From e6bdcb65e37c5e1b7af477ee5ca99d3910fb9d8f Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@18797224-902f-48f8-a5cc-f745e15eee43> Date: Thu, 9 Jul 1998 03:25:31 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create branch 'PRIVACY_BRANCH_070898'. git-svn-id: svn://10.0.0.236/branches/PRIVACY_BRANCH_070898@5198 18797224-902f-48f8-a5cc-f745e15eee43 --- CVSROOT/checkoutlist | 15 - CVSROOT/commitinfo | 15 - CVSROOT/config | 6 - CVSROOT/cvswrappers | 23 - CVSROOT/editinfo | 21 - CVSROOT/loginfo | 26 - CVSROOT/modules | 320 - CVSROOT/notify | 12 - CVSROOT/passwd | 1 - CVSROOT/rcsinfo | 13 - CVSROOT/readers | 0 CVSROOT/taginfo | 20 - CVSROOT/verifymsg | 21 - buildtools/windows/batch/MOZENV.BAT | 74 - buildtools/windows/bin/README | 26 - buildtools/windows/bin/alpha/gmake.exe | Bin 256512 -> 0 bytes buildtools/windows/bin/alpha/nsinstall.exe | Bin 77312 -> 0 bytes buildtools/windows/bin/alpha/shmsdos.exe | Bin 123904 -> 0 bytes buildtools/windows/bin/alpha/uname.exe | Bin 75264 -> 0 bytes buildtools/windows/bin/x86/gmake.exe | Bin 152064 -> 0 bytes buildtools/windows/bin/x86/nsinstall.exe | Bin 30208 -> 0 bytes buildtools/windows/bin/x86/shmsdos.exe | Bin 58368 -> 0 bytes buildtools/windows/bin/x86/uname.exe | Bin 28160 -> 0 bytes buildtools/windows/source/make/COPYING | 339 - buildtools/windows/source/make/ChangeLog | 3263 ------ buildtools/windows/source/make/INSTALL | 176 - buildtools/windows/source/make/Makefile | 62 - buildtools/windows/source/make/Makefile.in | 307 - buildtools/windows/source/make/NEWS | 557 -- buildtools/windows/source/make/NMakefile | 128 - buildtools/windows/source/make/README | 28 - buildtools/windows/source/make/README.MOZILLA | 16 - buildtools/windows/source/make/acconfig.h | 17 - buildtools/windows/source/make/alloca.c | 492 - buildtools/windows/source/make/ar.c | 317 - buildtools/windows/source/make/arscan.c | 561 -- buildtools/windows/source/make/build.sh.in | 69 - buildtools/windows/source/make/commands.c | 521 - buildtools/windows/source/make/commands.h | 42 - buildtools/windows/source/make/config.h | 275 - buildtools/windows/source/make/config.h.in | 270 - buildtools/windows/source/make/configh.dos | 136 - buildtools/windows/source/make/configure | 2991 ------ buildtools/windows/source/make/configure.bat | 88 - buildtools/windows/source/make/configure.in | 131 - buildtools/windows/source/make/default.c | 403 - buildtools/windows/source/make/dep.h | 66 - buildtools/windows/source/make/dir.c | 760 -- buildtools/windows/source/make/expand.c | 456 - buildtools/windows/source/make/file.c | 566 -- buildtools/windows/source/make/file.h | 111 - buildtools/windows/source/make/function.c | 1329 --- buildtools/windows/source/make/getloadavg.c | 938 -- buildtools/windows/source/make/getopt.c | 763 -- buildtools/windows/source/make/getopt.h | 129 - buildtools/windows/source/make/getopt1.c | 180 - buildtools/windows/source/make/glob.c | 705 -- .../windows/source/make/glob/COPYING.LIB | 481 - buildtools/windows/source/make/glob/Makefile | 28 - .../windows/source/make/glob/Makefile.in | 66 - buildtools/windows/source/make/glob/configure | 1547 --- .../windows/source/make/glob/configure.bat | 52 - .../windows/source/make/glob/configure.in | 19 - buildtools/windows/source/make/glob/fnmatch.c | 200 - buildtools/windows/source/make/glob/fnmatch.h | 67 - buildtools/windows/source/make/glob/glob.c | 705 -- buildtools/windows/source/make/glob/glob.h | 97 - buildtools/windows/source/make/implicit.c | 590 -- buildtools/windows/source/make/install-sh | 238 - buildtools/windows/source/make/job.c | 1852 ---- buildtools/windows/source/make/job.h | 67 - buildtools/windows/source/make/main.c | 2035 ---- buildtools/windows/source/make/make-stds.texi | 656 -- buildtools/windows/source/make/make.aux | 354 - buildtools/windows/source/make/make.cp | 701 -- buildtools/windows/source/make/make.cps | 652 -- buildtools/windows/source/make/make.fn | 149 - buildtools/windows/source/make/make.fns | 165 - buildtools/windows/source/make/make.h | 355 - buildtools/windows/source/make/make.info | 163 - buildtools/windows/source/make/make.info-1 | 1122 --- buildtools/windows/source/make/make.info-2 | 1195 --- buildtools/windows/source/make/make.info-3 | 1228 --- buildtools/windows/source/make/make.info-4 | 1296 --- buildtools/windows/source/make/make.info-5 | 1131 --- buildtools/windows/source/make/make.info-6 | 1215 --- buildtools/windows/source/make/make.info-7 | 727 -- buildtools/windows/source/make/make.info-8 | 896 -- buildtools/windows/source/make/make.man | 302 - buildtools/windows/source/make/make.texinfo | 8830 ----------------- buildtools/windows/source/make/make.toc | 118 - buildtools/windows/source/make/misc.c | 739 -- buildtools/windows/source/make/mkinstalldirs | 32 - buildtools/windows/source/make/read.c | 2069 ---- buildtools/windows/source/make/remake.c | 1086 -- buildtools/windows/source/make/remote-cstms.c | 270 - buildtools/windows/source/make/remote-stub.c | 92 - buildtools/windows/source/make/rule.c | 571 -- buildtools/windows/source/make/rule.h | 53 - buildtools/windows/source/make/signame.c | 304 - buildtools/windows/source/make/signame.h | 65 - buildtools/windows/source/make/texinfo.tex | 4421 --------- buildtools/windows/source/make/variable.c | 822 -- buildtools/windows/source/make/variable.h | 100 - buildtools/windows/source/make/version.c | 7 - buildtools/windows/source/make/vpath.c | 487 - buildtools/windows/source/make/windir.h | 21 - buildtools/windows/source/shmsdos/README | 27 - buildtools/windows/source/shmsdos/nsinstall.c | 697 -- .../windows/source/shmsdos/nsinstall.mak | 141 - buildtools/windows/source/shmsdos/shmsdos.c | 2573 ----- buildtools/windows/source/shmsdos/shmsdos.mak | 141 - buildtools/windows/source/uname/README | 9 - buildtools/windows/source/uname/uname.c | 155 - buildtools/windows/source/uname/uname.mak | 141 - .../client/windows/docs/installer/IS1.JPG | Bin 8087 -> 0 bytes .../windows/docs/installer/L10NTREE.JPG | Bin 4513 -> 0 bytes .../client/windows/docs/installer/SPLASH.JPG | Bin 20208 -> 0 bytes .../windows/docs/installer/branding.html | 40 - .../docs/installer/gettingStarted.html | 100 - .../windows/docs/installer/isocodes.htm | 203 - .../windows/docs/installer/kitOverview.html | 99 - .../windows/docs/installer/kitStruct.html | 63 - .../windows/docs/installer/localizeAim.html | 51 - .../windows/docs/installer/localizeCD.html | 65 - .../windows/docs/installer/localizeCosmo.html | 62 - .../docs/installer/localizeIsuser.html | 32 - .../docs/installer/localizeMmedia.html | 45 - .../windows/docs/installer/localizeMplay.html | 68 - .../windows/docs/installer/localizeNav40.html | 154 - .../docs/installer/localizeNetcast.html | 49 - .../docs/installer/localizeNsconf.html | 67 - .../docs/installer/localizeRsutil.html | 71 - .../windows/docs/installer/localizeSetup.html | 138 - .../windows/docs/installer/localizeURL.html | 55 - .../docs/installer/localize_these_files.html | 125 - .../windows/docs/installer/nomenclature.html | 109 - .../docs/installer/projectOverview.html | 57 - .../windows/docs/installer/reference.html | 54 - .../docs/installer/registrySettings.html | 612 -- .../windows/docs/installer/reportingBugs.html | 53 - .../windows/docs/installer/returnKit.html | 54 - .../client/windows/docs/installer/splash.html | 47 - .../windows/docs/installer/testKit.html | 150 - .../client/windows/docs/installer/toc.html | 106 - .../windows/docs/installer/usingKit.html | 323 - l10nkits/client/windows/docs/nav40/SPLASH.JPG | Bin 19447 -> 0 bytes l10nkits/client/windows/docs/nav40/allxpstr.h | 7878 --------------- .../client/windows/docs/nav40/branding.html | 40 - .../client/windows/docs/nav40/charsets.htm | 383 - .../windows/docs/nav40/gettingStarted.html | 100 - .../client/windows/docs/nav40/idBuild.jpg | Bin 57205 -> 0 bytes .../client/windows/docs/nav40/image5LE.JPG | Bin 1067 -> 0 bytes .../client/windows/docs/nav40/imageEJR.JPG | Bin 21513 -> 0 bytes .../client/windows/docs/nav40/imageGAN.JPG | Bin 871 -> 0 bytes .../client/windows/docs/nav40/imageGHT.JPG | Bin 1103 -> 0 bytes .../client/windows/docs/nav40/imageQC9.JPG | Bin 6256 -> 0 bytes .../client/windows/docs/nav40/isocodes.htm | 203 - .../client/windows/docs/nav40/isonames.htm | 1029 -- .../windows/docs/nav40/kitOverview.html | 44 - .../client/windows/docs/nav40/kitStruct.html | 75 - .../client/windows/docs/nav40/l10ntree.jpg | Bin 5947 -> 0 bytes .../windows/docs/nav40/localizeAboutplg.html | 81 - .../windows/docs/nav40/localizeAllPref.html | 154 - .../windows/docs/nav40/localizeBookmarks.html | 36 - .../docs/nav40/localizeConfigPref.html | 108 - .../windows/docs/nav40/localizeLicense.html | 67 - .../windows/docs/nav40/localizeNpnul.html | 42 - .../windows/docs/nav40/localizeURL.html | 55 - .../docs/nav40/localize_these_files.html | 141 - .../windows/docs/nav40/nomenclature.html | 108 - l10nkits/client/windows/docs/nav40/pixel.gif | Bin 41 -> 0 bytes .../windows/docs/nav40/projectOverview.html | 73 - .../client/windows/docs/nav40/reference.html | 77 - .../windows/docs/nav40/reportingBugs.html | 54 - l10nkits/client/windows/docs/nav40/resource.h | 3949 -------- .../client/windows/docs/nav40/returnKit.html | 58 - .../client/windows/docs/nav40/splash.html | 47 - .../client/windows/docs/nav40/testKit.html | 130 - l10nkits/client/windows/docs/nav40/toc.html | 132 - .../windows/docs/nav40/troubleshooting.html | 125 - .../client/windows/docs/nav40/usingKit.html | 432 - .../client/windows/docs/nav40/winfekit.jpg | Bin 4486 -> 0 bytes .../client/windows/docs/nav40/xpencui.htm | 215 - .../xp/docs/mozilla.org/kitDownload.html | 118 - .../xp/docs/mozilla.org/l10nLibrary.html | 58 - .../xp/docs/mozilla.org/l10nkitintro.html | 148 - .../client/xp/docs/mozilla.org/ulpFAQ.html | 375 - .../xp/docs/mozilla.org/ulpLicense.html | 330 - mozilla/base/Makefile | 24 - mozilla/base/macbuild/base.mcp | Bin 94410 -> 0 bytes mozilla/base/makefile.win | 23 - mozilla/base/public/MANIFEST | 5 - mozilla/base/public/Makefile | 30 - mozilla/base/public/makefile.win | 30 - mozilla/base/public/nsISizeOfHandler.h | 66 - mozilla/base/src/MANIFEST | 22 - mozilla/base/src/Makefile | 70 - mozilla/base/src/mac/nsTimerMac.cpp | 283 - mozilla/base/src/makefile.win | 95 - mozilla/base/src/nsArena.cpp | 80 - mozilla/base/src/nsAtomTable.cpp | 154 - mozilla/base/src/nsBTree.cpp | 403 - mozilla/base/src/nsBTree.h | 283 - mozilla/base/src/nsByteBuffer.cpp | 135 - mozilla/base/src/nsCRT.cpp | 290 - mozilla/base/src/nsCRT.h | 115 - mozilla/base/src/nsDeque.cpp | 433 - mozilla/base/src/nsDeque.h | 357 - mozilla/base/src/nsIArena.h | 51 - mozilla/base/src/nsIAtom.h | 77 - mozilla/base/src/nsIBaseStream.h | 42 - mozilla/base/src/nsIByteBuffer.h | 56 - mozilla/base/src/nsIInputStream.h | 60 - mozilla/base/src/nsIOutputStream.h | 45 - mozilla/base/src/nsITimer.h | 86 - mozilla/base/src/nsITimerCallback.h | 41 - mozilla/base/src/nsIUnicharBuffer.h | 46 - mozilla/base/src/nsIUnicharInputStream.h | 98 - mozilla/base/src/nsRBTree.cpp | 423 - mozilla/base/src/nsRBTree.h | 223 - mozilla/base/src/nsSizeOfHandler.cpp | 121 - mozilla/base/src/nsString.cpp | 2085 ---- mozilla/base/src/nsString.h | 238 - mozilla/base/src/nsUnicharBuffer.cpp | 137 - mozilla/base/src/nsUnicharInputStream.cpp | 329 - mozilla/base/src/nsUnitConversion.h | 76 - mozilla/base/src/nsVoidArray.cpp | 227 - mozilla/base/src/nsVoidArray.h | 74 - mozilla/base/src/nscore.h | 110 - mozilla/base/src/unix/Makefile | 43 - mozilla/base/src/unix/nsTimer.cpp | 171 - mozilla/base/src/windows/makefile.win | 40 - mozilla/base/src/windows/nsTimer.cpp | 364 - mozilla/base/tests/CvtURL.cpp | 104 - mozilla/base/tests/Makefile | 62 - mozilla/base/tests/TestAtoms.cpp | 108 - mozilla/base/tests/TestCRT.cpp | 89 - mozilla/base/tests/TimerTest.cpp | 202 - mozilla/base/tests/makefile.win | 75 - mozilla/base/tests/resources.h | 32 - mozilla/base/tests/timer.rc | 38 - mozilla/content/base/public/nsIContent.h | 141 - mozilla/content/base/public/nsIDocument.h | 213 - .../base/public/nsIDocumentContainer.h | 71 - .../content/base/public/nsIDocumentObserver.h | 180 - mozilla/content/base/public/nsIStyleRule.h | 43 - mozilla/content/base/public/nsIStyleSheet.h | 55 - mozilla/content/base/public/nsITextContent.h | 48 - mozilla/content/base/src/nsDocument.cpp | 944 -- mozilla/content/base/src/nsDocument.h | 254 - mozilla/content/base/src/nsHTMLValue.cpp | 304 - mozilla/content/base/src/nsHTMLValue.h | 151 - mozilla/content/base/src/nsSelection.cpp | 102 - mozilla/content/base/src/nsStyleContext.cpp | 998 -- mozilla/content/base/src/nsStyleSet.cpp | 819 -- mozilla/content/events/makefile.win | 23 - mozilla/content/events/public/makefile.win | 29 - .../events/public/nsIEventListenerManager.h | 89 - .../events/public/nsIEventStateManager.h | 58 - mozilla/content/events/src/nsDOMEvent.cpp | 175 - mozilla/content/events/src/nsDOMEvent.h | 80 - .../events/src/nsEventListenerManager.cpp | 340 - .../events/src/nsEventListenerManager.h | 78 - .../events/src/nsEventStateManager.cpp | 67 - .../content/events/src/nsEventStateManager.h | 52 - mozilla/content/html/content/makefile.win | 22 - .../html/content/public/nsIHTMLContent.h | 90 - mozilla/content/html/content/src/makefile.win | 55 - .../content/html/content/src/nsHTMLAtoms.cpp | 406 - .../content/html/content/src/nsHTMLAtoms.h | 181 - mozilla/content/html/document/public/MANIFEST | 5 - .../content/html/document/public/makefile.win | 25 - .../html/document/src/nsHTMLContentSink.cpp | 1711 ---- .../html/document/src/nsHTMLDocument.cpp | 301 - .../html/document/src/nsHTMLDocument.h | 76 - .../html/document/src/nsIHTMLDocument.h | 41 - .../content/html/style/public/nsICSSParser.h | 65 - .../html/style/src/nsCSSDeclaration.cpp | 2084 ---- .../content/html/style/src/nsCSSKeywords.h | 40 - .../content/html/style/src/nsCSSLayout.cpp | 351 - .../content/html/style/src/nsCSSParser.cpp | 2418 ----- mozilla/content/html/style/src/nsCSSProps.h | 40 - .../content/html/style/src/nsCSSScanner.cpp | 584 -- mozilla/content/html/style/src/nsCSSScanner.h | 118 - .../content/html/style/src/nsCSSStruct.cpp | 2084 ---- .../content/html/style/src/nsCSSStyleRule.cpp | 1090 -- .../html/style/src/nsCSSStyleSheet.cpp | 885 -- .../html/style/src/nsHTMLAttributes.cpp | 705 -- .../html/style/src/nsHTMLCSSStyleSheet.cpp | 240 - .../html/style/src/nsHTMLStyleSheet.cpp | 236 - .../content/html/style/src/nsHTMLValue.cpp | 304 - mozilla/content/html/style/src/nsHTMLValue.h | 151 - .../html/style/src/nsICSSDeclaration.h | 334 - .../content/html/style/src/nsICSSStyleRule.h | 76 - .../html/style/src/nsIHTMLAttributes.h | 65 - .../html/style/src/nsIHTMLCSSStyleSheet.h | 36 - mozilla/content/shared/public/nsCSSKeywords.h | 40 - mozilla/content/shared/public/nsCSSProps.h | 40 - mozilla/content/shared/public/nsHTMLAtoms.h | 181 - mozilla/content/shared/public/nsHTMLValue.h | 151 - mozilla/content/shared/public/nsStyleCoord.h | 237 - mozilla/content/shared/src/nsCSSKeywords.cpp | 452 - mozilla/content/shared/src/nsCSSProps.cpp | 365 - mozilla/content/shared/src/nsHTMLAtoms.cpp | 406 - mozilla/content/shared/src/nsHTMLValue.cpp | 304 - mozilla/directory/Makefile | 67 - mozilla/directory/buildsdk.txt | 149 - mozilla/directory/c-sdk/ldap/Makefile.client | 32 - .../c-sdk/ldap/build/Makefile.client | 23 - mozilla/directory/c-sdk/ldap/build/dirver.c | 193 - .../c-sdk/ldap/include/Makefile.client | 48 - .../directory/c-sdk/ldap/include/disptmpl.h | 343 - mozilla/directory/c-sdk/ldap/include/lber.h | 257 - mozilla/directory/c-sdk/ldap/include/ldap.h | 984 -- .../directory/c-sdk/ldap/include/ldaplog.h | 68 - .../directory/c-sdk/ldap/include/ldaprot.h | 158 - mozilla/directory/c-sdk/ldap/include/ldif.h | 57 - .../directory/c-sdk/ldap/include/portable.h | 362 - mozilla/directory/c-sdk/ldap/include/regex.h | 58 - .../directory/c-sdk/ldap/include/srchpref.h | 118 - .../c-sdk/ldap/libraries/Makefile.client | 30 - .../ldap/libraries/liblber/Makefile.client | 79 - .../c-sdk/ldap/libraries/liblber/bprint.c | 82 - .../c-sdk/ldap/libraries/liblber/decode.c | 621 -- .../c-sdk/ldap/libraries/liblber/dtest.c | 94 - .../c-sdk/ldap/libraries/liblber/encode.c | 656 -- .../c-sdk/ldap/libraries/liblber/etest.c | 168 - .../c-sdk/ldap/libraries/liblber/idtest.c | 82 - .../c-sdk/ldap/libraries/liblber/io.c | 1188 --- .../c-sdk/ldap/libraries/liblber/lber-int.h | 231 - .../ldap/libraries/libldap/Makefile.client | 162 - .../c-sdk/ldap/libraries/libldap/abandon.c | 224 - .../c-sdk/ldap/libraries/libldap/add.c | 201 - .../c-sdk/ldap/libraries/libldap/bind.c | 155 - .../c-sdk/ldap/libraries/libldap/cache.c | 126 - .../c-sdk/ldap/libraries/libldap/charray.c | 225 - .../c-sdk/ldap/libraries/libldap/charset.c | 1826 ---- .../c-sdk/ldap/libraries/libldap/cldap.c | 564 -- .../c-sdk/ldap/libraries/libldap/compare.c | 174 - .../c-sdk/ldap/libraries/libldap/compat.c | 63 - .../c-sdk/ldap/libraries/libldap/control.c | 499 - .../ldap/libraries/libldap/countvalues.c | 48 - .../c-sdk/ldap/libraries/libldap/delete.c | 149 - .../c-sdk/ldap/libraries/libldap/disptmpl.c | 753 -- .../c-sdk/ldap/libraries/libldap/dllmain.c | 159 - .../c-sdk/ldap/libraries/libldap/dsparse.c | 208 - .../c-sdk/ldap/libraries/libldap/error.c | 436 - .../c-sdk/ldap/libraries/libldap/extendop.c | 246 - .../c-sdk/ldap/libraries/libldap/free.c | 134 - .../c-sdk/ldap/libraries/libldap/freevalues.c | 54 - .../c-sdk/ldap/libraries/libldap/friendly.c | 128 - .../c-sdk/ldap/libraries/libldap/getattr.c | 131 - .../c-sdk/ldap/libraries/libldap/getdn.c | 343 - .../ldap/libraries/libldap/getdxbyname.c | 246 - .../c-sdk/ldap/libraries/libldap/getentry.c | 122 - .../c-sdk/ldap/libraries/libldap/getfilter.c | 525 - .../c-sdk/ldap/libraries/libldap/getoption.c | 180 - .../c-sdk/ldap/libraries/libldap/getvalues.c | 461 - .../c-sdk/ldap/libraries/libldap/globals.c | 29 - .../c-sdk/ldap/libraries/libldap/ldap-int.h | 710 -- .../ldap/libraries/libldap/ldapfilter.conf | 105 - .../c-sdk/ldap/libraries/libldap/ldapfriendly | 242 - .../libraries/libldap/ldapsearchprefs.conf | 153 - .../ldap/libraries/libldap/ldaptemplates.conf | 677 -- .../c-sdk/ldap/libraries/libldap/memcache.c | 2180 ---- .../c-sdk/ldap/libraries/libldap/message.c | 86 - .../c-sdk/ldap/libraries/libldap/modify.c | 202 - .../c-sdk/ldap/libraries/libldap/mozock.c | 690 -- .../ldap/libraries/libldap/nsprthreadtest.c | 602 -- .../c-sdk/ldap/libraries/libldap/open.c | 386 - .../c-sdk/ldap/libraries/libldap/os-ip.c | 753 -- .../c-sdk/ldap/libraries/libldap/psearch.c | 168 - .../ldap/libraries/libldap/pthreadtest.c | 427 - .../c-sdk/ldap/libraries/libldap/referral.c | 158 - .../c-sdk/ldap/libraries/libldap/regex.c | 895 -- .../c-sdk/ldap/libraries/libldap/rename.c | 237 - .../c-sdk/ldap/libraries/libldap/request.c | 1246 --- .../c-sdk/ldap/libraries/libldap/reslist.c | 59 - .../c-sdk/ldap/libraries/libldap/result.c | 1275 --- .../c-sdk/ldap/libraries/libldap/saslbind.c | 257 - .../c-sdk/ldap/libraries/libldap/sbind.c | 232 - .../c-sdk/ldap/libraries/libldap/search.c | 898 -- .../c-sdk/ldap/libraries/libldap/setoption.c | 216 - .../c-sdk/ldap/libraries/libldap/sort.c | 303 - .../c-sdk/ldap/libraries/libldap/sortctrl.c | 434 - .../c-sdk/ldap/libraries/libldap/srchpref.c | 417 - .../c-sdk/ldap/libraries/libldap/test.c | 1795 ---- .../c-sdk/ldap/libraries/libldap/tmplout.c | 1113 --- .../c-sdk/ldap/libraries/libldap/tmpltest.c | 299 - .../c-sdk/ldap/libraries/libldap/ufn.c | 530 - .../c-sdk/ldap/libraries/libldap/unbind.c | 187 - .../c-sdk/ldap/libraries/libldap/unescape.c | 62 - .../c-sdk/ldap/libraries/libldap/url.c | 413 - .../c-sdk/ldap/libraries/libldap/utf8.c | 237 - .../c-sdk/ldap/libraries/libldap/vlistctrl.c | 225 - .../ldap/libraries/macintosh/LDAPClient.prj | Bin 34096 -> 0 bytes .../libraries/macintosh/LDAPClient68K.prj | Bin 44778 -> 0 bytes .../libraries/macintosh/LDAPClient68K.prj.exp | 262 - .../libraries/macintosh/LDAPClientCFM68K.prj | Bin 40657 -> 0 bytes .../libraries/macintosh/LDAPClientDebugDefs.h | 41 - .../ldap/libraries/macintosh/LDAPClientDefs.h | 40 - .../libraries/macintosh/LDAPClientPPC.exp | 262 - .../libraries/macintosh/LDAPClientPPC.mcp | Bin 59623 -> 0 bytes .../libraries/macintosh/LDAPClientPPC.prj | Bin 34057 -> 0 bytes .../libraries/macintosh/LDAPClientPPC.prj.exp | 262 - .../c-sdk/ldap/libraries/macintosh/README | 67 - .../c-sdk/ldap/libraries/macintosh/getopt.c | 121 - .../ldap/libraries/macintosh/kerberos-macos.c | 94 - .../libraries/macintosh/ldap-macos-defs.h | 25 - .../ldap/libraries/macintosh/ldap-macos.h | 92 - .../ldap/libraries/macintosh/libldap-68k-2i.u | Bin 43493 -> 0 bytes .../ldap/libraries/macintosh/libldap-68k-4i.u | Bin 43494 -> 0 bytes .../ldap/libraries/macintosh/libldap-PPC.r | 10 - .../ldap/libraries/macintosh/libldap-PPC.u | Bin 33101 -> 0 bytes .../libraries/macintosh/libldap-PPC.u.exp | 262 - .../c-sdk/ldap/libraries/macintosh/macos-ip.c | 407 - .../ldap/libraries/macintosh/sdk/dirver-PPC.u | Bin 28497 -> 0 bytes .../c-sdk/ldap/libraries/macintosh/strings.c | 114 - .../libraries/macintosh/tcp-univhdrs/tcp.c | 992 -- .../libraries/macintosh/tcp-univhdrs/tcp.h | 85 - .../ldap/libraries/msdos/winsock/libldap.def | 188 - .../ldap/libraries/msdos/winsock/libldap.rc | 53 - .../ldap/libraries/msdos/winsock/mozock.c | 666 -- .../ldap/libraries/msdos/winsock/nsldap.mak | 930 -- .../ldap/libraries/msdos/winsock/nsldap.rc | 52 - .../ldap/libraries/msdos/winsock/nsldap32.def | 272 - .../libraries/msdos/winsock/nsldap32bc.def | 276 - mozilla/directory/ldapsdk.mak | 183 - mozilla/directory/ldapsdk.mk | 49 - mozilla/dom/Makefile | 24 - mozilla/dom/macbuild/dom.mcp | Bin 45476 -> 0 bytes mozilla/dom/makefile.win | 22 - mozilla/dom/public/MANIFEST | 24 - mozilla/dom/public/Makefile | 38 - mozilla/dom/public/coreDom/MANIFEST | 31 - mozilla/dom/public/coreDom/Makefile | 42 - mozilla/dom/public/coreDom/makefile.win | 30 - mozilla/dom/public/coreDom/nsIDOMAttribute.h | 51 - .../dom/public/coreDom/nsIDOMAttributeList.h | 52 - mozilla/dom/public/coreDom/nsIDOMComment.h | 45 - mozilla/dom/public/coreDom/nsIDOMDOM.h | 46 - mozilla/dom/public/coreDom/nsIDOMDocument.h | 79 - .../public/coreDom/nsIDOMDocumentContext.h | 45 - .../public/coreDom/nsIDOMDocumentFragment.h | 46 - mozilla/dom/public/coreDom/nsIDOMElement.h | 65 - mozilla/dom/public/coreDom/nsIDOMNode.h | 70 - .../dom/public/coreDom/nsIDOMNodeIterator.h | 56 - mozilla/dom/public/coreDom/nsIDOMPI.h | 48 - mozilla/dom/public/coreDom/nsIDOMText.h | 56 - .../dom/public/coreDom/nsIDOMTreeIterator.h | 61 - mozilla/dom/public/coreEvents/MANIFEST | 14 - mozilla/dom/public/coreEvents/Makefile | 39 - mozilla/dom/public/coreEvents/makefile.win | 28 - .../public/coreEvents/nsIDOMDragListener.h | 55 - mozilla/dom/public/coreEvents/nsIDOMEvent.h | 181 - .../public/coreEvents/nsIDOMEventCapturer.h | 49 - .../public/coreEvents/nsIDOMEventListener.h | 47 - .../public/coreEvents/nsIDOMEventReceiver.h | 48 - .../public/coreEvents/nsIDOMFocusListener.h | 55 - .../dom/public/coreEvents/nsIDOMKeyListener.h | 60 - .../public/coreEvents/nsIDOMLoadListener.h | 70 - .../public/coreEvents/nsIDOMMouseListener.h | 85 - .../coreEvents/nsIDOMMouseMotionListener.h | 55 - mozilla/dom/public/events/MANIFEST | 5 - mozilla/dom/public/events/Makefile | 30 - mozilla/dom/public/events/makefile.win | 26 - mozilla/dom/public/events/nsINSEvent.h | 41 - mozilla/dom/public/idl/Navigator.idl | 11 - mozilla/dom/public/idl/Window.idl | 14 - mozilla/dom/public/idl/coreDom/Attribute.idl | 6 - .../dom/public/idl/coreDom/AttributeList.idl | 9 - mozilla/dom/public/idl/coreDom/Comment.idl | 4 - mozilla/dom/public/idl/coreDom/DOM.idl | 4 - mozilla/dom/public/idl/coreDom/Document.idl | 17 - .../public/idl/coreDom/DocumentContext.idl | 3 - .../public/idl/coreDom/DocumentFragment.idl | 3 - mozilla/dom/public/idl/coreDom/Element.idl | 14 - mozilla/dom/public/idl/coreDom/Node.idl | 25 - .../dom/public/idl/coreDom/NodeIterator.idl | 9 - mozilla/dom/public/idl/coreDom/PI.idl | 4 - mozilla/dom/public/idl/coreDom/Text.idl | 14 - .../dom/public/idl/coreDom/TreeIterator.idl | 11 - mozilla/dom/public/idl/coreDom/makefile.win | 61 - mozilla/dom/public/idl/makefile.win | 63 - mozilla/dom/public/makefile.win | 30 - mozilla/dom/public/nsIDOMNavigator.h | 57 - mozilla/dom/public/nsIDOMWindow.h | 64 - mozilla/dom/public/nsIJSGlobalObject.h | 43 - mozilla/dom/public/nsIJSScriptObject.h | 50 - mozilla/dom/public/nsIScriptContext.h | 92 - mozilla/dom/public/nsIScriptContextOwner.h | 56 - mozilla/dom/public/nsIScriptGlobalObject.h | 45 - mozilla/dom/public/nsIScriptObjectOwner.h | 65 - mozilla/dom/src/Makefile | 47 - mozilla/dom/src/makefile.win | 74 - mozilla/dom/src/nsGlobalWindow.cpp | 988 -- mozilla/dom/src/nsJSAttribute.cpp | 437 - mozilla/dom/src/nsJSAttributeList.cpp | 566 -- mozilla/dom/src/nsJSComment.cpp | 337 - mozilla/dom/src/nsJSDOM.cpp | 407 - mozilla/dom/src/nsJSDocument.cpp | 1063 -- mozilla/dom/src/nsJSDocumentContext.cpp | 359 - mozilla/dom/src/nsJSDocumentFragment.cpp | 362 - mozilla/dom/src/nsJSElement.cpp | 799 -- mozilla/dom/src/nsJSEnvironment.cpp | 165 - mozilla/dom/src/nsJSEnvironment.h | 56 - mozilla/dom/src/nsJSNavigator.cpp | 445 - mozilla/dom/src/nsJSNode.cpp | 844 -- mozilla/dom/src/nsJSNodeIterator.cpp | 645 -- mozilla/dom/src/nsJSPI.cpp | 367 - mozilla/dom/src/nsJSText.cpp | 598 -- mozilla/dom/src/nsJSTreeIterator.cpp | 718 -- mozilla/dom/src/nsJSWindow.cpp | 607 -- mozilla/dom/tests/js/DumpHTML.js | 72 - mozilla/dom/tests/js/DumpTree.js | 58 - mozilla/dom/tests/js/HTMLString.js | 80 - mozilla/dom/tests/js/simple.js | 56 - mozilla/dom/tests/js/tables/changeCaption.js | 68 - mozilla/dom/tests/js/tables/changeCell.js | 93 - mozilla/dom/tests/js/timer.js | 71 - mozilla/dom/tools/Exceptions.cpp | 105 - mozilla/dom/tools/Exceptions.h | 132 - mozilla/dom/tools/FileGen.cpp | 330 - mozilla/dom/tools/FileGen.h | 64 - mozilla/dom/tools/IdlAttribute.cpp | 52 - mozilla/dom/tools/IdlAttribute.h | 42 - mozilla/dom/tools/IdlEnum.cpp | 91 - mozilla/dom/tools/IdlEnum.h | 44 - mozilla/dom/tools/IdlFunction.cpp | 169 - mozilla/dom/tools/IdlFunction.h | 59 - mozilla/dom/tools/IdlInterface.cpp | 402 - mozilla/dom/tools/IdlInterface.h | 84 - mozilla/dom/tools/IdlObject.cpp | 55 - mozilla/dom/tools/IdlObject.h | 41 - mozilla/dom/tools/IdlParameter.cpp | 71 - mozilla/dom/tools/IdlParameter.h | 52 - mozilla/dom/tools/IdlParser.cpp | 906 -- mozilla/dom/tools/IdlParser.h | 69 - mozilla/dom/tools/IdlScanner.cpp | 1262 --- mozilla/dom/tools/IdlScanner.h | 204 - mozilla/dom/tools/IdlSpecification.cpp | 94 - mozilla/dom/tools/IdlSpecification.h | 47 - mozilla/dom/tools/IdlVariable.cpp | 207 - mozilla/dom/tools/IdlVariable.h | 79 - mozilla/dom/tools/JSStubGen.cpp | 1358 --- mozilla/dom/tools/JSStubGen.h | 75 - mozilla/dom/tools/Makefile | 60 - mozilla/dom/tools/Makefile.win | 63 - mozilla/dom/tools/Test.idl | 19 - mozilla/dom/tools/XPCOMGen.cpp | 350 - mozilla/dom/tools/XPCOMGen.h | 51 - mozilla/dom/tools/geniid.pl | 89 - mozilla/dom/tools/main.cpp | 157 - mozilla/gconfig/.cshrc | 272 - mozilla/gconfig/AIX.mk | 58 - mozilla/gconfig/AIX3.2.mk | 19 - mozilla/gconfig/AIX4.1.mk | 36 - mozilla/gconfig/AIX4.2.mk | 25 - mozilla/gconfig/AIX4.3.mk | 25 - mozilla/gconfig/FreeBSD2.mk | 49 - mozilla/gconfig/HP-UX.mk | 56 - mozilla/gconfig/HP-UXA.09.03.mk | 27 - mozilla/gconfig/HP-UXA.09.07.mk | 27 - mozilla/gconfig/HP-UXA.09.mk | 21 - mozilla/gconfig/HP-UXB.10.01.mk | 23 - mozilla/gconfig/HP-UXB.10.10.mk | 34 - mozilla/gconfig/HP-UXB.10.20.mk | 34 - mozilla/gconfig/HP-UXB.10.30.mk | 30 - mozilla/gconfig/HP-UXB.10.mk | 21 - mozilla/gconfig/HP-UXB.11.00.mk | 29 - mozilla/gconfig/HP-UXB.11.mk | 23 - mozilla/gconfig/IRIX.mk | 98 - mozilla/gconfig/IRIX5.2.mk | 19 - mozilla/gconfig/IRIX5.3.mk | 21 - mozilla/gconfig/IRIX5.mk | 24 - mozilla/gconfig/IRIX6.2.mk | 27 - mozilla/gconfig/IRIX6.3.mk | 26 - mozilla/gconfig/IRIX6.mk | 27 - mozilla/gconfig/Linux.mk | 73 - mozilla/gconfig/LinuxELF1.2.mk | 20 - mozilla/gconfig/LinuxELF2.0.mk | 20 - mozilla/gconfig/Makefile | 27 - mozilla/gconfig/NCR3.0.mk | 74 - mozilla/gconfig/NEC4.2.mk | 45 - mozilla/gconfig/OSF1.mk | 54 - mozilla/gconfig/OSF1V2.0.mk | 19 - mozilla/gconfig/OSF1V3.0.mk | 20 - mozilla/gconfig/OSF1V3.2.mk | 28 - mozilla/gconfig/OSF1V4.0.mk | 35 - mozilla/gconfig/OSF1V4.0B.mk | 19 - mozilla/gconfig/OSF1V4.0D.mk | 20 - mozilla/gconfig/ReliantUNIX.mk | 68 - mozilla/gconfig/ReliantUNIX5.4.mk | 19 - mozilla/gconfig/SCOOS5.0.mk | 20 - mozilla/gconfig/SCO_SV3.2.mk | 70 - mozilla/gconfig/SunOS4.1.3_U1.mk | 43 - mozilla/gconfig/SunOS5.3.mk | 22 - mozilla/gconfig/SunOS5.4.mk | 22 - mozilla/gconfig/SunOS5.4_i86pc.mk | 52 - mozilla/gconfig/SunOS5.5.1.mk | 26 - mozilla/gconfig/SunOS5.5.1_i86pc.mk | 29 - mozilla/gconfig/SunOS5.5.mk | 26 - mozilla/gconfig/SunOS5.6.mk | 27 - mozilla/gconfig/SunOS5.6_i86pc.mk | 29 - mozilla/gconfig/SunOS5.mk | 109 - mozilla/gconfig/UNIX.mk | 85 - mozilla/gconfig/UNIXWARE2.1.mk | 33 - mozilla/gconfig/WIN16.mk | 109 - mozilla/gconfig/WIN32.mk | 103 - mozilla/gconfig/WIN954.0.mk | 47 - mozilla/gconfig/WINNT3.51.mk | 54 - mozilla/gconfig/WINNT4.0.mk | 51 - mozilla/gconfig/arch.mk | 286 - mozilla/gconfig/command.mk | 40 - mozilla/gconfig/config.mk | 117 - mozilla/gconfig/coreconf.pl | 139 - mozilla/gconfig/cpdist.pl | 179 - mozilla/gconfig/extract_objs.pl | 47 - mozilla/gconfig/headers.mk | 35 - mozilla/gconfig/import.pl | 190 - mozilla/gconfig/location.mk | 40 - mozilla/gconfig/makedep.exe | Bin 144896 -> 0 bytes mozilla/gconfig/makefile.win | 82 - mozilla/gconfig/md/Makefile | 65 - mozilla/gconfig/md/manifest.mn | 19 - mozilla/gconfig/md/watcomfx.lib | Bin 2048 -> 0 bytes mozilla/gconfig/mkdepend/Makefile | 40 - mozilla/gconfig/mkdepend/cppsetup.c | 243 - mozilla/gconfig/mkdepend/def.h | 150 - mozilla/gconfig/mkdepend/ifparser.c | 462 - mozilla/gconfig/mkdepend/ifparser.h | 76 - mozilla/gconfig/mkdepend/imakemdep.h | 727 -- mozilla/gconfig/mkdepend/include.c | 328 - mozilla/gconfig/mkdepend/main.c | 738 -- mozilla/gconfig/mkdepend/mkdepend.man | 365 - mozilla/gconfig/mkdepend/parse.c | 592 -- mozilla/gconfig/mkdepend/pr.c | 140 - mozilla/gconfig/module.mk | 46 - mozilla/gconfig/nsinstall/Makefile | 43 - mozilla/gconfig/nsinstall/nfspwd | 30 - mozilla/gconfig/nsinstall/nfspwd.pl | 30 - mozilla/gconfig/nsinstall/nsinstall.c | 317 - mozilla/gconfig/nsinstall/pathsub.c | 222 - mozilla/gconfig/nsinstall/pathsub.h | 58 - mozilla/gconfig/nsinstall/sunos4.h | 147 - mozilla/gconfig/platform.mk | 21 - mozilla/gconfig/prefix.mk | 70 - mozilla/gconfig/release.pl | 113 - mozilla/gconfig/rules.mk | 817 -- mozilla/gconfig/ruleset.mk | 358 - mozilla/gconfig/source.mk | 109 - mozilla/gconfig/suffix.mk | 116 - mozilla/gconfig/tree.mk | 44 - mozilla/gconfig/version.mk | 89 - mozilla/gconfig/version.pl | 59 - mozilla/gfx/Makefile | 24 - mozilla/gfx/macbuild/gfx.mcp | Bin 55735 -> 0 bytes mozilla/gfx/makefile.win | 22 - mozilla/gfx/src/MANIFEST | 25 - mozilla/gfx/src/Makefile | 43 - mozilla/gfx/src/mac/nsDeviceContextMac.cpp | 532 - mozilla/gfx/src/mac/nsDeviceContextMac.h | 125 - mozilla/gfx/src/mac/nsFontMetricsMac.cpp | 384 - mozilla/gfx/src/mac/nsFontMetricsMac.h | 84 - mozilla/gfx/src/mac/nsGfxFactoryMac.cpp | 176 - mozilla/gfx/src/mac/nsImageMac.cpp | 377 - mozilla/gfx/src/mac/nsImageMac.h | 112 - mozilla/gfx/src/mac/nsRegionMac.cpp | 239 - mozilla/gfx/src/mac/nsRegionMac.h | 70 - mozilla/gfx/src/mac/nsRenderingContextMac.cpp | 960 -- mozilla/gfx/src/mac/nsRenderingContextMac.h | 151 - mozilla/gfx/src/makefile.win | 79 - mozilla/gfx/src/motif/Makefile | 52 - mozilla/gfx/src/motif/nsDeviceContextMac.cpp | 532 - mozilla/gfx/src/motif/nsDeviceContextMac.h | 125 - mozilla/gfx/src/motif/nsDeviceContextUnix.cpp | 518 - mozilla/gfx/src/motif/nsDeviceContextUnix.h | 128 - mozilla/gfx/src/motif/nsFontMetricsMac.cpp | 384 - mozilla/gfx/src/motif/nsFontMetricsMac.h | 84 - mozilla/gfx/src/motif/nsFontMetricsUnix.cpp | 378 - mozilla/gfx/src/motif/nsFontMetricsUnix.h | 86 - mozilla/gfx/src/motif/nsGfxFactoryMac.cpp | 176 - mozilla/gfx/src/motif/nsGfxFactoryUnix.cpp | 176 - mozilla/gfx/src/motif/nsImageMac.cpp | 377 - mozilla/gfx/src/motif/nsImageMac.h | 112 - mozilla/gfx/src/motif/nsImageUnix.cpp | 380 - mozilla/gfx/src/motif/nsImageUnix.h | 115 - mozilla/gfx/src/motif/nsRegionMac.cpp | 239 - mozilla/gfx/src/motif/nsRegionMac.h | 70 - mozilla/gfx/src/motif/nsRegionUnix.cpp | 237 - mozilla/gfx/src/motif/nsRegionUnix.h | 73 - .../gfx/src/motif/nsRenderingContextMac.cpp | 960 -- mozilla/gfx/src/motif/nsRenderingContextMac.h | 151 - .../gfx/src/motif/nsRenderingContextUnix.cpp | 961 -- .../gfx/src/motif/nsRenderingContextUnix.h | 154 - mozilla/gfx/src/nsColor.cpp | 111 - mozilla/gfx/src/nsColor.h | 52 - mozilla/gfx/src/nsColorNameIDs.h | 142 - mozilla/gfx/src/nsColorNames.cpp | 566 -- mozilla/gfx/src/nsColorNames.h | 44 - mozilla/gfx/src/nsColorNamesRGB.cpp | 144 - mozilla/gfx/src/nsCoord.h | 38 - mozilla/gfx/src/nsFont.cpp | 80 - mozilla/gfx/src/nsFont.h | 86 - mozilla/gfx/src/nsFontCache.cpp | 139 - mozilla/gfx/src/nsGfxCIID.h | 52 - mozilla/gfx/src/nsIBlender.h | 86 - mozilla/gfx/src/nsIDeviceContext.h | 98 - mozilla/gfx/src/nsIFontCache.h | 68 - mozilla/gfx/src/nsIFontMetrics.h | 87 - mozilla/gfx/src/nsIImage.h | 254 - mozilla/gfx/src/nsIImageGroup.h | 118 - mozilla/gfx/src/nsIImageManager.h | 83 - mozilla/gfx/src/nsIImageObserver.h | 167 - mozilla/gfx/src/nsIImageRequest.h | 73 - mozilla/gfx/src/nsIRegion.h | 201 - mozilla/gfx/src/nsIRenderingContext.h | 413 - mozilla/gfx/src/nsImage.h | 87 - mozilla/gfx/src/nsImageGroup.cpp | 294 - mozilla/gfx/src/nsImageManager.cpp | 138 - mozilla/gfx/src/nsImageNet.h | 31 - mozilla/gfx/src/nsImageNetContext.cpp | 350 - mozilla/gfx/src/nsImageNetContextAsync.cpp | 458 - mozilla/gfx/src/nsImageRenderer.cpp | 282 - mozilla/gfx/src/nsImageRequest.cpp | 326 - mozilla/gfx/src/nsImageRequest.h | 74 - mozilla/gfx/src/nsImageSystemServices.cpp | 134 - mozilla/gfx/src/nsImageURL.cpp | 179 - mozilla/gfx/src/nsMargin.h | 71 - mozilla/gfx/src/nsPoint.h | 61 - mozilla/gfx/src/nsRect.cpp | 173 - mozilla/gfx/src/nsRect.h | 129 - mozilla/gfx/src/nsRegion.h | 160 - mozilla/gfx/src/nsSize.h | 61 - mozilla/gfx/src/nsTransform2D.cpp | 565 -- mozilla/gfx/src/nsTransform2D.h | 211 - mozilla/gfx/src/windows/makefile.win | 62 - mozilla/gfx/src/windows/nsBlenderWin.cpp | 1112 --- mozilla/gfx/src/windows/nsBlenderWin.h | 179 - .../gfx/src/windows/nsDeviceContextWin.cpp | 240 - mozilla/gfx/src/windows/nsDeviceContextWin.h | 87 - mozilla/gfx/src/windows/nsFontMetricsWin.cpp | 245 - mozilla/gfx/src/windows/nsFontMetricsWin.h | 76 - mozilla/gfx/src/windows/nsGfxFactoryWin.cpp | 181 - mozilla/gfx/src/windows/nsImageWin.cpp | 1238 --- mozilla/gfx/src/windows/nsImageWin.h | 235 - mozilla/gfx/src/windows/nsRegionWin.cpp | 173 - mozilla/gfx/src/windows/nsRegionWin.h | 60 - .../gfx/src/windows/nsRenderingContextWin.cpp | 1076 -- .../gfx/src/windows/nsRenderingContextWin.h | 174 - mozilla/gfx/tests/DumpColors.cpp | 32 - mozilla/gfx/tests/Makefile | 67 - mozilla/gfx/tests/TestColorNames.cpp | 114 - mozilla/gfx/tests/TestRect.cpp | 431 - mozilla/gfx/tests/btest/BitTest.cpp | 1194 --- mozilla/gfx/tests/btest/image.rc | 44 - mozilla/gfx/tests/btest/makefile.win | 62 - mozilla/gfx/tests/btest/resource.h | 31 - mozilla/gfx/tests/btest/resources.h | 37 - mozilla/gfx/tests/makefile.win | 70 - mozilla/htmlparser/Makefile | 27 - mozilla/htmlparser/macbuild/htmlparser.mcp | Bin 42471 -> 0 bytes mozilla/htmlparser/makefile.win | 23 - mozilla/htmlparser/robot/Makefile | 54 - mozilla/htmlparser/robot/makefile.win | 54 - mozilla/htmlparser/robot/nsDebugRobot.cpp | 261 - mozilla/htmlparser/robot/nsIRobotSink.h | 39 - .../htmlparser/robot/nsIRobotSinkObserver.h | 35 - mozilla/htmlparser/robot/nsRobotSink.cpp | 291 - mozilla/htmlparser/robot/test/RobotMain.cpp | 17 - mozilla/htmlparser/robot/test/makefile.win | 55 - mozilla/htmlparser/src/CNavDTD.cpp | 2768 ------ mozilla/htmlparser/src/CNavDTD.h | 710 -- mozilla/htmlparser/src/COtherDTD.cpp | 963 -- mozilla/htmlparser/src/COtherDTD.h | 599 -- mozilla/htmlparser/src/MANIFEST | 14 - mozilla/htmlparser/src/Makefile | 76 - mozilla/htmlparser/src/SelfTest.cpp | 190 - mozilla/htmlparser/src/makefile.win | 119 - mozilla/htmlparser/src/nsDTDDebug.cpp | 546 - mozilla/htmlparser/src/nsHTMLContentSink.cpp | 468 - mozilla/htmlparser/src/nsHTMLContentSink.h | 169 - mozilla/htmlparser/src/nsHTMLTags.cpp | 97 - mozilla/htmlparser/src/nsHTMLTags.h | 71 - mozilla/htmlparser/src/nsHTMLTokens.cpp | 1272 --- mozilla/htmlparser/src/nsHTMLTokens.h | 289 - mozilla/htmlparser/src/nsIContentSink.h | 127 - mozilla/htmlparser/src/nsIDTD.h | 160 - mozilla/htmlparser/src/nsIDTDDebug.h | 58 - mozilla/htmlparser/src/nsIHTMLContentSink.h | 259 - mozilla/htmlparser/src/nsIParser.h | 99 - mozilla/htmlparser/src/nsIParserFilter.h | 51 - mozilla/htmlparser/src/nsIParserNode.h | 126 - mozilla/htmlparser/src/nsITokenHandler.h | 44 - mozilla/htmlparser/src/nsParser.cpp | 963 -- mozilla/htmlparser/src/nsParser.h | 344 - mozilla/htmlparser/src/nsParserNode.cpp | 204 - mozilla/htmlparser/src/nsParserNode.h | 161 - mozilla/htmlparser/src/nsParserTypes.h | 83 - mozilla/htmlparser/src/nsScanner.cpp | 531 - mozilla/htmlparser/src/nsScanner.h | 272 - mozilla/htmlparser/src/nsToken.cpp | 198 - mozilla/htmlparser/src/nsToken.h | 181 - mozilla/htmlparser/src/nsTokenHandler.cpp | 86 - mozilla/htmlparser/src/nsTokenHandler.h | 53 - mozilla/htmlparser/src/nsTokenizer.cpp | 327 - mozilla/htmlparser/src/nsTokenizer.h | 185 - mozilla/htmlparser/src/nshtmlpars.h | 37 - mozilla/htmlparser/src/prstrm.cpp | 343 - mozilla/htmlparser/src/prstrm.h | 106 - mozilla/htmlparser/tests/html/Table01.html | 11 - mozilla/htmlparser/tests/html/Table02.html | 14 - mozilla/htmlparser/tests/html/Table03.html | 11 - mozilla/htmlparser/tests/html/Table04.html | 53 - mozilla/htmlparser/tests/html/Table05.html | 12 - mozilla/htmlparser/tests/html/Table05e.html | 21 - mozilla/htmlparser/tests/html/Table05f.html | 16 - mozilla/htmlparser/tests/html/Table05g.html | 13 - mozilla/htmlparser/tests/html/Table05h.html | 12 - mozilla/htmlparser/tests/html/Table05i.html | 13 - mozilla/htmlparser/tests/html/Table05j.html | 11 - mozilla/htmlparser/tests/html/Table06.html | 13 - mozilla/htmlparser/tests/html/acronym1.html | 14 - mozilla/htmlparser/tests/html/aname01.html | 17 - mozilla/htmlparser/tests/html/atoi01.html | 13 - .../tests/html/attribute_quote_bug1.html | 13 - mozilla/htmlparser/tests/html/bdo001.html | 14 - mozilla/htmlparser/tests/html/br001.html | 11 - mozilla/htmlparser/tests/html/button001.html | 19 - mozilla/htmlparser/tests/html/button002.html | 34 - mozilla/htmlparser/tests/html/center001.html | 29 - mozilla/htmlparser/tests/html/center002.html | 36 - mozilla/htmlparser/tests/html/col001.html | 21 - mozilla/htmlparser/tests/html/col002.html | 24 - mozilla/htmlparser/tests/html/col003.html | 31 - mozilla/htmlparser/tests/html/col004.html | 26 - mozilla/htmlparser/tests/html/col005.html | 39 - mozilla/htmlparser/tests/html/col006.html | 261 - mozilla/htmlparser/tests/html/col007.html | 39 - mozilla/htmlparser/tests/html/col008.html | 35 - mozilla/htmlparser/tests/html/col009.html | 29 - mozilla/htmlparser/tests/html/col010.html | 22 - mozilla/htmlparser/tests/html/col011.html | 32 - mozilla/htmlparser/tests/html/col012.html | 27 - mozilla/htmlparser/tests/html/col013.html | 22 - mozilla/htmlparser/tests/html/col014.html | 22 - mozilla/htmlparser/tests/html/col015.html | 22 - mozilla/htmlparser/tests/html/col016.html | 31 - mozilla/htmlparser/tests/html/del001.html | 14 - mozilla/htmlparser/tests/html/del002.html | 17 - mozilla/htmlparser/tests/html/del003.html | 12 - mozilla/htmlparser/tests/html/del004.html | 13 - mozilla/htmlparser/tests/html/del005.html | 22 - mozilla/htmlparser/tests/html/del006.html | 21 - mozilla/htmlparser/tests/html/del007.html | 21 - mozilla/htmlparser/tests/html/del008.html | 22 - mozilla/htmlparser/tests/html/del009.html | 19 - mozilla/htmlparser/tests/html/del010.html | 16 - mozilla/htmlparser/tests/html/del011.html | 23 - mozilla/htmlparser/tests/html/doc001.html | 0 mozilla/htmlparser/tests/html/doc002.html | 10 - mozilla/htmlparser/tests/html/endswithcr.html | 1 - mozilla/htmlparser/tests/html/entity001.html | 12 - .../htmlparser/tests/html/fieldset001.html | 22 - .../htmlparser/tests/html/fieldset002.html | 56 - .../htmlparser/tests/html/fieldset003.html | 26 - mozilla/htmlparser/tests/html/form001.html | 13 - mozilla/htmlparser/tests/html/form002.html | 22 - mozilla/htmlparser/tests/html/head01.html | 9 - mozilla/htmlparser/tests/html/head02.html | 11 - mozilla/htmlparser/tests/html/head03.html | 9 - mozilla/htmlparser/tests/html/home01.html | 976 -- mozilla/htmlparser/tests/html/html001.html | 8 - mozilla/htmlparser/tests/html/imgmap001.html | 13 - mozilla/htmlparser/tests/html/ins001.html | 14 - mozilla/htmlparser/tests/html/ins002.html | 18 - mozilla/htmlparser/tests/html/ins003.html | 13 - mozilla/htmlparser/tests/html/insdel01.html | 16 - mozilla/htmlparser/tests/html/insdel02.html | 16 - mozilla/htmlparser/tests/html/layer001.html | 20 - mozilla/htmlparser/tests/html/layer002.html | 28 - mozilla/htmlparser/tests/html/layer003.html | 29 - mozilla/htmlparser/tests/html/layer01.html | 22 - mozilla/htmlparser/tests/html/list001.html | 33 - mozilla/htmlparser/tests/html/list002.html | 15 - mozilla/htmlparser/tests/html/list003.html | 19 - mozilla/htmlparser/tests/html/newlines.html | 3 - mozilla/htmlparser/tests/html/obj001.html | 12 - mozilla/htmlparser/tests/html/obj002.html | 9 - mozilla/htmlparser/tests/html/obj003.html | 17 - mozilla/htmlparser/tests/html/param001.html | 10 - mozilla/htmlparser/tests/html/param002.html | 14 - mozilla/htmlparser/tests/html/pre001.html | 9 - mozilla/htmlparser/tests/html/pre002.html | 11 - mozilla/htmlparser/tests/html/pre003.html | 8 - mozilla/htmlparser/tests/html/pre004.html | 18 - mozilla/htmlparser/tests/html/pre005.html | 53 - mozilla/htmlparser/tests/html/pre006.html | 28 - mozilla/htmlparser/tests/html/pre007.html | 12 - mozilla/htmlparser/tests/html/pre012.html | 22 - mozilla/htmlparser/tests/html/pre015.html | 18 - mozilla/htmlparser/tests/html/pre016.html | 17 - mozilla/htmlparser/tests/html/q001.html | 18 - mozilla/htmlparser/tests/html/quote001.html | 51 - mozilla/htmlparser/tests/html/quote002.html | 33 - mozilla/htmlparser/tests/html/quote003.html | 14 - mozilla/htmlparser/tests/html/span001.html | 30 - mozilla/htmlparser/tests/html/span002.html | 21 - mozilla/htmlparser/tests/html/span003.html | 17 - mozilla/htmlparser/tests/html/strike002.html | 17 - mozilla/htmlparser/tests/html/strike005.html | 22 - mozilla/htmlparser/tests/html/strike006.html | 18 - mozilla/htmlparser/tests/html/strike007.html | 20 - mozilla/htmlparser/tests/html/strike008.html | 26 - mozilla/htmlparser/tests/html/table05a.html | 14 - mozilla/htmlparser/tests/html/table05b.html | 14 - mozilla/htmlparser/tests/html/table05c.html | 14 - mozilla/htmlparser/tests/html/table05d.html | 13 - mozilla/htmlparser/tests/html/table05k.html | 19 - mozilla/htmlparser/tests/html/table05l.html | 14 - mozilla/htmlparser/tests/html/table05m.html | 5 - mozilla/htmlparser/tests/html/table05n.html | 11 - mozilla/htmlparser/tests/html/table05o.html | 6 - mozilla/htmlparser/tests/html/table07.html | 13 - mozilla/htmlparser/tests/html/table200.html | 21 - mozilla/htmlparser/tests/html/table201.html | 22 - mozilla/htmlparser/tests/html/table202.html | 23 - mozilla/htmlparser/tests/html/table203.html | 29 - mozilla/htmlparser/tests/html/table204.html | 23 - mozilla/htmlparser/tests/html/table205.html | 28 - mozilla/htmlparser/tests/html/tableall.html | 81 - mozilla/htmlparser/tests/html/tag001.html | 3 - mozilla/htmlparser/tests/html/tag002.html | 23 - mozilla/htmlparser/tests/html/tag003.html | 10 - mozilla/htmlparser/tests/html/tag004.html | 4 - mozilla/htmlparser/tests/html/tag005.html | 7 - mozilla/htmlparser/tests/html/tag006.html | 6 - mozilla/htmlparser/tests/html/tag007.html | 5 - mozilla/htmlparser/tests/html/tag008.html | 4 - mozilla/htmlparser/tests/html/target01.html | 7 - mozilla/htmlparser/tests/html/tbody001.html | 17 - mozilla/htmlparser/tests/html/text001.html | 8 - mozilla/htmlparser/tests/html/text002.html | 8 - mozilla/htmlparser/tests/html/text003.html | 12 - mozilla/htmlparser/tests/html/thead001.html | 25 - mozilla/htmlparser/tests/html/title01.html | 6 - mozilla/htmlparser/tests/html/usascii.html | 26 - mozilla/htmlparser/tests/html/utf8001.html | 9 - mozilla/htmlparser/tests/html/value001.html | 14 - mozilla/htmlparser/tests/html/xmp005.html | 48 - mozilla/htmlparser/tests/windows/Selftest.cpp | 148 - mozilla/htmlparser/tools/gentags.pl | 331 - mozilla/layout/Makefile | 24 - mozilla/layout/base/Makefile | 24 - mozilla/layout/base/makefile.win | 22 - mozilla/layout/base/nsCSSRendering.cpp | 923 -- mozilla/layout/base/nsCSSRendering.h | 106 - mozilla/layout/base/nsIPresShell.h | 99 - mozilla/layout/base/nsPresContext.cpp | 408 - mozilla/layout/base/nsPresContext.h | 185 - mozilla/layout/base/public/MANIFEST | 24 - mozilla/layout/base/public/Makefile | 48 - mozilla/layout/base/public/makefile.win | 47 - mozilla/layout/base/public/nsIContent.h | 141 - .../layout/base/public/nsIContentDelegate.h | 47 - mozilla/layout/base/public/nsIDocument.h | 213 - .../layout/base/public/nsIDocumentContainer.h | 71 - .../layout/base/public/nsIDocumentObserver.h | 180 - mozilla/layout/base/public/nsIFrame.h | 663 -- .../layout/base/public/nsIFrameImageLoader.h | 73 - mozilla/layout/base/public/nsIPresContext.h | 185 - mozilla/layout/base/public/nsIPresShell.h | 99 - mozilla/layout/base/public/nsIReflowCommand.h | 116 - mozilla/layout/base/public/nsIRunaround.h | 75 - mozilla/layout/base/public/nsISelection.h | 69 - mozilla/layout/base/public/nsISpaceManager.h | 202 - mozilla/layout/base/public/nsIStyleContext.h | 207 - mozilla/layout/base/public/nsIStyleRule.h | 43 - mozilla/layout/base/public/nsIStyleSet.h | 97 - mozilla/layout/base/public/nsIStyleSheet.h | 55 - mozilla/layout/base/public/nsITextContent.h | 48 - mozilla/layout/base/public/nsPresContext.h | 185 - mozilla/layout/base/public/nsStyleCoord.h | 237 - mozilla/layout/base/public/nsStyleStruct.h | 38 - mozilla/layout/base/public/nslayout.h | 32 - mozilla/layout/base/src/Makefile | 58 - mozilla/layout/base/src/makefile.win | 80 - mozilla/layout/base/src/nsContainerFrame.cpp | 1343 --- mozilla/layout/base/src/nsContainerFrame.h | 372 - mozilla/layout/base/src/nsDocument.cpp | 944 -- mozilla/layout/base/src/nsDocument.h | 254 - mozilla/layout/base/src/nsFrame.cpp | 1991 ---- mozilla/layout/base/src/nsFrame.h | 312 - .../layout/base/src/nsFrameImageLoader.cpp | 319 - mozilla/layout/base/src/nsFrameImageLoader.h | 81 - mozilla/layout/base/src/nsGalleyContext.cpp | 71 - mozilla/layout/base/src/nsPresContext.cpp | 408 - mozilla/layout/base/src/nsPresContext.h | 84 - mozilla/layout/base/src/nsPresShell.cpp | 751 -- .../layout/base/src/nsPrintPreviewContext.cpp | 88 - mozilla/layout/base/src/nsSelection.cpp | 102 - mozilla/layout/base/src/nsSelection.h | 65 - mozilla/layout/base/src/nsSelectionPoint.cpp | 52 - mozilla/layout/base/src/nsSelectionPoint.h | 55 - mozilla/layout/base/src/nsSelectionRange.cpp | 94 - mozilla/layout/base/src/nsSelectionRange.h | 89 - mozilla/layout/base/src/nsSpaceManager.cpp | 1070 -- mozilla/layout/base/src/nsSpaceManager.h | 162 - mozilla/layout/base/src/nsSplittableFrame.cpp | 220 - mozilla/layout/base/src/nsSplittableFrame.h | 75 - mozilla/layout/base/src/nsStyleConsts.h | 250 - mozilla/layout/base/src/nsStyleContext.cpp | 998 -- mozilla/layout/base/src/nsStyleCoord.cpp | 252 - mozilla/layout/base/src/nsStyleSet.cpp | 819 -- mozilla/layout/base/tests/Makefile | 22 - .../layout/base/tests/TestContainerFrame.cpp | 737 -- .../layout/base/tests/TestSpaceManager.cpp | 761 -- mozilla/layout/base/tests/makefile.win | 58 - mozilla/layout/build/Makefile | 66 - mozilla/layout/build/dlldeps.cpp | 35 - mozilla/layout/build/makefile.win | 88 - mozilla/layout/config/config.mak | 30 - mozilla/layout/config/rules.mak | 19 - mozilla/layout/css/Makefile | 24 - mozilla/layout/css/layout/Makefile | 24 - mozilla/layout/css/layout/makefile.win | 22 - mozilla/layout/css/layout/public/Makefile | 28 - mozilla/layout/css/layout/public/makefile.win | 27 - .../css/layout/public/nsIInlineReflow.h | 101 - mozilla/layout/css/layout/src/Makefile | 47 - mozilla/layout/css/layout/src/makefile.win | 57 - .../layout/css/layout/src/nsCSSBlockFrame.cpp | 3894 -------- .../layout/css/layout/src/nsCSSBlockFrame.h | 136 - .../css/layout/src/nsCSSContainerFrame.cpp | 50 - .../css/layout/src/nsCSSInlineFrame.cpp | 1033 -- .../layout/css/layout/src/nsCSSInlineFrame.h | 132 - .../css/layout/src/nsCSSInlineLayout.cpp | 449 - .../layout/css/layout/src/nsCSSInlineLayout.h | 110 - .../layout/css/layout/src/nsCSSLineLayout.cpp | 107 - .../layout/css/layout/src/nsCSSLineLayout.h | 120 - mozilla/layout/css/makefile.win | 22 - mozilla/layout/events/Makefile | 24 - mozilla/layout/events/public/Makefile | 29 - mozilla/layout/events/public/makefile.win | 29 - .../events/public/nsIEventListenerManager.h | 89 - .../events/public/nsIEventStateManager.h | 58 - mozilla/layout/events/src/Makefile | 46 - mozilla/layout/events/src/makefile.win | 56 - mozilla/layout/events/src/nsDOMEvent.cpp | 175 - mozilla/layout/events/src/nsDOMEvent.h | 80 - .../events/src/nsEventListenerManager.cpp | 340 - .../events/src/nsEventListenerManager.h | 78 - .../layout/events/src/nsEventStateManager.cpp | 67 - .../layout/events/src/nsEventStateManager.h | 52 - mozilla/layout/generic/broken-image.gif | Bin 338 -> 0 bytes .../layout/generic/nsHTMLContainerFrame.cpp | 385 - mozilla/layout/generic/nsHTMLContainerFrame.h | 64 - mozilla/layout/generic/nsHTMLParts.h | 172 - .../layout/generic/nsHTMLReflowCommand.cpp | 165 - mozilla/layout/generic/nsHTMLReflowCommand.h | 63 - mozilla/layout/generic/nsIFrame.h | 663 -- mozilla/layout/generic/nsImageMap.cpp | 750 -- mozilla/layout/generic/nsLeafFrame.cpp | 121 - mozilla/layout/generic/nsLeafFrame.h | 72 - mozilla/layout/generic/nsPageFrame.cpp | 213 - mozilla/layout/generic/nsPageFrame.h | 50 - mozilla/layout/generic/nsPlaceholderFrame.cpp | 223 - mozilla/layout/generic/nsPlaceholderFrame.h | 77 - mozilla/layout/generic/nsSelection.cpp | 102 - mozilla/layout/generic/nsSpaceManager.cpp | 1070 -- mozilla/layout/generic/nsSpaceManager.h | 162 - mozilla/layout/html/Makefile | 26 - mozilla/layout/html/base/Makefile | 24 - mozilla/layout/html/base/makefile.win | 22 - mozilla/layout/html/base/src/MANIFEST | 5 - mozilla/layout/html/base/src/Makefile | 71 - mozilla/layout/html/base/src/broken-image.gif | Bin 338 -> 0 bytes mozilla/layout/html/base/src/makefile.win | 106 - .../layout/html/base/src/nsAbsoluteFrame.cpp | 226 - .../layout/html/base/src/nsAbsoluteFrame.h | 84 - mozilla/layout/html/base/src/nsBRPart.cpp | 250 - mozilla/layout/html/base/src/nsBodyFrame.cpp | 812 -- mozilla/layout/html/base/src/nsBodyFrame.h | 125 - mozilla/layout/html/base/src/nsBodyPart.cpp | 92 - .../layout/html/base/src/nsDOMAttributes.cpp | 254 - .../layout/html/base/src/nsDOMAttributes.h | 78 - .../layout/html/base/src/nsDOMIterator.cpp | 190 - mozilla/layout/html/base/src/nsDOMIterator.h | 54 - .../html/base/src/nsGlobalVariables.cpp | 102 - .../layout/html/base/src/nsGlobalVariables.h | 133 - mozilla/layout/html/base/src/nsHRPart.cpp | 485 - mozilla/layout/html/base/src/nsHTMLAtoms.cpp | 406 - mozilla/layout/html/base/src/nsHTMLAtoms.h | 181 - mozilla/layout/html/base/src/nsHTMLBase.cpp | 202 - mozilla/layout/html/base/src/nsHTMLBase.h | 48 - mozilla/layout/html/base/src/nsHTMLBullet.cpp | 632 -- .../layout/html/base/src/nsHTMLContainer.cpp | 972 -- .../layout/html/base/src/nsHTMLContainer.h | 79 - .../html/base/src/nsHTMLContainerFrame.cpp | 385 - .../html/base/src/nsHTMLContainerFrame.h | 64 - .../layout/html/base/src/nsHTMLContent.cpp | 643 -- mozilla/layout/html/base/src/nsHTMLContent.h | 158 - mozilla/layout/html/base/src/nsHTMLHead.cpp | 74 - mozilla/layout/html/base/src/nsHTMLIIDs.cpp | 33 - mozilla/layout/html/base/src/nsHTMLIIDs.h | 32 - mozilla/layout/html/base/src/nsHTMLImage.cpp | 880 -- mozilla/layout/html/base/src/nsHTMLImage.h | 72 - mozilla/layout/html/base/src/nsHTMLParts.h | 172 - .../html/base/src/nsHTMLReflowCommand.cpp | 165 - .../html/base/src/nsHTMLReflowCommand.h | 63 - .../layout/html/base/src/nsHTMLTagContent.cpp | 1028 -- .../layout/html/base/src/nsHTMLTagContent.h | 234 - .../layout/html/base/src/nsIAbsoluteItems.h | 51 - .../layout/html/base/src/nsIAnchoredItems.h | 52 - .../html/base/src/nsIFloaterContainer.h | 50 - mozilla/layout/html/base/src/nsIHTMLContent.h | 90 - mozilla/layout/html/base/src/nsIImageMap.h | 81 - mozilla/layout/html/base/src/nsImageMap.cpp | 750 -- mozilla/layout/html/base/src/nsLeafFrame.cpp | 121 - mozilla/layout/html/base/src/nsLeafFrame.h | 72 - mozilla/layout/html/base/src/nsPageFrame.cpp | 213 - mozilla/layout/html/base/src/nsPageFrame.h | 50 - .../html/base/src/nsPlaceholderFrame.cpp | 223 - .../layout/html/base/src/nsPlaceholderFrame.h | 77 - mozilla/layout/html/base/src/nsRootPart.cpp | 573 -- .../layout/html/base/src/nsScrollFrame.cpp | 572 -- mozilla/layout/html/base/src/nsScrollFrame.h | 27 - mozilla/layout/html/base/src/nsSpacerPart.cpp | 322 - .../layout/html/base/src/nsTextContent.cpp | 1705 ---- mozilla/layout/html/base/src/nsWBRPart.cpp | 73 - mozilla/layout/html/content/Makefile | 24 - mozilla/layout/html/content/makefile.win | 22 - mozilla/layout/html/content/src/Makefile | 43 - mozilla/layout/html/content/src/makefile.win | 55 - .../layout/html/content/src/nsHTMLComment.cpp | 103 - .../layout/html/content/src/nsHTMLHead.cpp | 74 - .../layout/html/content/src/nsHTMLMeta.cpp | 76 - .../layout/html/content/src/nsHTMLTitle.cpp | 102 - mozilla/layout/html/document/Makefile | 24 - mozilla/layout/html/document/makefile.win | 22 - mozilla/layout/html/document/public/MANIFEST | 5 - .../layout/html/document/public/makefile.win | 25 - .../layout/html/document/public/nsIWebFrame.h | 43 - mozilla/layout/html/document/src/Makefile | 68 - mozilla/layout/html/document/src/makefile.win | 62 - .../html/document/src/nsHTMLContentSink.cpp | 1711 ---- .../html/document/src/nsHTMLDocument.cpp | 301 - .../layout/html/document/src/nsHTMLDocument.h | 76 - .../layout/html/document/src/nsHTMLIFrame.cpp | 643 -- .../layout/html/document/src/nsHTMLParts.cpp | 155 - .../html/document/src/nsIHTMLDocument.h | 41 - mozilla/layout/html/document/src/ua.css | 316 - mozilla/layout/html/forms/Makefile | 24 - mozilla/layout/html/forms/makefile.win | 22 - mozilla/layout/html/forms/public/Makefile | 29 - mozilla/layout/html/forms/public/makefile.win | 25 - .../layout/html/forms/public/nsIFormControl.h | 113 - .../layout/html/forms/public/nsIFormManager.h | 152 - mozilla/layout/html/forms/src/Makefile | 49 - mozilla/layout/html/forms/src/makefile.win | 52 - mozilla/layout/html/forms/src/nsForm.cpp | 1092 -- mozilla/layout/html/forms/src/nsHTMLForms.h | 169 - mozilla/layout/html/forms/src/nsInput.cpp | 519 - mozilla/layout/html/forms/src/nsInput.h | 215 - .../layout/html/forms/src/nsInputButton.cpp | 658 -- .../layout/html/forms/src/nsInputCheckbox.cpp | 270 - .../layout/html/forms/src/nsInputCheckbox.h | 58 - mozilla/layout/html/forms/src/nsInputFile.cpp | 317 - mozilla/layout/html/forms/src/nsInputFile.h | 74 - .../layout/html/forms/src/nsInputFrame.cpp | 667 -- mozilla/layout/html/forms/src/nsInputFrame.h | 230 - .../layout/html/forms/src/nsInputRadio.cpp | 351 - mozilla/layout/html/forms/src/nsInputRadio.h | 93 - mozilla/layout/html/forms/src/nsInputText.cpp | 433 - mozilla/layout/html/forms/src/nsInputText.h | 79 - mozilla/layout/html/forms/src/nsSelect.cpp | 695 -- mozilla/layout/html/makefile.win | 22 - mozilla/layout/html/style/Makefile | 24 - mozilla/layout/html/style/makefile.win | 22 - mozilla/layout/html/style/public/MANIFEST | 5 - mozilla/layout/html/style/public/Makefile | 28 - mozilla/layout/html/style/public/makefile.win | 24 - .../layout/html/style/public/nsICSSParser.h | 65 - mozilla/layout/html/style/src/Makefile | 52 - mozilla/layout/html/style/src/makefile.win | 54 - .../html/style/src/nsCSSDeclaration.cpp | 2084 ---- .../layout/html/style/src/nsCSSKeywordIDs.h | 106 - .../layout/html/style/src/nsCSSKeywords.cpp | 452 - mozilla/layout/html/style/src/nsCSSKeywords.h | 40 - mozilla/layout/html/style/src/nsCSSLayout.cpp | 351 - mozilla/layout/html/style/src/nsCSSLayout.h | 81 - mozilla/layout/html/style/src/nsCSSParser.cpp | 2418 ----- mozilla/layout/html/style/src/nsCSSPropIDs.h | 82 - mozilla/layout/html/style/src/nsCSSProps.cpp | 365 - mozilla/layout/html/style/src/nsCSSProps.h | 40 - .../layout/html/style/src/nsCSSRendering.cpp | 923 -- .../layout/html/style/src/nsCSSRendering.h | 106 - .../layout/html/style/src/nsCSSScanner.cpp | 584 -- mozilla/layout/html/style/src/nsCSSScanner.h | 118 - .../layout/html/style/src/nsCSSStyleRule.cpp | 1090 -- .../layout/html/style/src/nsCSSStyleSheet.cpp | 885 -- .../html/style/src/nsHTMLAttributes.cpp | 705 -- .../html/style/src/nsHTMLCSSStyleSheet.cpp | 240 - .../html/style/src/nsHTMLStyleSheet.cpp | 236 - mozilla/layout/html/style/src/nsHTMLValue.cpp | 304 - mozilla/layout/html/style/src/nsHTMLValue.h | 151 - .../layout/html/style/src/nsICSSDeclaration.h | 334 - .../layout/html/style/src/nsICSSStyleRule.h | 76 - .../layout/html/style/src/nsICSSStyleSheet.h | 47 - .../layout/html/style/src/nsIHTMLAttributes.h | 65 - .../html/style/src/nsIHTMLCSSStyleSheet.h | 36 - .../layout/html/style/src/nsIHTMLStyleSheet.h | 36 - mozilla/layout/html/table/Makefile | 24 - mozilla/layout/html/table/makefile.win | 22 - .../table/src/BasicTableLayoutStrategy.cpp | 1433 --- .../html/table/src/BasicTableLayoutStrategy.h | 212 - mozilla/layout/html/table/src/Makefile | 56 - mozilla/layout/html/table/src/makefile.win | 61 - .../html/table/src/nsCellLayoutData.cpp | 573 -- .../layout/html/table/src/nsCellLayoutData.h | 197 - mozilla/layout/html/table/src/nsCellMap.cpp | 113 - mozilla/layout/html/table/src/nsCellMap.h | 94 - .../layout/html/table/src/nsColLayoutData.cpp | 109 - .../layout/html/table/src/nsColLayoutData.h | 99 - .../layout/html/table/src/nsITableContent.h | 86 - .../html/table/src/nsITableLayoutStrategy.h | 55 - .../layout/html/table/src/nsTableCaption.cpp | 158 - .../layout/html/table/src/nsTableCaption.h | 77 - mozilla/layout/html/table/src/nsTableCell.cpp | 403 - mozilla/layout/html/table/src/nsTableCell.h | 137 - .../html/table/src/nsTableCellFrame.cpp | 631 -- .../layout/html/table/src/nsTableCellFrame.h | 187 - mozilla/layout/html/table/src/nsTableCol.cpp | 277 - mozilla/layout/html/table/src/nsTableCol.h | 156 - .../layout/html/table/src/nsTableColFrame.h | 85 - .../layout/html/table/src/nsTableColGroup.cpp | 381 - .../layout/html/table/src/nsTableColGroup.h | 181 - .../html/table/src/nsTableColGroupFrame.cpp | 237 - .../html/table/src/nsTableColGroupFrame.h | 93 - .../layout/html/table/src/nsTableContent.cpp | 242 - .../layout/html/table/src/nsTableContent.h | 119 - .../layout/html/table/src/nsTableFrame.cpp | 3279 ------ mozilla/layout/html/table/src/nsTableFrame.h | 461 - .../html/table/src/nsTableOuterFrame.cpp | 1336 --- .../layout/html/table/src/nsTableOuterFrame.h | 215 - mozilla/layout/html/table/src/nsTablePart.cpp | 802 -- mozilla/layout/html/table/src/nsTablePart.h | 125 - mozilla/layout/html/table/src/nsTableRow.cpp | 337 - mozilla/layout/html/table/src/nsTableRow.h | 133 - .../layout/html/table/src/nsTableRowFrame.cpp | 1486 --- .../layout/html/table/src/nsTableRowFrame.h | 219 - .../layout/html/table/src/nsTableRowGroup.cpp | 339 - .../layout/html/table/src/nsTableRowGroup.h | 118 - .../html/table/src/nsTableRowGroupFrame.cpp | 1237 --- .../html/table/src/nsTableRowGroupFrame.h | 180 - .../html/tests/CellMapTest/CellMapTest.cpp | 122 - mozilla/layout/html/tests/Makefile | 66 - mozilla/layout/html/tests/TestAppend.js | 102 - mozilla/layout/html/tests/TestAttributes.cpp | 278 - mozilla/layout/html/tests/TestCSSParser.cpp | 130 - .../html/tests/TestCSSPropertyLookup.cpp | 135 - mozilla/layout/html/tests/TestCSSScanner.cpp | 103 - mozilla/layout/html/tests/TestDelete.js | 169 - .../layout/html/tests/TestHTMLTagLookup.cpp | 73 - mozilla/layout/html/tests/TestInlineFrame.cpp | 1661 ---- mozilla/layout/html/tests/TestInsert.js | 83 - mozilla/layout/html/tests/TestTextDOM.js | 213 - mozilla/layout/html/tests/css/IMPORTANT.css | 35 - mozilla/layout/html/tests/css/INVALID.css | 391 - mozilla/layout/html/tests/css/SELECTORS.css | 32 - .../html/tests/css/background-attachment.css | 28 - .../html/tests/css/background-color.css | 24 - .../html/tests/css/background-image.css | 23 - .../html/tests/css/background-position.css | 43 - .../html/tests/css/background-repeat.css | 25 - mozilla/layout/html/tests/css/background.css | 32 - .../html/tests/css/border-bottom-width.css | 23 - .../layout/html/tests/css/border-bottom.css | 24 - .../layout/html/tests/css/border-color.css | 20 - .../html/tests/css/border-left-width.css | 20 - mozilla/layout/html/tests/css/border-left.css | 24 - .../html/tests/css/border-right-width.css | 20 - .../layout/html/tests/css/border-right.css | 24 - .../layout/html/tests/css/border-style.css | 28 - .../html/tests/css/border-top-width.css | 20 - mozilla/layout/html/tests/css/border-top.css | 24 - .../layout/html/tests/css/border-width.css | 25 - mozilla/layout/html/tests/css/border.css | 24 - mozilla/layout/html/tests/css/bugs/bug01.css | 19 - mozilla/layout/html/tests/css/bugs/bug02.css | 20 - mozilla/layout/html/tests/css/clear.css | 20 - mozilla/layout/html/tests/css/clip.css | 53 - mozilla/layout/html/tests/css/color.css | 22 - mozilla/layout/html/tests/css/cursor.css | 23 - mozilla/layout/html/tests/css/direction.css | 22 - mozilla/layout/html/tests/css/display.css | 20 - mozilla/layout/html/tests/css/float.css | 20 - mozilla/layout/html/tests/css/font-family.css | 17 - mozilla/layout/html/tests/css/font-size.css | 29 - mozilla/layout/html/tests/css/font-style.css | 23 - .../layout/html/tests/css/font-variant.css | 22 - mozilla/layout/html/tests/css/font-weight.css | 31 - mozilla/layout/html/tests/css/font.css | 29 - mozilla/layout/html/tests/css/height.css | 18 - mozilla/layout/html/tests/css/left.css | 19 - .../layout/html/tests/css/letter-spacing.css | 18 - mozilla/layout/html/tests/css/line-height.css | 20 - .../html/tests/css/list-style-image.css | 18 - .../html/tests/css/list-style-position.css | 18 - .../layout/html/tests/css/list-style-type.css | 25 - mozilla/layout/html/tests/css/list-style.css | 26 - .../layout/html/tests/css/margin-bottom.css | 19 - mozilla/layout/html/tests/css/margin-left.css | 19 - .../layout/html/tests/css/margin-right.css | 19 - mozilla/layout/html/tests/css/margin-top.css | 19 - mozilla/layout/html/tests/css/margin.css | 38 - mozilla/layout/html/tests/css/opacity.css | 21 - mozilla/layout/html/tests/css/overflow.css | 20 - .../layout/html/tests/css/padding-bottom.css | 18 - .../layout/html/tests/css/padding-left.css | 18 - .../layout/html/tests/css/padding-right.css | 18 - mozilla/layout/html/tests/css/padding-top.css | 18 - mozilla/layout/html/tests/css/padding.css | 30 - mozilla/layout/html/tests/css/position.css | 21 - mozilla/layout/html/tests/css/text-align.css | 20 - .../layout/html/tests/css/text-decoration.css | 26 - mozilla/layout/html/tests/css/text-indent.css | 18 - .../layout/html/tests/css/text-transform.css | 21 - mozilla/layout/html/tests/css/top.css | 19 - .../layout/html/tests/css/vertical-align.css | 25 - mozilla/layout/html/tests/css/visibility.css | 19 - mozilla/layout/html/tests/css/white-space.css | 19 - mozilla/layout/html/tests/css/width.css | 19 - .../layout/html/tests/css/word-spacing.css | 25 - mozilla/layout/html/tests/css/z-index.css | 20 - mozilla/layout/html/tests/makefile.win | 103 - .../TableContentTest/TableContentTest.cpp | 597 -- .../tests/table/testcases/nestedTables.html | 337 - .../html/tests/table/testcases/slashlogo.html | 3471 ------- .../testcases/wa_table_thtd_rowspan.html | 472 - .../table/testcases/wa_table_tr_align.html | 106 - .../tests/table/testcases/wf_table_index.html | 177 - mozilla/layout/macbuild/layout.mcp | Bin 63090 -> 0 bytes mozilla/layout/makefile.win | 22 - mozilla/layout/style/nsCSSDeclaration.cpp | 2084 ---- mozilla/layout/style/nsCSSKeywords.cpp | 452 - mozilla/layout/style/nsCSSKeywords.h | 40 - mozilla/layout/style/nsCSSParser.cpp | 2418 ----- mozilla/layout/style/nsCSSProps.cpp | 365 - mozilla/layout/style/nsCSSProps.h | 40 - mozilla/layout/style/nsCSSScanner.cpp | 584 -- mozilla/layout/style/nsCSSScanner.h | 118 - mozilla/layout/style/nsCSSStruct.cpp | 2084 ---- mozilla/layout/style/nsCSSStyleRule.cpp | 1090 -- mozilla/layout/style/nsCSSStyleSheet.cpp | 885 -- mozilla/layout/style/nsHTMLCSSStyleSheet.cpp | 240 - mozilla/layout/style/nsHTMLStyleSheet.cpp | 236 - mozilla/layout/style/nsICSSParser.h | 65 - mozilla/layout/style/nsICSSStyleRule.h | 76 - mozilla/layout/style/nsIHTMLCSSStyleSheet.h | 36 - mozilla/layout/style/nsIStyleRule.h | 43 - mozilla/layout/style/nsIStyleSheet.h | 55 - mozilla/layout/style/nsStyleContext.cpp | 998 -- mozilla/layout/style/nsStyleCoord.h | 237 - mozilla/layout/style/nsStyleSet.cpp | 819 -- mozilla/layout/style/ua.css | 316 - .../tables/BasicTableLayoutStrategy.cpp | 1433 --- .../layout/tables/BasicTableLayoutStrategy.h | 212 - mozilla/layout/tables/nsCellMap.cpp | 113 - mozilla/layout/tables/nsCellMap.h | 94 - .../layout/tables/nsITableLayoutStrategy.h | 55 - mozilla/layout/tables/nsTableCellFrame.cpp | 631 -- mozilla/layout/tables/nsTableCellFrame.h | 187 - mozilla/layout/tables/nsTableColFrame.h | 85 - .../layout/tables/nsTableColGroupFrame.cpp | 237 - mozilla/layout/tables/nsTableColGroupFrame.h | 93 - mozilla/layout/tables/nsTableFrame.cpp | 3279 ------ mozilla/layout/tables/nsTableFrame.h | 461 - mozilla/layout/tables/nsTableOuterFrame.cpp | 1336 --- mozilla/layout/tables/nsTableOuterFrame.h | 215 - mozilla/layout/tables/nsTableRowFrame.cpp | 1486 --- mozilla/layout/tables/nsTableRowFrame.h | 219 - .../layout/tables/nsTableRowGroupFrame.cpp | 1237 --- mozilla/layout/tables/nsTableRowGroupFrame.h | 180 - mozilla/layout/tools/CSSKeywords.txt | 104 - mozilla/layout/tools/CSSProps.txt | 80 - mozilla/layout/tools/ColorNames.txt | 140 - mozilla/layout/tools/HTMLTags.txt | 90 - mozilla/layout/tools/Makefile | 53 - mozilla/layout/tools/genhash.inc | 119 - mozilla/layout/tools/genhash.pl | 102 - mozilla/modules/fullsoft/Makefile | 21 - mozilla/network/main/singsign.c | 1828 ++++ mozilla/nglayout.mac | 300 - mozilla/nglayout.mak | 369 - mozilla/nglayout.mk | 165 - mozilla/parser/htmlparser/Makefile | 27 - .../parser/htmlparser/macbuild/htmlparser.mcp | Bin 42471 -> 0 bytes mozilla/parser/htmlparser/makefile.win | 23 - mozilla/parser/htmlparser/robot/Makefile | 54 - mozilla/parser/htmlparser/robot/makefile.win | 54 - .../parser/htmlparser/robot/nsDebugRobot.cpp | 261 - .../parser/htmlparser/robot/nsIRobotSink.h | 39 - .../htmlparser/robot/nsIRobotSinkObserver.h | 35 - .../parser/htmlparser/robot/nsRobotSink.cpp | 291 - .../htmlparser/robot/test/RobotMain.cpp | 17 - .../parser/htmlparser/robot/test/makefile.win | 55 - mozilla/parser/htmlparser/src/CNavDTD.cpp | 2768 ------ mozilla/parser/htmlparser/src/CNavDTD.h | 710 -- mozilla/parser/htmlparser/src/COtherDTD.cpp | 963 -- mozilla/parser/htmlparser/src/COtherDTD.h | 599 -- mozilla/parser/htmlparser/src/MANIFEST | 14 - mozilla/parser/htmlparser/src/Makefile | 76 - mozilla/parser/htmlparser/src/SelfTest.cpp | 190 - mozilla/parser/htmlparser/src/makefile.win | 119 - mozilla/parser/htmlparser/src/nsDTDDebug.cpp | 546 - .../htmlparser/src/nsHTMLContentSink.cpp | 468 - .../parser/htmlparser/src/nsHTMLContentSink.h | 169 - mozilla/parser/htmlparser/src/nsHTMLTags.cpp | 97 - mozilla/parser/htmlparser/src/nsHTMLTags.h | 71 - .../parser/htmlparser/src/nsHTMLTokens.cpp | 1272 --- mozilla/parser/htmlparser/src/nsHTMLTokens.h | 289 - .../parser/htmlparser/src/nsIContentSink.h | 127 - mozilla/parser/htmlparser/src/nsIDTD.h | 160 - mozilla/parser/htmlparser/src/nsIDTDDebug.h | 58 - .../htmlparser/src/nsIHTMLContentSink.h | 259 - mozilla/parser/htmlparser/src/nsIParser.h | 99 - .../parser/htmlparser/src/nsIParserFilter.h | 51 - mozilla/parser/htmlparser/src/nsIParserNode.h | 126 - .../parser/htmlparser/src/nsITokenHandler.h | 44 - mozilla/parser/htmlparser/src/nsParser.cpp | 963 -- mozilla/parser/htmlparser/src/nsParser.h | 344 - .../parser/htmlparser/src/nsParserNode.cpp | 204 - mozilla/parser/htmlparser/src/nsParserNode.h | 161 - mozilla/parser/htmlparser/src/nsParserTypes.h | 83 - mozilla/parser/htmlparser/src/nsScanner.cpp | 531 - mozilla/parser/htmlparser/src/nsScanner.h | 272 - mozilla/parser/htmlparser/src/nsToken.cpp | 198 - mozilla/parser/htmlparser/src/nsToken.h | 181 - .../parser/htmlparser/src/nsTokenHandler.cpp | 86 - .../parser/htmlparser/src/nsTokenHandler.h | 53 - mozilla/parser/htmlparser/src/nsTokenizer.cpp | 327 - mozilla/parser/htmlparser/src/nsTokenizer.h | 185 - mozilla/parser/htmlparser/src/nshtmlpars.h | 37 - mozilla/parser/htmlparser/src/prstrm.cpp | 343 - mozilla/parser/htmlparser/src/prstrm.h | 106 - .../parser/htmlparser/tests/html/Table01.html | 11 - .../parser/htmlparser/tests/html/Table02.html | 14 - .../parser/htmlparser/tests/html/Table03.html | 11 - .../parser/htmlparser/tests/html/Table04.html | 53 - .../parser/htmlparser/tests/html/Table05.html | 12 - .../htmlparser/tests/html/Table05e.html | 21 - .../htmlparser/tests/html/Table05f.html | 16 - .../htmlparser/tests/html/Table05g.html | 13 - .../htmlparser/tests/html/Table05h.html | 12 - .../htmlparser/tests/html/Table05i.html | 13 - .../htmlparser/tests/html/Table05j.html | 11 - .../parser/htmlparser/tests/html/Table06.html | 13 - .../htmlparser/tests/html/acronym1.html | 14 - .../parser/htmlparser/tests/html/aname01.html | 17 - .../parser/htmlparser/tests/html/atoi01.html | 13 - .../tests/html/attribute_quote_bug1.html | 13 - .../parser/htmlparser/tests/html/bdo001.html | 14 - .../parser/htmlparser/tests/html/br001.html | 11 - .../htmlparser/tests/html/button001.html | 19 - .../htmlparser/tests/html/button002.html | 34 - .../htmlparser/tests/html/center001.html | 29 - .../htmlparser/tests/html/center002.html | 36 - .../parser/htmlparser/tests/html/col001.html | 21 - .../parser/htmlparser/tests/html/col002.html | 24 - .../parser/htmlparser/tests/html/col003.html | 31 - .../parser/htmlparser/tests/html/col004.html | 26 - .../parser/htmlparser/tests/html/col005.html | 39 - .../parser/htmlparser/tests/html/col006.html | 261 - .../parser/htmlparser/tests/html/col007.html | 39 - .../parser/htmlparser/tests/html/col008.html | 35 - .../parser/htmlparser/tests/html/col009.html | 29 - .../parser/htmlparser/tests/html/col010.html | 22 - .../parser/htmlparser/tests/html/col011.html | 32 - .../parser/htmlparser/tests/html/col012.html | 27 - .../parser/htmlparser/tests/html/col013.html | 22 - .../parser/htmlparser/tests/html/col014.html | 22 - .../parser/htmlparser/tests/html/col015.html | 22 - .../parser/htmlparser/tests/html/col016.html | 31 - .../parser/htmlparser/tests/html/del001.html | 14 - .../parser/htmlparser/tests/html/del002.html | 17 - .../parser/htmlparser/tests/html/del003.html | 12 - .../parser/htmlparser/tests/html/del004.html | 13 - .../parser/htmlparser/tests/html/del005.html | 22 - .../parser/htmlparser/tests/html/del006.html | 21 - .../parser/htmlparser/tests/html/del007.html | 21 - .../parser/htmlparser/tests/html/del008.html | 22 - .../parser/htmlparser/tests/html/del009.html | 19 - .../parser/htmlparser/tests/html/del010.html | 16 - .../parser/htmlparser/tests/html/del011.html | 23 - .../parser/htmlparser/tests/html/doc001.html | 0 .../parser/htmlparser/tests/html/doc002.html | 10 - .../htmlparser/tests/html/endswithcr.html | 1 - .../htmlparser/tests/html/entity001.html | 12 - .../htmlparser/tests/html/fieldset001.html | 22 - .../htmlparser/tests/html/fieldset002.html | 56 - .../htmlparser/tests/html/fieldset003.html | 26 - .../parser/htmlparser/tests/html/form001.html | 13 - .../parser/htmlparser/tests/html/form002.html | 22 - .../parser/htmlparser/tests/html/head01.html | 9 - .../parser/htmlparser/tests/html/head02.html | 11 - .../parser/htmlparser/tests/html/head03.html | 9 - .../parser/htmlparser/tests/html/home01.html | 976 -- .../parser/htmlparser/tests/html/html001.html | 8 - .../htmlparser/tests/html/imgmap001.html | 13 - .../parser/htmlparser/tests/html/ins001.html | 14 - .../parser/htmlparser/tests/html/ins002.html | 18 - .../parser/htmlparser/tests/html/ins003.html | 13 - .../htmlparser/tests/html/insdel01.html | 16 - .../htmlparser/tests/html/insdel02.html | 16 - .../htmlparser/tests/html/layer001.html | 20 - .../htmlparser/tests/html/layer002.html | 28 - .../htmlparser/tests/html/layer003.html | 29 - .../parser/htmlparser/tests/html/layer01.html | 22 - .../parser/htmlparser/tests/html/list001.html | 33 - .../parser/htmlparser/tests/html/list002.html | 15 - .../parser/htmlparser/tests/html/list003.html | 19 - .../htmlparser/tests/html/newlines.html | 3 - .../parser/htmlparser/tests/html/obj001.html | 12 - .../parser/htmlparser/tests/html/obj002.html | 9 - .../parser/htmlparser/tests/html/obj003.html | 17 - .../htmlparser/tests/html/param001.html | 10 - .../htmlparser/tests/html/param002.html | 14 - .../parser/htmlparser/tests/html/pre001.html | 9 - .../parser/htmlparser/tests/html/pre002.html | 11 - .../parser/htmlparser/tests/html/pre003.html | 8 - .../parser/htmlparser/tests/html/pre004.html | 18 - .../parser/htmlparser/tests/html/pre005.html | 53 - .../parser/htmlparser/tests/html/pre006.html | 28 - .../parser/htmlparser/tests/html/pre007.html | 12 - .../parser/htmlparser/tests/html/pre012.html | 22 - .../parser/htmlparser/tests/html/pre015.html | 18 - .../parser/htmlparser/tests/html/pre016.html | 17 - .../parser/htmlparser/tests/html/q001.html | 18 - .../htmlparser/tests/html/quote001.html | 51 - .../htmlparser/tests/html/quote002.html | 33 - .../htmlparser/tests/html/quote003.html | 14 - .../parser/htmlparser/tests/html/span001.html | 30 - .../parser/htmlparser/tests/html/span002.html | 21 - .../parser/htmlparser/tests/html/span003.html | 17 - .../htmlparser/tests/html/strike002.html | 17 - .../htmlparser/tests/html/strike005.html | 22 - .../htmlparser/tests/html/strike006.html | 18 - .../htmlparser/tests/html/strike007.html | 20 - .../htmlparser/tests/html/strike008.html | 26 - .../htmlparser/tests/html/table05a.html | 14 - .../htmlparser/tests/html/table05b.html | 14 - .../htmlparser/tests/html/table05c.html | 14 - .../htmlparser/tests/html/table05d.html | 13 - .../htmlparser/tests/html/table05k.html | 19 - .../htmlparser/tests/html/table05l.html | 14 - .../htmlparser/tests/html/table05m.html | 5 - .../htmlparser/tests/html/table05n.html | 11 - .../htmlparser/tests/html/table05o.html | 6 - .../parser/htmlparser/tests/html/table07.html | 13 - .../htmlparser/tests/html/table200.html | 21 - .../htmlparser/tests/html/table201.html | 22 - .../htmlparser/tests/html/table202.html | 23 - .../htmlparser/tests/html/table203.html | 29 - .../htmlparser/tests/html/table204.html | 23 - .../htmlparser/tests/html/table205.html | 28 - .../htmlparser/tests/html/tableall.html | 81 - .../parser/htmlparser/tests/html/tag001.html | 3 - .../parser/htmlparser/tests/html/tag002.html | 23 - .../parser/htmlparser/tests/html/tag003.html | 10 - .../parser/htmlparser/tests/html/tag004.html | 4 - .../parser/htmlparser/tests/html/tag005.html | 7 - .../parser/htmlparser/tests/html/tag006.html | 6 - .../parser/htmlparser/tests/html/tag007.html | 5 - .../parser/htmlparser/tests/html/tag008.html | 4 - .../htmlparser/tests/html/target01.html | 7 - .../htmlparser/tests/html/tbody001.html | 17 - .../parser/htmlparser/tests/html/text001.html | 8 - .../parser/htmlparser/tests/html/text002.html | 8 - .../parser/htmlparser/tests/html/text003.html | 12 - .../htmlparser/tests/html/thead001.html | 25 - .../parser/htmlparser/tests/html/title01.html | 6 - .../parser/htmlparser/tests/html/usascii.html | 26 - .../parser/htmlparser/tests/html/utf8001.html | 9 - .../htmlparser/tests/html/value001.html | 14 - .../parser/htmlparser/tests/html/xmp005.html | 48 - .../htmlparser/tests/windows/Selftest.cpp | 148 - mozilla/parser/htmlparser/tools/gentags.pl | 331 - mozilla/privacy/Makefile | 28 + mozilla/privacy/makefile.win | 23 + .../html/document => privacy}/public/Makefile | 9 +- .../events => privacy/public}/makefile.win | 9 +- mozilla/privacy/public/privacy.h | 58 + .../public/receipt.h} | 38 +- mozilla/{view => privacy}/src/Makefile | 30 +- .../events => privacy}/src/makefile.win | 38 +- mozilla/privacy/src/privacy.c | 174 + mozilla/privacy/src/receipt.c | 379 + mozilla/shell/Makefile | 24 - mozilla/shell/makefile.win | 23 - mozilla/shell/public/Makefile | 30 - mozilla/shell/public/makefile.win | 31 - mozilla/shell/public/nsIApplicationShell.h | 58 - mozilla/shell/public/nsIShellInstance.h | 119 - mozilla/shell/public/nsshell.h | 27 - mozilla/shell/src/Makefile | 71 - mozilla/shell/src/makefile.win | 73 - mozilla/shell/src/nsApplicationManager.cpp | 201 - mozilla/shell/src/nsApplicationManager.h | 104 - mozilla/shell/src/nsShellInstance.cpp | 347 - mozilla/shell/src/nsShellInstance.h | 136 - mozilla/shell/src/unix/Makefile | 41 - mozilla/shell/src/unix/main.cpp | 115 - mozilla/shell/src/windows/makefile.win | 63 - mozilla/shell/src/windows/winmain.cpp | 92 - mozilla/shell/tests/Makefile | 24 - mozilla/shell/tests/apptest/Makefile | 73 - mozilla/shell/tests/apptest/apptest.rc | 28 - mozilla/shell/tests/apptest/makefile.win | 52 - mozilla/shell/tests/apptest/nsAppTest.cpp | 198 - mozilla/shell/tests/apptest/nsAppTest.h | 74 - mozilla/shell/tests/apptest/resources.h | 25 - mozilla/shell/tests/makefile.win | 23 - mozilla/string/obsolete/nsString.cpp | 2085 ---- mozilla/string/obsolete/nsString.h | 238 - mozilla/trex.mak | 245 - mozilla/trex.mk | 113 - mozilla/uriloader/base/nsDocLoader.cpp | 593 -- mozilla/view/Makefile | 24 - mozilla/view/makefile.win | 23 - mozilla/view/public/MANIFEST | 8 - mozilla/view/public/Makefile | 33 - mozilla/view/public/makefile.win | 26 - mozilla/view/public/nsIScrollableView.h | 109 - mozilla/view/public/nsIView.h | 410 - mozilla/view/public/nsIViewManager.h | 398 - mozilla/view/public/nsViewsCID.h | 38 - mozilla/view/src/makefile.win | 60 - mozilla/view/src/nsScrollingView.cpp | 1121 --- mozilla/view/src/nsScrollingView.h | 87 - mozilla/view/src/nsView.cpp | 1078 -- mozilla/view/src/nsView.h | 133 - mozilla/view/src/nsViewFactory.cpp | 166 - mozilla/view/src/nsViewManager.cpp | 1010 -- mozilla/view/src/nsViewManager.h | 143 - mozilla/webshell/Makefile | 24 - mozilla/webshell/macbuild/nglayoutworksheet | 144 - mozilla/webshell/macbuild/raptorlist.txt | 30 - mozilla/webshell/macbuild/webshell.mcp | Bin 93130 -> 0 bytes mozilla/webshell/makefile.win | 23 - mozilla/webshell/public/MANIFEST | 9 - mozilla/webshell/public/Makefile | 32 - mozilla/webshell/public/makefile.win | 33 - mozilla/webshell/public/nsIDocumentLoader.h | 110 - mozilla/webshell/public/nsIDocumentWidget.h | 64 - mozilla/webshell/public/nsILinkHandler.h | 80 - mozilla/webshell/public/nsIWebWidget.h | 111 - mozilla/webshell/public/nsweb.h | 27 - mozilla/webshell/src/Makefile | 50 - mozilla/webshell/src/makefile.win | 69 - mozilla/webshell/src/nsDocLoader.cpp | 593 -- mozilla/webshell/src/nsLinkHandler.cpp | 214 - mozilla/webshell/src/nsWebWidget.cpp | 1209 --- mozilla/webshell/tests/Makefile | 24 - mozilla/webshell/tests/imgtest/ImageTest.cpp | 403 - mozilla/webshell/tests/imgtest/image.rc | 28 - mozilla/webshell/tests/imgtest/makefile.win | 50 - mozilla/webshell/tests/imgtest/resources.h | 25 - mozilla/webshell/tests/makefile.win | 23 - mozilla/webshell/tests/viewer/JSConsole.cpp | 958 -- mozilla/webshell/tests/viewer/JSConsole.h | 106 - mozilla/webshell/tests/viewer/Makefile | 172 - mozilla/webshell/tests/viewer/jsconsres.h | 67 - mozilla/webshell/tests/viewer/mac/viewer.mcp | Bin 146491 -> 0 bytes mozilla/webshell/tests/viewer/mac/viewer.ppob | Bin 1288 -> 0 bytes mozilla/webshell/tests/viewer/mac/viewer.rsrc | Bin 4038 -> 0 bytes .../tests/viewer/macToBeImplemented.cp | 44 - mozilla/webshell/tests/viewer/main.cpp | 69 - mozilla/webshell/tests/viewer/makefile.win | 113 - mozilla/webshell/tests/viewer/nsDocLoader.cpp | 269 - mozilla/webshell/tests/viewer/nsDocLoader.h | 100 - .../tests/viewer/nsEditorInterfaces.cpp | 241 - .../tests/viewer/nsEditorInterfaces.h | 69 - .../webshell/tests/viewer/nsEditorMode.cpp | 170 - mozilla/webshell/tests/viewer/nsEditorMode.h | 33 - .../tests/viewer/nsMacApplication.cpp | 162 - mozilla/webshell/tests/viewer/nsMacFile.cp | 153 - mozilla/webshell/tests/viewer/nsMotifMenu.cpp | 199 - mozilla/webshell/tests/viewer/nsMotifMenu.h | 33 - mozilla/webshell/tests/viewer/nsViewer.cpp | 1664 ---- mozilla/webshell/tests/viewer/nsViewer.h | 234 - mozilla/webshell/tests/viewer/resources.h | 75 - .../webshell/tests/viewer/samples/Anieyes.gif | Bin 13539 -> 0 bytes mozilla/webshell/tests/viewer/samples/bg.jpg | Bin 9407 -> 0 bytes .../webshell/tests/viewer/samples/gear1.gif | Bin 9492 -> 0 bytes .../webshell/tests/viewer/samples/raptor.jpg | Bin 49629 -> 0 bytes .../tests/viewer/samples/rock_gra.gif | Bin 23780 -> 0 bytes .../webshell/tests/viewer/samples/test0.html | 83 - .../webshell/tests/viewer/samples/test1.html | 85 - .../webshell/tests/viewer/samples/test2.html | 41 - .../webshell/tests/viewer/samples/test3.html | 125 - .../webshell/tests/viewer/samples/test4.html | 142 - .../webshell/tests/viewer/samples/test5.html | 38 - .../webshell/tests/viewer/samples/test6.html | 71 - .../webshell/tests/viewer/samples/test7.html | 10 - .../tests/viewer/samples/test8-1.html | 66 - .../webshell/tests/viewer/samples/test8.html | 76 - .../tests/viewer/samples/test8sca.html | 308 - .../tests/viewer/samples/test8siz.html | 66 - .../tests/viewer/samples/test8tab.html | 9 - .../webshell/tests/viewer/samples/test9.html | 39 - .../webshell/tests/viewer/samples/test9a.html | 16 - .../tests/viewer/samples/test_ed.html | 5 - .../tests/viewer/samples/test_form.html | 34 - mozilla/webshell/tests/viewer/viewer.rc | 162 - mozilla/webshell/tests/viewer/winmain.cpp | 371 - mozilla/webtools/bonsai/CGI.tcl | 128 - mozilla/webtools/bonsai/INSTALL | 424 - mozilla/webtools/bonsai/Makefile | 119 - mozilla/webtools/bonsai/README | 563 -- mozilla/webtools/bonsai/SourceChecker.cgi | 237 - mozilla/webtools/bonsai/SourceChecker.pm | 192 - mozilla/webtools/bonsai/addcheckin.tcl | 250 - mozilla/webtools/bonsai/admin.cgi | 205 - mozilla/webtools/bonsai/adminfuncs.tcl | 84 - mozilla/webtools/bonsai/adminmail.tcl | 66 - mozilla/webtools/bonsai/bonsai.gif | Bin 20285 -> 0 bytes mozilla/webtools/bonsai/branchspam.cgi | 91 - mozilla/webtools/bonsai/branchspammer.cgi | 100 - mozilla/webtools/bonsai/changebar.tcl | 83 - mozilla/webtools/bonsai/closemessage | 23 - mozilla/webtools/bonsai/contacthelp.html | 27 - mozilla/webtools/bonsai/countcheckins.cgi | 88 - mozilla/webtools/bonsai/createlegaldirs.tcl | 93 - mozilla/webtools/bonsai/cvsblame.cgi | 614 -- mozilla/webtools/bonsai/cvsblame.pl | 825 -- mozilla/webtools/bonsai/cvsguess.cgi | 72 - mozilla/webtools/bonsai/cvsindex.pl | 91 - mozilla/webtools/bonsai/cvslog.cgi | 503 - mozilla/webtools/bonsai/cvsmenu.pl | 64 - mozilla/webtools/bonsai/cvsquery.cgi | 650 -- mozilla/webtools/bonsai/cvsquery.pl | 448 - mozilla/webtools/bonsai/cvsqueryform.cgi | 321 - mozilla/webtools/bonsai/cvsregexp.html | 257 - mozilla/webtools/bonsai/cvsview2.cgi | 972 -- mozilla/webtools/bonsai/doadmin.cgi | 131 - mozilla/webtools/bonsai/doeditcheckin.cgi | 103 - mozilla/webtools/bonsai/doeditmessage.cgi | 74 - mozilla/webtools/bonsai/doeditprofile.cgi | 73 - mozilla/webtools/bonsai/doeditwhiteboard.cgi | 83 - mozilla/webtools/bonsai/dolog.pl | 239 - mozilla/webtools/bonsai/dotweak.cgi | 121 - mozilla/webtools/bonsai/editcheckin.cgi | 91 - mozilla/webtools/bonsai/editmessage.cgi | 99 - mozilla/webtools/bonsai/editprofile.cgi | 109 - mozilla/webtools/bonsai/editwhiteboard.cgi | 45 - mozilla/webtools/bonsai/globals.tcl | 695 -- mozilla/webtools/bonsai/handleAdminMail.tcl | 35 - mozilla/webtools/bonsai/handleCheckinMail.tcl | 36 - mozilla/webtools/bonsai/header.pl | 61 - mozilla/webtools/bonsai/index.html | 12 - mozilla/webtools/bonsai/indextest.pl | 44 - mozilla/webtools/bonsai/lloydcgi.pl | 100 - mozilla/webtools/bonsai/localprofile.cgi | 79 - mozilla/webtools/bonsai/maketables.sh | 146 - mozilla/webtools/bonsai/moduleanalyse.cgi | 134 - mozilla/webtools/bonsai/modules.pl | 170 - mozilla/webtools/bonsai/multidiff.cgi | 135 - mozilla/webtools/bonsai/myglobrecur.tcl | 79 - mozilla/webtools/bonsai/openmessage | 35 - mozilla/webtools/bonsai/perlifyconfig.tcl | 89 - mozilla/webtools/bonsai/processqueue.pl | 35 - mozilla/webtools/bonsai/profile.cgi | 83 - mozilla/webtools/bonsai/rebuildcvshistory.cgi | 386 - mozilla/webtools/bonsai/rebuilddatabase.tcl | 196 - mozilla/webtools/bonsai/rebuildtaginfo.cgi | 103 - mozilla/webtools/bonsai/repophook.cgi | 134 - mozilla/webtools/bonsai/reposfiles.pl | 58 - mozilla/webtools/bonsai/rview.cgi | 212 - mozilla/webtools/bonsai/show2.cgi | 348 - mozilla/webtools/bonsai/showcheckins.cgi | 350 - mozilla/webtools/bonsai/switchtree.cgi | 54 - mozilla/webtools/bonsai/testlock.pl | 12 - mozilla/webtools/bonsai/toplevel.cgi | 261 - mozilla/webtools/bonsai/trapdoor.c | 7 - mozilla/webtools/bonsai/utils.pl | 174 - mozilla/webtools/bonsai/viewold.cgi | 73 - mozilla/webtools/lxr/.htaccess | 7 - mozilla/webtools/lxr/INSTALL | 121 - mozilla/webtools/lxr/diff | 206 - mozilla/webtools/lxr/find | 74 - mozilla/webtools/lxr/genxref | 338 - mozilla/webtools/lxr/ident | 172 - mozilla/webtools/lxr/index.html | 170 - mozilla/webtools/lxr/lib/LXR/Common.pm | 785 -- mozilla/webtools/lxr/lib/LXR/Config.pm | 310 - mozilla/webtools/lxr/lib/SimpleParse.pm | 107 - mozilla/webtools/lxr/lxr.conf | 44 - mozilla/webtools/lxr/search | 125 - mozilla/webtools/lxr/search-help.html | 166 - mozilla/webtools/lxr/source | 367 - mozilla/webtools/lxr/template-dir | 19 - mozilla/webtools/lxr/template-head | 17 - mozilla/webtools/lxr/template-source-head | 59 - mozilla/webtools/lxr/template-sourcedir-head | 47 - mozilla/webtools/lxr/template-tail | 19 - mozilla/webtools/lxr/update-search.sh | 28 - mozilla/webtools/lxr/update-src.sh | 36 - mozilla/webtools/lxr/update-xref.sh | 29 - mozilla/webtools/registry/file.cgi | 102 - mozilla/webtools/registry/lloydcgi.pl | 44 - mozilla/webtools/registry/who.cgi | 82 - mozilla/webtools/tinderbox/1afi003r.gif | Bin 12967 -> 0 bytes mozilla/webtools/tinderbox/Empty.html | 1 - mozilla/webtools/tinderbox/README | 76 - mozilla/webtools/tinderbox/addimage.cgi | 402 - mozilla/webtools/tinderbox/addnote.cgi | 86 - mozilla/webtools/tinderbox/admintree.cgi | 118 - mozilla/webtools/tinderbox/buildwho.pl | 90 - mozilla/webtools/tinderbox/clean.pl | 42 - mozilla/webtools/tinderbox/copydata.pl | 91 - mozilla/webtools/tinderbox/doadmin.cgi | 213 - mozilla/webtools/tinderbox/ep_mac.pl | 45 - mozilla/webtools/tinderbox/ep_unix.pl | 59 - mozilla/webtools/tinderbox/ep_windows.pl | 73 - mozilla/webtools/tinderbox/faq.html | 31 - mozilla/webtools/tinderbox/fixupimages.pl | 217 - mozilla/webtools/tinderbox/globals.pl | 505 - mozilla/webtools/tinderbox/handlemail.pl | 44 - mozilla/webtools/tinderbox/imagelog.pl | 43 - mozilla/webtools/tinderbox/index.html | 12 - mozilla/webtools/tinderbox/processbuild.pl | 214 - mozilla/webtools/tinderbox/reledanim.gif | Bin 1685 -> 0 bytes mozilla/webtools/tinderbox/showbuilds.cgi | 552 -- mozilla/webtools/tinderbox/showimages.cgi | 136 - mozilla/webtools/tinderbox/showlog.cgi | 282 - mozilla/webtools/tinderbox/star.gif | Bin 227 -> 0 bytes mozilla/widget/Makefile | 24 - mozilla/widget/build.bat | 21 - mozilla/widget/makefile.win | 23 - mozilla/widget/public/MANIFEST | 27 - mozilla/widget/public/Makefile | 52 - mozilla/widget/public/makefile.win | 32 - mozilla/widget/public/nsGUIEvent.h | 322 - mozilla/widget/public/nsIAppShell.h | 91 - mozilla/widget/public/nsIButton.h | 56 - mozilla/widget/public/nsICheckButton.h | 54 - mozilla/widget/public/nsIComboBox.h | 49 - mozilla/widget/public/nsIEventListener.h | 43 - mozilla/widget/public/nsIFileWidget.h | 98 - mozilla/widget/public/nsIListBox.h | 91 - mozilla/widget/public/nsIListWidget.h | 125 - mozilla/widget/public/nsIMouseListener.h | 66 - mozilla/widget/public/nsIRadioButton.h | 58 - mozilla/widget/public/nsIRadioGroup.h | 79 - mozilla/widget/public/nsIScrollbar.h | 110 - mozilla/widget/public/nsITabWidget.h | 55 - mozilla/widget/public/nsITextAreaWidget.h | 44 - mozilla/widget/public/nsITextWidget.h | 155 - mozilla/widget/public/nsIToolkit.h | 54 - mozilla/widget/public/nsITooltipWidget.h | 40 - mozilla/widget/public/nsIWidget.h | 469 - mozilla/widget/public/nsStringUtil.h | 79 - mozilla/widget/public/nsWidgetsCID.h | 98 - mozilla/widget/public/nsui.h | 27 - mozilla/widget/src/Makefile | 26 - mozilla/widget/src/mac/nsDeviceContextMac.cpp | 532 - mozilla/widget/src/mac/nsDeviceContextMac.h | 125 - mozilla/widget/src/makefile.win | 23 - mozilla/widget/src/motif/Makefile | 92 - mozilla/widget/src/motif/nsAppShell.cpp | 117 - mozilla/widget/src/motif/nsAppShell.h | 56 - mozilla/widget/src/motif/nsButton.cpp | 185 - mozilla/widget/src/motif/nsButton.h | 88 - mozilla/widget/src/motif/nsCheckButton.cpp | 307 - mozilla/widget/src/motif/nsCheckButton.h | 103 - mozilla/widget/src/motif/nsComboBox.cpp | 573 -- mozilla/widget/src/motif/nsComboBox.h | 119 - mozilla/widget/src/motif/nsFileWidget.cpp | 329 - mozilla/widget/src/motif/nsFileWidget.h | 122 - mozilla/widget/src/motif/nsListBox.cpp | 550 - mozilla/widget/src/motif/nsListBox.h | 116 - mozilla/widget/src/motif/nsRadioButton.cpp | 326 - mozilla/widget/src/motif/nsRadioButton.h | 104 - mozilla/widget/src/motif/nsScrollbar.cpp | 482 - mozilla/widget/src/motif/nsScrollbar.h | 108 - mozilla/widget/src/motif/nsTextAreaWidget.cpp | 318 - mozilla/widget/src/motif/nsTextAreaWidget.h | 115 - mozilla/widget/src/motif/nsTextHelper.cpp | 208 - mozilla/widget/src/motif/nsTextHelper.h | 58 - mozilla/widget/src/motif/nsTextWidget.cpp | 353 - mozilla/widget/src/motif/nsTextWidget.h | 122 - mozilla/widget/src/motif/nsToolkit.cpp | 78 - mozilla/widget/src/motif/nsToolkit.h | 55 - mozilla/widget/src/motif/nsWidgetFactory.cpp | 229 - mozilla/widget/src/motif/nsWindow.cpp | 1239 --- mozilla/widget/src/motif/nsWindow.h | 519 - mozilla/widget/src/motif/nsXtEventHandler.cpp | 738 -- mozilla/widget/src/motif/nsXtEventHandler.h | 59 - mozilla/widget/src/windows/Makefile | 23 - mozilla/widget/src/windows/makefile.win | 81 - mozilla/widget/src/windows/nsAppShell.cpp | 114 - mozilla/widget/src/windows/nsAppShell.h | 53 - mozilla/widget/src/windows/nsButton.cpp | 153 - mozilla/widget/src/windows/nsButton.h | 63 - mozilla/widget/src/windows/nsCList.h | 102 - mozilla/widget/src/windows/nsCheckButton.cpp | 187 - mozilla/widget/src/windows/nsCheckButton.h | 69 - mozilla/widget/src/windows/nsComboBox.cpp | 274 - mozilla/widget/src/windows/nsComboBox.h | 77 - mozilla/widget/src/windows/nsFileWidget.cpp | 187 - mozilla/widget/src/windows/nsFileWidget.h | 70 - mozilla/widget/src/windows/nsListBox.cpp | 338 - mozilla/widget/src/windows/nsListBox.h | 78 - mozilla/widget/src/windows/nsObject.cpp | 147 - mozilla/widget/src/windows/nsObject.h | 107 - mozilla/widget/src/windows/nsRadioButton.cpp | 181 - mozilla/widget/src/windows/nsRadioButton.h | 71 - mozilla/widget/src/windows/nsRadioGroup.cpp | 379 - mozilla/widget/src/windows/nsRadioGroup.h | 90 - mozilla/widget/src/windows/nsScrollbar.cpp | 464 - mozilla/widget/src/windows/nsScrollbar.h | 78 - mozilla/widget/src/windows/nsStringUtil.h | 79 - .../widget/src/windows/nsSwitchToUIThread.h | 58 - mozilla/widget/src/windows/nsTabWidget.cpp | 155 - mozilla/widget/src/windows/nsTabWidget.h | 62 - .../widget/src/windows/nsTextAreaWidget.cpp | 191 - mozilla/widget/src/windows/nsTextAreaWidget.h | 75 - mozilla/widget/src/windows/nsTextHelper.cpp | 193 - mozilla/widget/src/windows/nsTextHelper.h | 62 - mozilla/widget/src/windows/nsTextWidget.cpp | 130 - mozilla/widget/src/windows/nsTextWidget.h | 58 - mozilla/widget/src/windows/nsToolkit.cpp | 363 - mozilla/widget/src/windows/nsToolkit.h | 139 - .../widget/src/windows/nsTooltipWidget.cpp | 156 - mozilla/widget/src/windows/nsTooltipWidget.h | 63 - .../widget/src/windows/nsWidgetFactory.cpp | 241 - mozilla/widget/src/windows/nsWindow.cpp | 2105 ---- mozilla/widget/src/windows/nsWindow.h | 431 - mozilla/widget/src/windows/nsdefs.h | 38 - mozilla/widget/src/windows/res/select.cur | Bin 326 -> 0 bytes mozilla/widget/src/windows/resource.h | 18 - mozilla/widget/src/windows/widget.rc | 20 - mozilla/widget/tests/Makefile | 22 - mozilla/widget/tests/makefile.win | 23 - mozilla/widget/tests/scribble/Makefile | 130 - mozilla/widget/tests/scribble/Scribble.cpp | 602 -- mozilla/widget/tests/scribble/Scribble.h | 54 - mozilla/widget/tests/scribble/main.cpp | 50 - mozilla/widget/tests/scribble/makefile.win | 51 - mozilla/widget/tests/widget/Makefile | 130 - mozilla/widget/tests/widget/main.cpp | 52 - mozilla/widget/tests/widget/makefile.win | 50 - mozilla/widget/tests/widget/nsWidgetTest.cpp | 1541 --- mozilla/widget/tests/widget/viewerMenu.cpp | 194 - mozilla/widget/tests/widget/viewerMenu.h | 29 - mozilla/xpcom/ds/nsArena.cpp | 80 - mozilla/xpcom/ds/nsAtomTable.cpp | 154 - mozilla/xpcom/ds/nsBTree.cpp | 403 - mozilla/xpcom/ds/nsBTree.h | 283 - mozilla/xpcom/ds/nsByteBuffer.cpp | 135 - mozilla/xpcom/ds/nsCRT.cpp | 290 - mozilla/xpcom/ds/nsCRT.h | 115 - mozilla/xpcom/ds/nsDeque.cpp | 433 - mozilla/xpcom/ds/nsDeque.h | 357 - mozilla/xpcom/ds/nsIArena.h | 51 - mozilla/xpcom/ds/nsIAtom.h | 77 - mozilla/xpcom/ds/nsIByteBuffer.h | 56 - mozilla/xpcom/ds/nsISizeOfHandler.h | 66 - mozilla/xpcom/ds/nsIUnicharBuffer.h | 46 - mozilla/xpcom/ds/nsRBTree.cpp | 423 - mozilla/xpcom/ds/nsRBTree.h | 223 - mozilla/xpcom/ds/nsSizeOfHandler.cpp | 121 - mozilla/xpcom/ds/nsString.cpp | 2085 ---- mozilla/xpcom/ds/nsString.h | 238 - mozilla/xpcom/ds/nsUnicharBuffer.cpp | 137 - mozilla/xpcom/ds/nsUnitConversion.h | 76 - mozilla/xpcom/ds/nsVoidArray.cpp | 227 - mozilla/xpcom/ds/nsVoidArray.h | 74 - mozilla/xpcom/glue/nsID.cpp | 73 - mozilla/xpcom/glue/nsVoidArray.cpp | 227 - mozilla/xpcom/glue/nsVoidArray.h | 74 - mozilla/xpcom/io/nsIBaseStream.h | 42 - mozilla/xpcom/io/nsIInputStream.h | 60 - mozilla/xpcom/io/nsIOutputStream.h | 45 - mozilla/xpcom/io/nsIUnicharInputStream.h | 98 - mozilla/xpcom/io/nsUnicharInputStream.cpp | 329 - mozilla/xpcom/string/obsolete/nsString.cpp | 2085 ---- mozilla/xpcom/string/obsolete/nsString.h | 238 - mozilla/xpcom/tests/CvtURL.cpp | 104 - mozilla/xpcom/tests/TestAtoms.cpp | 108 - mozilla/xpcom/tests/TestCRT.cpp | 89 - mozilla/xpcom/tests/resources.h | 32 - 1994 files changed, 2561 insertions(+), 436789 deletions(-) delete mode 100644 CVSROOT/checkoutlist delete mode 100644 CVSROOT/commitinfo delete mode 100644 CVSROOT/config delete mode 100644 CVSROOT/cvswrappers delete mode 100644 CVSROOT/editinfo delete mode 100644 CVSROOT/loginfo delete mode 100644 CVSROOT/modules delete mode 100644 CVSROOT/notify delete mode 100644 CVSROOT/passwd delete mode 100644 CVSROOT/rcsinfo delete mode 100644 CVSROOT/readers delete mode 100644 CVSROOT/taginfo delete mode 100644 CVSROOT/verifymsg delete mode 100755 buildtools/windows/batch/MOZENV.BAT delete mode 100644 buildtools/windows/bin/README delete mode 100755 buildtools/windows/bin/alpha/gmake.exe delete mode 100755 buildtools/windows/bin/alpha/nsinstall.exe delete mode 100755 buildtools/windows/bin/alpha/shmsdos.exe delete mode 100755 buildtools/windows/bin/alpha/uname.exe delete mode 100755 buildtools/windows/bin/x86/gmake.exe delete mode 100755 buildtools/windows/bin/x86/nsinstall.exe delete mode 100755 buildtools/windows/bin/x86/shmsdos.exe delete mode 100755 buildtools/windows/bin/x86/uname.exe delete mode 100644 buildtools/windows/source/make/COPYING delete mode 100644 buildtools/windows/source/make/ChangeLog delete mode 100644 buildtools/windows/source/make/INSTALL delete mode 100644 buildtools/windows/source/make/Makefile delete mode 100644 buildtools/windows/source/make/Makefile.in delete mode 100644 buildtools/windows/source/make/NEWS delete mode 100644 buildtools/windows/source/make/NMakefile delete mode 100644 buildtools/windows/source/make/README delete mode 100644 buildtools/windows/source/make/README.MOZILLA delete mode 100644 buildtools/windows/source/make/acconfig.h delete mode 100644 buildtools/windows/source/make/alloca.c delete mode 100644 buildtools/windows/source/make/ar.c delete mode 100644 buildtools/windows/source/make/arscan.c delete mode 100644 buildtools/windows/source/make/build.sh.in delete mode 100644 buildtools/windows/source/make/commands.c delete mode 100644 buildtools/windows/source/make/commands.h delete mode 100644 buildtools/windows/source/make/config.h delete mode 100644 buildtools/windows/source/make/config.h.in delete mode 100644 buildtools/windows/source/make/configh.dos delete mode 100644 buildtools/windows/source/make/configure delete mode 100755 buildtools/windows/source/make/configure.bat delete mode 100644 buildtools/windows/source/make/configure.in delete mode 100644 buildtools/windows/source/make/default.c delete mode 100644 buildtools/windows/source/make/dep.h delete mode 100644 buildtools/windows/source/make/dir.c delete mode 100644 buildtools/windows/source/make/expand.c delete mode 100644 buildtools/windows/source/make/file.c delete mode 100644 buildtools/windows/source/make/file.h delete mode 100644 buildtools/windows/source/make/function.c delete mode 100644 buildtools/windows/source/make/getloadavg.c delete mode 100644 buildtools/windows/source/make/getopt.c delete mode 100644 buildtools/windows/source/make/getopt.h delete mode 100644 buildtools/windows/source/make/getopt1.c delete mode 100644 buildtools/windows/source/make/glob.c delete mode 100644 buildtools/windows/source/make/glob/COPYING.LIB delete mode 100644 buildtools/windows/source/make/glob/Makefile delete mode 100644 buildtools/windows/source/make/glob/Makefile.in delete mode 100644 buildtools/windows/source/make/glob/configure delete mode 100755 buildtools/windows/source/make/glob/configure.bat delete mode 100644 buildtools/windows/source/make/glob/configure.in delete mode 100644 buildtools/windows/source/make/glob/fnmatch.c delete mode 100644 buildtools/windows/source/make/glob/fnmatch.h delete mode 100644 buildtools/windows/source/make/glob/glob.c delete mode 100644 buildtools/windows/source/make/glob/glob.h delete mode 100644 buildtools/windows/source/make/implicit.c delete mode 100644 buildtools/windows/source/make/install-sh delete mode 100644 buildtools/windows/source/make/job.c delete mode 100644 buildtools/windows/source/make/job.h delete mode 100644 buildtools/windows/source/make/main.c delete mode 100644 buildtools/windows/source/make/make-stds.texi delete mode 100644 buildtools/windows/source/make/make.aux delete mode 100644 buildtools/windows/source/make/make.cp delete mode 100644 buildtools/windows/source/make/make.cps delete mode 100644 buildtools/windows/source/make/make.fn delete mode 100644 buildtools/windows/source/make/make.fns delete mode 100644 buildtools/windows/source/make/make.h delete mode 100644 buildtools/windows/source/make/make.info delete mode 100644 buildtools/windows/source/make/make.info-1 delete mode 100644 buildtools/windows/source/make/make.info-2 delete mode 100644 buildtools/windows/source/make/make.info-3 delete mode 100644 buildtools/windows/source/make/make.info-4 delete mode 100644 buildtools/windows/source/make/make.info-5 delete mode 100644 buildtools/windows/source/make/make.info-6 delete mode 100644 buildtools/windows/source/make/make.info-7 delete mode 100644 buildtools/windows/source/make/make.info-8 delete mode 100644 buildtools/windows/source/make/make.man delete mode 100644 buildtools/windows/source/make/make.texinfo delete mode 100644 buildtools/windows/source/make/make.toc delete mode 100644 buildtools/windows/source/make/misc.c delete mode 100644 buildtools/windows/source/make/mkinstalldirs delete mode 100644 buildtools/windows/source/make/read.c delete mode 100644 buildtools/windows/source/make/remake.c delete mode 100644 buildtools/windows/source/make/remote-cstms.c delete mode 100644 buildtools/windows/source/make/remote-stub.c delete mode 100644 buildtools/windows/source/make/rule.c delete mode 100644 buildtools/windows/source/make/rule.h delete mode 100644 buildtools/windows/source/make/signame.c delete mode 100644 buildtools/windows/source/make/signame.h delete mode 100644 buildtools/windows/source/make/texinfo.tex delete mode 100644 buildtools/windows/source/make/variable.c delete mode 100644 buildtools/windows/source/make/variable.h delete mode 100644 buildtools/windows/source/make/version.c delete mode 100644 buildtools/windows/source/make/vpath.c delete mode 100644 buildtools/windows/source/make/windir.h delete mode 100644 buildtools/windows/source/shmsdos/README delete mode 100644 buildtools/windows/source/shmsdos/nsinstall.c delete mode 100644 buildtools/windows/source/shmsdos/nsinstall.mak delete mode 100644 buildtools/windows/source/shmsdos/shmsdos.c delete mode 100644 buildtools/windows/source/shmsdos/shmsdos.mak delete mode 100644 buildtools/windows/source/uname/README delete mode 100644 buildtools/windows/source/uname/uname.c delete mode 100644 buildtools/windows/source/uname/uname.mak delete mode 100644 l10nkits/client/windows/docs/installer/IS1.JPG delete mode 100644 l10nkits/client/windows/docs/installer/L10NTREE.JPG delete mode 100644 l10nkits/client/windows/docs/installer/SPLASH.JPG delete mode 100644 l10nkits/client/windows/docs/installer/branding.html delete mode 100644 l10nkits/client/windows/docs/installer/gettingStarted.html delete mode 100644 l10nkits/client/windows/docs/installer/isocodes.htm delete mode 100644 l10nkits/client/windows/docs/installer/kitOverview.html delete mode 100644 l10nkits/client/windows/docs/installer/kitStruct.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeAim.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeCD.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeCosmo.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeIsuser.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeMmedia.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeMplay.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeNav40.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeNetcast.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeNsconf.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeRsutil.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeSetup.html delete mode 100644 l10nkits/client/windows/docs/installer/localizeURL.html delete mode 100644 l10nkits/client/windows/docs/installer/localize_these_files.html delete mode 100644 l10nkits/client/windows/docs/installer/nomenclature.html delete mode 100644 l10nkits/client/windows/docs/installer/projectOverview.html delete mode 100644 l10nkits/client/windows/docs/installer/reference.html delete mode 100644 l10nkits/client/windows/docs/installer/registrySettings.html delete mode 100644 l10nkits/client/windows/docs/installer/reportingBugs.html delete mode 100644 l10nkits/client/windows/docs/installer/returnKit.html delete mode 100644 l10nkits/client/windows/docs/installer/splash.html delete mode 100644 l10nkits/client/windows/docs/installer/testKit.html delete mode 100644 l10nkits/client/windows/docs/installer/toc.html delete mode 100644 l10nkits/client/windows/docs/installer/usingKit.html delete mode 100644 l10nkits/client/windows/docs/nav40/SPLASH.JPG delete mode 100644 l10nkits/client/windows/docs/nav40/allxpstr.h delete mode 100644 l10nkits/client/windows/docs/nav40/branding.html delete mode 100644 l10nkits/client/windows/docs/nav40/charsets.htm delete mode 100644 l10nkits/client/windows/docs/nav40/gettingStarted.html delete mode 100644 l10nkits/client/windows/docs/nav40/idBuild.jpg delete mode 100644 l10nkits/client/windows/docs/nav40/image5LE.JPG delete mode 100644 l10nkits/client/windows/docs/nav40/imageEJR.JPG delete mode 100644 l10nkits/client/windows/docs/nav40/imageGAN.JPG delete mode 100644 l10nkits/client/windows/docs/nav40/imageGHT.JPG delete mode 100644 l10nkits/client/windows/docs/nav40/imageQC9.JPG delete mode 100644 l10nkits/client/windows/docs/nav40/isocodes.htm delete mode 100644 l10nkits/client/windows/docs/nav40/isonames.htm delete mode 100644 l10nkits/client/windows/docs/nav40/kitOverview.html delete mode 100644 l10nkits/client/windows/docs/nav40/kitStruct.html delete mode 100644 l10nkits/client/windows/docs/nav40/l10ntree.jpg delete mode 100644 l10nkits/client/windows/docs/nav40/localizeAboutplg.html delete mode 100644 l10nkits/client/windows/docs/nav40/localizeAllPref.html delete mode 100644 l10nkits/client/windows/docs/nav40/localizeBookmarks.html delete mode 100644 l10nkits/client/windows/docs/nav40/localizeConfigPref.html delete mode 100644 l10nkits/client/windows/docs/nav40/localizeLicense.html delete mode 100644 l10nkits/client/windows/docs/nav40/localizeNpnul.html delete mode 100644 l10nkits/client/windows/docs/nav40/localizeURL.html delete mode 100644 l10nkits/client/windows/docs/nav40/localize_these_files.html delete mode 100644 l10nkits/client/windows/docs/nav40/nomenclature.html delete mode 100644 l10nkits/client/windows/docs/nav40/pixel.gif delete mode 100644 l10nkits/client/windows/docs/nav40/projectOverview.html delete mode 100644 l10nkits/client/windows/docs/nav40/reference.html delete mode 100644 l10nkits/client/windows/docs/nav40/reportingBugs.html delete mode 100644 l10nkits/client/windows/docs/nav40/resource.h delete mode 100644 l10nkits/client/windows/docs/nav40/returnKit.html delete mode 100644 l10nkits/client/windows/docs/nav40/splash.html delete mode 100644 l10nkits/client/windows/docs/nav40/testKit.html delete mode 100644 l10nkits/client/windows/docs/nav40/toc.html delete mode 100644 l10nkits/client/windows/docs/nav40/troubleshooting.html delete mode 100644 l10nkits/client/windows/docs/nav40/usingKit.html delete mode 100644 l10nkits/client/windows/docs/nav40/winfekit.jpg delete mode 100644 l10nkits/client/windows/docs/nav40/xpencui.htm delete mode 100644 l10nkits/client/xp/docs/mozilla.org/kitDownload.html delete mode 100644 l10nkits/client/xp/docs/mozilla.org/l10nLibrary.html delete mode 100644 l10nkits/client/xp/docs/mozilla.org/l10nkitintro.html delete mode 100644 l10nkits/client/xp/docs/mozilla.org/ulpFAQ.html delete mode 100644 l10nkits/client/xp/docs/mozilla.org/ulpLicense.html delete mode 100644 mozilla/base/Makefile delete mode 100644 mozilla/base/macbuild/base.mcp delete mode 100644 mozilla/base/makefile.win delete mode 100644 mozilla/base/public/MANIFEST delete mode 100644 mozilla/base/public/Makefile delete mode 100644 mozilla/base/public/makefile.win delete mode 100644 mozilla/base/public/nsISizeOfHandler.h delete mode 100644 mozilla/base/src/MANIFEST delete mode 100644 mozilla/base/src/Makefile delete mode 100644 mozilla/base/src/mac/nsTimerMac.cpp delete mode 100644 mozilla/base/src/makefile.win delete mode 100644 mozilla/base/src/nsArena.cpp delete mode 100644 mozilla/base/src/nsAtomTable.cpp delete mode 100644 mozilla/base/src/nsBTree.cpp delete mode 100644 mozilla/base/src/nsBTree.h delete mode 100644 mozilla/base/src/nsByteBuffer.cpp delete mode 100644 mozilla/base/src/nsCRT.cpp delete mode 100644 mozilla/base/src/nsCRT.h delete mode 100644 mozilla/base/src/nsDeque.cpp delete mode 100644 mozilla/base/src/nsDeque.h delete mode 100644 mozilla/base/src/nsIArena.h delete mode 100644 mozilla/base/src/nsIAtom.h delete mode 100644 mozilla/base/src/nsIBaseStream.h delete mode 100644 mozilla/base/src/nsIByteBuffer.h delete mode 100644 mozilla/base/src/nsIInputStream.h delete mode 100644 mozilla/base/src/nsIOutputStream.h delete mode 100644 mozilla/base/src/nsITimer.h delete mode 100644 mozilla/base/src/nsITimerCallback.h delete mode 100644 mozilla/base/src/nsIUnicharBuffer.h delete mode 100644 mozilla/base/src/nsIUnicharInputStream.h delete mode 100644 mozilla/base/src/nsRBTree.cpp delete mode 100644 mozilla/base/src/nsRBTree.h delete mode 100644 mozilla/base/src/nsSizeOfHandler.cpp delete mode 100644 mozilla/base/src/nsString.cpp delete mode 100644 mozilla/base/src/nsString.h delete mode 100644 mozilla/base/src/nsUnicharBuffer.cpp delete mode 100644 mozilla/base/src/nsUnicharInputStream.cpp delete mode 100644 mozilla/base/src/nsUnitConversion.h delete mode 100644 mozilla/base/src/nsVoidArray.cpp delete mode 100644 mozilla/base/src/nsVoidArray.h delete mode 100644 mozilla/base/src/nscore.h delete mode 100644 mozilla/base/src/unix/Makefile delete mode 100644 mozilla/base/src/unix/nsTimer.cpp delete mode 100644 mozilla/base/src/windows/makefile.win delete mode 100644 mozilla/base/src/windows/nsTimer.cpp delete mode 100644 mozilla/base/tests/CvtURL.cpp delete mode 100644 mozilla/base/tests/Makefile delete mode 100644 mozilla/base/tests/TestAtoms.cpp delete mode 100644 mozilla/base/tests/TestCRT.cpp delete mode 100644 mozilla/base/tests/TimerTest.cpp delete mode 100644 mozilla/base/tests/makefile.win delete mode 100644 mozilla/base/tests/resources.h delete mode 100644 mozilla/base/tests/timer.rc delete mode 100644 mozilla/content/base/public/nsIContent.h delete mode 100644 mozilla/content/base/public/nsIDocument.h delete mode 100644 mozilla/content/base/public/nsIDocumentContainer.h delete mode 100644 mozilla/content/base/public/nsIDocumentObserver.h delete mode 100644 mozilla/content/base/public/nsIStyleRule.h delete mode 100644 mozilla/content/base/public/nsIStyleSheet.h delete mode 100644 mozilla/content/base/public/nsITextContent.h delete mode 100644 mozilla/content/base/src/nsDocument.cpp delete mode 100644 mozilla/content/base/src/nsDocument.h delete mode 100644 mozilla/content/base/src/nsHTMLValue.cpp delete mode 100644 mozilla/content/base/src/nsHTMLValue.h delete mode 100644 mozilla/content/base/src/nsSelection.cpp delete mode 100644 mozilla/content/base/src/nsStyleContext.cpp delete mode 100644 mozilla/content/base/src/nsStyleSet.cpp delete mode 100644 mozilla/content/events/makefile.win delete mode 100644 mozilla/content/events/public/makefile.win delete mode 100644 mozilla/content/events/public/nsIEventListenerManager.h delete mode 100644 mozilla/content/events/public/nsIEventStateManager.h delete mode 100644 mozilla/content/events/src/nsDOMEvent.cpp delete mode 100644 mozilla/content/events/src/nsDOMEvent.h delete mode 100644 mozilla/content/events/src/nsEventListenerManager.cpp delete mode 100644 mozilla/content/events/src/nsEventListenerManager.h delete mode 100644 mozilla/content/events/src/nsEventStateManager.cpp delete mode 100644 mozilla/content/events/src/nsEventStateManager.h delete mode 100644 mozilla/content/html/content/makefile.win delete mode 100644 mozilla/content/html/content/public/nsIHTMLContent.h delete mode 100644 mozilla/content/html/content/src/makefile.win delete mode 100644 mozilla/content/html/content/src/nsHTMLAtoms.cpp delete mode 100644 mozilla/content/html/content/src/nsHTMLAtoms.h delete mode 100644 mozilla/content/html/document/public/MANIFEST delete mode 100644 mozilla/content/html/document/public/makefile.win delete mode 100644 mozilla/content/html/document/src/nsHTMLContentSink.cpp delete mode 100644 mozilla/content/html/document/src/nsHTMLDocument.cpp delete mode 100644 mozilla/content/html/document/src/nsHTMLDocument.h delete mode 100644 mozilla/content/html/document/src/nsIHTMLDocument.h delete mode 100644 mozilla/content/html/style/public/nsICSSParser.h delete mode 100644 mozilla/content/html/style/src/nsCSSDeclaration.cpp delete mode 100644 mozilla/content/html/style/src/nsCSSKeywords.h delete mode 100644 mozilla/content/html/style/src/nsCSSLayout.cpp delete mode 100644 mozilla/content/html/style/src/nsCSSParser.cpp delete mode 100644 mozilla/content/html/style/src/nsCSSProps.h delete mode 100644 mozilla/content/html/style/src/nsCSSScanner.cpp delete mode 100644 mozilla/content/html/style/src/nsCSSScanner.h delete mode 100644 mozilla/content/html/style/src/nsCSSStruct.cpp delete mode 100644 mozilla/content/html/style/src/nsCSSStyleRule.cpp delete mode 100644 mozilla/content/html/style/src/nsCSSStyleSheet.cpp delete mode 100644 mozilla/content/html/style/src/nsHTMLAttributes.cpp delete mode 100644 mozilla/content/html/style/src/nsHTMLCSSStyleSheet.cpp delete mode 100644 mozilla/content/html/style/src/nsHTMLStyleSheet.cpp delete mode 100644 mozilla/content/html/style/src/nsHTMLValue.cpp delete mode 100644 mozilla/content/html/style/src/nsHTMLValue.h delete mode 100644 mozilla/content/html/style/src/nsICSSDeclaration.h delete mode 100644 mozilla/content/html/style/src/nsICSSStyleRule.h delete mode 100644 mozilla/content/html/style/src/nsIHTMLAttributes.h delete mode 100644 mozilla/content/html/style/src/nsIHTMLCSSStyleSheet.h delete mode 100644 mozilla/content/shared/public/nsCSSKeywords.h delete mode 100644 mozilla/content/shared/public/nsCSSProps.h delete mode 100644 mozilla/content/shared/public/nsHTMLAtoms.h delete mode 100644 mozilla/content/shared/public/nsHTMLValue.h delete mode 100644 mozilla/content/shared/public/nsStyleCoord.h delete mode 100644 mozilla/content/shared/src/nsCSSKeywords.cpp delete mode 100644 mozilla/content/shared/src/nsCSSProps.cpp delete mode 100644 mozilla/content/shared/src/nsHTMLAtoms.cpp delete mode 100644 mozilla/content/shared/src/nsHTMLValue.cpp delete mode 100644 mozilla/directory/Makefile delete mode 100644 mozilla/directory/buildsdk.txt delete mode 100644 mozilla/directory/c-sdk/ldap/Makefile.client delete mode 100644 mozilla/directory/c-sdk/ldap/build/Makefile.client delete mode 100644 mozilla/directory/c-sdk/ldap/build/dirver.c delete mode 100644 mozilla/directory/c-sdk/ldap/include/Makefile.client delete mode 100644 mozilla/directory/c-sdk/ldap/include/disptmpl.h delete mode 100644 mozilla/directory/c-sdk/ldap/include/lber.h delete mode 100644 mozilla/directory/c-sdk/ldap/include/ldap.h delete mode 100644 mozilla/directory/c-sdk/ldap/include/ldaplog.h delete mode 100644 mozilla/directory/c-sdk/ldap/include/ldaprot.h delete mode 100644 mozilla/directory/c-sdk/ldap/include/ldif.h delete mode 100644 mozilla/directory/c-sdk/ldap/include/portable.h delete mode 100644 mozilla/directory/c-sdk/ldap/include/regex.h delete mode 100644 mozilla/directory/c-sdk/ldap/include/srchpref.h delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/Makefile.client delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/liblber/Makefile.client delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/liblber/bprint.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/liblber/decode.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/liblber/dtest.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/liblber/encode.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/liblber/etest.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/liblber/idtest.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/liblber/io.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/liblber/lber-int.h delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/Makefile.client delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/abandon.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/add.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/bind.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/cache.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/charray.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/charset.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/cldap.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/compare.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/compat.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/control.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/countvalues.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/delete.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/disptmpl.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/dllmain.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/dsparse.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/error.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/extendop.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/free.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/freevalues.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/friendly.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/getattr.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/getdn.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/getdxbyname.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/getentry.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/getfilter.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/getoption.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/getvalues.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/globals.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/ldap-int.h delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/ldapfilter.conf delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/ldapfriendly delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/ldapsearchprefs.conf delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/ldaptemplates.conf delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/memcache.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/message.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/modify.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/mozock.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/nsprthreadtest.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/open.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/os-ip.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/psearch.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/pthreadtest.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/referral.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/regex.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/rename.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/request.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/reslist.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/result.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/saslbind.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/sbind.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/search.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/setoption.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/sort.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/sortctrl.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/srchpref.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/test.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/tmplout.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/tmpltest.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/ufn.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/unbind.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/unescape.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/url.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/utf8.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/libldap/vlistctrl.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/LDAPClient.prj delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/LDAPClient68K.prj delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/LDAPClient68K.prj.exp delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/LDAPClientCFM68K.prj delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/LDAPClientDebugDefs.h delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/LDAPClientDefs.h delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/LDAPClientPPC.exp delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/LDAPClientPPC.mcp delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/LDAPClientPPC.prj delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/LDAPClientPPC.prj.exp delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/README delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/getopt.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/kerberos-macos.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/ldap-macos-defs.h delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/ldap-macos.h delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/libldap-68k-2i.u delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/libldap-68k-4i.u delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/libldap-PPC.r delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/libldap-PPC.u delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/libldap-PPC.u.exp delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/macos-ip.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/sdk/dirver-PPC.u delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/strings.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/tcp-univhdrs/tcp.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/macintosh/tcp-univhdrs/tcp.h delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/msdos/winsock/libldap.def delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/msdos/winsock/libldap.rc delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/msdos/winsock/mozock.c delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/msdos/winsock/nsldap.mak delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/msdos/winsock/nsldap.rc delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/msdos/winsock/nsldap32.def delete mode 100644 mozilla/directory/c-sdk/ldap/libraries/msdos/winsock/nsldap32bc.def delete mode 100644 mozilla/directory/ldapsdk.mak delete mode 100644 mozilla/directory/ldapsdk.mk delete mode 100644 mozilla/dom/Makefile delete mode 100644 mozilla/dom/macbuild/dom.mcp delete mode 100644 mozilla/dom/makefile.win delete mode 100644 mozilla/dom/public/MANIFEST delete mode 100644 mozilla/dom/public/Makefile delete mode 100644 mozilla/dom/public/coreDom/MANIFEST delete mode 100644 mozilla/dom/public/coreDom/Makefile delete mode 100644 mozilla/dom/public/coreDom/makefile.win delete mode 100644 mozilla/dom/public/coreDom/nsIDOMAttribute.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMAttributeList.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMComment.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMDOM.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMDocument.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMDocumentContext.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMDocumentFragment.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMElement.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMNode.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMNodeIterator.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMPI.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMText.h delete mode 100644 mozilla/dom/public/coreDom/nsIDOMTreeIterator.h delete mode 100644 mozilla/dom/public/coreEvents/MANIFEST delete mode 100644 mozilla/dom/public/coreEvents/Makefile delete mode 100644 mozilla/dom/public/coreEvents/makefile.win delete mode 100644 mozilla/dom/public/coreEvents/nsIDOMDragListener.h delete mode 100644 mozilla/dom/public/coreEvents/nsIDOMEvent.h delete mode 100644 mozilla/dom/public/coreEvents/nsIDOMEventCapturer.h delete mode 100644 mozilla/dom/public/coreEvents/nsIDOMEventListener.h delete mode 100644 mozilla/dom/public/coreEvents/nsIDOMEventReceiver.h delete mode 100644 mozilla/dom/public/coreEvents/nsIDOMFocusListener.h delete mode 100644 mozilla/dom/public/coreEvents/nsIDOMKeyListener.h delete mode 100644 mozilla/dom/public/coreEvents/nsIDOMLoadListener.h delete mode 100644 mozilla/dom/public/coreEvents/nsIDOMMouseListener.h delete mode 100644 mozilla/dom/public/coreEvents/nsIDOMMouseMotionListener.h delete mode 100644 mozilla/dom/public/events/MANIFEST delete mode 100644 mozilla/dom/public/events/Makefile delete mode 100644 mozilla/dom/public/events/makefile.win delete mode 100644 mozilla/dom/public/events/nsINSEvent.h delete mode 100644 mozilla/dom/public/idl/Navigator.idl delete mode 100644 mozilla/dom/public/idl/Window.idl delete mode 100644 mozilla/dom/public/idl/coreDom/Attribute.idl delete mode 100644 mozilla/dom/public/idl/coreDom/AttributeList.idl delete mode 100644 mozilla/dom/public/idl/coreDom/Comment.idl delete mode 100644 mozilla/dom/public/idl/coreDom/DOM.idl delete mode 100644 mozilla/dom/public/idl/coreDom/Document.idl delete mode 100644 mozilla/dom/public/idl/coreDom/DocumentContext.idl delete mode 100644 mozilla/dom/public/idl/coreDom/DocumentFragment.idl delete mode 100644 mozilla/dom/public/idl/coreDom/Element.idl delete mode 100644 mozilla/dom/public/idl/coreDom/Node.idl delete mode 100644 mozilla/dom/public/idl/coreDom/NodeIterator.idl delete mode 100644 mozilla/dom/public/idl/coreDom/PI.idl delete mode 100644 mozilla/dom/public/idl/coreDom/Text.idl delete mode 100644 mozilla/dom/public/idl/coreDom/TreeIterator.idl delete mode 100644 mozilla/dom/public/idl/coreDom/makefile.win delete mode 100644 mozilla/dom/public/idl/makefile.win delete mode 100644 mozilla/dom/public/makefile.win delete mode 100644 mozilla/dom/public/nsIDOMNavigator.h delete mode 100644 mozilla/dom/public/nsIDOMWindow.h delete mode 100644 mozilla/dom/public/nsIJSGlobalObject.h delete mode 100644 mozilla/dom/public/nsIJSScriptObject.h delete mode 100644 mozilla/dom/public/nsIScriptContext.h delete mode 100644 mozilla/dom/public/nsIScriptContextOwner.h delete mode 100644 mozilla/dom/public/nsIScriptGlobalObject.h delete mode 100644 mozilla/dom/public/nsIScriptObjectOwner.h delete mode 100644 mozilla/dom/src/Makefile delete mode 100644 mozilla/dom/src/makefile.win delete mode 100644 mozilla/dom/src/nsGlobalWindow.cpp delete mode 100644 mozilla/dom/src/nsJSAttribute.cpp delete mode 100644 mozilla/dom/src/nsJSAttributeList.cpp delete mode 100644 mozilla/dom/src/nsJSComment.cpp delete mode 100644 mozilla/dom/src/nsJSDOM.cpp delete mode 100644 mozilla/dom/src/nsJSDocument.cpp delete mode 100644 mozilla/dom/src/nsJSDocumentContext.cpp delete mode 100644 mozilla/dom/src/nsJSDocumentFragment.cpp delete mode 100644 mozilla/dom/src/nsJSElement.cpp delete mode 100644 mozilla/dom/src/nsJSEnvironment.cpp delete mode 100644 mozilla/dom/src/nsJSEnvironment.h delete mode 100644 mozilla/dom/src/nsJSNavigator.cpp delete mode 100644 mozilla/dom/src/nsJSNode.cpp delete mode 100644 mozilla/dom/src/nsJSNodeIterator.cpp delete mode 100644 mozilla/dom/src/nsJSPI.cpp delete mode 100644 mozilla/dom/src/nsJSText.cpp delete mode 100644 mozilla/dom/src/nsJSTreeIterator.cpp delete mode 100644 mozilla/dom/src/nsJSWindow.cpp delete mode 100644 mozilla/dom/tests/js/DumpHTML.js delete mode 100644 mozilla/dom/tests/js/DumpTree.js delete mode 100644 mozilla/dom/tests/js/HTMLString.js delete mode 100644 mozilla/dom/tests/js/simple.js delete mode 100644 mozilla/dom/tests/js/tables/changeCaption.js delete mode 100644 mozilla/dom/tests/js/tables/changeCell.js delete mode 100644 mozilla/dom/tests/js/timer.js delete mode 100644 mozilla/dom/tools/Exceptions.cpp delete mode 100644 mozilla/dom/tools/Exceptions.h delete mode 100644 mozilla/dom/tools/FileGen.cpp delete mode 100644 mozilla/dom/tools/FileGen.h delete mode 100644 mozilla/dom/tools/IdlAttribute.cpp delete mode 100644 mozilla/dom/tools/IdlAttribute.h delete mode 100644 mozilla/dom/tools/IdlEnum.cpp delete mode 100644 mozilla/dom/tools/IdlEnum.h delete mode 100644 mozilla/dom/tools/IdlFunction.cpp delete mode 100644 mozilla/dom/tools/IdlFunction.h delete mode 100644 mozilla/dom/tools/IdlInterface.cpp delete mode 100644 mozilla/dom/tools/IdlInterface.h delete mode 100644 mozilla/dom/tools/IdlObject.cpp delete mode 100644 mozilla/dom/tools/IdlObject.h delete mode 100644 mozilla/dom/tools/IdlParameter.cpp delete mode 100644 mozilla/dom/tools/IdlParameter.h delete mode 100644 mozilla/dom/tools/IdlParser.cpp delete mode 100644 mozilla/dom/tools/IdlParser.h delete mode 100644 mozilla/dom/tools/IdlScanner.cpp delete mode 100644 mozilla/dom/tools/IdlScanner.h delete mode 100644 mozilla/dom/tools/IdlSpecification.cpp delete mode 100644 mozilla/dom/tools/IdlSpecification.h delete mode 100644 mozilla/dom/tools/IdlVariable.cpp delete mode 100644 mozilla/dom/tools/IdlVariable.h delete mode 100644 mozilla/dom/tools/JSStubGen.cpp delete mode 100644 mozilla/dom/tools/JSStubGen.h delete mode 100644 mozilla/dom/tools/Makefile delete mode 100644 mozilla/dom/tools/Makefile.win delete mode 100644 mozilla/dom/tools/Test.idl delete mode 100644 mozilla/dom/tools/XPCOMGen.cpp delete mode 100644 mozilla/dom/tools/XPCOMGen.h delete mode 100644 mozilla/dom/tools/geniid.pl delete mode 100644 mozilla/dom/tools/main.cpp delete mode 100644 mozilla/gconfig/.cshrc delete mode 100644 mozilla/gconfig/AIX.mk delete mode 100644 mozilla/gconfig/AIX3.2.mk delete mode 100644 mozilla/gconfig/AIX4.1.mk delete mode 100644 mozilla/gconfig/AIX4.2.mk delete mode 100644 mozilla/gconfig/AIX4.3.mk delete mode 100644 mozilla/gconfig/FreeBSD2.mk delete mode 100644 mozilla/gconfig/HP-UX.mk delete mode 100644 mozilla/gconfig/HP-UXA.09.03.mk delete mode 100644 mozilla/gconfig/HP-UXA.09.07.mk delete mode 100644 mozilla/gconfig/HP-UXA.09.mk delete mode 100644 mozilla/gconfig/HP-UXB.10.01.mk delete mode 100644 mozilla/gconfig/HP-UXB.10.10.mk delete mode 100644 mozilla/gconfig/HP-UXB.10.20.mk delete mode 100644 mozilla/gconfig/HP-UXB.10.30.mk delete mode 100644 mozilla/gconfig/HP-UXB.10.mk delete mode 100644 mozilla/gconfig/HP-UXB.11.00.mk delete mode 100644 mozilla/gconfig/HP-UXB.11.mk delete mode 100644 mozilla/gconfig/IRIX.mk delete mode 100644 mozilla/gconfig/IRIX5.2.mk delete mode 100644 mozilla/gconfig/IRIX5.3.mk delete mode 100644 mozilla/gconfig/IRIX5.mk delete mode 100644 mozilla/gconfig/IRIX6.2.mk delete mode 100644 mozilla/gconfig/IRIX6.3.mk delete mode 100644 mozilla/gconfig/IRIX6.mk delete mode 100644 mozilla/gconfig/Linux.mk delete mode 100644 mozilla/gconfig/LinuxELF1.2.mk delete mode 100644 mozilla/gconfig/LinuxELF2.0.mk delete mode 100644 mozilla/gconfig/Makefile delete mode 100644 mozilla/gconfig/NCR3.0.mk delete mode 100644 mozilla/gconfig/NEC4.2.mk delete mode 100644 mozilla/gconfig/OSF1.mk delete mode 100644 mozilla/gconfig/OSF1V2.0.mk delete mode 100644 mozilla/gconfig/OSF1V3.0.mk delete mode 100644 mozilla/gconfig/OSF1V3.2.mk delete mode 100644 mozilla/gconfig/OSF1V4.0.mk delete mode 100644 mozilla/gconfig/OSF1V4.0B.mk delete mode 100644 mozilla/gconfig/OSF1V4.0D.mk delete mode 100644 mozilla/gconfig/ReliantUNIX.mk delete mode 100644 mozilla/gconfig/ReliantUNIX5.4.mk delete mode 100644 mozilla/gconfig/SCOOS5.0.mk delete mode 100644 mozilla/gconfig/SCO_SV3.2.mk delete mode 100644 mozilla/gconfig/SunOS4.1.3_U1.mk delete mode 100644 mozilla/gconfig/SunOS5.3.mk delete mode 100644 mozilla/gconfig/SunOS5.4.mk delete mode 100644 mozilla/gconfig/SunOS5.4_i86pc.mk delete mode 100644 mozilla/gconfig/SunOS5.5.1.mk delete mode 100644 mozilla/gconfig/SunOS5.5.1_i86pc.mk delete mode 100644 mozilla/gconfig/SunOS5.5.mk delete mode 100644 mozilla/gconfig/SunOS5.6.mk delete mode 100644 mozilla/gconfig/SunOS5.6_i86pc.mk delete mode 100644 mozilla/gconfig/SunOS5.mk delete mode 100644 mozilla/gconfig/UNIX.mk delete mode 100644 mozilla/gconfig/UNIXWARE2.1.mk delete mode 100644 mozilla/gconfig/WIN16.mk delete mode 100644 mozilla/gconfig/WIN32.mk delete mode 100644 mozilla/gconfig/WIN954.0.mk delete mode 100644 mozilla/gconfig/WINNT3.51.mk delete mode 100644 mozilla/gconfig/WINNT4.0.mk delete mode 100644 mozilla/gconfig/arch.mk delete mode 100644 mozilla/gconfig/command.mk delete mode 100644 mozilla/gconfig/config.mk delete mode 100644 mozilla/gconfig/coreconf.pl delete mode 100644 mozilla/gconfig/cpdist.pl delete mode 100644 mozilla/gconfig/extract_objs.pl delete mode 100644 mozilla/gconfig/headers.mk delete mode 100644 mozilla/gconfig/import.pl delete mode 100644 mozilla/gconfig/location.mk delete mode 100755 mozilla/gconfig/makedep.exe delete mode 100644 mozilla/gconfig/makefile.win delete mode 100644 mozilla/gconfig/md/Makefile delete mode 100644 mozilla/gconfig/md/manifest.mn delete mode 100644 mozilla/gconfig/md/watcomfx.lib delete mode 100644 mozilla/gconfig/mkdepend/Makefile delete mode 100644 mozilla/gconfig/mkdepend/cppsetup.c delete mode 100644 mozilla/gconfig/mkdepend/def.h delete mode 100644 mozilla/gconfig/mkdepend/ifparser.c delete mode 100644 mozilla/gconfig/mkdepend/ifparser.h delete mode 100644 mozilla/gconfig/mkdepend/imakemdep.h delete mode 100644 mozilla/gconfig/mkdepend/include.c delete mode 100644 mozilla/gconfig/mkdepend/main.c delete mode 100644 mozilla/gconfig/mkdepend/mkdepend.man delete mode 100644 mozilla/gconfig/mkdepend/parse.c delete mode 100644 mozilla/gconfig/mkdepend/pr.c delete mode 100644 mozilla/gconfig/module.mk delete mode 100644 mozilla/gconfig/nsinstall/Makefile delete mode 100644 mozilla/gconfig/nsinstall/nfspwd delete mode 100644 mozilla/gconfig/nsinstall/nfspwd.pl delete mode 100644 mozilla/gconfig/nsinstall/nsinstall.c delete mode 100644 mozilla/gconfig/nsinstall/pathsub.c delete mode 100644 mozilla/gconfig/nsinstall/pathsub.h delete mode 100644 mozilla/gconfig/nsinstall/sunos4.h delete mode 100644 mozilla/gconfig/platform.mk delete mode 100644 mozilla/gconfig/prefix.mk delete mode 100644 mozilla/gconfig/release.pl delete mode 100644 mozilla/gconfig/rules.mk delete mode 100644 mozilla/gconfig/ruleset.mk delete mode 100644 mozilla/gconfig/source.mk delete mode 100644 mozilla/gconfig/suffix.mk delete mode 100644 mozilla/gconfig/tree.mk delete mode 100644 mozilla/gconfig/version.mk delete mode 100644 mozilla/gconfig/version.pl delete mode 100644 mozilla/gfx/Makefile delete mode 100644 mozilla/gfx/macbuild/gfx.mcp delete mode 100644 mozilla/gfx/makefile.win delete mode 100644 mozilla/gfx/src/MANIFEST delete mode 100644 mozilla/gfx/src/Makefile delete mode 100644 mozilla/gfx/src/mac/nsDeviceContextMac.cpp delete mode 100644 mozilla/gfx/src/mac/nsDeviceContextMac.h delete mode 100644 mozilla/gfx/src/mac/nsFontMetricsMac.cpp delete mode 100644 mozilla/gfx/src/mac/nsFontMetricsMac.h delete mode 100644 mozilla/gfx/src/mac/nsGfxFactoryMac.cpp delete mode 100644 mozilla/gfx/src/mac/nsImageMac.cpp delete mode 100644 mozilla/gfx/src/mac/nsImageMac.h delete mode 100644 mozilla/gfx/src/mac/nsRegionMac.cpp delete mode 100644 mozilla/gfx/src/mac/nsRegionMac.h delete mode 100644 mozilla/gfx/src/mac/nsRenderingContextMac.cpp delete mode 100644 mozilla/gfx/src/mac/nsRenderingContextMac.h delete mode 100644 mozilla/gfx/src/makefile.win delete mode 100644 mozilla/gfx/src/motif/Makefile delete mode 100644 mozilla/gfx/src/motif/nsDeviceContextMac.cpp delete mode 100644 mozilla/gfx/src/motif/nsDeviceContextMac.h delete mode 100644 mozilla/gfx/src/motif/nsDeviceContextUnix.cpp delete mode 100644 mozilla/gfx/src/motif/nsDeviceContextUnix.h delete mode 100644 mozilla/gfx/src/motif/nsFontMetricsMac.cpp delete mode 100644 mozilla/gfx/src/motif/nsFontMetricsMac.h delete mode 100644 mozilla/gfx/src/motif/nsFontMetricsUnix.cpp delete mode 100644 mozilla/gfx/src/motif/nsFontMetricsUnix.h delete mode 100644 mozilla/gfx/src/motif/nsGfxFactoryMac.cpp delete mode 100644 mozilla/gfx/src/motif/nsGfxFactoryUnix.cpp delete mode 100644 mozilla/gfx/src/motif/nsImageMac.cpp delete mode 100644 mozilla/gfx/src/motif/nsImageMac.h delete mode 100644 mozilla/gfx/src/motif/nsImageUnix.cpp delete mode 100644 mozilla/gfx/src/motif/nsImageUnix.h delete mode 100644 mozilla/gfx/src/motif/nsRegionMac.cpp delete mode 100644 mozilla/gfx/src/motif/nsRegionMac.h delete mode 100644 mozilla/gfx/src/motif/nsRegionUnix.cpp delete mode 100644 mozilla/gfx/src/motif/nsRegionUnix.h delete mode 100644 mozilla/gfx/src/motif/nsRenderingContextMac.cpp delete mode 100644 mozilla/gfx/src/motif/nsRenderingContextMac.h delete mode 100644 mozilla/gfx/src/motif/nsRenderingContextUnix.cpp delete mode 100644 mozilla/gfx/src/motif/nsRenderingContextUnix.h delete mode 100644 mozilla/gfx/src/nsColor.cpp delete mode 100644 mozilla/gfx/src/nsColor.h delete mode 100644 mozilla/gfx/src/nsColorNameIDs.h delete mode 100644 mozilla/gfx/src/nsColorNames.cpp delete mode 100644 mozilla/gfx/src/nsColorNames.h delete mode 100644 mozilla/gfx/src/nsColorNamesRGB.cpp delete mode 100644 mozilla/gfx/src/nsCoord.h delete mode 100644 mozilla/gfx/src/nsFont.cpp delete mode 100644 mozilla/gfx/src/nsFont.h delete mode 100644 mozilla/gfx/src/nsFontCache.cpp delete mode 100644 mozilla/gfx/src/nsGfxCIID.h delete mode 100644 mozilla/gfx/src/nsIBlender.h delete mode 100644 mozilla/gfx/src/nsIDeviceContext.h delete mode 100644 mozilla/gfx/src/nsIFontCache.h delete mode 100644 mozilla/gfx/src/nsIFontMetrics.h delete mode 100644 mozilla/gfx/src/nsIImage.h delete mode 100644 mozilla/gfx/src/nsIImageGroup.h delete mode 100644 mozilla/gfx/src/nsIImageManager.h delete mode 100644 mozilla/gfx/src/nsIImageObserver.h delete mode 100644 mozilla/gfx/src/nsIImageRequest.h delete mode 100644 mozilla/gfx/src/nsIRegion.h delete mode 100644 mozilla/gfx/src/nsIRenderingContext.h delete mode 100644 mozilla/gfx/src/nsImage.h delete mode 100644 mozilla/gfx/src/nsImageGroup.cpp delete mode 100644 mozilla/gfx/src/nsImageManager.cpp delete mode 100644 mozilla/gfx/src/nsImageNet.h delete mode 100644 mozilla/gfx/src/nsImageNetContext.cpp delete mode 100644 mozilla/gfx/src/nsImageNetContextAsync.cpp delete mode 100644 mozilla/gfx/src/nsImageRenderer.cpp delete mode 100644 mozilla/gfx/src/nsImageRequest.cpp delete mode 100644 mozilla/gfx/src/nsImageRequest.h delete mode 100644 mozilla/gfx/src/nsImageSystemServices.cpp delete mode 100644 mozilla/gfx/src/nsImageURL.cpp delete mode 100644 mozilla/gfx/src/nsMargin.h delete mode 100644 mozilla/gfx/src/nsPoint.h delete mode 100644 mozilla/gfx/src/nsRect.cpp delete mode 100644 mozilla/gfx/src/nsRect.h delete mode 100644 mozilla/gfx/src/nsRegion.h delete mode 100644 mozilla/gfx/src/nsSize.h delete mode 100644 mozilla/gfx/src/nsTransform2D.cpp delete mode 100644 mozilla/gfx/src/nsTransform2D.h delete mode 100644 mozilla/gfx/src/windows/makefile.win delete mode 100644 mozilla/gfx/src/windows/nsBlenderWin.cpp delete mode 100644 mozilla/gfx/src/windows/nsBlenderWin.h delete mode 100644 mozilla/gfx/src/windows/nsDeviceContextWin.cpp delete mode 100644 mozilla/gfx/src/windows/nsDeviceContextWin.h delete mode 100644 mozilla/gfx/src/windows/nsFontMetricsWin.cpp delete mode 100644 mozilla/gfx/src/windows/nsFontMetricsWin.h delete mode 100644 mozilla/gfx/src/windows/nsGfxFactoryWin.cpp delete mode 100644 mozilla/gfx/src/windows/nsImageWin.cpp delete mode 100644 mozilla/gfx/src/windows/nsImageWin.h delete mode 100644 mozilla/gfx/src/windows/nsRegionWin.cpp delete mode 100644 mozilla/gfx/src/windows/nsRegionWin.h delete mode 100644 mozilla/gfx/src/windows/nsRenderingContextWin.cpp delete mode 100644 mozilla/gfx/src/windows/nsRenderingContextWin.h delete mode 100644 mozilla/gfx/tests/DumpColors.cpp delete mode 100644 mozilla/gfx/tests/Makefile delete mode 100644 mozilla/gfx/tests/TestColorNames.cpp delete mode 100644 mozilla/gfx/tests/TestRect.cpp delete mode 100644 mozilla/gfx/tests/btest/BitTest.cpp delete mode 100644 mozilla/gfx/tests/btest/image.rc delete mode 100644 mozilla/gfx/tests/btest/makefile.win delete mode 100644 mozilla/gfx/tests/btest/resource.h delete mode 100644 mozilla/gfx/tests/btest/resources.h delete mode 100644 mozilla/gfx/tests/makefile.win delete mode 100644 mozilla/htmlparser/Makefile delete mode 100644 mozilla/htmlparser/macbuild/htmlparser.mcp delete mode 100644 mozilla/htmlparser/makefile.win delete mode 100644 mozilla/htmlparser/robot/Makefile delete mode 100644 mozilla/htmlparser/robot/makefile.win delete mode 100644 mozilla/htmlparser/robot/nsDebugRobot.cpp delete mode 100644 mozilla/htmlparser/robot/nsIRobotSink.h delete mode 100644 mozilla/htmlparser/robot/nsIRobotSinkObserver.h delete mode 100644 mozilla/htmlparser/robot/nsRobotSink.cpp delete mode 100644 mozilla/htmlparser/robot/test/RobotMain.cpp delete mode 100644 mozilla/htmlparser/robot/test/makefile.win delete mode 100644 mozilla/htmlparser/src/CNavDTD.cpp delete mode 100644 mozilla/htmlparser/src/CNavDTD.h delete mode 100644 mozilla/htmlparser/src/COtherDTD.cpp delete mode 100644 mozilla/htmlparser/src/COtherDTD.h delete mode 100644 mozilla/htmlparser/src/MANIFEST delete mode 100644 mozilla/htmlparser/src/Makefile delete mode 100644 mozilla/htmlparser/src/SelfTest.cpp delete mode 100644 mozilla/htmlparser/src/makefile.win delete mode 100644 mozilla/htmlparser/src/nsDTDDebug.cpp delete mode 100644 mozilla/htmlparser/src/nsHTMLContentSink.cpp delete mode 100644 mozilla/htmlparser/src/nsHTMLContentSink.h delete mode 100644 mozilla/htmlparser/src/nsHTMLTags.cpp delete mode 100644 mozilla/htmlparser/src/nsHTMLTags.h delete mode 100644 mozilla/htmlparser/src/nsHTMLTokens.cpp delete mode 100644 mozilla/htmlparser/src/nsHTMLTokens.h delete mode 100644 mozilla/htmlparser/src/nsIContentSink.h delete mode 100644 mozilla/htmlparser/src/nsIDTD.h delete mode 100644 mozilla/htmlparser/src/nsIDTDDebug.h delete mode 100644 mozilla/htmlparser/src/nsIHTMLContentSink.h delete mode 100644 mozilla/htmlparser/src/nsIParser.h delete mode 100644 mozilla/htmlparser/src/nsIParserFilter.h delete mode 100644 mozilla/htmlparser/src/nsIParserNode.h delete mode 100644 mozilla/htmlparser/src/nsITokenHandler.h delete mode 100644 mozilla/htmlparser/src/nsParser.cpp delete mode 100644 mozilla/htmlparser/src/nsParser.h delete mode 100644 mozilla/htmlparser/src/nsParserNode.cpp delete mode 100644 mozilla/htmlparser/src/nsParserNode.h delete mode 100644 mozilla/htmlparser/src/nsParserTypes.h delete mode 100644 mozilla/htmlparser/src/nsScanner.cpp delete mode 100644 mozilla/htmlparser/src/nsScanner.h delete mode 100644 mozilla/htmlparser/src/nsToken.cpp delete mode 100644 mozilla/htmlparser/src/nsToken.h delete mode 100644 mozilla/htmlparser/src/nsTokenHandler.cpp delete mode 100644 mozilla/htmlparser/src/nsTokenHandler.h delete mode 100644 mozilla/htmlparser/src/nsTokenizer.cpp delete mode 100644 mozilla/htmlparser/src/nsTokenizer.h delete mode 100644 mozilla/htmlparser/src/nshtmlpars.h delete mode 100644 mozilla/htmlparser/src/prstrm.cpp delete mode 100644 mozilla/htmlparser/src/prstrm.h delete mode 100644 mozilla/htmlparser/tests/html/Table01.html delete mode 100644 mozilla/htmlparser/tests/html/Table02.html delete mode 100644 mozilla/htmlparser/tests/html/Table03.html delete mode 100644 mozilla/htmlparser/tests/html/Table04.html delete mode 100644 mozilla/htmlparser/tests/html/Table05.html delete mode 100644 mozilla/htmlparser/tests/html/Table05e.html delete mode 100644 mozilla/htmlparser/tests/html/Table05f.html delete mode 100644 mozilla/htmlparser/tests/html/Table05g.html delete mode 100644 mozilla/htmlparser/tests/html/Table05h.html delete mode 100644 mozilla/htmlparser/tests/html/Table05i.html delete mode 100644 mozilla/htmlparser/tests/html/Table05j.html delete mode 100644 mozilla/htmlparser/tests/html/Table06.html delete mode 100644 mozilla/htmlparser/tests/html/acronym1.html delete mode 100644 mozilla/htmlparser/tests/html/aname01.html delete mode 100644 mozilla/htmlparser/tests/html/atoi01.html delete mode 100644 mozilla/htmlparser/tests/html/attribute_quote_bug1.html delete mode 100644 mozilla/htmlparser/tests/html/bdo001.html delete mode 100644 mozilla/htmlparser/tests/html/br001.html delete mode 100644 mozilla/htmlparser/tests/html/button001.html delete mode 100644 mozilla/htmlparser/tests/html/button002.html delete mode 100644 mozilla/htmlparser/tests/html/center001.html delete mode 100644 mozilla/htmlparser/tests/html/center002.html delete mode 100644 mozilla/htmlparser/tests/html/col001.html delete mode 100644 mozilla/htmlparser/tests/html/col002.html delete mode 100644 mozilla/htmlparser/tests/html/col003.html delete mode 100644 mozilla/htmlparser/tests/html/col004.html delete mode 100644 mozilla/htmlparser/tests/html/col005.html delete mode 100644 mozilla/htmlparser/tests/html/col006.html delete mode 100644 mozilla/htmlparser/tests/html/col007.html delete mode 100644 mozilla/htmlparser/tests/html/col008.html delete mode 100644 mozilla/htmlparser/tests/html/col009.html delete mode 100644 mozilla/htmlparser/tests/html/col010.html delete mode 100644 mozilla/htmlparser/tests/html/col011.html delete mode 100644 mozilla/htmlparser/tests/html/col012.html delete mode 100644 mozilla/htmlparser/tests/html/col013.html delete mode 100644 mozilla/htmlparser/tests/html/col014.html delete mode 100644 mozilla/htmlparser/tests/html/col015.html delete mode 100644 mozilla/htmlparser/tests/html/col016.html delete mode 100644 mozilla/htmlparser/tests/html/del001.html delete mode 100644 mozilla/htmlparser/tests/html/del002.html delete mode 100644 mozilla/htmlparser/tests/html/del003.html delete mode 100644 mozilla/htmlparser/tests/html/del004.html delete mode 100644 mozilla/htmlparser/tests/html/del005.html delete mode 100644 mozilla/htmlparser/tests/html/del006.html delete mode 100644 mozilla/htmlparser/tests/html/del007.html delete mode 100644 mozilla/htmlparser/tests/html/del008.html delete mode 100644 mozilla/htmlparser/tests/html/del009.html delete mode 100644 mozilla/htmlparser/tests/html/del010.html delete mode 100644 mozilla/htmlparser/tests/html/del011.html delete mode 100644 mozilla/htmlparser/tests/html/doc001.html delete mode 100644 mozilla/htmlparser/tests/html/doc002.html delete mode 100644 mozilla/htmlparser/tests/html/endswithcr.html delete mode 100644 mozilla/htmlparser/tests/html/entity001.html delete mode 100644 mozilla/htmlparser/tests/html/fieldset001.html delete mode 100644 mozilla/htmlparser/tests/html/fieldset002.html delete mode 100644 mozilla/htmlparser/tests/html/fieldset003.html delete mode 100644 mozilla/htmlparser/tests/html/form001.html delete mode 100644 mozilla/htmlparser/tests/html/form002.html delete mode 100644 mozilla/htmlparser/tests/html/head01.html delete mode 100644 mozilla/htmlparser/tests/html/head02.html delete mode 100644 mozilla/htmlparser/tests/html/head03.html delete mode 100644 mozilla/htmlparser/tests/html/home01.html delete mode 100644 mozilla/htmlparser/tests/html/html001.html delete mode 100644 mozilla/htmlparser/tests/html/imgmap001.html delete mode 100644 mozilla/htmlparser/tests/html/ins001.html delete mode 100644 mozilla/htmlparser/tests/html/ins002.html delete mode 100644 mozilla/htmlparser/tests/html/ins003.html delete mode 100644 mozilla/htmlparser/tests/html/insdel01.html delete mode 100644 mozilla/htmlparser/tests/html/insdel02.html delete mode 100644 mozilla/htmlparser/tests/html/layer001.html delete mode 100644 mozilla/htmlparser/tests/html/layer002.html delete mode 100644 mozilla/htmlparser/tests/html/layer003.html delete mode 100644 mozilla/htmlparser/tests/html/layer01.html delete mode 100644 mozilla/htmlparser/tests/html/list001.html delete mode 100644 mozilla/htmlparser/tests/html/list002.html delete mode 100644 mozilla/htmlparser/tests/html/list003.html delete mode 100644 mozilla/htmlparser/tests/html/newlines.html delete mode 100644 mozilla/htmlparser/tests/html/obj001.html delete mode 100644 mozilla/htmlparser/tests/html/obj002.html delete mode 100644 mozilla/htmlparser/tests/html/obj003.html delete mode 100644 mozilla/htmlparser/tests/html/param001.html delete mode 100644 mozilla/htmlparser/tests/html/param002.html delete mode 100644 mozilla/htmlparser/tests/html/pre001.html delete mode 100644 mozilla/htmlparser/tests/html/pre002.html delete mode 100644 mozilla/htmlparser/tests/html/pre003.html delete mode 100644 mozilla/htmlparser/tests/html/pre004.html delete mode 100644 mozilla/htmlparser/tests/html/pre005.html delete mode 100644 mozilla/htmlparser/tests/html/pre006.html delete mode 100644 mozilla/htmlparser/tests/html/pre007.html delete mode 100644 mozilla/htmlparser/tests/html/pre012.html delete mode 100644 mozilla/htmlparser/tests/html/pre015.html delete mode 100644 mozilla/htmlparser/tests/html/pre016.html delete mode 100644 mozilla/htmlparser/tests/html/q001.html delete mode 100644 mozilla/htmlparser/tests/html/quote001.html delete mode 100644 mozilla/htmlparser/tests/html/quote002.html delete mode 100644 mozilla/htmlparser/tests/html/quote003.html delete mode 100644 mozilla/htmlparser/tests/html/span001.html delete mode 100644 mozilla/htmlparser/tests/html/span002.html delete mode 100644 mozilla/htmlparser/tests/html/span003.html delete mode 100644 mozilla/htmlparser/tests/html/strike002.html delete mode 100644 mozilla/htmlparser/tests/html/strike005.html delete mode 100644 mozilla/htmlparser/tests/html/strike006.html delete mode 100644 mozilla/htmlparser/tests/html/strike007.html delete mode 100644 mozilla/htmlparser/tests/html/strike008.html delete mode 100644 mozilla/htmlparser/tests/html/table05a.html delete mode 100644 mozilla/htmlparser/tests/html/table05b.html delete mode 100644 mozilla/htmlparser/tests/html/table05c.html delete mode 100644 mozilla/htmlparser/tests/html/table05d.html delete mode 100644 mozilla/htmlparser/tests/html/table05k.html delete mode 100644 mozilla/htmlparser/tests/html/table05l.html delete mode 100644 mozilla/htmlparser/tests/html/table05m.html delete mode 100644 mozilla/htmlparser/tests/html/table05n.html delete mode 100644 mozilla/htmlparser/tests/html/table05o.html delete mode 100644 mozilla/htmlparser/tests/html/table07.html delete mode 100644 mozilla/htmlparser/tests/html/table200.html delete mode 100644 mozilla/htmlparser/tests/html/table201.html delete mode 100644 mozilla/htmlparser/tests/html/table202.html delete mode 100644 mozilla/htmlparser/tests/html/table203.html delete mode 100644 mozilla/htmlparser/tests/html/table204.html delete mode 100644 mozilla/htmlparser/tests/html/table205.html delete mode 100644 mozilla/htmlparser/tests/html/tableall.html delete mode 100644 mozilla/htmlparser/tests/html/tag001.html delete mode 100644 mozilla/htmlparser/tests/html/tag002.html delete mode 100644 mozilla/htmlparser/tests/html/tag003.html delete mode 100644 mozilla/htmlparser/tests/html/tag004.html delete mode 100644 mozilla/htmlparser/tests/html/tag005.html delete mode 100644 mozilla/htmlparser/tests/html/tag006.html delete mode 100644 mozilla/htmlparser/tests/html/tag007.html delete mode 100644 mozilla/htmlparser/tests/html/tag008.html delete mode 100644 mozilla/htmlparser/tests/html/target01.html delete mode 100644 mozilla/htmlparser/tests/html/tbody001.html delete mode 100644 mozilla/htmlparser/tests/html/text001.html delete mode 100644 mozilla/htmlparser/tests/html/text002.html delete mode 100644 mozilla/htmlparser/tests/html/text003.html delete mode 100644 mozilla/htmlparser/tests/html/thead001.html delete mode 100644 mozilla/htmlparser/tests/html/title01.html delete mode 100644 mozilla/htmlparser/tests/html/usascii.html delete mode 100644 mozilla/htmlparser/tests/html/utf8001.html delete mode 100644 mozilla/htmlparser/tests/html/value001.html delete mode 100644 mozilla/htmlparser/tests/html/xmp005.html delete mode 100644 mozilla/htmlparser/tests/windows/Selftest.cpp delete mode 100644 mozilla/htmlparser/tools/gentags.pl delete mode 100644 mozilla/layout/Makefile delete mode 100644 mozilla/layout/base/Makefile delete mode 100644 mozilla/layout/base/makefile.win delete mode 100644 mozilla/layout/base/nsCSSRendering.cpp delete mode 100644 mozilla/layout/base/nsCSSRendering.h delete mode 100644 mozilla/layout/base/nsIPresShell.h delete mode 100644 mozilla/layout/base/nsPresContext.cpp delete mode 100644 mozilla/layout/base/nsPresContext.h delete mode 100644 mozilla/layout/base/public/MANIFEST delete mode 100644 mozilla/layout/base/public/Makefile delete mode 100644 mozilla/layout/base/public/makefile.win delete mode 100644 mozilla/layout/base/public/nsIContent.h delete mode 100644 mozilla/layout/base/public/nsIContentDelegate.h delete mode 100644 mozilla/layout/base/public/nsIDocument.h delete mode 100644 mozilla/layout/base/public/nsIDocumentContainer.h delete mode 100644 mozilla/layout/base/public/nsIDocumentObserver.h delete mode 100644 mozilla/layout/base/public/nsIFrame.h delete mode 100644 mozilla/layout/base/public/nsIFrameImageLoader.h delete mode 100644 mozilla/layout/base/public/nsIPresContext.h delete mode 100644 mozilla/layout/base/public/nsIPresShell.h delete mode 100644 mozilla/layout/base/public/nsIReflowCommand.h delete mode 100644 mozilla/layout/base/public/nsIRunaround.h delete mode 100644 mozilla/layout/base/public/nsISelection.h delete mode 100644 mozilla/layout/base/public/nsISpaceManager.h delete mode 100644 mozilla/layout/base/public/nsIStyleContext.h delete mode 100644 mozilla/layout/base/public/nsIStyleRule.h delete mode 100644 mozilla/layout/base/public/nsIStyleSet.h delete mode 100644 mozilla/layout/base/public/nsIStyleSheet.h delete mode 100644 mozilla/layout/base/public/nsITextContent.h delete mode 100644 mozilla/layout/base/public/nsPresContext.h delete mode 100644 mozilla/layout/base/public/nsStyleCoord.h delete mode 100644 mozilla/layout/base/public/nsStyleStruct.h delete mode 100644 mozilla/layout/base/public/nslayout.h delete mode 100644 mozilla/layout/base/src/Makefile delete mode 100644 mozilla/layout/base/src/makefile.win delete mode 100644 mozilla/layout/base/src/nsContainerFrame.cpp delete mode 100644 mozilla/layout/base/src/nsContainerFrame.h delete mode 100644 mozilla/layout/base/src/nsDocument.cpp delete mode 100644 mozilla/layout/base/src/nsDocument.h delete mode 100644 mozilla/layout/base/src/nsFrame.cpp delete mode 100644 mozilla/layout/base/src/nsFrame.h delete mode 100644 mozilla/layout/base/src/nsFrameImageLoader.cpp delete mode 100644 mozilla/layout/base/src/nsFrameImageLoader.h delete mode 100644 mozilla/layout/base/src/nsGalleyContext.cpp delete mode 100644 mozilla/layout/base/src/nsPresContext.cpp delete mode 100644 mozilla/layout/base/src/nsPresContext.h delete mode 100644 mozilla/layout/base/src/nsPresShell.cpp delete mode 100644 mozilla/layout/base/src/nsPrintPreviewContext.cpp delete mode 100644 mozilla/layout/base/src/nsSelection.cpp delete mode 100644 mozilla/layout/base/src/nsSelection.h delete mode 100644 mozilla/layout/base/src/nsSelectionPoint.cpp delete mode 100644 mozilla/layout/base/src/nsSelectionPoint.h delete mode 100644 mozilla/layout/base/src/nsSelectionRange.cpp delete mode 100644 mozilla/layout/base/src/nsSelectionRange.h delete mode 100644 mozilla/layout/base/src/nsSpaceManager.cpp delete mode 100644 mozilla/layout/base/src/nsSpaceManager.h delete mode 100644 mozilla/layout/base/src/nsSplittableFrame.cpp delete mode 100644 mozilla/layout/base/src/nsSplittableFrame.h delete mode 100644 mozilla/layout/base/src/nsStyleConsts.h delete mode 100644 mozilla/layout/base/src/nsStyleContext.cpp delete mode 100644 mozilla/layout/base/src/nsStyleCoord.cpp delete mode 100644 mozilla/layout/base/src/nsStyleSet.cpp delete mode 100644 mozilla/layout/base/tests/Makefile delete mode 100644 mozilla/layout/base/tests/TestContainerFrame.cpp delete mode 100644 mozilla/layout/base/tests/TestSpaceManager.cpp delete mode 100644 mozilla/layout/base/tests/makefile.win delete mode 100644 mozilla/layout/build/Makefile delete mode 100644 mozilla/layout/build/dlldeps.cpp delete mode 100644 mozilla/layout/build/makefile.win delete mode 100644 mozilla/layout/config/config.mak delete mode 100644 mozilla/layout/config/rules.mak delete mode 100644 mozilla/layout/css/Makefile delete mode 100644 mozilla/layout/css/layout/Makefile delete mode 100644 mozilla/layout/css/layout/makefile.win delete mode 100644 mozilla/layout/css/layout/public/Makefile delete mode 100644 mozilla/layout/css/layout/public/makefile.win delete mode 100644 mozilla/layout/css/layout/public/nsIInlineReflow.h delete mode 100644 mozilla/layout/css/layout/src/Makefile delete mode 100644 mozilla/layout/css/layout/src/makefile.win delete mode 100644 mozilla/layout/css/layout/src/nsCSSBlockFrame.cpp delete mode 100644 mozilla/layout/css/layout/src/nsCSSBlockFrame.h delete mode 100644 mozilla/layout/css/layout/src/nsCSSContainerFrame.cpp delete mode 100644 mozilla/layout/css/layout/src/nsCSSInlineFrame.cpp delete mode 100644 mozilla/layout/css/layout/src/nsCSSInlineFrame.h delete mode 100644 mozilla/layout/css/layout/src/nsCSSInlineLayout.cpp delete mode 100644 mozilla/layout/css/layout/src/nsCSSInlineLayout.h delete mode 100644 mozilla/layout/css/layout/src/nsCSSLineLayout.cpp delete mode 100644 mozilla/layout/css/layout/src/nsCSSLineLayout.h delete mode 100644 mozilla/layout/css/makefile.win delete mode 100644 mozilla/layout/events/Makefile delete mode 100644 mozilla/layout/events/public/Makefile delete mode 100644 mozilla/layout/events/public/makefile.win delete mode 100644 mozilla/layout/events/public/nsIEventListenerManager.h delete mode 100644 mozilla/layout/events/public/nsIEventStateManager.h delete mode 100644 mozilla/layout/events/src/Makefile delete mode 100644 mozilla/layout/events/src/makefile.win delete mode 100644 mozilla/layout/events/src/nsDOMEvent.cpp delete mode 100644 mozilla/layout/events/src/nsDOMEvent.h delete mode 100644 mozilla/layout/events/src/nsEventListenerManager.cpp delete mode 100644 mozilla/layout/events/src/nsEventListenerManager.h delete mode 100644 mozilla/layout/events/src/nsEventStateManager.cpp delete mode 100644 mozilla/layout/events/src/nsEventStateManager.h delete mode 100644 mozilla/layout/generic/broken-image.gif delete mode 100644 mozilla/layout/generic/nsHTMLContainerFrame.cpp delete mode 100644 mozilla/layout/generic/nsHTMLContainerFrame.h delete mode 100644 mozilla/layout/generic/nsHTMLParts.h delete mode 100644 mozilla/layout/generic/nsHTMLReflowCommand.cpp delete mode 100644 mozilla/layout/generic/nsHTMLReflowCommand.h delete mode 100644 mozilla/layout/generic/nsIFrame.h delete mode 100644 mozilla/layout/generic/nsImageMap.cpp delete mode 100644 mozilla/layout/generic/nsLeafFrame.cpp delete mode 100644 mozilla/layout/generic/nsLeafFrame.h delete mode 100644 mozilla/layout/generic/nsPageFrame.cpp delete mode 100644 mozilla/layout/generic/nsPageFrame.h delete mode 100644 mozilla/layout/generic/nsPlaceholderFrame.cpp delete mode 100644 mozilla/layout/generic/nsPlaceholderFrame.h delete mode 100644 mozilla/layout/generic/nsSelection.cpp delete mode 100644 mozilla/layout/generic/nsSpaceManager.cpp delete mode 100644 mozilla/layout/generic/nsSpaceManager.h delete mode 100644 mozilla/layout/html/Makefile delete mode 100644 mozilla/layout/html/base/Makefile delete mode 100644 mozilla/layout/html/base/makefile.win delete mode 100644 mozilla/layout/html/base/src/MANIFEST delete mode 100644 mozilla/layout/html/base/src/Makefile delete mode 100644 mozilla/layout/html/base/src/broken-image.gif delete mode 100644 mozilla/layout/html/base/src/makefile.win delete mode 100644 mozilla/layout/html/base/src/nsAbsoluteFrame.cpp delete mode 100644 mozilla/layout/html/base/src/nsAbsoluteFrame.h delete mode 100644 mozilla/layout/html/base/src/nsBRPart.cpp delete mode 100644 mozilla/layout/html/base/src/nsBodyFrame.cpp delete mode 100644 mozilla/layout/html/base/src/nsBodyFrame.h delete mode 100644 mozilla/layout/html/base/src/nsBodyPart.cpp delete mode 100644 mozilla/layout/html/base/src/nsDOMAttributes.cpp delete mode 100644 mozilla/layout/html/base/src/nsDOMAttributes.h delete mode 100644 mozilla/layout/html/base/src/nsDOMIterator.cpp delete mode 100644 mozilla/layout/html/base/src/nsDOMIterator.h delete mode 100644 mozilla/layout/html/base/src/nsGlobalVariables.cpp delete mode 100644 mozilla/layout/html/base/src/nsGlobalVariables.h delete mode 100644 mozilla/layout/html/base/src/nsHRPart.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLAtoms.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLAtoms.h delete mode 100644 mozilla/layout/html/base/src/nsHTMLBase.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLBase.h delete mode 100644 mozilla/layout/html/base/src/nsHTMLBullet.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLContainer.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLContainer.h delete mode 100644 mozilla/layout/html/base/src/nsHTMLContainerFrame.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLContainerFrame.h delete mode 100644 mozilla/layout/html/base/src/nsHTMLContent.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLContent.h delete mode 100644 mozilla/layout/html/base/src/nsHTMLHead.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLIIDs.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLIIDs.h delete mode 100644 mozilla/layout/html/base/src/nsHTMLImage.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLImage.h delete mode 100644 mozilla/layout/html/base/src/nsHTMLParts.h delete mode 100644 mozilla/layout/html/base/src/nsHTMLReflowCommand.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLReflowCommand.h delete mode 100644 mozilla/layout/html/base/src/nsHTMLTagContent.cpp delete mode 100644 mozilla/layout/html/base/src/nsHTMLTagContent.h delete mode 100644 mozilla/layout/html/base/src/nsIAbsoluteItems.h delete mode 100644 mozilla/layout/html/base/src/nsIAnchoredItems.h delete mode 100644 mozilla/layout/html/base/src/nsIFloaterContainer.h delete mode 100644 mozilla/layout/html/base/src/nsIHTMLContent.h delete mode 100644 mozilla/layout/html/base/src/nsIImageMap.h delete mode 100644 mozilla/layout/html/base/src/nsImageMap.cpp delete mode 100644 mozilla/layout/html/base/src/nsLeafFrame.cpp delete mode 100644 mozilla/layout/html/base/src/nsLeafFrame.h delete mode 100644 mozilla/layout/html/base/src/nsPageFrame.cpp delete mode 100644 mozilla/layout/html/base/src/nsPageFrame.h delete mode 100644 mozilla/layout/html/base/src/nsPlaceholderFrame.cpp delete mode 100644 mozilla/layout/html/base/src/nsPlaceholderFrame.h delete mode 100644 mozilla/layout/html/base/src/nsRootPart.cpp delete mode 100644 mozilla/layout/html/base/src/nsScrollFrame.cpp delete mode 100644 mozilla/layout/html/base/src/nsScrollFrame.h delete mode 100644 mozilla/layout/html/base/src/nsSpacerPart.cpp delete mode 100644 mozilla/layout/html/base/src/nsTextContent.cpp delete mode 100644 mozilla/layout/html/base/src/nsWBRPart.cpp delete mode 100644 mozilla/layout/html/content/Makefile delete mode 100644 mozilla/layout/html/content/makefile.win delete mode 100644 mozilla/layout/html/content/src/Makefile delete mode 100644 mozilla/layout/html/content/src/makefile.win delete mode 100644 mozilla/layout/html/content/src/nsHTMLComment.cpp delete mode 100644 mozilla/layout/html/content/src/nsHTMLHead.cpp delete mode 100644 mozilla/layout/html/content/src/nsHTMLMeta.cpp delete mode 100644 mozilla/layout/html/content/src/nsHTMLTitle.cpp delete mode 100644 mozilla/layout/html/document/Makefile delete mode 100644 mozilla/layout/html/document/makefile.win delete mode 100644 mozilla/layout/html/document/public/MANIFEST delete mode 100644 mozilla/layout/html/document/public/makefile.win delete mode 100644 mozilla/layout/html/document/public/nsIWebFrame.h delete mode 100644 mozilla/layout/html/document/src/Makefile delete mode 100644 mozilla/layout/html/document/src/makefile.win delete mode 100644 mozilla/layout/html/document/src/nsHTMLContentSink.cpp delete mode 100644 mozilla/layout/html/document/src/nsHTMLDocument.cpp delete mode 100644 mozilla/layout/html/document/src/nsHTMLDocument.h delete mode 100644 mozilla/layout/html/document/src/nsHTMLIFrame.cpp delete mode 100644 mozilla/layout/html/document/src/nsHTMLParts.cpp delete mode 100644 mozilla/layout/html/document/src/nsIHTMLDocument.h delete mode 100644 mozilla/layout/html/document/src/ua.css delete mode 100644 mozilla/layout/html/forms/Makefile delete mode 100644 mozilla/layout/html/forms/makefile.win delete mode 100644 mozilla/layout/html/forms/public/Makefile delete mode 100644 mozilla/layout/html/forms/public/makefile.win delete mode 100644 mozilla/layout/html/forms/public/nsIFormControl.h delete mode 100644 mozilla/layout/html/forms/public/nsIFormManager.h delete mode 100644 mozilla/layout/html/forms/src/Makefile delete mode 100644 mozilla/layout/html/forms/src/makefile.win delete mode 100644 mozilla/layout/html/forms/src/nsForm.cpp delete mode 100644 mozilla/layout/html/forms/src/nsHTMLForms.h delete mode 100644 mozilla/layout/html/forms/src/nsInput.cpp delete mode 100644 mozilla/layout/html/forms/src/nsInput.h delete mode 100644 mozilla/layout/html/forms/src/nsInputButton.cpp delete mode 100644 mozilla/layout/html/forms/src/nsInputCheckbox.cpp delete mode 100644 mozilla/layout/html/forms/src/nsInputCheckbox.h delete mode 100644 mozilla/layout/html/forms/src/nsInputFile.cpp delete mode 100644 mozilla/layout/html/forms/src/nsInputFile.h delete mode 100644 mozilla/layout/html/forms/src/nsInputFrame.cpp delete mode 100644 mozilla/layout/html/forms/src/nsInputFrame.h delete mode 100644 mozilla/layout/html/forms/src/nsInputRadio.cpp delete mode 100644 mozilla/layout/html/forms/src/nsInputRadio.h delete mode 100644 mozilla/layout/html/forms/src/nsInputText.cpp delete mode 100644 mozilla/layout/html/forms/src/nsInputText.h delete mode 100644 mozilla/layout/html/forms/src/nsSelect.cpp delete mode 100644 mozilla/layout/html/makefile.win delete mode 100644 mozilla/layout/html/style/Makefile delete mode 100644 mozilla/layout/html/style/makefile.win delete mode 100644 mozilla/layout/html/style/public/MANIFEST delete mode 100644 mozilla/layout/html/style/public/Makefile delete mode 100644 mozilla/layout/html/style/public/makefile.win delete mode 100644 mozilla/layout/html/style/public/nsICSSParser.h delete mode 100644 mozilla/layout/html/style/src/Makefile delete mode 100644 mozilla/layout/html/style/src/makefile.win delete mode 100644 mozilla/layout/html/style/src/nsCSSDeclaration.cpp delete mode 100644 mozilla/layout/html/style/src/nsCSSKeywordIDs.h delete mode 100644 mozilla/layout/html/style/src/nsCSSKeywords.cpp delete mode 100644 mozilla/layout/html/style/src/nsCSSKeywords.h delete mode 100644 mozilla/layout/html/style/src/nsCSSLayout.cpp delete mode 100644 mozilla/layout/html/style/src/nsCSSLayout.h delete mode 100644 mozilla/layout/html/style/src/nsCSSParser.cpp delete mode 100644 mozilla/layout/html/style/src/nsCSSPropIDs.h delete mode 100644 mozilla/layout/html/style/src/nsCSSProps.cpp delete mode 100644 mozilla/layout/html/style/src/nsCSSProps.h delete mode 100644 mozilla/layout/html/style/src/nsCSSRendering.cpp delete mode 100644 mozilla/layout/html/style/src/nsCSSRendering.h delete mode 100644 mozilla/layout/html/style/src/nsCSSScanner.cpp delete mode 100644 mozilla/layout/html/style/src/nsCSSScanner.h delete mode 100644 mozilla/layout/html/style/src/nsCSSStyleRule.cpp delete mode 100644 mozilla/layout/html/style/src/nsCSSStyleSheet.cpp delete mode 100644 mozilla/layout/html/style/src/nsHTMLAttributes.cpp delete mode 100644 mozilla/layout/html/style/src/nsHTMLCSSStyleSheet.cpp delete mode 100644 mozilla/layout/html/style/src/nsHTMLStyleSheet.cpp delete mode 100644 mozilla/layout/html/style/src/nsHTMLValue.cpp delete mode 100644 mozilla/layout/html/style/src/nsHTMLValue.h delete mode 100644 mozilla/layout/html/style/src/nsICSSDeclaration.h delete mode 100644 mozilla/layout/html/style/src/nsICSSStyleRule.h delete mode 100644 mozilla/layout/html/style/src/nsICSSStyleSheet.h delete mode 100644 mozilla/layout/html/style/src/nsIHTMLAttributes.h delete mode 100644 mozilla/layout/html/style/src/nsIHTMLCSSStyleSheet.h delete mode 100644 mozilla/layout/html/style/src/nsIHTMLStyleSheet.h delete mode 100644 mozilla/layout/html/table/Makefile delete mode 100644 mozilla/layout/html/table/makefile.win delete mode 100644 mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp delete mode 100644 mozilla/layout/html/table/src/BasicTableLayoutStrategy.h delete mode 100644 mozilla/layout/html/table/src/Makefile delete mode 100644 mozilla/layout/html/table/src/makefile.win delete mode 100644 mozilla/layout/html/table/src/nsCellLayoutData.cpp delete mode 100644 mozilla/layout/html/table/src/nsCellLayoutData.h delete mode 100644 mozilla/layout/html/table/src/nsCellMap.cpp delete mode 100644 mozilla/layout/html/table/src/nsCellMap.h delete mode 100644 mozilla/layout/html/table/src/nsColLayoutData.cpp delete mode 100644 mozilla/layout/html/table/src/nsColLayoutData.h delete mode 100644 mozilla/layout/html/table/src/nsITableContent.h delete mode 100644 mozilla/layout/html/table/src/nsITableLayoutStrategy.h delete mode 100644 mozilla/layout/html/table/src/nsTableCaption.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableCaption.h delete mode 100644 mozilla/layout/html/table/src/nsTableCell.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableCell.h delete mode 100644 mozilla/layout/html/table/src/nsTableCellFrame.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableCellFrame.h delete mode 100644 mozilla/layout/html/table/src/nsTableCol.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableCol.h delete mode 100644 mozilla/layout/html/table/src/nsTableColFrame.h delete mode 100644 mozilla/layout/html/table/src/nsTableColGroup.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableColGroup.h delete mode 100644 mozilla/layout/html/table/src/nsTableColGroupFrame.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableColGroupFrame.h delete mode 100644 mozilla/layout/html/table/src/nsTableContent.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableContent.h delete mode 100644 mozilla/layout/html/table/src/nsTableFrame.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableFrame.h delete mode 100644 mozilla/layout/html/table/src/nsTableOuterFrame.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableOuterFrame.h delete mode 100644 mozilla/layout/html/table/src/nsTablePart.cpp delete mode 100644 mozilla/layout/html/table/src/nsTablePart.h delete mode 100644 mozilla/layout/html/table/src/nsTableRow.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableRow.h delete mode 100644 mozilla/layout/html/table/src/nsTableRowFrame.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableRowFrame.h delete mode 100644 mozilla/layout/html/table/src/nsTableRowGroup.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableRowGroup.h delete mode 100644 mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp delete mode 100644 mozilla/layout/html/table/src/nsTableRowGroupFrame.h delete mode 100644 mozilla/layout/html/tests/CellMapTest/CellMapTest.cpp delete mode 100644 mozilla/layout/html/tests/Makefile delete mode 100644 mozilla/layout/html/tests/TestAppend.js delete mode 100644 mozilla/layout/html/tests/TestAttributes.cpp delete mode 100644 mozilla/layout/html/tests/TestCSSParser.cpp delete mode 100644 mozilla/layout/html/tests/TestCSSPropertyLookup.cpp delete mode 100644 mozilla/layout/html/tests/TestCSSScanner.cpp delete mode 100644 mozilla/layout/html/tests/TestDelete.js delete mode 100644 mozilla/layout/html/tests/TestHTMLTagLookup.cpp delete mode 100644 mozilla/layout/html/tests/TestInlineFrame.cpp delete mode 100644 mozilla/layout/html/tests/TestInsert.js delete mode 100644 mozilla/layout/html/tests/TestTextDOM.js delete mode 100644 mozilla/layout/html/tests/css/IMPORTANT.css delete mode 100644 mozilla/layout/html/tests/css/INVALID.css delete mode 100644 mozilla/layout/html/tests/css/SELECTORS.css delete mode 100644 mozilla/layout/html/tests/css/background-attachment.css delete mode 100644 mozilla/layout/html/tests/css/background-color.css delete mode 100644 mozilla/layout/html/tests/css/background-image.css delete mode 100644 mozilla/layout/html/tests/css/background-position.css delete mode 100644 mozilla/layout/html/tests/css/background-repeat.css delete mode 100644 mozilla/layout/html/tests/css/background.css delete mode 100644 mozilla/layout/html/tests/css/border-bottom-width.css delete mode 100644 mozilla/layout/html/tests/css/border-bottom.css delete mode 100644 mozilla/layout/html/tests/css/border-color.css delete mode 100644 mozilla/layout/html/tests/css/border-left-width.css delete mode 100644 mozilla/layout/html/tests/css/border-left.css delete mode 100644 mozilla/layout/html/tests/css/border-right-width.css delete mode 100644 mozilla/layout/html/tests/css/border-right.css delete mode 100644 mozilla/layout/html/tests/css/border-style.css delete mode 100644 mozilla/layout/html/tests/css/border-top-width.css delete mode 100644 mozilla/layout/html/tests/css/border-top.css delete mode 100644 mozilla/layout/html/tests/css/border-width.css delete mode 100644 mozilla/layout/html/tests/css/border.css delete mode 100644 mozilla/layout/html/tests/css/bugs/bug01.css delete mode 100644 mozilla/layout/html/tests/css/bugs/bug02.css delete mode 100644 mozilla/layout/html/tests/css/clear.css delete mode 100644 mozilla/layout/html/tests/css/clip.css delete mode 100644 mozilla/layout/html/tests/css/color.css delete mode 100644 mozilla/layout/html/tests/css/cursor.css delete mode 100644 mozilla/layout/html/tests/css/direction.css delete mode 100644 mozilla/layout/html/tests/css/display.css delete mode 100644 mozilla/layout/html/tests/css/float.css delete mode 100644 mozilla/layout/html/tests/css/font-family.css delete mode 100644 mozilla/layout/html/tests/css/font-size.css delete mode 100644 mozilla/layout/html/tests/css/font-style.css delete mode 100644 mozilla/layout/html/tests/css/font-variant.css delete mode 100644 mozilla/layout/html/tests/css/font-weight.css delete mode 100644 mozilla/layout/html/tests/css/font.css delete mode 100644 mozilla/layout/html/tests/css/height.css delete mode 100644 mozilla/layout/html/tests/css/left.css delete mode 100644 mozilla/layout/html/tests/css/letter-spacing.css delete mode 100644 mozilla/layout/html/tests/css/line-height.css delete mode 100644 mozilla/layout/html/tests/css/list-style-image.css delete mode 100644 mozilla/layout/html/tests/css/list-style-position.css delete mode 100644 mozilla/layout/html/tests/css/list-style-type.css delete mode 100644 mozilla/layout/html/tests/css/list-style.css delete mode 100644 mozilla/layout/html/tests/css/margin-bottom.css delete mode 100644 mozilla/layout/html/tests/css/margin-left.css delete mode 100644 mozilla/layout/html/tests/css/margin-right.css delete mode 100644 mozilla/layout/html/tests/css/margin-top.css delete mode 100644 mozilla/layout/html/tests/css/margin.css delete mode 100644 mozilla/layout/html/tests/css/opacity.css delete mode 100644 mozilla/layout/html/tests/css/overflow.css delete mode 100644 mozilla/layout/html/tests/css/padding-bottom.css delete mode 100644 mozilla/layout/html/tests/css/padding-left.css delete mode 100644 mozilla/layout/html/tests/css/padding-right.css delete mode 100644 mozilla/layout/html/tests/css/padding-top.css delete mode 100644 mozilla/layout/html/tests/css/padding.css delete mode 100644 mozilla/layout/html/tests/css/position.css delete mode 100644 mozilla/layout/html/tests/css/text-align.css delete mode 100644 mozilla/layout/html/tests/css/text-decoration.css delete mode 100644 mozilla/layout/html/tests/css/text-indent.css delete mode 100644 mozilla/layout/html/tests/css/text-transform.css delete mode 100644 mozilla/layout/html/tests/css/top.css delete mode 100644 mozilla/layout/html/tests/css/vertical-align.css delete mode 100644 mozilla/layout/html/tests/css/visibility.css delete mode 100644 mozilla/layout/html/tests/css/white-space.css delete mode 100644 mozilla/layout/html/tests/css/width.css delete mode 100644 mozilla/layout/html/tests/css/word-spacing.css delete mode 100644 mozilla/layout/html/tests/css/z-index.css delete mode 100644 mozilla/layout/html/tests/makefile.win delete mode 100644 mozilla/layout/html/tests/table/TableContentTest/TableContentTest.cpp delete mode 100644 mozilla/layout/html/tests/table/testcases/nestedTables.html delete mode 100644 mozilla/layout/html/tests/table/testcases/slashlogo.html delete mode 100644 mozilla/layout/html/tests/table/testcases/wa_table_thtd_rowspan.html delete mode 100644 mozilla/layout/html/tests/table/testcases/wa_table_tr_align.html delete mode 100644 mozilla/layout/html/tests/table/testcases/wf_table_index.html delete mode 100644 mozilla/layout/macbuild/layout.mcp delete mode 100644 mozilla/layout/makefile.win delete mode 100644 mozilla/layout/style/nsCSSDeclaration.cpp delete mode 100644 mozilla/layout/style/nsCSSKeywords.cpp delete mode 100644 mozilla/layout/style/nsCSSKeywords.h delete mode 100644 mozilla/layout/style/nsCSSParser.cpp delete mode 100644 mozilla/layout/style/nsCSSProps.cpp delete mode 100644 mozilla/layout/style/nsCSSProps.h delete mode 100644 mozilla/layout/style/nsCSSScanner.cpp delete mode 100644 mozilla/layout/style/nsCSSScanner.h delete mode 100644 mozilla/layout/style/nsCSSStruct.cpp delete mode 100644 mozilla/layout/style/nsCSSStyleRule.cpp delete mode 100644 mozilla/layout/style/nsCSSStyleSheet.cpp delete mode 100644 mozilla/layout/style/nsHTMLCSSStyleSheet.cpp delete mode 100644 mozilla/layout/style/nsHTMLStyleSheet.cpp delete mode 100644 mozilla/layout/style/nsICSSParser.h delete mode 100644 mozilla/layout/style/nsICSSStyleRule.h delete mode 100644 mozilla/layout/style/nsIHTMLCSSStyleSheet.h delete mode 100644 mozilla/layout/style/nsIStyleRule.h delete mode 100644 mozilla/layout/style/nsIStyleSheet.h delete mode 100644 mozilla/layout/style/nsStyleContext.cpp delete mode 100644 mozilla/layout/style/nsStyleCoord.h delete mode 100644 mozilla/layout/style/nsStyleSet.cpp delete mode 100644 mozilla/layout/style/ua.css delete mode 100644 mozilla/layout/tables/BasicTableLayoutStrategy.cpp delete mode 100644 mozilla/layout/tables/BasicTableLayoutStrategy.h delete mode 100644 mozilla/layout/tables/nsCellMap.cpp delete mode 100644 mozilla/layout/tables/nsCellMap.h delete mode 100644 mozilla/layout/tables/nsITableLayoutStrategy.h delete mode 100644 mozilla/layout/tables/nsTableCellFrame.cpp delete mode 100644 mozilla/layout/tables/nsTableCellFrame.h delete mode 100644 mozilla/layout/tables/nsTableColFrame.h delete mode 100644 mozilla/layout/tables/nsTableColGroupFrame.cpp delete mode 100644 mozilla/layout/tables/nsTableColGroupFrame.h delete mode 100644 mozilla/layout/tables/nsTableFrame.cpp delete mode 100644 mozilla/layout/tables/nsTableFrame.h delete mode 100644 mozilla/layout/tables/nsTableOuterFrame.cpp delete mode 100644 mozilla/layout/tables/nsTableOuterFrame.h delete mode 100644 mozilla/layout/tables/nsTableRowFrame.cpp delete mode 100644 mozilla/layout/tables/nsTableRowFrame.h delete mode 100644 mozilla/layout/tables/nsTableRowGroupFrame.cpp delete mode 100644 mozilla/layout/tables/nsTableRowGroupFrame.h delete mode 100644 mozilla/layout/tools/CSSKeywords.txt delete mode 100644 mozilla/layout/tools/CSSProps.txt delete mode 100644 mozilla/layout/tools/ColorNames.txt delete mode 100644 mozilla/layout/tools/HTMLTags.txt delete mode 100644 mozilla/layout/tools/Makefile delete mode 100644 mozilla/layout/tools/genhash.inc delete mode 100644 mozilla/layout/tools/genhash.pl delete mode 100644 mozilla/modules/fullsoft/Makefile create mode 100644 mozilla/network/main/singsign.c delete mode 100644 mozilla/nglayout.mac delete mode 100644 mozilla/nglayout.mak delete mode 100644 mozilla/nglayout.mk delete mode 100644 mozilla/parser/htmlparser/Makefile delete mode 100644 mozilla/parser/htmlparser/macbuild/htmlparser.mcp delete mode 100644 mozilla/parser/htmlparser/makefile.win delete mode 100644 mozilla/parser/htmlparser/robot/Makefile delete mode 100644 mozilla/parser/htmlparser/robot/makefile.win delete mode 100644 mozilla/parser/htmlparser/robot/nsDebugRobot.cpp delete mode 100644 mozilla/parser/htmlparser/robot/nsIRobotSink.h delete mode 100644 mozilla/parser/htmlparser/robot/nsIRobotSinkObserver.h delete mode 100644 mozilla/parser/htmlparser/robot/nsRobotSink.cpp delete mode 100644 mozilla/parser/htmlparser/robot/test/RobotMain.cpp delete mode 100644 mozilla/parser/htmlparser/robot/test/makefile.win delete mode 100644 mozilla/parser/htmlparser/src/CNavDTD.cpp delete mode 100644 mozilla/parser/htmlparser/src/CNavDTD.h delete mode 100644 mozilla/parser/htmlparser/src/COtherDTD.cpp delete mode 100644 mozilla/parser/htmlparser/src/COtherDTD.h delete mode 100644 mozilla/parser/htmlparser/src/MANIFEST delete mode 100644 mozilla/parser/htmlparser/src/Makefile delete mode 100644 mozilla/parser/htmlparser/src/SelfTest.cpp delete mode 100644 mozilla/parser/htmlparser/src/makefile.win delete mode 100644 mozilla/parser/htmlparser/src/nsDTDDebug.cpp delete mode 100644 mozilla/parser/htmlparser/src/nsHTMLContentSink.cpp delete mode 100644 mozilla/parser/htmlparser/src/nsHTMLContentSink.h delete mode 100644 mozilla/parser/htmlparser/src/nsHTMLTags.cpp delete mode 100644 mozilla/parser/htmlparser/src/nsHTMLTags.h delete mode 100644 mozilla/parser/htmlparser/src/nsHTMLTokens.cpp delete mode 100644 mozilla/parser/htmlparser/src/nsHTMLTokens.h delete mode 100644 mozilla/parser/htmlparser/src/nsIContentSink.h delete mode 100644 mozilla/parser/htmlparser/src/nsIDTD.h delete mode 100644 mozilla/parser/htmlparser/src/nsIDTDDebug.h delete mode 100644 mozilla/parser/htmlparser/src/nsIHTMLContentSink.h delete mode 100644 mozilla/parser/htmlparser/src/nsIParser.h delete mode 100644 mozilla/parser/htmlparser/src/nsIParserFilter.h delete mode 100644 mozilla/parser/htmlparser/src/nsIParserNode.h delete mode 100644 mozilla/parser/htmlparser/src/nsITokenHandler.h delete mode 100644 mozilla/parser/htmlparser/src/nsParser.cpp delete mode 100644 mozilla/parser/htmlparser/src/nsParser.h delete mode 100644 mozilla/parser/htmlparser/src/nsParserNode.cpp delete mode 100644 mozilla/parser/htmlparser/src/nsParserNode.h delete mode 100644 mozilla/parser/htmlparser/src/nsParserTypes.h delete mode 100644 mozilla/parser/htmlparser/src/nsScanner.cpp delete mode 100644 mozilla/parser/htmlparser/src/nsScanner.h delete mode 100644 mozilla/parser/htmlparser/src/nsToken.cpp delete mode 100644 mozilla/parser/htmlparser/src/nsToken.h delete mode 100644 mozilla/parser/htmlparser/src/nsTokenHandler.cpp delete mode 100644 mozilla/parser/htmlparser/src/nsTokenHandler.h delete mode 100644 mozilla/parser/htmlparser/src/nsTokenizer.cpp delete mode 100644 mozilla/parser/htmlparser/src/nsTokenizer.h delete mode 100644 mozilla/parser/htmlparser/src/nshtmlpars.h delete mode 100644 mozilla/parser/htmlparser/src/prstrm.cpp delete mode 100644 mozilla/parser/htmlparser/src/prstrm.h delete mode 100644 mozilla/parser/htmlparser/tests/html/Table01.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table02.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table03.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table04.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table05.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table05e.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table05f.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table05g.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table05h.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table05i.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table05j.html delete mode 100644 mozilla/parser/htmlparser/tests/html/Table06.html delete mode 100644 mozilla/parser/htmlparser/tests/html/acronym1.html delete mode 100644 mozilla/parser/htmlparser/tests/html/aname01.html delete mode 100644 mozilla/parser/htmlparser/tests/html/atoi01.html delete mode 100644 mozilla/parser/htmlparser/tests/html/attribute_quote_bug1.html delete mode 100644 mozilla/parser/htmlparser/tests/html/bdo001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/br001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/button001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/button002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/center001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/center002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col004.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col005.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col006.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col007.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col008.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col009.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col010.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col011.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col012.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col013.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col014.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col015.html delete mode 100644 mozilla/parser/htmlparser/tests/html/col016.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del004.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del005.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del006.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del007.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del008.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del009.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del010.html delete mode 100644 mozilla/parser/htmlparser/tests/html/del011.html delete mode 100644 mozilla/parser/htmlparser/tests/html/doc001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/doc002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/endswithcr.html delete mode 100644 mozilla/parser/htmlparser/tests/html/entity001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/fieldset001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/fieldset002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/fieldset003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/form001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/form002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/head01.html delete mode 100644 mozilla/parser/htmlparser/tests/html/head02.html delete mode 100644 mozilla/parser/htmlparser/tests/html/head03.html delete mode 100644 mozilla/parser/htmlparser/tests/html/home01.html delete mode 100644 mozilla/parser/htmlparser/tests/html/html001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/imgmap001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/ins001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/ins002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/ins003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/insdel01.html delete mode 100644 mozilla/parser/htmlparser/tests/html/insdel02.html delete mode 100644 mozilla/parser/htmlparser/tests/html/layer001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/layer002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/layer003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/layer01.html delete mode 100644 mozilla/parser/htmlparser/tests/html/list001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/list002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/list003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/newlines.html delete mode 100644 mozilla/parser/htmlparser/tests/html/obj001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/obj002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/obj003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/param001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/param002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/pre001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/pre002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/pre003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/pre004.html delete mode 100644 mozilla/parser/htmlparser/tests/html/pre005.html delete mode 100644 mozilla/parser/htmlparser/tests/html/pre006.html delete mode 100644 mozilla/parser/htmlparser/tests/html/pre007.html delete mode 100644 mozilla/parser/htmlparser/tests/html/pre012.html delete mode 100644 mozilla/parser/htmlparser/tests/html/pre015.html delete mode 100644 mozilla/parser/htmlparser/tests/html/pre016.html delete mode 100644 mozilla/parser/htmlparser/tests/html/q001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/quote001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/quote002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/quote003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/span001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/span002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/span003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/strike002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/strike005.html delete mode 100644 mozilla/parser/htmlparser/tests/html/strike006.html delete mode 100644 mozilla/parser/htmlparser/tests/html/strike007.html delete mode 100644 mozilla/parser/htmlparser/tests/html/strike008.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table05a.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table05b.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table05c.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table05d.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table05k.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table05l.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table05m.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table05n.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table05o.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table07.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table200.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table201.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table202.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table203.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table204.html delete mode 100644 mozilla/parser/htmlparser/tests/html/table205.html delete mode 100644 mozilla/parser/htmlparser/tests/html/tableall.html delete mode 100644 mozilla/parser/htmlparser/tests/html/tag001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/tag002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/tag003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/tag004.html delete mode 100644 mozilla/parser/htmlparser/tests/html/tag005.html delete mode 100644 mozilla/parser/htmlparser/tests/html/tag006.html delete mode 100644 mozilla/parser/htmlparser/tests/html/tag007.html delete mode 100644 mozilla/parser/htmlparser/tests/html/tag008.html delete mode 100644 mozilla/parser/htmlparser/tests/html/target01.html delete mode 100644 mozilla/parser/htmlparser/tests/html/tbody001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/text001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/text002.html delete mode 100644 mozilla/parser/htmlparser/tests/html/text003.html delete mode 100644 mozilla/parser/htmlparser/tests/html/thead001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/title01.html delete mode 100644 mozilla/parser/htmlparser/tests/html/usascii.html delete mode 100644 mozilla/parser/htmlparser/tests/html/utf8001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/value001.html delete mode 100644 mozilla/parser/htmlparser/tests/html/xmp005.html delete mode 100644 mozilla/parser/htmlparser/tests/windows/Selftest.cpp delete mode 100644 mozilla/parser/htmlparser/tools/gentags.pl create mode 100644 mozilla/privacy/Makefile create mode 100644 mozilla/privacy/makefile.win rename mozilla/{layout/html/document => privacy}/public/Makefile (92%) rename mozilla/{layout/events => privacy/public}/makefile.win (91%) create mode 100644 mozilla/privacy/public/privacy.h rename mozilla/{layout/css/layout/src/nsCSSContainerFrame.h => privacy/public/receipt.h} (60%) rename mozilla/{view => privacy}/src/Makefile (75%) rename mozilla/{content/events => privacy}/src/makefile.win (60%) create mode 100644 mozilla/privacy/src/privacy.c create mode 100644 mozilla/privacy/src/receipt.c delete mode 100644 mozilla/shell/Makefile delete mode 100644 mozilla/shell/makefile.win delete mode 100644 mozilla/shell/public/Makefile delete mode 100644 mozilla/shell/public/makefile.win delete mode 100644 mozilla/shell/public/nsIApplicationShell.h delete mode 100644 mozilla/shell/public/nsIShellInstance.h delete mode 100644 mozilla/shell/public/nsshell.h delete mode 100644 mozilla/shell/src/Makefile delete mode 100644 mozilla/shell/src/makefile.win delete mode 100644 mozilla/shell/src/nsApplicationManager.cpp delete mode 100644 mozilla/shell/src/nsApplicationManager.h delete mode 100644 mozilla/shell/src/nsShellInstance.cpp delete mode 100644 mozilla/shell/src/nsShellInstance.h delete mode 100644 mozilla/shell/src/unix/Makefile delete mode 100644 mozilla/shell/src/unix/main.cpp delete mode 100644 mozilla/shell/src/windows/makefile.win delete mode 100644 mozilla/shell/src/windows/winmain.cpp delete mode 100644 mozilla/shell/tests/Makefile delete mode 100644 mozilla/shell/tests/apptest/Makefile delete mode 100644 mozilla/shell/tests/apptest/apptest.rc delete mode 100644 mozilla/shell/tests/apptest/makefile.win delete mode 100644 mozilla/shell/tests/apptest/nsAppTest.cpp delete mode 100644 mozilla/shell/tests/apptest/nsAppTest.h delete mode 100644 mozilla/shell/tests/apptest/resources.h delete mode 100644 mozilla/shell/tests/makefile.win delete mode 100644 mozilla/string/obsolete/nsString.cpp delete mode 100644 mozilla/string/obsolete/nsString.h delete mode 100644 mozilla/trex.mak delete mode 100644 mozilla/trex.mk delete mode 100644 mozilla/uriloader/base/nsDocLoader.cpp delete mode 100644 mozilla/view/Makefile delete mode 100644 mozilla/view/makefile.win delete mode 100644 mozilla/view/public/MANIFEST delete mode 100644 mozilla/view/public/Makefile delete mode 100644 mozilla/view/public/makefile.win delete mode 100644 mozilla/view/public/nsIScrollableView.h delete mode 100644 mozilla/view/public/nsIView.h delete mode 100644 mozilla/view/public/nsIViewManager.h delete mode 100644 mozilla/view/public/nsViewsCID.h delete mode 100644 mozilla/view/src/makefile.win delete mode 100644 mozilla/view/src/nsScrollingView.cpp delete mode 100644 mozilla/view/src/nsScrollingView.h delete mode 100644 mozilla/view/src/nsView.cpp delete mode 100644 mozilla/view/src/nsView.h delete mode 100644 mozilla/view/src/nsViewFactory.cpp delete mode 100644 mozilla/view/src/nsViewManager.cpp delete mode 100644 mozilla/view/src/nsViewManager.h delete mode 100644 mozilla/webshell/Makefile delete mode 100644 mozilla/webshell/macbuild/nglayoutworksheet delete mode 100644 mozilla/webshell/macbuild/raptorlist.txt delete mode 100644 mozilla/webshell/macbuild/webshell.mcp delete mode 100644 mozilla/webshell/makefile.win delete mode 100644 mozilla/webshell/public/MANIFEST delete mode 100644 mozilla/webshell/public/Makefile delete mode 100644 mozilla/webshell/public/makefile.win delete mode 100644 mozilla/webshell/public/nsIDocumentLoader.h delete mode 100644 mozilla/webshell/public/nsIDocumentWidget.h delete mode 100644 mozilla/webshell/public/nsILinkHandler.h delete mode 100644 mozilla/webshell/public/nsIWebWidget.h delete mode 100644 mozilla/webshell/public/nsweb.h delete mode 100644 mozilla/webshell/src/Makefile delete mode 100644 mozilla/webshell/src/makefile.win delete mode 100644 mozilla/webshell/src/nsDocLoader.cpp delete mode 100644 mozilla/webshell/src/nsLinkHandler.cpp delete mode 100644 mozilla/webshell/src/nsWebWidget.cpp delete mode 100644 mozilla/webshell/tests/Makefile delete mode 100644 mozilla/webshell/tests/imgtest/ImageTest.cpp delete mode 100644 mozilla/webshell/tests/imgtest/image.rc delete mode 100644 mozilla/webshell/tests/imgtest/makefile.win delete mode 100644 mozilla/webshell/tests/imgtest/resources.h delete mode 100644 mozilla/webshell/tests/makefile.win delete mode 100644 mozilla/webshell/tests/viewer/JSConsole.cpp delete mode 100644 mozilla/webshell/tests/viewer/JSConsole.h delete mode 100644 mozilla/webshell/tests/viewer/Makefile delete mode 100644 mozilla/webshell/tests/viewer/jsconsres.h delete mode 100644 mozilla/webshell/tests/viewer/mac/viewer.mcp delete mode 100644 mozilla/webshell/tests/viewer/mac/viewer.ppob delete mode 100644 mozilla/webshell/tests/viewer/mac/viewer.rsrc delete mode 100644 mozilla/webshell/tests/viewer/macToBeImplemented.cp delete mode 100644 mozilla/webshell/tests/viewer/main.cpp delete mode 100644 mozilla/webshell/tests/viewer/makefile.win delete mode 100644 mozilla/webshell/tests/viewer/nsDocLoader.cpp delete mode 100644 mozilla/webshell/tests/viewer/nsDocLoader.h delete mode 100644 mozilla/webshell/tests/viewer/nsEditorInterfaces.cpp delete mode 100644 mozilla/webshell/tests/viewer/nsEditorInterfaces.h delete mode 100644 mozilla/webshell/tests/viewer/nsEditorMode.cpp delete mode 100644 mozilla/webshell/tests/viewer/nsEditorMode.h delete mode 100644 mozilla/webshell/tests/viewer/nsMacApplication.cpp delete mode 100644 mozilla/webshell/tests/viewer/nsMacFile.cp delete mode 100644 mozilla/webshell/tests/viewer/nsMotifMenu.cpp delete mode 100644 mozilla/webshell/tests/viewer/nsMotifMenu.h delete mode 100644 mozilla/webshell/tests/viewer/nsViewer.cpp delete mode 100644 mozilla/webshell/tests/viewer/nsViewer.h delete mode 100644 mozilla/webshell/tests/viewer/resources.h delete mode 100644 mozilla/webshell/tests/viewer/samples/Anieyes.gif delete mode 100644 mozilla/webshell/tests/viewer/samples/bg.jpg delete mode 100644 mozilla/webshell/tests/viewer/samples/gear1.gif delete mode 100644 mozilla/webshell/tests/viewer/samples/raptor.jpg delete mode 100644 mozilla/webshell/tests/viewer/samples/rock_gra.gif delete mode 100644 mozilla/webshell/tests/viewer/samples/test0.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test1.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test2.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test3.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test4.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test5.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test6.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test7.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test8-1.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test8.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test8sca.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test8siz.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test8tab.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test9.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test9a.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test_ed.html delete mode 100644 mozilla/webshell/tests/viewer/samples/test_form.html delete mode 100644 mozilla/webshell/tests/viewer/viewer.rc delete mode 100644 mozilla/webshell/tests/viewer/winmain.cpp delete mode 100755 mozilla/webtools/bonsai/CGI.tcl delete mode 100644 mozilla/webtools/bonsai/INSTALL delete mode 100755 mozilla/webtools/bonsai/Makefile delete mode 100644 mozilla/webtools/bonsai/README delete mode 100755 mozilla/webtools/bonsai/SourceChecker.cgi delete mode 100755 mozilla/webtools/bonsai/SourceChecker.pm delete mode 100755 mozilla/webtools/bonsai/addcheckin.tcl delete mode 100755 mozilla/webtools/bonsai/admin.cgi delete mode 100755 mozilla/webtools/bonsai/adminfuncs.tcl delete mode 100755 mozilla/webtools/bonsai/adminmail.tcl delete mode 100755 mozilla/webtools/bonsai/bonsai.gif delete mode 100755 mozilla/webtools/bonsai/branchspam.cgi delete mode 100755 mozilla/webtools/bonsai/branchspammer.cgi delete mode 100755 mozilla/webtools/bonsai/changebar.tcl delete mode 100644 mozilla/webtools/bonsai/closemessage delete mode 100644 mozilla/webtools/bonsai/contacthelp.html delete mode 100755 mozilla/webtools/bonsai/countcheckins.cgi delete mode 100755 mozilla/webtools/bonsai/createlegaldirs.tcl delete mode 100755 mozilla/webtools/bonsai/cvsblame.cgi delete mode 100755 mozilla/webtools/bonsai/cvsblame.pl delete mode 100755 mozilla/webtools/bonsai/cvsguess.cgi delete mode 100755 mozilla/webtools/bonsai/cvsindex.pl delete mode 100755 mozilla/webtools/bonsai/cvslog.cgi delete mode 100644 mozilla/webtools/bonsai/cvsmenu.pl delete mode 100755 mozilla/webtools/bonsai/cvsquery.cgi delete mode 100755 mozilla/webtools/bonsai/cvsquery.pl delete mode 100755 mozilla/webtools/bonsai/cvsqueryform.cgi delete mode 100644 mozilla/webtools/bonsai/cvsregexp.html delete mode 100755 mozilla/webtools/bonsai/cvsview2.cgi delete mode 100755 mozilla/webtools/bonsai/doadmin.cgi delete mode 100755 mozilla/webtools/bonsai/doeditcheckin.cgi delete mode 100755 mozilla/webtools/bonsai/doeditmessage.cgi delete mode 100755 mozilla/webtools/bonsai/doeditprofile.cgi delete mode 100755 mozilla/webtools/bonsai/doeditwhiteboard.cgi delete mode 100755 mozilla/webtools/bonsai/dolog.pl delete mode 100755 mozilla/webtools/bonsai/dotweak.cgi delete mode 100755 mozilla/webtools/bonsai/editcheckin.cgi delete mode 100755 mozilla/webtools/bonsai/editmessage.cgi delete mode 100755 mozilla/webtools/bonsai/editprofile.cgi delete mode 100755 mozilla/webtools/bonsai/editwhiteboard.cgi delete mode 100755 mozilla/webtools/bonsai/globals.tcl delete mode 100755 mozilla/webtools/bonsai/handleAdminMail.tcl delete mode 100755 mozilla/webtools/bonsai/handleCheckinMail.tcl delete mode 100644 mozilla/webtools/bonsai/header.pl delete mode 100644 mozilla/webtools/bonsai/index.html delete mode 100755 mozilla/webtools/bonsai/indextest.pl delete mode 100755 mozilla/webtools/bonsai/lloydcgi.pl delete mode 100755 mozilla/webtools/bonsai/localprofile.cgi delete mode 100755 mozilla/webtools/bonsai/maketables.sh delete mode 100755 mozilla/webtools/bonsai/moduleanalyse.cgi delete mode 100755 mozilla/webtools/bonsai/modules.pl delete mode 100755 mozilla/webtools/bonsai/multidiff.cgi delete mode 100644 mozilla/webtools/bonsai/myglobrecur.tcl delete mode 100644 mozilla/webtools/bonsai/openmessage delete mode 100755 mozilla/webtools/bonsai/perlifyconfig.tcl delete mode 100755 mozilla/webtools/bonsai/processqueue.pl delete mode 100755 mozilla/webtools/bonsai/profile.cgi delete mode 100755 mozilla/webtools/bonsai/rebuildcvshistory.cgi delete mode 100755 mozilla/webtools/bonsai/rebuilddatabase.tcl delete mode 100755 mozilla/webtools/bonsai/rebuildtaginfo.cgi delete mode 100755 mozilla/webtools/bonsai/repophook.cgi delete mode 100755 mozilla/webtools/bonsai/reposfiles.pl delete mode 100755 mozilla/webtools/bonsai/rview.cgi delete mode 100755 mozilla/webtools/bonsai/show2.cgi delete mode 100755 mozilla/webtools/bonsai/showcheckins.cgi delete mode 100755 mozilla/webtools/bonsai/switchtree.cgi delete mode 100755 mozilla/webtools/bonsai/testlock.pl delete mode 100755 mozilla/webtools/bonsai/toplevel.cgi delete mode 100644 mozilla/webtools/bonsai/trapdoor.c delete mode 100644 mozilla/webtools/bonsai/utils.pl delete mode 100755 mozilla/webtools/bonsai/viewold.cgi delete mode 100644 mozilla/webtools/lxr/.htaccess delete mode 100644 mozilla/webtools/lxr/INSTALL delete mode 100755 mozilla/webtools/lxr/diff delete mode 100755 mozilla/webtools/lxr/find delete mode 100755 mozilla/webtools/lxr/genxref delete mode 100755 mozilla/webtools/lxr/ident delete mode 100644 mozilla/webtools/lxr/index.html delete mode 100755 mozilla/webtools/lxr/lib/LXR/Common.pm delete mode 100755 mozilla/webtools/lxr/lib/LXR/Config.pm delete mode 100755 mozilla/webtools/lxr/lib/SimpleParse.pm delete mode 100644 mozilla/webtools/lxr/lxr.conf delete mode 100755 mozilla/webtools/lxr/search delete mode 100644 mozilla/webtools/lxr/search-help.html delete mode 100755 mozilla/webtools/lxr/source delete mode 100644 mozilla/webtools/lxr/template-dir delete mode 100644 mozilla/webtools/lxr/template-head delete mode 100644 mozilla/webtools/lxr/template-source-head delete mode 100644 mozilla/webtools/lxr/template-sourcedir-head delete mode 100644 mozilla/webtools/lxr/template-tail delete mode 100755 mozilla/webtools/lxr/update-search.sh delete mode 100755 mozilla/webtools/lxr/update-src.sh delete mode 100755 mozilla/webtools/lxr/update-xref.sh delete mode 100755 mozilla/webtools/registry/file.cgi delete mode 100755 mozilla/webtools/registry/lloydcgi.pl delete mode 100755 mozilla/webtools/registry/who.cgi delete mode 100644 mozilla/webtools/tinderbox/1afi003r.gif delete mode 100644 mozilla/webtools/tinderbox/Empty.html delete mode 100644 mozilla/webtools/tinderbox/README delete mode 100755 mozilla/webtools/tinderbox/addimage.cgi delete mode 100755 mozilla/webtools/tinderbox/addnote.cgi delete mode 100755 mozilla/webtools/tinderbox/admintree.cgi delete mode 100755 mozilla/webtools/tinderbox/buildwho.pl delete mode 100755 mozilla/webtools/tinderbox/clean.pl delete mode 100755 mozilla/webtools/tinderbox/copydata.pl delete mode 100755 mozilla/webtools/tinderbox/doadmin.cgi delete mode 100755 mozilla/webtools/tinderbox/ep_mac.pl delete mode 100755 mozilla/webtools/tinderbox/ep_unix.pl delete mode 100755 mozilla/webtools/tinderbox/ep_windows.pl delete mode 100755 mozilla/webtools/tinderbox/faq.html delete mode 100755 mozilla/webtools/tinderbox/fixupimages.pl delete mode 100755 mozilla/webtools/tinderbox/globals.pl delete mode 100755 mozilla/webtools/tinderbox/handlemail.pl delete mode 100755 mozilla/webtools/tinderbox/imagelog.pl delete mode 100755 mozilla/webtools/tinderbox/index.html delete mode 100755 mozilla/webtools/tinderbox/processbuild.pl delete mode 100644 mozilla/webtools/tinderbox/reledanim.gif delete mode 100755 mozilla/webtools/tinderbox/showbuilds.cgi delete mode 100755 mozilla/webtools/tinderbox/showimages.cgi delete mode 100755 mozilla/webtools/tinderbox/showlog.cgi delete mode 100644 mozilla/webtools/tinderbox/star.gif delete mode 100644 mozilla/widget/Makefile delete mode 100755 mozilla/widget/build.bat delete mode 100644 mozilla/widget/makefile.win delete mode 100644 mozilla/widget/public/MANIFEST delete mode 100644 mozilla/widget/public/Makefile delete mode 100644 mozilla/widget/public/makefile.win delete mode 100644 mozilla/widget/public/nsGUIEvent.h delete mode 100644 mozilla/widget/public/nsIAppShell.h delete mode 100644 mozilla/widget/public/nsIButton.h delete mode 100644 mozilla/widget/public/nsICheckButton.h delete mode 100644 mozilla/widget/public/nsIComboBox.h delete mode 100644 mozilla/widget/public/nsIEventListener.h delete mode 100644 mozilla/widget/public/nsIFileWidget.h delete mode 100644 mozilla/widget/public/nsIListBox.h delete mode 100644 mozilla/widget/public/nsIListWidget.h delete mode 100644 mozilla/widget/public/nsIMouseListener.h delete mode 100644 mozilla/widget/public/nsIRadioButton.h delete mode 100644 mozilla/widget/public/nsIRadioGroup.h delete mode 100644 mozilla/widget/public/nsIScrollbar.h delete mode 100644 mozilla/widget/public/nsITabWidget.h delete mode 100644 mozilla/widget/public/nsITextAreaWidget.h delete mode 100644 mozilla/widget/public/nsITextWidget.h delete mode 100644 mozilla/widget/public/nsIToolkit.h delete mode 100644 mozilla/widget/public/nsITooltipWidget.h delete mode 100644 mozilla/widget/public/nsIWidget.h delete mode 100644 mozilla/widget/public/nsStringUtil.h delete mode 100644 mozilla/widget/public/nsWidgetsCID.h delete mode 100644 mozilla/widget/public/nsui.h delete mode 100644 mozilla/widget/src/Makefile delete mode 100644 mozilla/widget/src/mac/nsDeviceContextMac.cpp delete mode 100644 mozilla/widget/src/mac/nsDeviceContextMac.h delete mode 100644 mozilla/widget/src/makefile.win delete mode 100644 mozilla/widget/src/motif/Makefile delete mode 100644 mozilla/widget/src/motif/nsAppShell.cpp delete mode 100644 mozilla/widget/src/motif/nsAppShell.h delete mode 100644 mozilla/widget/src/motif/nsButton.cpp delete mode 100644 mozilla/widget/src/motif/nsButton.h delete mode 100644 mozilla/widget/src/motif/nsCheckButton.cpp delete mode 100644 mozilla/widget/src/motif/nsCheckButton.h delete mode 100644 mozilla/widget/src/motif/nsComboBox.cpp delete mode 100644 mozilla/widget/src/motif/nsComboBox.h delete mode 100644 mozilla/widget/src/motif/nsFileWidget.cpp delete mode 100644 mozilla/widget/src/motif/nsFileWidget.h delete mode 100644 mozilla/widget/src/motif/nsListBox.cpp delete mode 100644 mozilla/widget/src/motif/nsListBox.h delete mode 100644 mozilla/widget/src/motif/nsRadioButton.cpp delete mode 100644 mozilla/widget/src/motif/nsRadioButton.h delete mode 100644 mozilla/widget/src/motif/nsScrollbar.cpp delete mode 100644 mozilla/widget/src/motif/nsScrollbar.h delete mode 100644 mozilla/widget/src/motif/nsTextAreaWidget.cpp delete mode 100644 mozilla/widget/src/motif/nsTextAreaWidget.h delete mode 100644 mozilla/widget/src/motif/nsTextHelper.cpp delete mode 100644 mozilla/widget/src/motif/nsTextHelper.h delete mode 100644 mozilla/widget/src/motif/nsTextWidget.cpp delete mode 100644 mozilla/widget/src/motif/nsTextWidget.h delete mode 100644 mozilla/widget/src/motif/nsToolkit.cpp delete mode 100644 mozilla/widget/src/motif/nsToolkit.h delete mode 100644 mozilla/widget/src/motif/nsWidgetFactory.cpp delete mode 100644 mozilla/widget/src/motif/nsWindow.cpp delete mode 100644 mozilla/widget/src/motif/nsWindow.h delete mode 100644 mozilla/widget/src/motif/nsXtEventHandler.cpp delete mode 100644 mozilla/widget/src/motif/nsXtEventHandler.h delete mode 100644 mozilla/widget/src/windows/Makefile delete mode 100644 mozilla/widget/src/windows/makefile.win delete mode 100644 mozilla/widget/src/windows/nsAppShell.cpp delete mode 100644 mozilla/widget/src/windows/nsAppShell.h delete mode 100644 mozilla/widget/src/windows/nsButton.cpp delete mode 100644 mozilla/widget/src/windows/nsButton.h delete mode 100644 mozilla/widget/src/windows/nsCList.h delete mode 100644 mozilla/widget/src/windows/nsCheckButton.cpp delete mode 100644 mozilla/widget/src/windows/nsCheckButton.h delete mode 100644 mozilla/widget/src/windows/nsComboBox.cpp delete mode 100644 mozilla/widget/src/windows/nsComboBox.h delete mode 100644 mozilla/widget/src/windows/nsFileWidget.cpp delete mode 100644 mozilla/widget/src/windows/nsFileWidget.h delete mode 100644 mozilla/widget/src/windows/nsListBox.cpp delete mode 100644 mozilla/widget/src/windows/nsListBox.h delete mode 100644 mozilla/widget/src/windows/nsObject.cpp delete mode 100644 mozilla/widget/src/windows/nsObject.h delete mode 100644 mozilla/widget/src/windows/nsRadioButton.cpp delete mode 100644 mozilla/widget/src/windows/nsRadioButton.h delete mode 100644 mozilla/widget/src/windows/nsRadioGroup.cpp delete mode 100644 mozilla/widget/src/windows/nsRadioGroup.h delete mode 100644 mozilla/widget/src/windows/nsScrollbar.cpp delete mode 100644 mozilla/widget/src/windows/nsScrollbar.h delete mode 100644 mozilla/widget/src/windows/nsStringUtil.h delete mode 100644 mozilla/widget/src/windows/nsSwitchToUIThread.h delete mode 100644 mozilla/widget/src/windows/nsTabWidget.cpp delete mode 100644 mozilla/widget/src/windows/nsTabWidget.h delete mode 100644 mozilla/widget/src/windows/nsTextAreaWidget.cpp delete mode 100644 mozilla/widget/src/windows/nsTextAreaWidget.h delete mode 100644 mozilla/widget/src/windows/nsTextHelper.cpp delete mode 100644 mozilla/widget/src/windows/nsTextHelper.h delete mode 100644 mozilla/widget/src/windows/nsTextWidget.cpp delete mode 100644 mozilla/widget/src/windows/nsTextWidget.h delete mode 100644 mozilla/widget/src/windows/nsToolkit.cpp delete mode 100644 mozilla/widget/src/windows/nsToolkit.h delete mode 100644 mozilla/widget/src/windows/nsTooltipWidget.cpp delete mode 100644 mozilla/widget/src/windows/nsTooltipWidget.h delete mode 100644 mozilla/widget/src/windows/nsWidgetFactory.cpp delete mode 100644 mozilla/widget/src/windows/nsWindow.cpp delete mode 100644 mozilla/widget/src/windows/nsWindow.h delete mode 100644 mozilla/widget/src/windows/nsdefs.h delete mode 100644 mozilla/widget/src/windows/res/select.cur delete mode 100644 mozilla/widget/src/windows/resource.h delete mode 100644 mozilla/widget/src/windows/widget.rc delete mode 100644 mozilla/widget/tests/Makefile delete mode 100644 mozilla/widget/tests/makefile.win delete mode 100644 mozilla/widget/tests/scribble/Makefile delete mode 100644 mozilla/widget/tests/scribble/Scribble.cpp delete mode 100644 mozilla/widget/tests/scribble/Scribble.h delete mode 100644 mozilla/widget/tests/scribble/main.cpp delete mode 100644 mozilla/widget/tests/scribble/makefile.win delete mode 100644 mozilla/widget/tests/widget/Makefile delete mode 100644 mozilla/widget/tests/widget/main.cpp delete mode 100644 mozilla/widget/tests/widget/makefile.win delete mode 100644 mozilla/widget/tests/widget/nsWidgetTest.cpp delete mode 100644 mozilla/widget/tests/widget/viewerMenu.cpp delete mode 100644 mozilla/widget/tests/widget/viewerMenu.h delete mode 100644 mozilla/xpcom/ds/nsArena.cpp delete mode 100644 mozilla/xpcom/ds/nsAtomTable.cpp delete mode 100644 mozilla/xpcom/ds/nsBTree.cpp delete mode 100644 mozilla/xpcom/ds/nsBTree.h delete mode 100644 mozilla/xpcom/ds/nsByteBuffer.cpp delete mode 100644 mozilla/xpcom/ds/nsCRT.cpp delete mode 100644 mozilla/xpcom/ds/nsCRT.h delete mode 100644 mozilla/xpcom/ds/nsDeque.cpp delete mode 100644 mozilla/xpcom/ds/nsDeque.h delete mode 100644 mozilla/xpcom/ds/nsIArena.h delete mode 100644 mozilla/xpcom/ds/nsIAtom.h delete mode 100644 mozilla/xpcom/ds/nsIByteBuffer.h delete mode 100644 mozilla/xpcom/ds/nsISizeOfHandler.h delete mode 100644 mozilla/xpcom/ds/nsIUnicharBuffer.h delete mode 100644 mozilla/xpcom/ds/nsRBTree.cpp delete mode 100644 mozilla/xpcom/ds/nsRBTree.h delete mode 100644 mozilla/xpcom/ds/nsSizeOfHandler.cpp delete mode 100644 mozilla/xpcom/ds/nsString.cpp delete mode 100644 mozilla/xpcom/ds/nsString.h delete mode 100644 mozilla/xpcom/ds/nsUnicharBuffer.cpp delete mode 100644 mozilla/xpcom/ds/nsUnitConversion.h delete mode 100644 mozilla/xpcom/ds/nsVoidArray.cpp delete mode 100644 mozilla/xpcom/ds/nsVoidArray.h delete mode 100644 mozilla/xpcom/glue/nsID.cpp delete mode 100644 mozilla/xpcom/glue/nsVoidArray.cpp delete mode 100644 mozilla/xpcom/glue/nsVoidArray.h delete mode 100644 mozilla/xpcom/io/nsIBaseStream.h delete mode 100644 mozilla/xpcom/io/nsIInputStream.h delete mode 100644 mozilla/xpcom/io/nsIOutputStream.h delete mode 100644 mozilla/xpcom/io/nsIUnicharInputStream.h delete mode 100644 mozilla/xpcom/io/nsUnicharInputStream.cpp delete mode 100644 mozilla/xpcom/string/obsolete/nsString.cpp delete mode 100644 mozilla/xpcom/string/obsolete/nsString.h delete mode 100644 mozilla/xpcom/tests/CvtURL.cpp delete mode 100644 mozilla/xpcom/tests/TestAtoms.cpp delete mode 100644 mozilla/xpcom/tests/TestCRT.cpp delete mode 100644 mozilla/xpcom/tests/resources.h diff --git a/CVSROOT/checkoutlist b/CVSROOT/checkoutlist deleted file mode 100644 index 15d6b76b101..00000000000 --- a/CVSROOT/checkoutlist +++ /dev/null @@ -1,15 +0,0 @@ -# The "checkoutlist" file is used to support additional version controlled -# administrative files in $CVSROOT/CVSROOT, such as template files. -# -# The first entry on a line is a filename which will be checked out from -# the corresponding RCS file in the $CVSROOT/CVSROOT directory. -# The remainder of the line is an error message to use if the file cannot -# be checked out. -# -# File format: -# -# [] -# -# comment lines begin with '#' -passwd -readers diff --git a/CVSROOT/commitinfo b/CVSROOT/commitinfo deleted file mode 100644 index b19e7b7a63e..00000000000 --- a/CVSROOT/commitinfo +++ /dev/null @@ -1,15 +0,0 @@ -# The "commitinfo" file is used to control pre-commit checks. -# The filter on the right is invoked with the repository and a list -# of files to check. A non-zero exit of the filter program will -# cause the commit to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/config b/CVSROOT/config deleted file mode 100644 index 51b03f663d8..00000000000 --- a/CVSROOT/config +++ /dev/null @@ -1,6 +0,0 @@ -# Set this to "no" if pserver shouldn't check system users/passwords -#SystemAuth=no - -# Set `PreservePermissions' to `yes' to save file status information -# in the repository. -#PreservePermissions=no diff --git a/CVSROOT/cvswrappers b/CVSROOT/cvswrappers deleted file mode 100644 index 0accaf1b153..00000000000 --- a/CVSROOT/cvswrappers +++ /dev/null @@ -1,23 +0,0 @@ -# This file affects handling of files based on their names. -# -# The -t/-f options allow one to treat directories of files -# as a single file, or to transform a file in other ways on -# its way in and out of CVS. -# -# The -m option specifies whether CVS attempts to merge files. -# -# The -k option specifies keyword expansion (e.g. -kb for binary). -# -# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers) -# -# wildcard [option value][option value]... -# -# where option is one of -# -f from cvs filter value: path to filter -# -t to cvs filter value: path to filter -# -m update methodology value: MERGE or COPY -# -k expansion mode value: b, o, kkv, &c -# -# and value is a single-quote delimited value. -# For example: -#*.gif -k 'b' diff --git a/CVSROOT/editinfo b/CVSROOT/editinfo deleted file mode 100644 index d78886c1522..00000000000 --- a/CVSROOT/editinfo +++ /dev/null @@ -1,21 +0,0 @@ -# The "editinfo" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/CVSROOT/loginfo b/CVSROOT/loginfo deleted file mode 100644 index 5a59f0a5440..00000000000 --- a/CVSROOT/loginfo +++ /dev/null @@ -1,26 +0,0 @@ -# The "loginfo" file controls where "cvs commit" log information -# is sent. The first entry on a line is a regular expression which must match -# the directory that the change is being made to, relative to the -# $CVSROOT. If a match is found, then the remainder of the line is a filter -# program that should expect log information on its standard input. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name ALL appears as a regular expression it is always used -# in addition to the first matching regex or DEFAULT. -# -# You may specify a format string as part of the -# filter. The string is composed of a `%' followed -# by a single format character, or followed by a set of format -# characters surrounded by `{' and `}' as separators. The format -# characters are: -# -# s = file name -# V = old version number (pre-checkin) -# v = new version number (post-checkin) -# -# For example: -#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog -# or -#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog diff --git a/CVSROOT/modules b/CVSROOT/modules deleted file mode 100644 index e3ea19a7646..00000000000 --- a/CVSROOT/modules +++ /dev/null @@ -1,320 +0,0 @@ -# Three different line formats are valid: -# key -a aliases... -# key [options] directory -# key [options] directory files... -# -# Where "options" are composed of: -# -i prog Run "prog" on "cvs commit" from top-level of module. -# -o prog Run "prog" on "cvs checkout" of module. -# -e prog Run "prog" on "cvs export" of module. -# -t prog Run "prog" on "cvs rtag" of module. -# -u prog Run "prog" on "cvs update" of module. -# -d dir Place module in directory "dir" instead of module name. -# -l Top-level directory only -- do not recurse. -# -# NOTE: If you change any of the "Run" options above, you'll have to -# release and re-checkout any working directories of these modules. -# -# And "directory" is a path to a directory relative to $CVSROOT. -# -# The "-a" option specifies an alias. An alias is interpreted as if -# everything on the right of the "-a" had been typed on the command line. -# -# You can encode a module within a module by using the special '&' -# character to interpose another module into the current module. This -# can be useful for creating a module that consists of many directories -# spread out over the entire source repository. - -MozillaSource -a \ - MozillaSourceWin \ - MozillaSourceMac \ - MozillaSourceUnix \ - -MozillaSourceWin -a MozillaSourceCommon MozillaSourceWinOnly - -MozillaSourceMac -a MozillaSourceCommon MozillaSourceMacOnly - -MozillaSourceUnix -a MozillaSourceCommon MozillaSourceUnixOnly - -MozillaSourceCommon -a \ - mozilla/LEGAL \ - mozilla/LICENSE \ - mozilla/CHANGES.html \ - mozilla/build \ - mozilla/include \ - mozilla/jpeg \ - mozilla/js \ - mozilla/lib/htmldlgs \ - mozilla/lib/layout \ - mozilla/lib/libcnv \ - mozilla/lib/libi18n \ - mozilla/lib/liblayer \ - mozilla/lib/libmisc \ - mozilla/lib/libmime \ - mozilla/lib/libmocha \ - mozilla/lib/libnet \ - mozilla/lib/libparse \ - mozilla/lib/libpics \ - mozilla/lib/libpwcac \ - mozilla/lib/libstyle \ - mozilla/lib/plugin \ - mozilla/lib/xlate \ - mozilla/lib/xp \ - mozilla/modules/calendar \ - mozilla/modules/edtplug/classes \ - mozilla/modules/edtplug/src \ - mozilla/modules/edtplug/include \ - mozilla/modules/libfont/classes \ - mozilla/modules/libfont/public \ - mozilla/modules/libfont/src \ - mozilla/modules/libhook \ - mozilla/modules/libimg \ - mozilla/modules/libnls \ - mozilla/modules/libpref \ - mozilla/modules/libreg \ - mozilla/modules/libutil \ - mozilla/modules/oji \ - mozilla/modules/progress/src \ - mozilla/modules/rdf \ - mozilla/modules/schedulr \ - mozilla/modules/security/freenav \ - mozilla/modules/softupdt/classes \ - mozilla/modules/softupdt/include \ - mozilla/modules/softupdt/src \ - mozilla/modules/xml \ - mozilla/modules/zlib/src \ - mozilla/nav-java/stubs \ - mozilla/network \ - mozilla/nsprpub \ - mozilla/privacy \ - mozilla/xpcom \ - mozilla/l10n \ - mozilla/dbm \ - mozilla/README - -MozillaSourceWinOnly -a \ - mozilla/client.mak \ - mozilla/cmd/makefile.win \ - mozilla/cmd/dialup \ - mozilla/cmd/wincom \ - mozilla/cmd/winfe \ - mozilla/config \ - mozilla/lib/makefile.win \ - mozilla/modules/coreincl \ - mozilla/modules/edtplug/makefile.win \ - mozilla/makefile.win \ - mozilla/modules/libfont/jmcgen \ - mozilla/modules/libfont/makefile.win \ - mozilla/modules/libfont/producers/makefile.win \ - mozilla/modules/libfont/producers/win \ - mozilla/modules/libfont/producers/win/classes \ - mozilla/modules/libfont/producers/win/classes/netscape \ - mozilla/modules/libfont/producers/win/classes/netscape/fonts \ - mozilla/modules/libfont/producers/win/src \ - mozilla/modules/makefile.win \ - mozilla/modules/progress/makefile.win \ - mozilla/modules/progress/public \ - mozilla/modules/security/makefile.win \ - mozilla/modules/softupdt/makefile.win \ - mozilla/modules/zlib/makefile.win \ - mozilla/nav-java/makefile.win \ - JavaStubWin - - -MozillaSourceUnixOnly -a \ - mozilla/cmd/Makefile \ - mozilla/cmd/stubfe \ - mozilla/cmd/xfe \ - mozilla/config/.cvsignore \ - mozilla/config/AIX.mk \ - mozilla/config/BSD_OS.mk \ - mozilla/config/bsdecho.c \ - mozilla/config/clobber_miss.pl \ - mozilla/config/common.mk \ - mozilla/config/config.guess \ - mozilla/config/config.mk \ - mozilla/config/coreconf.mk \ - mozilla/config/cvsco.pl \ - mozilla/config/fastcwd.pl \ - mozilla/config/FreeBSD.mk \ - mozilla/config/gtscc.c \ - mozilla/config/HP-UX.mk \ - mozilla/config/IRIX.mk \ - mozilla/config/Linux.mk \ - mozilla/config/makecopy.c \ - mozilla/config/Makefile \ - mozilla/config/mangle.c \ - mozilla/config/mantomak.c \ - mozilla/config/mkdepend \ - mozilla/config/NCR.mk \ - mozilla/config/NEC.mk \ - mozilla/config/NEWS-OS.mk \ - mozilla/config/NEXTSTEP.mk \ - mozilla/config/nfspwd.pl \ - mozilla/config/nodl.pl \ - mozilla/config/nsinstall.c \ - mozilla/config/OSF1.mk \ - mozilla/config/outofdate.pl \ - mozilla/config/pathsub.c \ - mozilla/config/pathsub.h \ - mozilla/config/pkg2dpth.pl \ - mozilla/config/ports \ - mozilla/config/revdepth.pl \ - mozilla/config/Rhapsody.mk \ - mozilla/config/rules.mk \ - mozilla/config/SCOOS.mk \ - mozilla/config/SINIX.mk \ - mozilla/config/sj.pl \ - mozilla/config/SunOS.mk \ - mozilla/config/SunOS4.mk \ - mozilla/config/SunOS5.mk \ - mozilla/config/UNIXWARE.mk \ - mozilla/config/xmversion.sh \ - mozilla/lib/Makefile \ - mozilla/Makefile \ - mozilla/modules/edtplug/Makefile \ - mozilla/modules/libfont/jmcgen \ - mozilla/modules/libfont/Makefile \ - mozilla/modules/libfont/producers/Makefile \ - mozilla/modules/Makefile \ - mozilla/modules/progress/Makefile \ - mozilla/modules/progress/public \ - mozilla/modules/security/Makefile \ - mozilla/modules/softupdt/Makefile \ - mozilla/modules/zlib/Makefile \ - mozilla/nav-java/Makefile \ - mozilla/lib/mariner \ - JavaStubUnix - - -MozillaSourceMacOnly -a \ - mozilla/config/mac \ - mozilla/cmd/dialup \ - mozilla/cmd/macfe \ - mozilla/lib/mac/AutoAdmin \ - mozilla/lib/mac/Includes \ - mozilla/lib/mac/MacMemoryAllocator \ - mozilla/lib/mac/Misc \ - mozilla/lib/mac/MoreFiles \ - mozilla/lib/mac/NSRuntime \ - mozilla/lib/mac/NSStdLib \ - mozilla/lib/mac/patches \ - mozilla/lib/mac/PowerPlant \ - mozilla/lib/mac/UserInterface \ - mozilla/modules/coreincl \ - mozilla/modules/edtplug/macbuild \ - mozilla/modules/libfont \ - mozilla/modules/progress/macbuild \ - mozilla/modules/progress/public \ - mozilla/modules/softupdt/macbuild \ - mozilla/modules/zlib/macbuild \ - mozilla/lib/mariner \ - JavaStubMac - -JavaStubAll -a \ - JavaStubWin \ - JavaStubMac \ - JavaStubUnix - -JavaStubCore -a \ - mozilla/sun-java/stubs/include \ - mozilla/sun-java/stubs/src - -JavaStubMac -a \ - JavaStubCore \ - mozilla/sun-java/stubs/macbuild \ - mozilla/sun-java/stubs/macjri - -JavaStubUnix -a \ - JavaStubCore \ - mozilla/sun-java/Makefile \ - mozilla/sun-java/stubs/jri \ - mozilla/sun-java/stubs/Makefile - -JavaStubWin -a \ - JavaStubCore \ - mozilla/sun-java/makefile.win \ - mozilla/sun-java/stubs/jri \ - mozilla/sun-java/stubs/makefile.win - -###################################################################### - -# -# Modules for the raptor layout effort. Note that raptor dist is temporary -# until raptor is integrated into the mainline build. -# - -RaptorDist -a \ - mozilla/nsprpub \ - mozilla/include \ - mozilla/jpeg \ - mozilla/modules/libreg \ - mozilla/xpcom \ - mozilla/modules/zlib \ - mozilla/modules/libutil \ - mozilla/sun-java \ - mozilla/nav-java \ - mozilla/js \ - mozilla/modules/security/freenav \ - mozilla/modules/libpref \ - mozilla/modules/libimg \ - mozilla/lib/xp \ - mozilla/lib/libnet \ - mozilla/base \ - mozilla/network - -Raptor -a \ - mozilla/htmlparser \ - mozilla/dom \ - mozilla/gfx \ - mozilla/view \ - mozilla/widget \ - mozilla/layout \ - mozilla/webshell - -RaptorAll -a \ - RaptorDist \ - Raptor - -##################################################################### -# Module for the Normandy landing. - -NormandyBeach -a \ - MozillaSource \ - mozilla/lib/libaddr \ - mozilla/lib/libmsg - -NormandyBeachWin -a \ - MozillaSourceWin \ - mozilla/lib/libaddr \ - mozilla/lib/libmsg - -NormandyBeachUnix -a \ - MozillaSourceUnix \ - mozilla/lib/libaddr \ - mozilla/lib/libmsg - -NormandyBeachMac -a \ - MozillaSourceMac \ - mozilla/lib/libaddr \ - mozilla/lib/libmsg - -####################################################################### -# Modules for the Directory SDK. There are two users of the libldap -# Mozilla and the DirectorySDK - -DirectorySDKSource -a \ - DirectorySDKSourceCommon \ - DirectorySDKSourceBuild - -DirectorySDKSourceCommon -a \ - mozilla/directory/ldapsdk.mak \ - mozilla/directory/ldapsdk.mk \ - mozilla/directory/buildsdk.txt \ - mozilla/directory/Makefile \ - mozilla/directory/c-sdk - -DirectorySDKSourceBuild -a \ - mozilla/cmd/winfe/mkfiles32 \ - mozilla/config - diff --git a/CVSROOT/notify b/CVSROOT/notify deleted file mode 100644 index 34f0bc28880..00000000000 --- a/CVSROOT/notify +++ /dev/null @@ -1,12 +0,0 @@ -# The "notify" file controls where notifications from watches set by -# "cvs watch add" or "cvs edit" are sent. The first entry on a line is -# a regular expression which is tested against the directory that the -# change is being made to, relative to the $CVSROOT. If it matches, -# then the remainder of the line is a filter program that should contain -# one occurrence of %s for the user to notify, and information on its -# standard input. -# -# "ALL" or "DEFAULT" can be used in place of the regular expression. -# -# For example: -#ALL mail %s -s "CVS notification" diff --git a/CVSROOT/passwd b/CVSROOT/passwd deleted file mode 100644 index 5224ce2b5f4..00000000000 --- a/CVSROOT/passwd +++ /dev/null @@ -1 +0,0 @@ -friedman%netscape.com:eyXRDOnq4TplQ:cvsadm diff --git a/CVSROOT/rcsinfo b/CVSROOT/rcsinfo deleted file mode 100644 index 49e59f4d0df..00000000000 --- a/CVSROOT/rcsinfo +++ /dev/null @@ -1,13 +0,0 @@ -# The "rcsinfo" file is used to control templates with which the editor -# is invoked on commit and import. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being made to, relative to the -# $CVSROOT. For the first match that is found, then the remainder of the -# line is the name of the file that contains the template. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/readers b/CVSROOT/readers deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/CVSROOT/taginfo b/CVSROOT/taginfo deleted file mode 100644 index 274a46dd5b6..00000000000 --- a/CVSROOT/taginfo +++ /dev/null @@ -1,20 +0,0 @@ -# The "taginfo" file is used to control pre-tag checks. -# The filter on the right is invoked with the following arguments: -# -# $1 -- tagname -# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d -# $3 -- repository -# $4-> file revision [file revision ...] -# -# A non-zero exit of the filter program will cause the tag to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/verifymsg b/CVSROOT/verifymsg deleted file mode 100644 index 86f747ce222..00000000000 --- a/CVSROOT/verifymsg +++ /dev/null @@ -1,21 +0,0 @@ -# The "verifymsg" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/buildtools/windows/batch/MOZENV.BAT b/buildtools/windows/batch/MOZENV.BAT deleted file mode 100755 index 07a0c9aff82..00000000000 --- a/buildtools/windows/batch/MOZENV.BAT +++ /dev/null @@ -1,74 +0,0 @@ -@echo off - -rem * To set up your local build read and customize this batch file. -rem * You shouldn't have to touch anything but "set" statements -rem * Batch file contributed by Lucas Gonze (lucas@gonze.com) and -rem * Rick Ekle (rele@iconect.net) - -rem * This stuff forces us to not reset the environment variables more -rem * than once. It would cause some vars to get longer than 127 chars -rem * (the longest possible batch line) to run this stuff more than once. -if "%1%" == "-force" goto skiptest -if "%MOZBUILD%" == "ALREADYDONE" goto alldone -:skiptest -echo setting up environment... -set MOZBUILD=ALREADYDONE - -rem * if this isn't set properly your build will get -rem * "file './config/WIN' not found" -set MOZ_BITS=32 - -set MOZ_GOLD=1 -set MOZ_MEDIUM=1 -set NO_SECURITY=1 -set NSPR20=1 - -rem * don't set this if you want to make an optimized release build -set MOZ_DEBUG=1 - -rem * set if running NT 3.51, don't set otherwise -rem * set MOZ_NT=351 - -rem * location of resulting executable and totally optional. -rem * If you don't set this, mozilla.exe will be generated into -rem * mozilla\cmd\winfe\mkfiles32\x86dbg (or x86rel for optimized builds) -rem * set MOZ_OUT=d:\bin - -rem * top of your tree, drive letter and path, i.e. set d:\mozilla_src. -rem * The topmost directory under this should be mozilla -rem * so if you extracted zip file to z:\foo, this should be z:\foo -set MOZ_SRC=d:\moz\ - -rem * location of the bin directory containing your GNU tools. The build - -rem * looks for MOZ_TOOLS\bin\gmake.exe, so after you download and unpack -rem * wintools.zip, make some directory called "bin", put your new -rem * uname.exe, shmsdos.exe, and gmake.exe in it, and set MOZ_TOOLS to -rem * the place where you put it. -set MOZ_TOOLS=d: - -rem * where to find cp.exe and rm.exe, aka gnu tools for windows -set gnuTools=D:\CDK\H-I386~1\bin - -rem * the important thing is that your new moz tools should be first -SET PATH=%MOZ_TOOLS%\bin;%gnuTools%;%PATH% - -rem * if you are running VC++ 5.0 or higher, this will prevent the build - -rem * from trying to pick up uuid2.lib, which only exists in previous -rem * versions of vc++. -set _MSC_VER=1100 - -rem * vcvars32.bat is created by visual c++ install to -rem * enable command line builds -echo setting up visual c++ environment... -call d:\bin\vcvars32.bat - -:alldone -@echo environment set up, building mozilla... - -rem * uncomment these to make the script build as well - -rem cd %MOZ_SRC% -rem cd mozilla -rem nmake -f client.mak diff --git a/buildtools/windows/bin/README b/buildtools/windows/bin/README deleted file mode 100644 index 3e8ebd4c215..00000000000 --- a/buildtools/windows/bin/README +++ /dev/null @@ -1,26 +0,0 @@ -Building NSPR on Windows NT Using Netscape's gmake and Other Tools - -This directory contains the following tools: -- gmake.exe: GNU make 3.74, modified to use shmsdos.exe as the shell -- shmsdos.exe: a lightweight shell developed by Netscape programmers. - It has most of the file manipulation operations (such as cp, - rm, mkdir as well as Netscape's own nsinstall) as built-in - commands, so even if you have these - file utilities installed on your NT machine, they won't be invoked - by gmake and shmsdos. Also, since shmsdos is not a full-blown - shell and its built-in file commands are not fully compatible - with the true Unix file utilities, our makefiles have had to - avoid some features of sh and work around the incompatibilities - on Windows NT. -- uname.exe: this uname.exe returns the OS as "WINNT", which is what - our makefiles assume. Do not use a uname.exe that returns other - strings, such as "Windows_NT". - -Binaries for the x86 processors can be found in the 'x86' subdirectory. -Binaries for the alpha processors can be found in the 'alpha' -subdirectory. - -INSTALLATION: - -Install gmake.exe, shmsdos.exe, and uname.exe in any directory. -Add that directory to your Path environment variable. \ No newline at end of file diff --git a/buildtools/windows/bin/alpha/gmake.exe b/buildtools/windows/bin/alpha/gmake.exe deleted file mode 100755 index 732c20d440ddb40bb0c59103ef9f8438459f8075..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256512 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%0A-%O-)6U@B`}tUg6bL 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

S@9g%C-18i#BB_37nV}ocNraW8z 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 diff --git a/buildtools/windows/bin/alpha/nsinstall.exe b/buildtools/windows/bin/alpha/nsinstall.exe deleted file mode 100755 index 77145fd1e29f5edc7d84e2a4ca2846c2c6a09694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77312 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

sk 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 diff --git a/buildtools/windows/bin/alpha/uname.exe b/buildtools/windows/bin/alpha/uname.exe deleted file mode 100755 index 6511a154c9c848b6e47a02ed014a4937a900929b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75264 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

Xb~+ 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 diff --git a/buildtools/windows/bin/x86/gmake.exe b/buildtools/windows/bin/x86/gmake.exe deleted file mode 100755 index bd1f70bcb3df5fddd561c49ad8c7c6eb68f0f1b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152064 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%0Dw!(n{|z{xDp?4U zzVn*S3?^n%Yo>@@O7u;hP5H;9eC*`%ut0uT3H+gSX_LbRejx?soLoRWLbW+%Yewh3 zS8|_na_-^kpNNhwaE}!DvrhG>@jzgMQ0g}4dz++ygdSDcL~>Y&VP_J%^Tz<@8z)yp zd>vDR*c>9n({o;ih8TNxp$B+S5`>Z^?eBh^$NR9#+0Jiz$Br!^l9IpsF3nV~w^nR< zXXu=W_H-nSZx82(j|z4KhW=5qWw2R4-y)xT^>blzC3VGcb6g(T<58~&1}pXh3scVl zGRor3VUU63?BS|3hgP-ARAn+H&kj3hU!>$WL+nn6$_a&wO)x~D)p<^?HN-xQ?9bO zYM~5{Nn*=z-+ohU3E#1w7xvouPl{@$=qy>(+!6APcz{v@k`taUo$}T!OOu;r5R;l^ z#j%2i+!P%8jC8LteOM>TXrtl6_h%|uU4oe6ukvPiCS8Tl0px{2Iw5z=pEr03YL8I` zn)qWujaDkZ1|v*<5dqkzwZ!{#MwySrx1ZkR{9C_*&feb~v8Ljq#5q!{nAn=J2NwD# zhL%NK=M;CR5*J6Yebkj|`ejM5+F}6QoF=13m%;VWu zT@T5>(F>b}rbP~eG_B4m?M0x~DF93q6mK=f@f}utJ)T*9-|BeuJGv;touG#w+q=xt z(BBi~uY($-jMIjR=}FMywQ_pozroyf!%v;*r})02EnPeh=0-E$mg9s@P-vXAyE-qSzY4k~0lBP{ z0|u9sBK}R4^>s|oTvFajK#_)-3Ub>~m33mij_){6+|)S_s)nKLk;S1)rPEZbzk>ST zqcfo${x5BjPR+JLP7Hq^PnYc^9$?YxG6)tI#d39k3hX^Iqyfv`Q8wFRd_{F(=lbo# zm(KPo`7!_=1niwkN{s6XqUmwNR`xlKCL11@1ApiITa~T~Jt$&qFk4uc3#AbWlzcW1 zC7_C|uCL_lm{Q{ePRR=gXCu#`pYR0!?gK^^TwJ5mwJLY3%$mT8zLoGBG;`qZ?jqx; zfjn8G12I@r#C+dGN%^nETnwXHS%@lAb8Gjmw&*nbi{^587P8w6CL}pxWx+{Mu*Mc<%B+n3dL3d-UYn{{NDGt}?@?ER8qp_cZK7Z54lib)q-CGaF4&f@^a2%}!H8 zB(68wiv;@1(3Q-IO%q+o>WgCMu?t*}^kdZY0RWjA+!wXW+^1*H^cujU4>R8!8R-U! zokSYPzrn@ntcuWg3PMw78b!Ka6|0#W_prfB_^c5UruyJqfwrj_g&>!?kpNWNsd||F zx47AE@FZ3<$_owicC5D^XR`M{M4q+o0oQr5lF`&XR(Apf-p2=K54nU;Hyqn06wP_* z61GhOZizm%gd$B}OR_q8>)q&Yhi5yNnYw7yeiDsx zpiSfAN3-eFpf0Zv*(`=Hc<5xmhk2^Ins?mgHKy_J2< zt(#|^*0y<8QA;Ano+(6HNI>YYzw1`P!mGItn4XY|5vu%}z_M>|ms6HiD+qElNR@aETrc=@?l419Z))Dtiqg5pFWrqLTeycuS z3%~Lmd8ys(@^?Q%i`vFj1mToBEv3Lh5#*vx5cC~gtDsYdC0O&4;{7$q z8N@(Nob@B&?RKH(xhwt>8pEh(yEx6kM~WB~ z?TTc1PyUxYci=<$^QLHq3GnuRZ2l~cBkLq%)|Bzb(Sj!BKRsYpzQY>$l6g)vSiIbp zdGS@g%xg#Hm1CYI_b7=a$Z&l`#L*QXuI!gsT#R0(`-Hrb(QBWAU(3Z#uNKBq07i&^ zB*fSQubOs;Ls@sf#tMMI(KA^t_o?JXS>^9vy!3kyYwoqw-MbDbyn z3rWi-RL73h6g^X!YjE9OP=pb~%@7MAE{i~n(_FE=%6KnHCqnj|1(|20wsq#Y)%he3 zq9H`d(4~SRu}R1b@}2(_QN{R#q7e6nFT;3-LYE2(#PSkTrfN*@cNkfyC!6=j&voWgy(>75c}kTw4mv5EL$jV*H5w zlq(c^NG;;%K;uG}u^8ZEVwbQg3gsrf5FxavEQl%cO4Ggw9H_X-ZuKp8mT6PG`|S0u zEP{Cjf<_iasVm_tipdEc`>dC>S9&#AY`f~%ixSpp{HuV?b>fvk8g>}xy7Wd(yo5FO zcYm7IN>_^JA+iXpmYb9Sz3Q#)hKjmSjeY4?I@9!teF$#-iOjo?tkoP_zW1SK0E_a$ zqVmm+X=M@hVx;FQ^pTOaMDCJ}=LZ*=8J{Ne7J4UISNZbX|ILlpT;>(9v^f7kmwZA(GbTc$ln8|2i+ZOpH+>w0S`EwbtFYAHS12ZqGz8l@{9|)3N6%8l055#3^P)>60iUlUGmd0 z!zq_(g&4A+Xt1^@c6TQZ`J)&7Z{-f?TJqW(kV6rsd#({*t0p^Fn+1&W(Q>U>?qp)G zpHSUNj@G`Nu1-A?qY8cLd5VoEEw`uIwtWi_J`w<$zdn`OeE$cL@P!=u7w``*w{F%6 z_C=~CtxD1?2X$PXmvTu9O4=z-LpseXX_lmUGyG9xKMh12{^=O&OiAZ^Mbci7G`};( zq%BuM01o?D^#lj$l|F5`pF9cQ4lfEhy@fl-DMB@GU82WF%2xS0nto6o&}}?3e)!aN zr-dW!(w}YQa{gqnX`8(C<0DLJr|6coY?Ut)H*4~@a2xS!gt%f?HPmc-|L_H0gm zm2w?P{PdlP`GFC2Ni@nnp;_TMaT?XbGxez={)bvA?$bwV{oJTpsb_m76j!t}w+l2F zNFXsg5a06={|?SBlrE!QVSS&-F#Yy~MDh1C@&L1jnS&yGUa3rlFjO!ti?b$&cR6W( z28Jd6n9h*Q&*Qr217?OQ-wqv-`LV`(oO*l5cBgRrpYuIV=-HJ?oqI?RoE&bY_+`St zf*m?z|HEu;yWphRI@8RSRHD*>0H>cHW!M@kOZSwnwR1mUuPTMPyMk5n@=tYT+WUEa z);xt+EKR-yUDz#^qgFFSx2lH+LpV?I7 zYfA~S9d_v z>^!@;8qAx5tiev&XW$=)9DHqYE;SE``~QT3o=Efs6qwMgc|zQ1onk(>I^)d4$Q)w| z>vjHce;Ni1dmO{=sB#`lCml`@upaW<;bpu!TIYM_lSW;TernVOd5{&_T-nFcM2^)W z>(f4y#W|HOp9dK2ckRo=tiC4aleD4x*9Kj8#5ZU9Qn5ckddCU(wlr~>P|8HL^z$V8 z;$`=Oo1hMAS!;DYZ;Ja=}Ff5uo2 z1CMhUxXL|az8nV7MejEbXCLP<@Ob>i6pVkKYR3JB(GkPXW&7?<2%D0qx;r@;-X-ir zOLZn&ozIyE5y8^??pcN#5jz`If2x^BJjWsuKX$j3_*y#|ue!uU$VxbkusVZpaz0JH zB6ek?7Uer}3at@GZ&z-m5LIUgvn%RTx6JlV#0at6UyGmc~^t(*@W=Wr&m41^+k4So1R{8>yK2OpoWu=#! z^ioMbdU&K=pGo&h`k%7W53{)F=K&!KPiCd>HR*dK{pVTf&zbb6B>msB(jPSG+aw)% z@bGx=GwJtA`scFJ?=k6jOL}uwdZ$TWC+Q)RzI@rH#{~06uhyrYYGI+Ny)`;gEL3#* zE)`Od^w_tQ8cIq83VS>&q!0<7$Z{JFul9(DNiIV7r5&Gl&J)4q}HBEqkDbG|k&8E7Wo<*1YM6bjt*@MYfhJ zZ?TzTX(R6Vk>xz{ZBh_@oH`=wq3lpH7L`r8d@o=TL<@)R zl2LJu?C-vVr=f%V!zvLuh$!aA59b-%2Cm^h2ee{@*0P9R$08a-d1F%Ec={(ny=ZoYqdA+q2>k4XXHs(p5*emkSZ8qZ3 zhCRK7n-VRKJp<~!K*+oZ=q%#qg^>JAfKKj;UW{>UV8(=z;Wwp+kBQOf;X@~dzuv~* z8Ag2e?`O#bIjM%d_EX%DPe3^vfxst(Hm-v0NJqJy4OLvgD^n>V!2M#ibDqBMtvuN4 z>-I9ZCg%H=4xUHwnQCYB)W*>8V*oM5UQF{+-xtm4$cm^qxJS|r9m|U{;K9i zXHltEz$ONUh9f>Dcs1XaL&x4ZXELb>^kJnQuHB`|C1cGyhYom6q)7y*IuvIOnHwCY3|{u#i(sC zKv?7>gvyyK_;F#5;K#X$l=Wezk(k8~&+vC`rH1(7ve*lqm(Pqn+q*n9mqjP*r^%WA zeKXwsq1RSV?wy_OeH=a5(EgRlwzAipF(wyK9dV!WXATkx$!I(z-GvOc7{+Je>( z=Jn1wEhl~B@dK{76mqLa9FM51x3{*)ZrML;E@6u8CkE!GN(^L8AP(p$4J|xiw-m;Q zau|S`#vFPPS0g76WwW}YV#fvZiMPfA16S>V5y)giiFj#$IbP>F%AYS)=PKmSoD9sr zksuT2yvcM^hhD8jBC;(AVlu_p$7pb+gTj1?{k7b2iv4wA&8^nzx$uak2*5-)!)=#W zAfuf)yRF6fl__il8t=Hd8s>Vqc$Fn8?U;y2e)u637!luk%|m)Y6`LISn)KyUrZ0v+ z3W$N2D1HRkUBZhaQOR*wKx}k9i#ZsUuy`x`M3G$uQz97Qr~{KJ-y&6%fNLxzIr!QU z6^v}7eEhMrd@sv4wLpaPkKuoneaTZ@XD0{jn{+mfvKJ<&Z?lN1nJnFQ*vHS=+n$06 zN}j&$0PQ3vZQCh{zHP6_Tkf{|c|*g47iYF~8c7vERapoAO0^qaMZSv(#w%>(xYHEu z@T({yh*$+(x;`mxX=dN@WlU4Q6xk-c5ej$Z1vCM{#-dsBy>f6>HLM78&~_T0)}PE^czV~fpd;2U`BlRDtEo>i~Mck zZ!>>i=I>wl`zC+c_zZ~QLP`PPgop&VfFlVzpZrMamGCyL+;~jBFM_DeI^b{ds)Qpw7mfG)ep=pownM~PX5_7s`AvcAOW ziOKSm=&%x3dPlafrOPpl7hNjmg_`k?r*y~yv&OVIUo$V6naf^o$cIHtg!gc?7mW1> zDlN2t@FYG{R)8ydt7%nB38kT&fa=+xua;!|?fKPBRQftG%SK&AuhTRxd!4>!+hZ zUE9(HbQS}`2JDeLe3lLl7DbOO7JL3d7=ecyRnr&WZ7K0r>+3HaHP zqKBmpaf=njg?=tyY`47Oy$dZV0)I_~(UseHOht=4Y1ZKuFgJ1IG3+vp@na$ed%jN_ z9&Fev724Ip)4+m|4l7d8+mt#Xe#z2fo|m-Qvj#lVXG^;r#g5t+kG|;kEIk}rdMr8- zbMoo*ykURu?e01XaN9z^j@H>RXLJE&iJm(*1FGWq`aL)o5`e{oZ<4;rs1FFh#A}r( z2srS$VH^(OPi2Cx8n|@%hSRlZFus1Tiw2{g>}_~Z@-;dC1pD z*4^)O7!bDR{xq{(wiFl~^DNyzo7=!o{)ZN2wA>dqh&ZxD>gPzha5qH~!+MCqW(y5P z+evylQr$34gU?*NI&Hjq z`fDPDT10Nd&D0yu#a~c^zAB(sSijYi(hoDs#UJ^hWNJ5UCdao%?vi(( zX(x^Sv5Ap(N&SS$B`dODmxFGak#fF)-Oj(J3lSq{s@ihfm=9a{D#Pe^&$IEq5L|_J z>Bp0F35g}}D_R-neH4J^h(8Wr=2=9=nJFUqUE(6O`SAU=_)MFTSS^g&%N}1GpGlQs*OpKv5K@ zeL0{{!yZ&Ma6jB2N4of)CX}wp^=nWy-SR8ssyvv8y;2j~v*9yZ>AUfrCB*!*L(*eZ zZo+oU-X`0+1Sfeg^W)GEi$7M#se|KB^a3Ed9t*35d&>sx!i&Sb)D`seDEf*Bh#Djz&$$Zk#U~T%t)@ zYdK+EFvPG^$|zU|&CXfofrU4+ax_O?CdWs#LDmy$5gPPy(;4%rx?cQEZ`30v?Xm0% zo}Il`uN?OoVk#)Lal<0Fd1ojM@+roi*Z|5(Q?N3d?cHz+mCUv>emzhikkpNT(W2Vx>K8PJpij*Nwc*Te5n!zL``RV? zGn*)akESj9KlzBDb=FBuf-OpsLn7+09fA2(qseu=;TSU~s9fXO_*FV##m~IhJF*9k@MNi?|HflmcD?^Vn1T=j=Q+cpvl@*;< zQ@LRZ{3Zc7QBt%i;;>3u{h@uD)mmMJve;Mg%F`P=V`eWhz4wr}7G;Fe{UFKB2 z4CAO8QL2WJX2v)&j@DBUBkEpjEXtpAgit9j25v^L*LXoC_LK1)R$5@9XMR{CIpr34 zj@mm1@~87jj{hUE4#e-}44Q@M63@1JB4+uZum%rUy7G?94H$kZR2fxtv4g^)^;T`R ziBkTKC6VaD&OyIUmS&2*sQ@$F+9+QvGDppoa;fTVt)3A51eFm!;o|r^7siiQt~tB% z<(~ieR-hhv%QrXk^8ia3XP%5Mzdk7nRFhP4_>6?a=+`E)e(zpG3HkdJf7kOD;qNB? zT)7|fpZjCdGD$feD}zh&n~v`ctrYJt&}4g|H?b7qP=+R#DV>LH@OSqL$}S89hykrU z$Y&2W1Om}dkEVH7s8|xhm*!TS4-0@l#PhJB{mgB|K$FNj5FSi}%2`E1!cN+b=EI&G z#=k0LH4uLbOYQkWVq-;|zK28$cGJRuP+|fwcFd9wzSgKWHCbMgxz5CV*(MM~(%EBh zI3nsoH3@i6Fad>{T2s&IZWAkDAV`xhV5r;Z3rjxZjM90^)FLuMFQ4rSb|iomf1~ca zPI7J^$|aIgh8-24#rIfacQ&;yc77&3Q)c@MMpFA87xk#=sxQ|Gqx2ckpoB(o>729O zal^9;{*PCTV*>+Bga!gk8e{-4joz|FEPGfYvNl<=aicx?VtnQSg$MFGf7c9poti8O z07HCw_`5EL01a_6fZ-Ehj^~cgv+#g!3~a!%F}%q^TQ&xWfabFBLNzc8vJU zW765M%$z(ibNA($nbRy_8c=0M;(I)4-t>PedsB8<`g95%GL-QWpMj{@eElW8fo7(8 zWJRbvj-ynu9J_)oJ!dv{!JAzJTv*NJ@jYt8p$E$7%#8aZ7J0uI72lGtP?H!bPiFg_ zM!A44j3-yv`Js^}_U!gQoa|lr`}mPd*7z&?dN$pCx)6r$b^M%Md%n~@ain(t$JS1~ zsYRytqzAc>csctj8<-B&P^&_6>!IhG{F*ThyIVV+`FEW5FSw{ zrjbvk8)4cuU_svE#M4dq?Qs$+T7yJ?*39(S7H5YMvi9s2hzO960^}D2gh!{vZUz8L zqo0u>OrmyFc*hcxG(D(Eo$G>=T>h?Kkl8dH8g3e=UD9~7llL)=Ut<~{*X+!raq2#m z1wY*XY-Ck*l7K@jaY5FXbchvWj6Y853+PVJh&ZA5H z-De0-FH`UDegiBRg|lRcPLWmkV`#G(5FpDFL~u9q5tR-t+4bEMOA7FFV)es7xP2Is z=}CN8fD8~meiB`#yFI)A#*jPHrT-@oK4_$JX%Idc+R51tJnuPkt`L^)pB+u5dSv-@ zCrQn)BY}Rikk0G8{GwQiuEB8zktWG1ij5luABNX?^zvwK=g|ve!3@4#4!)g2m3)bf zK_<-hrOh_ZP44P?Ifk!}3`sCR8YkfN_T+&#MZ~^sM+zoVGZeD37gv!it_0H{K-0xl zbn@cTWr&H}c4RkHheY05BogmcdW7#hdTn%}se4AvG+DSC{7|cwuyb*`UWD4CF!J0T zhI&HZK5wLa!w6Xv+KHvB66T{}biXcB9SV_mO;SPlKaB#^$e2eZ|NrtLQ1?Ovr)N*a zsGiuVHAVHVXAA3H!O8Wmhfb|`t>W2beawIEk4eiU<#7?Q!p{~o%NCVIVL|c zFqmz*ifTrUV5abb_!^x&OpmWT7oH!ftGB=BcW~b?ZILer=PYq|MhlhE+sudu<^&5| zn->JfB*!cKd6cvmmD8(0ramY1Y(XWU@Q+{Qi)(h_Cp}OjF4YxE3+D|>z zG}FcTgQ~nM3pWkP^ECOVo8I!XYG2t-`>}4f{f0VW3-=2@-qwmJHSnkN?HA#!0kGV% zzUX< zA14pU0EUPqDK1Glz+?zu7(m)C42@h;PCU@0zYG8IvESn}BP?Mew8As_+G68dQIT;FU-Gsqh?F|X^BT5JK%$q$WX>mH84IN+Y*I1c=3IR{( z_?q{KEQ(6F+^{)OWb$$l6sB3+4I+jzALc6#`0V}q+U6w9jiNnZ!jf_d{*7?lCi6v7 z3#z(O%YOSq`$;1g(vP_OYwK_?c6yXA4TJ_`Q{7YUp>5(TOBXc0a`tUtf%65k?Wc9b z@!y$lyMJVu&3YOK(B9Uzvc4Aks9d2lH${XGX?6aiNI=DiT3dvT@SCRX-DR(~wmD~; z+KkBPsCy}497gKRz%V{@53}WJjrj(1^$DV#oMci9*W=Mn5|MbJh`mJ~u|GLar)TT# zn^c2gYIYXfZ~yz~&jlT)J6}WoK`(!O3sB&QGFeIzA0e?I=U9AuN&IklU9$4v1D$-e z2kd9!d)|t_an|<39=r27t`%)-C#qXfnEqJaV2(^h{LzxeO&{(d`^smtZVJtaoZF#y zoiha|iDohMBYHEumLvzXMNm6{1ne@n{`K}Ah_O4d_+UkTNew~9!FW<}27YvLbbO9Vx8(?_Q_f;JT>cfX=i zDbNi;gm>*kDLw#B4Is_1sIf#MXIf$y*ld^)A}>p7X1bo*60QX%8gScz;K)K5`A9Ck zjQ7Ql?^$g^45Rg%YXXTO5HYB5e9xLOtJj<@EFrnSEtadzpU^5kU}0ar&6Cg% zmia{yL;^17Y?)g@W^PXl+1rim43w5t&xihpB^y^RN14D9UBhjyE%vm{G@1HcXkg{p z)P>8>(^Q@;mfog@b4F^Qv*(*k2lR^DN=?3+(%3^AbB_#1VWnNwNvqPBbQI@z8_N~o zhSM^JPD0-y>y>@+$5Vg(aXr3Sdm4Nn{q@IltMfJRL5@9mEQ_2!MO5``Dx?+*D~8KW zs~sNaMrCxUQsK>{p|tAs(Qz`0zXGhgw1V3HakTb0{nS?AggP0m$k1yC*t#Dj)x^&3ryj22S&-S2#rjZq1VG3Q0U6*O{w@*ti_44C<<}iOBRw$r z$|XQ2gV7PkSNM*TR{1v9B>*J8=Ux6y=RMTu6Jz_>`J0XlfscAO9lxL7*tj;QxGFty zG1lB8YOG_CUEv=~!yl20-B>iQ8-p@y!#T~QV&%A1vBYOP$=Te1aN*qOGc%7cv7`zD zno1!I8ML1rp_g|Hz3jD~I9O-l!nY$w+>_j8CKRSnY|S>ilc)TKo{FE8!e&~TnP~-8 zr14t+QkiJkCjegI((_=2bkjYt4;g~wl##*tJp?FTk(GSkyQLx0ODQf-~1>UJJdxI?&dfox1)nt)W+&S0Z}& zi#F*?Zf|p5Hw{W{c7NH^WrOoV+t*F&wJr_Y($qy6JqazqM7xK|0}(=O~*K%&;dQ}!3^Xl@5_$j zO-@3HuTq_!Q&g_gG#uslX^s&{rjEvsPDAtlXjv>*6IkWxWAeBT?(sg8t|wcpfOtm8 zF$T6jay9neH2XOUE=wf`?H%#dv{?S3-7>6x{U@_l$uGEJXbo!=rLX7FOu zsthVoXIq^gt7P40?}nXQtj}IMi#gQsL(8VkgWBK$7@vA!o?OvWoV_dx*)7bD)}P4| zT`Y44^E282Uo1hnRJ;vDFD@#VliA)>nO>` zFX|cYY!ept$JWZeaQZ*4lsTyO;CdmNKg<6EE0}zrTY{cE-U}N2Tdm-#_j?S4&kb?MHf>MROKmD7SWYNYJe8FT*!?Q)gT5Np4p2(7!U)8mPpY zPqXV280*?YI#{`n5&}vqctidGC7Tb>%G-4a3Q;CLjS5>ar3y4TcNvCU7=yKCjs%Ji z4XhH;GRAcA`M#2}9TW))LPB434{P>6>}_%^g(;4pQ_&?08Jki*#)s{uu;@bMSwY6r zBDIxf)j-WB)%v$uJ2|h)GsIN7sF~YP%fP?Q-VJaA%)lu4qvVLji0n+jzu{!~i`Ls# zI-1E;Wj6>7nikq^|27-?%#wiR^M(a9kmo;+8{&0AL>_^ilE_%v=={HiOjRlhXn+l#*Y`G63 z^%V&Z1_u(_uAK{r52r^tIkwkHrU6$p=^1dXs_Q5TKO*Wx&Mz+)A8}viU&cGS?dR=7 zMy7C7gcm0$Sje801s$_r86LjlqOkK?y^g+jiMyku!`1BkSl@khGgBK~u9b#C)um_k zb0YS2lz>SErW1CyjREQ&X%HM827xLe0`1Z5vp<5b8PnQ$%0gA`XwJ$Bn-H|8Hm(^X zXV-YDE?QuiSLuKJPsfG&v^p-`wk`Zc7`_{42%Fw`|It+HkX&QA5{rE7Vvk$BjfKC- zG4E(tDNTr#5^s5bnlQyCK15roRPO#uIIZl^&2G~opO-q4V>Uf5u`sAAv8)IyJUICs z=|h3$OP|L-mOGhXLX!SZ+zB3Sj(23^&J{2Prvda=>yTsxz?n_^o}%k=7;Z%_@in$3 z0B<#=Cf~#33VYn6=zgxKSr8l_t6j0BPhaK)eX;2)wmh7EDTtl3V#@>Rm%P~I6Z;0s-V~g4Oj?QF;q$2>3Fc>9a=iRsUL*~?v*2vL4YbJ2Zj6Vf`{7?In zxxZoK8+QJ~SO1+to#phzfF+n$iO`*2sep^Knus`dQ6e-&L?x@fV82g8h1=f|6ON+R z7W9T{&yX>oW*04xKFBVRoY(4{hggVb5iIiQld!K1uI+oQP(Nf{+~ozp=n{Kpi&2&_ zZqg_(vMPy*^e?6ZW{d8=haNPK2&+USBkfS};{Vf%XPSzWr%7j#5sWh;F!1Xe=~}hT zSP;&W5u=#i>`c`mG7f+DqZ}Vbpi3R;(PV>K__|t;BqSVG=j+Il>Rnc;;`{$un zvUaRJmcF~|6JwKOnw{@V7buF4zvyHM-Sc!qZ9(jLdtji!B~0kG{h<$H?^PaLDpK6h z1P%Eg8loApqg(KfEQ#GWu@O z+|kDJ)8%@et=!e~eEL=*JaQ|+J~g1X673_m5=eAO(_0A<*n6q+4LI#RL#@f|lM_;2Yv`UUGX_e%$z6J9ax=%w7{WYylZuaM2y9i1QXA_Nq=I zPu-A!O{H!%R!ZFHq$c0XbaG1C+4I7tH&T4!@+L94n!`k5TowOrE$5%@Z+JaVB*sg;5r+QNuACESkybeyb?RK$={;VtuG+saatM?5FB7D0|`-dmoyiJ zQ_cc~s^$D*Hl-dR)hQrliyUaSF5sW=mOA~nR{nL)yi(=>w?LE0l)ONU8C|w0Nb`hx z-rlgYuTDC{J;;rYzWYr5bWTV(+SscJnZoH} z?%3MO6!8bzgQcO@@PRjF8(1a9*h;W&KzfZOd~<5@FX)8OtLSAdxLtXZIRk1MB50cA z7PHEdR`R;jdFimYH z2x^n#(gL$(+XNDpf8)Vul) zTmFZ4#*gIN+c{p;`tKC)Xeb^Xu0yUiC%8b`sXV9*46pO#mEVf=FTzP66%AGot)v(Y z#fM7bM*{vkKh3K&T2ZfROhx>}pUD|oK=P(%Iw>?%&tv=<_fU=gT0;`%BL0kbXez&= zxo}}`SMUag7j{0&S(^Q)3NW!J^vb#M(C+v%7HJhjA5s?>RYBXmg`K?%nx11A6+Jfw)Y`E>(GXN&XY)Dq?()RpBs`juEV(^j_T8$vLniHmYCtp z;fE=@j_!3|D~Mi~TsPeCW+1?l6t8iI z21@uG&0Uf3V)!SL1p~&SbYZ#!m^vj-EwjVqCaWHjL~_od|Jnl7E0gKe0X7ebxK~A1 zStxU?CQ&nEWS!J;@o*ms=>z>O!G>21Acww`u1k8Gd|qn5K%Typ?jWG4<2_Rxfnh(# z7!#PQgz{e(Tj1mz=SPzIt3FbaWhWGw&M#p|hSOUP&#c%@UemBz62t)CvT} zu8pPZ@_8tBt&&J&YH$ZFcwVY0J@g_FVVanW@?;?MS-wb$8F8#2egg)C{8Ns&W_`Y@ zASFHVHxE&3IVM*8;D|^7ue6N;wgEXRDYADgMA##7g2^YHAiU|dv?9WR@~=yed6Cd> zCG5M!AYn<{Vvet&2EeqWLNdvB`KIYVpQF{5#*fxerhJ3tX%EgJM-g`eMVpI~clSQ1 zO$(|bAt|E&bj05^o)Jp6&gu#R+h7_bR|<2bkfaW{Du(uv5G&|B`Wbw03D!cFgphh6 z7V>M)J8XxK#T{`9Et~NIn!mbNVl+b(TADbQv@dS5kEbTfV z+GXpO>lS87nwZFCYbIH4W+a)7Xj*K%nG8x?qtIg*S#ksxL~^d4YMmZX8RkawPoaD7~Xrg23UE+dcT4}ksClEsGx1P{_U7!|kvf@PormnP!S>yhLcqx;C6K-*&HMTScT(=UJ5wjTq@?_TW`a`h=F|R;QOza0XnQq+*VqR7ZCw<3AGe!+CgA`BUwI zmPRAYo|{$6A4k_h_bdVfZWpI9^~d_3%DjtL+4{qF)3Nx_sPkdwJNZ{g0gM^t)>IFm z&X->`tUXo+9M;Zoo>fO0R_~XTOkXP3&4anmah5A#g@guHpI7<#|Ht0DfJar`d&7G& zJIRntm;n-u7-fpVA_0s9l#oOd$OVwgBq0e^5D_wl7y>8R8?+5DaT1%!c8;DNds=(i zbIQTf+V^-`d)l`JFOU#P0JVZz>#bF(wVRF?sFiS0=KKBD+H(mP+jGA6dA{d+o;R>( zuf4ASb^EWi{_B5vk_%1`L<9yMLzSSpMDxA&Iwyt{S6=W!348J8{#HwEw>Je~N zC;)t0nQSUeZhy_C%2Uw z>4DR@5bI3^Pr!`F9C|uv9#6}Y+eBl(@xpo6?uI?&JQTF`Ue;5sR#ZWjwdkXcr*RIu zvJYuO#h;>9ioJyG5V$#_*X}xrmgzn@SfzGqqj}{8-VNO0M8LY?jl9fZ1`TO-u@bKo z_wd2%cq~luFH=jySpldCbHnKfrwI=gzy8X=IeW)H>|i6Ig?FK7c|0tSoqELhbT_zu z0v;%E34z*m64Wli-xE&W!<~n5B?(3aFERAyLc#OXc8$gJvkj;ac-}bN{SufD&R}Q! zD^jHX16*5B-2cCDSe#BEO+oO{x2;SrsKB#D)XoZz!8_ z76o;lV`6=ApoDL12!@jB;1ejBCA=06CDTE#a7h!j4UZ)H3F)Bj4h$>nigqZ4ad$8g z&c?ynbU^k8%Gp2MbsS~xCdK2)6Zi@K3(pL}R!m|i2SuoOM&NVz*5sZlci7&u%w5s* zEjPwO=jRH3JKi zxBS-XkS4{C9zbJc9Y(v!h5(0JymDl}v#L}tBI67VhAEjFI)=##XP2WRK*6q5chY5L z^Cg1~4+md07 z>O9RT`rGm{o9oCSFoffB1X$XccO>ZO{1cIB{~2um(nhQ;oKILkX~s{@>tXi&r=9i# zOxNpHs@;Q%GT6ysbi#kH`?!92B${gq<4LYjw!a z(fY;~@LjPfwk|h5>i>hYckzuNuJ!hVh(5~?Tz(x$r4QW5^1#+G3B>HLGqHWY*Zgu4 z(Hbs0UEQQO^n6#u>fFyxsKgjYTXg)i;6n)MZggy0{I}=(BHG2u_n$7vw{VMN`_GM= z3q?g--Pfac1irvbf-_Pm<`E1@E_Ldy#tjxaIA;DcF20B(?n2(iL##o_Ij-kcEcp&G z&Vy;YkE5)-=cuDZy?x3Gx8Y~3+r;`iuqr6Zo3ipocW{e?*!Myos2(@Ygci9wPm6(- zyqmA8q8GQh1?$9|@|)axGQPKeYW%5LMN5kzZVct^>wm}Tm7^Zb8p$Hsv;UZ-!)i?T zkJ(4K1UiNkmhX#OuNR0XROcuQVp$d~9$G#+QuJc5Tg4a~>^_CxNY6a?;C*7Gbi5K2 z6T34adO9-(kv6JI`gNS(J)Z~$@?ukBa&2=$zFf3u|52xXU(X6$M>(df91U$TcC;MY z%5g2!@{1U^-xlf;a;TseiUq=YaX5?pR4wL<8-&dTYMn91__*lEmV!_Zky>ch+@8yd zPPC`m+}C>5uoLQK;j4sT$i{rv20g> zXZPMEO4mVsdT5F5DRi_##XhNJ^O@pw(Hrg87k!Q^fn!k1A9m+`QuOMU%Z+2<6mTHD zZV!iYqS?LPwmV#60iRGv`>4D(g85840>GX+CC}{t13*kBh@$49CP!$6qv-7BQjzO0 z{EJ@SQXqkwbP3=l35c@d5EXsCrEg?Y{?DLc`%~X8?kQG+0S%}nr>=Kg(V=!qW@obP zjB`_u^rYwQ;*eX_A8{(nQ{Aicp5SNyIp<(kiWoz?*rMox&3dRfoykH!X72&ab)jh! ziau`7Ad9k|Tv7CK+owez>q~pmjg+F-w#+CRYM*Mw{dhB2l!G_TN!3$JDVn66#)^st zm0YnQTz69CZsyb@vC@_0DQ;2nh)o9;A6%M(SVdWO)f+j2?G=!)CBzS$%StEwAr_Sx zK?MOAguxL;{E`@_^8;Q`0!w~3Hye%yTxPDWH7PkJGS)rVcnu}z;x>heC4)4G|7ecR zXPI)qKR^nf8xmtqFOI3%A>5J;mgkO{i=VMG@H0-S7W~>+p2>L~<~ceO%5af5lJy#V zh@HsgQ(8hl*Vl#G$%h5QBld$cjR$gb;SbTnB;!D}nRi5P(zsWgEr9a?IBxl3AQg6r z6kEZ(2iO@rDKR*Nvr+wZUR=jpx@NGu!=oEg`4 zW#CNimh5=rLqGifl}NFZbsOkB^E9g0Hm>u`A-uPw%Xk>V3ic+9fje0x+UIhAB9u>u zs?G&YWkUS;U~f-(4e9owT)bk85d`rW0%6SNZ}^4=b16Ck-k9d#7Ya{)=6Mmy-*EOb z&x#NJhSQ%pAU^m@4sD!|qdN(4G_;$KJ}39#5eMkBk#sOqMpS*Oapk6)ks{(4N~VK< zdhL!DIAKQ%zYo9zloB_%wlT~QPoKSG9sKRdci^{B{BFH=2R}lYr6MTg{N{1csfGYK zVDEP>(EmbBO8jC$*qt+DZ?hxvDu^xNlm@<4ge1U~8H~aOHEk$kbuOktrQ8D-osNBb=O`qKK8LDSaWF4PXcQhd*APLHZ zamQ|waLnFCCY>KVhL$Nfxa&1^RV`>tPv8@WkwQ22fqjm$5~giCQJDDxBZP8ZKvEFj z7)xG-LT|$A*aukHEf8E?3*p;&hH$vLI^hm=<#N|0Ccf90{vIX<4mQ6A*yHys2$w0K ze=>YGwvx&x|L*(uM?;SbkElOaW=UNSoG#vc%}DQNJLQ~0EzXXn>`C*W4eynFR?)d< z8gu4^2fbTlJ3=F%P$MJRn;7XL3{HEeAcK+EBFYeTi4?|DZ=t0|CK)!4jKDf^E~+NC z$41q!O)$KyeDWx;Mvm9qBG?s#!H~{p*+0tq^dM(8xHu7NDvJBY;@Xk`~2J-}zcKZRK&0Bo)`_8EubWC|fo)mwf*&9!NB zYRrHX8Uac(1xnk6_Dtku&6T(YCw65g@t8m(76PKD{1)YPen8QBS*l>UzyCwj(b$Kw zA;y)=nhF{)JSJjlKslk^xZE&FBJC~DQy;^Sdm0HqEqOe57IMOcq^Ia3JwwjO&S#nX zz+;w3Lyfr`aWNDyaRvK}-Ep!^^}D)y095oKhSe`0iNM*|B^=m(26iAEotB&6*?v{8 zeLgrxk_S^WDyw=@tBfI1X7l<>xVh~3HCi8xe|e|iIR$R=`{Z~Vs*NPnVw#cZsF59k zsaOJNGQlC~DH_@u3>UK7a2|bFRL5IqjH%8f2Ry!(L24x9(*+YAWL zfMk-*gJXCMKFC~%Ab2IQrrZ`M-Z=hLmEny~r4Mg)8|=UQ7T<3H{z z#*f^un{VOw?RQ|7S8Qsa;i)e`3nxtv1CK%9j2ydJP50mv4SZaFCj;Xj9ys=OpmGZZ zNq!I49!OvOgCxHNPBm(?#8pwHC7%I~hLmRT*|@=q$u$}Z21X}Jc?-!3{YdZV@4JC` zdcdJSzPG<8rT0)}SD*e#Of*rBC$t|_;cG4t7p5&z=FyhL31i2?`c^iZrYzPp(NM8} zbVhj&z1k#T3NV}h2K=T-M#DnF3>_*NOu}g#Sc_Leun6)gV~{igjKa_~2C+i^k{&G3 zf_|tK7$wi+aDXd>Y@AYZjMRWRoyd>-18Uf_@9#djJ*nUzZYgO1fK5qGcwt(|4Q_-x za0QBlxDUq7eyGyc;5AZZdUHDOC9G^@CiZ?(LcRyM01C+4H$#X82Rv}pO$RxAOsLw{ zn*=WJL%mmuPMIJ9wO#Sj@Ei6c_E({^6eD97e}WTy&?4-^jY>2QVI8y|5Xeol585iq zj4CHCK($h6p1jQA z*BX2mwBKyeez=iCb#sgqv|qI81`4M?fQHr=*^~Lkz3X79O$iqzwx5Tc)FRvOcs&S- z_Wit)@s7+0`mdyn9i)hEny#lnHRzyyI%4Ct8Om!Ks!UTXSPtkg&krZrPj!E|ZHe$d zEdAvuuZqy@;>oQutr4K9!@mnVhJRP|X-AUrDdd0tO~&4pkH3**cWF9Fj!CY+fH~8s zfXY6ae7;Qp=h!J)0tUG==vcs0?@m@6YF5qZ)wphwqoHB=wNOret@+LC3aQ-<3qF&|_j#gQpkF-f#Y6pPjFK8*g5sUVY7nQhd&L&Z2P)bu_) z@i=DF{GKsoy$@%negF=vv-X~9d&m2OHV^s(zhxjGql@oBdk!idPV=RXQecC-gvVUr zq0*y1?lHQwdN1dg7tCX^WCvh?R$WFjBP9vfR96<`YhlU%QKu4jVMm zvK^>laD4YmTSwWC1jh$javjAY*b2h+!d}J(p_?puh#d*mLm%MQH2ZJhxJZ1*-t6<^ zJEHL&jGw)m5u!x{0$e9g!C2YNgP&bOWDExDxdn3AK)uClwXHr!R1{d(p=@2mp#^C6 zGD)c1kt)D~<~=9VL%0~&YGR;oBIS&YLCBJ|prwW?-RX!PS(+(wA^*$7yx=-F3Y}x@@)u;V{4>GDzG|m@3W(;6!?gE zpt@#958UK(#f}cTN?yHz<1YtiOQF+p`#``z-TzH?+>o`w{kGWP;%lOj9^2qvj}2~HAVSMe5!k5)H?E2O8XDLz zAx!_4bQhW0RSo8g@&o&?J5WoshIMj)ka$wThYjXL84j-Aadl>!6mE!vYS>q;9xTVX zNNS|y`PNU^bt@}F`(r==Fq-O;dJwtPm4wz;u%~4r|dB9B!(ns?8x11 zVtQBC>xfNB`y+fOVY3X)zEP?6fxrP9K7K?Rq@G@HKKvI^1XO_wQYr@TQsCWsZfhPv za^P#wThU!Dyg<7PHx?)N-KQ5AOWjg99@jmYI7z%4-AjwZZ%94RTdL;XSA3s7s`HTI z!HlkVcEVg{63QIMN;)*>$!ArtcgQV#1eT9R19#CTT(9l+0kL@qymLIz=NV-I9;>ft z=i9kXK;F__C^!)0VK@)jTLa)RF#yW3rFdszC`X)dAU10sfW$ry!GZ$_TuK=B)3903 zL_I+nc6GgjHbIOeSNE&ZwLrU~w=}spP0Q>_nzs-+FgAje!Sd|nG@ew+=UsyhfRTAQ z4ymW)Xjv@JnSoQudd{l&0dmAiipyEx)P^{P&kZGqUlx)|Qm9qZ{ltQpjRGiv32QED zuj6Dt4&m1V3Lu zQgEg?LvvL2q#oN1Uo=C`!lGYo&Iv8G`3uwZbeNqUOierXJ%*h?q=(_C6f}|?;QPy< z8JZ2jGb^UNp-!mAM6s$KKVoMByi7$Wt2Lm6#3Rm_+3EuAO6utoq=2;WO`r!Wo!`bWIxwI?`KWgukokQ8$5Ij;Mz!2}DBLjjP97VT5Y zwn*x6l-egpp>x7xaeFfRY3#7Tyd56>qzwm$=y#G}H?+TiTP9Z*xd156bPR9g z95C|&rxtFx5)F*AExOGAa1$(x;0v{IgWSnuPx!WzgKiP21~V5BgcqG0 z>=Pbk@IV3KLWlw~m+Qq@6WoiX@XWP5bEN0{k-g{>S2Sq~k|GxM^t!rT=q}X7)AT5s ziDS=;jn4}l&(Fd<1lQwuQ?m054oXr0?hZFOZ-*iJ+k%cDZu%DF1ie%@-I;4nT(c(e+-I}Og zhvmo52hF8eF1SBM7g|eN;Da1#61o;6Ig{5+Vmq2&XK`gaenyS3Q^HhbIt87t%zV@0 zJiZL?QY;kC&XU9P=7GKf@~z$foZlD>ykpleJ8W7$#Uf|R6<1b_8|U*TaLxd-=6=o} zCMl4vQcKDnL>j<9Ct$)#c)q;Id2fTb$T^JH-;%FbGr~E@SF8u31PYl*jjWlN>|iCC ztY8x;wCinmXlv24b>W#MAS)@`)3v4&u7+Ae*i%9#9{AiLh@sl`;n5`u7JRL^gvqsq ze+xJ{EHHcxz{yeRB49b}VgXoA3^1W8RxPcZe`Ycr>I8m>)yIFKUJ^$6x?q@Ra_gMEKbW7jzT4 zA_uDr2*Pz(%W&*3hxii^Ln$l*Pgm|E%h0cxm#ODONBOzm$49xu>^TE5Efw2FU zxaQ|jH`%ym+aOfYD$pG?Mrdxp!9kzKg>iyDxwgUlK$06c_s2JwAIV*uY-+K5_!o=cudL**j5?1b>xO6^8ERJl&2U;UjJy9^gd`+Q5VD=ua(YuIs@c zSWZRH^PkNZdY(PRtKpp9)Z%-f_H>2xBV|Y6G7o1R^MQmdQs^!bPc2@dC-<(lRaJ=* zA=FNIFml~dLEACSxIFJgeLnq zG)3uHgx8>##Jwd)cO^hqbfi7KcOsksax!Kr;thD3?u9m_J`U0*KNl*<&c@O^WIo9b+TuHw=!oL@ z!{(Sn4@k|4_3=9ZBECM7zosymC-DYo;^iilGojwh{Hf>=F@)j6kb;-MX)wO`(8T-#M8W$=2Pe#R5XE)_vJ)BUSTheos7cBb<2Rz-uvP`x#tcF*+MO$aRIF$KNXjV-q^Y8kPCcyz{7Kbu_5p2nwW?!DW07sBq1l)oU z==$=2R+WuVdlso~p`R!DJL@`-!pn`#MB-_WMR(IKLmT0y(dJ=uayq8iXOmba`yudb zZk#^CkLb`7@7f)&pn>XP5Ux&N2Kq~h1L%$<8X-F^So+BxjZ7`^>3psimh^NqILnDd zA`04H30oJ%12QvozGo*3!L>yeDv$%URlh(yuAaw5=^~Up_$37Mv`vGVVtto_)%7*r z>d0>dy0)U)T-`6BBn;Dz+-VSNqEI#P)--01NilV5D3oN6o0K35R%u;J2<8@Q6AK0qq;Hb-rAMfp!2-qUTe{ zz3BLM4t%h=SlOL!E439#!2v|cdZ9P zt2LXVV6B#p#QBUIXkhdNGJyh%kT(JWG7$PQDvdLXAiDMmEfT7EC&cLkX9dnB0@U;u z9s6e8VLo3fSs5wq&%B1qR8puomu6XQoYMklpuk(K za`-T2lQ#>E;|^vBcCC9<2S`nbZe$2%tPJvB6^Y+%lML|=ITwbCLuAB~afX1oP}Gof zAuNNIke$jRq_uBUZe$@aZY&8Uc-=>@ z+>!?qyzZyhn38YM3z8Bnk=QfF3-%Ibe^9^`c3W*hOQ#X|%PsEeplAiO2HF9$EfW}q z2iiD4SK1}mx!yOD61cgrS2MDx=t3@RyndeGpIZXq6yr<+50U){Z>ir8ssEejBCk35 zu}EYmm0kcIfgsYFN11nEz32CI=4b3DQ>u3R2!1DwJ2$*bw32G`=nqBgpdAyFsV7;f zKTjw&&Kp^T1vI9532O?oQS^V?!JCK=wU6cpzw2&)|s%(8jyorm5Dh_kUEs z$`MHrjiD*-ek^}x9!?R&*V#^`R~ZzPK=qqu!4t21wURL*GLKFwq>WI_|7VdkdS znqS!|BEfuDBr6*=lGpp3ca}#S771>W{xxhV#>Z|Q@Q7(Cadi2lic{4b21Oq=We6oiDd+zE5ab0=uidMjvC>x5-~KWBk-Ldk#QN*+VW01 z1it5$%Y`G9iDj`4VGzoh6PoqHF4P2hYS-gvgp(1F04Bir-q(xXXdB<#^L>OmdRfjq zc;9Y=V8?L_h!;x(r_{D5qs4MD-pMObG%qlvYJ9i!348&PCm+H)^g!w3cwvITto%ao z8iB-lE9lXS9043P3i@`k^>;HS7zddRZvcZf98-d2B1)j-yYK}UmH9kMig$_FB5>X@ zA2H{Kl0{6!5phvfOn0-0y(gY>PiN7jg@ZxK7rt0;CUL)K0N=4hjgD2w4NmU^9==kqMxFp zV<%fdG{tJsDxx`LLx>7Ce{L3v12I;)`uQ{SSIp1P$G#HF9JiLA8LL2uatxP>O{A;) zK2#bOFrhXRX6Zr|Fo5@&(e5<9=HL!-O~|=9(D9%OqdWC=p}XCYZbuHFUKiX` zj99hiLP=#qDAdbu6CVyF!wJ3oL5FFBl(3;b7@Y4!S_cv!$e8tDc*ic33*w6yso^YU z-i&?pO)~u|;muy-rkAG+hjFb@h67F+toU4RMY48~q_5Y*5D86_EOEnz25$fD{Y9r- z_hI*@SO?7-<4EABUEqO8?l%{7mMIVU@za5)1ZwXX3(9@ui0VS&@m%~u=08GZv9=N*FKnM0pEY8(J1-72MpBmjE{Nv^uDOv%RMz;j%{Rhi@qRwZGM_f*+n4p$U!fHo%mqdvWr_MR$x z^vmd5x{MG`z7W2^NA|$SF(_H&L!UevO(*ynNUx*yO(_&&X`9pYe4QQO$5b{;_Ek(> zN%fhEW*)#@BiLm`zafBhR>jC7g%3E9T@85#rAEvdutR`4;iO$MT`iYkCI^RgtV|TvVazNNa6+1s=wgL9c^!0g@k(p~AISPsLo&H-^7N>v*YE3$@8u!mgF!df0fKq1A!k+qDcC z0ioC3qEq9f8|tbDG ziv4f^_Mi3{jGoj@IGLAMRW3vGxlKcvT%0iQ5sExYcyQ&hD$AY zN#t43w@||lE11gs^-};??~cMK`Uf02kqAhD1#dnn*dwNbe`P_an|rn*v;AtpvD&pn zh2FsZjv}+|FF3(f2=yCzQ~N)+hqNmpk`&R`LwzG`RaJGKA>&Qk?wBk&vM~q0BeqoN zxOt(RXIP5V6=5lg2-=}4;_9gKibQ=8J>Jiaf=;20rs(*V_l)8G_mdOJ6Xah4alT0M zv$t;{_d10hF2>6qD4rRCU13Y4rv#nu44k&%RCzi{^Mt2!*3~wjjAZ3wc!np*&rhw- zaq<)LAtIFGQkh^}59Z{@nRycUIO2C%=MOl-Ti+nzZTDRST#GNsNVN}=D@B_Zm=mFC zOeu(TO%&=3LOnV>9-G*c;WYey8dmXZ0SM5B)O_|U!22SmdO?%1pt%yz#29uGY+2Y~ z>^ds?Hj-0G;JA?!3b?oapI`6DB>@~f=&LxFfarh-jT6JKUd`F*yt+UAc)j^&1o^Q4 z#Rf=yy(L!_mUhlZm)xI_zfFZE+TjRj!rw)m0@1@IX0Q*K3wIVL_kn+F7wO0+_o92ZoZRF?(^_%BXdMDXg>}JY59aGJ*d!9(pnpfH#R!j7`)-Dxx?c! zI1R$i3?&IKqyut@rh`*ULrjEdqZkD)MnMWPOVFjp z6)ymtgqNGONpgBP!5t7$b|wipQ65SII08cTgnaE3Gd&#PgF|9J7ue9t*bXQUnc`@TAKE?|ULV)s7D?(aRoo1B-A8o&FgXX=4x z2*L16Py?>AmAjYSt%?H`gjg&?nE1&UN zLtW?ZsqVZp9Jv{j@uUw+esxmk`-&fhl%=pL1d-RTw*GhAoo8)*q7$<9!h$!kv%}5F zZ$w9dSgS#oFGkp`V`DL`WY~Wo3|@19m4yD-W5WQRLD=?D)$`plyck}v72+_KIl$lj z194=b1d?sOu~CKPgephTz_!bouHa4Zf6D@8hCe`tMZev?G%t)`a?W9!VrC)+uf33E zUA2f0m2%MnYRn20U>JXWRmlsalK9j|H&0{idCL)4UgB&S-R0atY znZQ_`X`d(ta`-Cy>P%yqlj*8EvDHJLZ}*z7$=Ve3{dD5gWzLs>Pi8=h9S4p?I^Sh> z>8~5h-03UPou^CnEOa&b%{gqvsTZ;|*#m*o9%#QsNN|GeP3!#1@!a$TH)7o+@fKwJ)%px?O1;ncbAzw*{o~u~d{D5?OEAB$^Qhv7S`MhNj<^(K zitCqym=dE)B4k*a=EFX&ID9R5*beIBL4O)c#J>uMLr1Vm4W_bkh+-=)cr&c}_C&V# zznjh&#{PaYtN#z_=?BuE3tl(e&w_%>RDH5<>@0_ocrcOdTE& zkyfkPo4)ivqX?;Kg~MRScjxf{p{EP`n~`LG#%qWDu)x#6G!4NkOHuQ>oev>KQ$EB$ zcKYEm)4wgYvY@GjrM8-;1&Ah9^Yiv+6_DKydI8V*3a|WoxI)fSC^douNCp?h!JxR} z1&`HtWi*7t*Cu>@fs&)}RiLl4JK^nA@v}rcsqI14n_aPd77g*zazD{aJ#)C z{1Fn))$2f@^&km)5%4DV5Q6hNsG+2Adn(Df`CC5`DXvC}j~*6<*o5TFMIwUi?A*ap zhhGzgyY^HlqT4V{CN|qeCt%xfm*i*`pR5Wo=z#pP6vM$xzFNJ@Oo4=XvC3(S8afX_|?SPvjiMXzG`ccSHdJL>qSsN-QeWG)Xy z{k{PQ>Mkn6S?8?|xBo5KFitdW6f~K>SqT@=2mfHp5C3e3-^WA-yuuSw#hF%k za&sEE2%s1Smq!fW(S_y@)#nr@KMaSFv@H*;J#cNGD1ACEliyo!l;7K~6U#CcrQbdv zy|%Z>C>_o6d#h7^ZPY{YB+RhTw0^1te}-4n_QRpBnUisNdt~@?EFn`0sj}A{YKnjv#@+u1dmdil zQK4!331gm__a|J5PP2bXQHi-U7;31`ye3OgpK+s;A# z^BT(r&M$CD1VwwWfii(?zXAT6Ib_OF!JXsBM{!V0nUMMod?SA8s@0*KZ`>Zrd<~>` zHJHUFBkv&cVOL%{AG<)uNE=fB8AJk<1!VK`PPQ-%hmGwNZLO@lCOMKpzi>`x3E%YT zaCc6Rx+5aqs-T#_nEe1ku2SNB<^*$d|A5?h)V8!3~v;^ zrx=k$Q@;sp&f*E%xt)(9SoRQF4qb|n{+-{4=Pv#XCHLW%e{50M4i1zYpa(~{evQQl z6@6jWN3v$!Cuok)$iaw7NQq-(Da44&(Zj`cwdN1uhpiUGz;3WOrJ^s9evV9!ofgvr z)hXdU(K{Xwt-cilZ!ZA56n8}B5H+UCZ02_yOt0{f04C{FkUfWo!8sO75CN0BYY#M< zh|D2Jfy6iwmV^HgJJdq(oW&WY7K60sfDz8_2!Mc%mJD%th-Gokwk<cb-oAXrR}DBc2+*&$vRv`GynT~1Q_$W-7Zp2S1cB<=EEuMLFEvAyYY99z`6N7}Qn zZJ@~VA4e230xq;nELXN(6qbwR>bfA;!~`R9MPn`|0*CnFC`e3@Zww7a8OMYQAySUL z&ub>%FVB#ehZjabdyrm_HbGuCaD6c^tmw_rB5=nXEkay=gMEU8G3?F$vpeAqSSw`9 z)`Ckbkrj0Ezn@Vs^N?reSOWi0tN)8uPy(TOkHLrIf}Y0H#f|U0tK#@^7_4L4uJ% zhMM8m#4yaDF&TX{|)B(hF zgSHhNcJPq-=y}bmc^j%7%^zKrF(Rd~Ycs^A$A*?tt6-=`nlD>v=yPEj`pPuMY{HAR zih{n`bv5P;v2PJ}8#)$I0JcKHHanEF$FO_N(E$NW02}}=SW+U>EUqZ=sh{ZoV-gr> zUJx5b5)Nv^i`mP# zDjDyNxNAh?b2#xn$Pm2+E)H!5aGzjst~F9ow@m}gh|J0vMryB`U0kAFiA$BsadCmz z`WrCOnU~BSxV`^W(rv@94djWO`Xey%%^kAHzu+KB&|m@g1aAQ89fHs|x+WclYjHtA z%H*dZHN;keePF*S!9LP}#Yd>+_iFGs`6)AT`wyZpLk`{Liok3m}&Ss3;217sGNjV3{Cc z86AfOb_X&-_nr$oLic_iwukOz;Z7_6%X`O^0k^N~xva`6;-he~xPy|HTDIt=)|gnm z-$ndcxYYWxb*VL0UTUG*LqQse!^N0SItHtfl-S4WfgUS#mkOf4`Tp0y#|lpNH)&@Y z9(7Wuxa)o%cF6LMTOr(S;9|%S7aJ$b4^iNk!p^X;RByfyp*A9aj6QH$ySjdlwr_^{ zYV!pIL_L26Pve2y9OQ2t%Y*HvZH-hyM$O9@OhOOxC;w4zP8}=p;wfPU395yYjQun* zkc|<(^yks+GzW9o{w5TO3(=osvQ1LCAZ`u7AqCWMbd1O+T(Y&OS%KNXc@mU*bDU@^X7H1P5@h$Ti1voH!tdQ6c z2mSnf`)zAzzwN8A-xl^<(tcY~t@&^FvhEkyZ%e{-k6KszKWM)Vt4xjQ61pw9q(@6Y zYyJ1^w*@{}UR#eF0}uBRAosQ878gW(VBH@}31U1RJo$L0;h9x%5U6JpTyyZ`;K_w9 zwQPu2do*Y9C{P*FG_^Q`yn|twy$+mCcYWQ9u>(z!uRT@xxcp}ex2K6afn(Ig zHb_X9FCR;Rw+}#K6#R^28%CY}~kC64r3!I+o`ug|q34X0k&yUC>)a}4)>29j1I2J^R zEMPlbDfH9fI=_fJ;1?@`81dLL_=q~?YomoS6EtD=u|np;Ha~V9Tv328kW*T+MGmTq z$X#Kh2F;)7q|4jK_`~@XmEdE`>{%6|mGEDp_3@b#{&5TzQQZLyn}q8A7@w@}CRyE; z@#=mDA+nMW!4(A$?|j0{QgPCz;FXgl;pTv1TYtF#{J-D)h2UQy!FLgSLeGp?gR3gT zKTiNN)dI6mg86tH%ufJ~1oIeNG4L$g>M?1r)Gr1jZMSHge`jWCsGjJcZ{sUec@F){ z{bzLC5^EgmK#(;`vpGtyL@$h8S&!!V0$wAX4hU`MO={CjxWxvoJkJ_p3e0HCJ@fcGMSrULP#?R!PE=>2q&UBLbJvc{c4L^^y+3Qk^?_?@Op9U z9ovpr_MOr9?s}Xd3>+|dbB$pF?4KQ~R6&n5poQw+W1jX%r33!BHu6>*Zs-FW5dtkY zxT3B%s(3fKNd^hM3egfV!gzj80z1Saweyc0MaGH#k0*A%PiOx}xPc0SthfYUO8U@h zDB&~aIdCgAczbXjZ}i3C#ED{{pbjeWPxT+O1&-SKp>*<(w*Eg(gjW21)0VyuDjtj! zx{yUmVwG{%CrE&v2H)PLr8H5LD=*K7Dv6|{1~PHcumMCW4`!2F*x9Iuy$xvcsV2v< zd84S9dP_yUISo!kBFO-I%pc1e;(9X+-mX1MBA6V+3&fGQIs{)C=YA~ub{QQ6+HVE6 zITZcNzQD(B81*m?0r+EXyZq_L5#zlPk%h0|ROaTMa>nAHm`SmfrW%cHNiX2pW zXdnB6+tTEOir@DJKA5tLJkiv2Qj4Fgdi+diz|X`w{N&=9jOQ9WU&b>9&$WZ)xl_;L zC+}t-=4d$vhnMh+nLHV@9s{Y|hdavcJ`9o+94w}XRs4E7Mx$I&)BgT zSBSg$6KYUn&6(sgz5-Q^x2nAhQ+gHw7JJGu8kr+xbFKXP1W38ubF_W~Y zzDFcaJ~kQ2qmU$|EM`jnTsmbKEwp16qCCl;(6Ts~HlJ}T!2F8ZTa(gLEx~*SvC+Jx z{bsi7m&d`%=Ib{du3sJw&1y3SLzyQ-v%Icf9tq8Q!r0e;RJ9-WVeCu@sh~~wiDXA9 z&|hr-bF;1UqrZ%uKMsrCg#L4G#2W9~JILKD7E!1}#Aw4@Bm+8THJNxPL~d@&^i^Uh z62lvTH)11+qXk-evCS8}QM(QqU|m>XhZyAcYyNs4GH&2p*0$t5S?E8AKyw4)!`zxc zFeZ@KAje^*?%n+eDpNY_0^y8t8YNhd8&@R_v zu_VL7wE19mu|fH`QR5)Td$j|eZrpz&!|0qczbik;#31HmjX6R3kQb!d+=>q{D^COf zYW~um`4J5BD-`{Ez4Ift+)_Ndc<%}G2jVGu)~RfUo-3BqhdIsB7(EDSt5MWSq+ z2L-X28WPZq*;Ia+TXbA=7Mb8{5HTGCpg4Cuhv8zK9HrtwYk#C~08N^NZ%Ip(R3Ev(xX(q1u>WmBu{MOe=`BsoUDbs@)BKF5v>-`-m5l|7SENDTrOi6l*^J80} zFiU2gkS(-v2ySjGUqKWbkI9>fEdL8#8=7yK?QxLuNZ;?mSDvv0r@rdy4&f6`wp`?$ zLAG)99!yRvl4HCE%0_Vnk3qdi64-twoEB_iN@)A7iW&`ab5)>l`qYkU$k%g z$1t{vPI){kd<2Wy1JSC*U6-ijCA>+f{Sjbg{e6aum`m9*vB#NWyol0#U>b9E1rc6a zw7>1`XknMgE6P@%#mpMa$*07yk0wfJWe6vW-UF$9WILn(sBRkvrBSg?i+7hS*6OtA z;)^$MhFUMgk)2Qq)u%Zr1E!@wY-f@F7s$(v7BXRuyb}-vgUa2+rBmb*D4{G4$=Oh^ zpkXXv3PJ}+MHAr{_IT*S5TEN8HlpE0PjO*|+|uE$?@(4qo7h_o!rn_-p6i#V`u~XG z-@7mURM9z@@hpn~-~r&kqF1$XNMB|vLk{`?Ov4CDBrLh+QF$ZP2j6yeKW7l@Q!CYR zZ@%+F2HeGm)ZQ^<2d(VgSMX-8zn6@N&Jx9sy?L_#==N}0iBbypc>f`P&zQhjW;~fb z$^4N7p4()rf?Pk+g9jkk8_W^=i75>}V`&<=z_G!Z|%Vs1k=wIihlKBkqInW1fgj5QpbkDGKMQ zdS+pgj@)T{9ICNWh@O}Nkmcg>aELxdlx~mgBFP~Se(;Cz{s&uMPz{B4HDZXf#D1gxG3s5-Q=rVD=<;e8bn- zk~{X?%`~kzR@pXvFADT`qxtj+0-c#pB0nFJjt35xk+#2My({QH_TKAxmKjUhxNrDv zpABxVwb&E1*!UHi0)+fT_svIJch5UpbZ~OURcHNc*YtV+1@tQ+FTM$-UFhRlp7Lgvf>pWNVH`mhjIOCQe=intSP0gi7T{W2(#T{th^}#X#Qd$ttU!yP zdhP~epZ}}2xw<_xFR3@%e|9B0 zh#_3jHyMqIX^Worr5`u{0v0K*gcOrm+|+{oScCZl<^%jtj~klS37>z7`Q$dO6h05c ze8x5{7d~H&`k=(XuS$K!pl@=Y4VyLlY7`XzOp#yKJxa8Oogb{k`~`~md2SONuuOUn za;-O)gX$+?nP}ar3gbDq$JJVbbj+j!{%vTE;@%WoZ%p=YOH%Z|mcX?K7p|{}{MFEk z?}t;(uj9jb4dZ@_G5r-R{oZ=1`RkOcdk-3|NfRLTM=L5`Sb_i9!3xi@9|D5E(mtpb_pu@@-ERw;WyG9TF z%Ps%k!{36YStv_{SOfqd%EINk7eBd)KG#?w*Dz#?3^CJUFk-&UlIIkVJvLcz%u0lV z;aQy_OUsVSlr(TKoDy?5Hw1k2I0+Yozx>xiIRHk%0JBoFi67pzFZ;PwqwIBfJ^a7(ZvGq{Ru6|39`#8IdMn6pBh zR;^(kRVw$jZ;G7|M8%nDY#Vc4th&D`)^%SPOH5JV9JOJDY6}eK0&`C4AN7@8DKS*)YUOUjfEh;j2Ce`h&#en@`jK% z$~}Nsa9+s-avQ~6Q(U}DEDec5OY#;H%VeGLvH24y?J|zfnW&{&;{Quv(XJThocn<+ z1oqTtfUdg2)eT)LP%odnb>e(U;vIx;wi8g?ZVbXK;1Yfq$6*-nS;p2I5wqitr|v`= z9MIMnvw3eQp@SD1s3EGq4b>hMC=u6+(fdKh2%PRrv))20;A0xF7Lx z-eQ10$7}%0Jytyu$R>(v#ECUBT$MKP&?{ciE1HJMt9qM~fi$8P>a;sRf>u{*seE0h zkHeWZ8JYrAeN;i8WgBj=JXZl@DMG-^@&|0+fD9c#yvYbip?SDe9@IS=+JZ5#y8oY!T`|rR9UUu8bIw=U}3h>G)CYmRehWArrv}8{-?DqXqVRS0v z@nrWj#^vP5c9aCA2wlHn6GIbeMc|ZOE5ZTb@;%tyMpi*dQhW??yW|}Z0Z~v(C8$v~ zUS8buB|$R019a!1suTr=iehdze2AMC=dKI7g3H{HNdr%OaG3`$XK+~#UTMK)xP3_i zFU8=h;Id3HQoR&yhW040k#6y>W?qZNTOk{73{l{!U{xlyISKHPbf^ks7;zO$cnJVj z8&Nno_fya()9`jy<0lP|YK$|~sc4bqazb7;qJpa*5`7V`ASgD|Y?{N@xhy5u7Ea;& z7dC*%1+mm?T*>vYI`T4?#0L_WB4avNM5wW12(1tR^8eXl^ckio7NcMl*CVioSX8?v z3y3*bheYw`&<5~}uE?U`Kf&*RTyQ`ZEY`kYm0Sg}8Ydf7IpI63((`5Mnm)2*t?_?c zYDToW9;q?Pzbw^1RK;BkYvLWz`LRKpFjP5)FZy{tinL-qA3JYDP6%8%D8z|H_6K*d z)p2AH`ZyU-iV^Jkg*OscXSk%-0YgB^J_xDT_`ua#itvNJ^dr8aEb5SG8wVj&L4){)s`8;P^I!E=SOJ807W^&Xl#K;rG@p*aq+OK&KG$TN>$oJ*rq}3H1cA zyn`(7T}LItAwKe)uP7s0UPiRMjA(fo(eg5)`7HuXWa7mOrG2zrB~7DqIQA#quD^GdH-EeuHDxaaB~ zh-Od3v@b6s7Jz^kbP=OOdXwW9S&&UAI%M{jn3S#(>B;}mBhpwGMD zOBF>|^``qz7ir|Hawk(QSJD2>X+2An`4tG&kB0OJHXG!8c7vZ~C8jgt5zIwGX`!QN zP@5CRhEtol_p$dbW#SRbhx;N%A?b}%Nz@)CKC|=sAV(nlgdxiEF%fCaHo!s22nq2M ztWI9404yo!f*hXE+3eS#dbmxnnq8w>GEtY`;X)eY0}3wOnyeri{9xQuFX8xTURhah z{tUi(xE(`uEc#kz^L6#+zmD+J-E7u$m}FuXK5`COqn@Awur#mv=M|!VB;pk4lKaU2 zL-PZ}3ijQEV0R+>)1~Ie8qSZea(=vX-uwWplrO}oSFixH!@u$)>}o;!Ld}ii&DT|% z3*dnd*78yG4*AP}z+OV5H_!E&!9R&$p>a~s%F#)lgzgLUCsmt|qBT$m?>sP{6S;Ps z13n|G3nO|Le^4-$-(sILrnfYyrz|NUqrYJsp!Yy34yQqlzKY44WE{tQ%;eB(o>6aZ zf6S_gMs>2}n=>E(zVH%Ufgj0AMKzX+k@Ok-0JjID>6ke9j2y~fbgVWHKyxwbC0I;H z){Mh-WCi-6RRktF;;gp`QJ%@HoTrHCu=w%_sCe1N)~H?7X5k-a-37g|Hl|+C{Nuky zD*=15AF7?7JCIR(f0%P!)W%y~YtD?uMOwpEZU^d&%pK!aq9{twGJ%Hp_Oyg?#Q+|;F~zctp6agmL_$knY|V2V{Uy^57a&> zL3?-aYdoCW10T`14K+b=tVEvE81N7RaLpAIysQm8kgX$0!$6pM-k(Y_&gg0-U{Ka!h^!ZRP0k>V`GN-|&&Gc_i znhQ$@+wCR#HIN91WyokSRb5^Po!^9w9qli+m1ukOfRhlK4^hClfqHa&Hly1j_Q8^K z=)}!)MYUn&?2hVK<69ke>Hgv&h#mHUOp|YQn5%mi*7<0Lt}o1RWEaW|W3?JS5=Z7j z1AtHfU=$@puphzv=4iZWg!f-fhg6~EVWGFQNc-7-PigGSisN zw#-A1qV?Ry8RLLZ3}+kw5C6ONPaX|$bQQ%HATCQ6EjhMCF$O^1uQI8=A9uAbmRvYS zS5fXfJeKm?*O!T@U(grVfGckSodX!^|M&0z*DbJROpYv+ zw5?xrXG^2!j>$8owtrbx??2OeuS;*)eY4)GHMVV7-?~Oa%(ZJ;T0GiDk56x1tF7PI ziWKc%p6l7LzP%lJ;%lvyI^INg!pS?|OZ~l-W9&)o>;-_N19 zEn4?%#3@G@|FZFJ!JCwbIaWTUc=K@}jQPAWex9-c;a}7jhY_b0arpOrl*JV?`u8lt z`1cUr8}VknyvRTCuM1&pLoeQ&tN^D4Pc&Ysm5&GSzq35uh?7`WrWNPCEYOmyIGN|= za~NU#dmQg}D^6cR`_SuAE6ziB*W#Ot|M_j`x8iKVTVo>pefPY&n=V<_0>s%YqbRxO z!BcAGlZp2hD^AXNaa1dgnJJ~18O?KEoL3OWzwhJSfOis}<%pB`_ico+oi)6pb}CtXNvVsOn)(V?vy2Ew^S^vuc)b6SYAVUu>RQW-@_^jg1RQ%mE9MxZW% zHUMGE#4t5jQw=}k{*+8%v+IkoAt!ZrEsJE?c^sH-KvyLf{VB>ng zC&Tm>O~z&g;iZ&s+^}YStEaK8ZKD{b^V&Av-Pr2cw0={gvK-l>&F=NItZ%&=1GENN zPT$zta<9jSl0EJBwrh=?j|*EjuW4Do4%KTE(;Tq2Z(0KwS{i+t2Pk%3@oj9|um~;7?IDZMp}44#WU1 zcR28J;2%GgHf$o+W2y-NJ&KZn1K0A!%W7+-4?mUKg-fdvK9%xiOUf25jr-KxkUw)y zM%r}tEB7kEHtSp0YwIz2zS`(%YFx8PWTP1H$CCcUlEvw3}+rUPS*=wVR+;hJ^H{8w*m#r)8&!(7G-C=^wU!F7Eh)5Ys8 zW;14c`$n{bL=W+}RvR_mvk52?V~s5nZ$-?N8}hFg?W3baE6xUBw)I+58&H%$l;_94 zbh}uI)~(Uj0ECRRHFvgh>a=i{-PN{cgD1Lq#2k*nm@n#c(f(;{MGJ0hCE`JJz?v`W zbJ4g_4Am|&X55)Ma*)x50JPlf64l_Z5!J+0=L$$Z)aD{&&%`F zSOawN`a6L=?!|Ca(l98a-W9|HUrI~!%1X_}5LSw#H57}8F0t56OsV)Ikt$BQzHK(I zHTjO;ys#aqiFh`)RW`2CFj&06aT3AaQc<(CVsQZpfU&>Ey!`xpd{s4Si`TSkW!P_T zZuD;4q+??RKl$CTzIENkEy@yPyXLOOc^mJ6C7t%hwt|^6)(OOd^tF2Hl8vp)^~Q$A zb<3Od%C_~jYlzert!b@nymQH#wz5raOV-@GNN-)Fx0LC3)i!QgwpLrZadUa&S^~5D zRzguIsOZi^7v=V-Nmy36;@SlPG0prfNQ)I2oSi3>2yE7W^5$oiP>sBf^PsM(* zZ21BakBj^N{rmsC1>6(kYr{KmKlFF;??m8ozs9}cRz>a+uT^eF;O%(w@Jz;2iU-}R z6yupuTUS}Ra76|8+x*j8xd9SWMwvQws;9iMrBO^zvAFU4h_vv(ZF2jniv^D2nG|!; zGsV}oaf8?;PUF6!(KA`Uc5WK{@6^|~Xw%oXUOSiNUG2d}NbFYIxkg|FuGKY+!rUo~ z7cO0Xtw+8q7nfDl@?*Z&8*?u&tEsA3zPhYt{(@^2#-4#0kUOPvJ|kAfqSeG)i3vQ@ zD-~}|g|}we{EFJz8Dc+pVcJU-$JCe~@$~#e+4E8M^om3{>7Ni!G_#DCJEg2P2HHgm zT2h93d8VUI^Or60E?itOgNgr2+QsFuEUns#Y;dMsxbzlgz*5;h31yFn7%i*);$?kt z{z#NN#VguB-c5;ByD+)zJqteI$}dhovImLqqVOUq(k_`P3STla)(T6OUC<)YB4cSc zY+QHIwB;4?QIuFRii)KLQ3h!*J?1V|W6>WNbzhV=u}ltxXk9s2FHHB}XlIPpFHV1c z$?^JfpkJ8wQnj@D)pxNpmo5X*QO4qm6=M2ZT{&G-;4_2!@7yV0DdSATTL!|9J~OZr z5cuMj8Ee;KpDfyVKK)kMNB%Dz+&iZVbzYTMwM&VH#`q9|*%HLZ8yP(FWo+0v@T6^iw# zSf9$;Esbk71BcIVs3@ziz_pM3RIE>ho93D8Hm^r^%JPa83ul(sFQgm({8mVoSl{X+ z*-GI`hF#1uy6;`X){=eA_a=OK=PSyFnQIlydk^^ zL&1uH_O|9V;#A&vqiA);7voy`DZU$TR4S3T?3?MR1?uDVDr*7Nd_a>sWz!n1UB45j z%-quHtsBL0c^XFv$L0KG(XK2;@U&5*a;NzIpZ2~4Jc=q^yApu`j0%VfidtwQ0g|S+ z?yBnQu1d%P(Eu?Ci>wJrheWcGPDrANVG&V55fM>Q0TED9(E&w8KnE2^R1{Q3Q4vs4 z7{vh<73F`wQ&pW#fIH5;&;LCC^IuC}>QvR)mv1}Y>458nYLcO4(i?iN3D?$F)f6Lo zJrv!dLJFoJbtJpqy?b+M12fXD8ZtCL35Ki*efx5l!W{KN8tPUEdYcNGUW0F`Hk;!L zK^#(ZseY`tkzIiE)Q84|lZjldsG77^xPrdy$KG7aQmWaJaI!2S7k){t$BBVhr zkhZpghRQ?3Nx77<5S8POED}Y+<09Q+r$u}>Fq==q853xSfg;ATx2fia;F&Rq$cAf@LW22|W z?mEs>?#d2P`PHyw@rf9>oT2&ShUDaD4H?{<^VE1~2_f&OxS6Mkn`y^QiBHTOgeWPf zKVY>@W;xlNTa_7=G%dal?-uSRb)Kotjc$5csjMtYfSHPKMeaA3N`X70GBk>8F5}UI zHArjBmWoc(*_2le#f*-7n$D)UnXThipL$>@ZguOpC8v*D(mF1YTTq48lY{b2YaJK7 z<}{JP;aKG6emHGZ>eE*JfC(SzQIwn4`g^$L_ptrF2sSoaCu}knm0~3L!oCgmLhyu3 zqs9bMQB)2dJbJ>7Oy_K_Z`8OZhuG+nj^e><+>jUJJT$mt(OKC;Qq!}u`oqvo4-|Bp zKxvp9#p2Td|NHovk^E_p|9yN$16lqw(EmO@R=HDu8ti``AGF+w&j$S8CBWE6;{T!i zK_Q&{ssH|6_LvWm_?QTPAU-IjlYiA8ijUctmzI{-FYHOM#~NH22@?mn>>-gpk84Rj zY4vj)CCNq71Te(Dm`oA&2zig*;g!qZ(9RStfe1gFPt81xeZac}Pd%UDDJrEp;LfEm zA%~`7N4}_Mv3>N@t$hl zQ^I>Pd9VymBfj&VFz?CZX`&<8Si#fs;60^0V@-IPT*gzS*+0as>;V2{%#uf?QD@vj z;x7A3xFJ8Adm>~00$iV8F7GZz$#z~&;V2eBY=Sb4|H|zZJhhDW2h6b8(0slcJ51@ z`y$+D0#kr;pcu#j(g6){F9l%%NCe^m9_Rsd1G)m8fH;5y7X5^F0P}!3Koc+pXaH(~ za-aan2XcUHU?7kVqyPax0g`}3ARgd>9za(h4&Z>JKcfGDL%<$jC$J6J0&D=*0;_@L zz+zwlFb|jwGyw%bJ`fM|0QUco%IyM{1B-y!KogJ-1ONd@1iAuoz_Ft!8`uhL1{MIb zfe}Cs&<%(K_8dXJz;a*_PzsC&k^mk!{4dN+U=6Sem;zJ-Ilw@m6VL|O`90bOtOgbX z<-lk_01|;?SU2v~%Dl$)@$}(F(?7Vd-O71zr~S_=?3;}*E5{B=C`=oC33ZWeB)sv! zq6QoHS(`;>}&~PKGEKN;1i0Ic&IO><0gh0 z@ji*KVEa7@#l4x~&yIV#2t`$O<;BcSKR!g8mvBiz^(c)Wro5|fpp`rg8~#ogO(PDRb- zJpG`b7FPDE#d~JzFRrS?<_xyPv1!cAkz{5h_m>tgTc$bbGo?8xBQDJ~T+&um0ZgMj z6gg~vhxoDy*jK@B4hFIWd(t(0RS92PS``klT`h`A12`TmgC#2qqd)6uM>ve_Yf4yK zialrA?k=HyD=$v)ZzBNg(7lMwCA(|&qc5jLjSMt?X|SW{G*6qUA~Vu!Jt zR91prT2`m#tRUoJC==?ENat^91BQN$4a`t6+ry5e;5<1)^0G#t@AF`#gzD|d8ZdZB zZU*Pc7?Cq17Z%#=>~X_VbF)(WXEQsqCuiW0!Pg)@)S$GiAwwZ zp20lrNsq59ni#6Z6fJC^MM0&q1%e$o=Nnrbm}Ajj5iTtRbF@=8uODo?vK-j@L7Gg; z4#lH<-rd^A27euf5VOUxOpl|P9O}haget~|YI>eJZe2BY)j}+49cDsQ+)Owz(2!Qq z%&?;sv+_~qVE9uo!*}y1J~4R`j~NjT)%NyKS$TCuv=LQ;&0lPjvtlCY(?eK*#aJ^$ zHX?>}Y~Yg97@wFwFe{J8|EYZcp#zW`YiDE%VHIML)FRi@CqVhsN7S1jAmc-DOmM5f zXcE5DeisjE#-2z~#Wt z785EL6)$?FM7OmV(~Qk8s=G5!Qn86!Qb^t>~VJxHQDJ7OQH?CX`h|ey*xv?EuLN6+-kyjUBTTen*3aVOMi3Th!ibu`5gWa4j4z zaEA+GF@?zihpbmrF5M|k#H2;<9FrEkA76-#QxG!>hwDm8${>)VJK-k5ar6)TN2)>l z={1GjD2NO58YRMYykmc^tsUeJBisSu7+}8>jzxG6!e`)4*oAOA+}i-#oiL@}f-w0w z(6{wY7~T=wYJ@3I`nDWlN=MI&5vFuBm**i&cl^2rH`{q1hj5b<|15-S5vDxO2Fekp za?Sw?5T>-9fDs5&nRG592Vp9!3oy`$e=fo)2vfOT0r#RGTXQcSfduqAF^U2jfL_f` z47Idg_(FIig_7-Y$6_glM&WM3BW-0>WpX7vhH9`l*tkVL5}|69BjT4;vS9(8!6v<% z52IWW-w9$wTwz@;ysWU~kfsW&xdsdkLC&E~Y%7qSqdW)r=y zNbQI}k&#I*j6x|wZA~GOVUGAEP5y9cSqafdat0!IMfyfzy2D|JQG4<uNkc zlH+1o3CYP}_6|eD)x+729_kCr7|E@xC=63PNFiK#)dXe$!JRP!SnXLH+N?(uE(D2* z?nNjyTv`z>t_pM4(~DDFbkK^f%ZVF(qIo_P+jx_yRKi;ac6PKerrM3@iZV z05gFmpaG}`N`YcvG%x~40w92wl|{CkRWK~4SY^kIlSOGvJC9omh~LJOT50eYCMXjd_g2C zs^BbP-yG2s@3Tp@I&DcvmuRPeO2y>+;TUtOA1&3oO1D@lDD1)2?C(Kyn95Bog7m-_ z*Hu)9ijhggAA~tx*_C7dA?`Du=qN{C=%@KOhpYzQ9b zb}@82CPl(7MxMXqDh8ecr%KR#?C;TY;bipRY2!ILg07LvtL=K`c+=8+o?LA+52{}t z$xad1I4YKDSX|z~jO=Xm1I2L!Jto@PU&&6Gl}R4i@rf)Zbu%|QzJTp(y8Mke1qoKg zHI2!TzVWRgnJQ0l3&UY>=H#k!JUQXY5S-NUPqLdnTwBHH0JsEJD2~VDoCsfE3h^8i zIKn8K6>PLOqFz%Wbgm>h60g})oXSsg^iZAzTSsq!A(H$zLr@l2UFu5<;lxwI<=3Iy zs*(~uxju;}ZJjSGf%eYVgGR$^j?SxK1YL@1)2GU+WcWc>)+U3r*^c3u2lT=oX)2MMqg3K{pp zECcPO_F!sIgNXb=PD-8_3RNdhfEJ}FU>7x%j6dO1a! z&iGxJ@?)RMDlzPi?g_s|%%4bp2CF+%6}TNj4J>R#eM_KqF(U+YOb(9qVdgN7`q+Iz zt?ot5A|(e-lH}k?Qa5CIyQA@(%wC*oY|%$hKw#9NeghX_#uL_&Hl4?($h@=LUsz-t zWzZ;^aE(!QzqStAAS;zd6FmwY0IyiLa$NKPrZOpMuw5KX9aS(l z8R$5BcH6HRf5(78km9ItB7{_C9y6ry=~*Q849UHQ5zMm6qVhUA6G0tDt1}Gwg}tKb z&1Er5knN%Catp_7#MwkK8A5VZ4He+dYqT89om@oOh_IOqQpDCfcuBFnF0sH0BZYFb zRH=>`%^tat#gF;yNaB(BtUXaOc(NO#xgOn)N>x5BK)FH98Z;<%aC&d{-hHC)FmgoVjMrpR$bu|Jj$MKV|dIrio@&^$gY>G5H~Bf@c0iy@Pw>Nd<(}9$|I^P`UYvo z8oij35O3=UQ?8g=Fq-dhR>wHVkAs{>Cx9u7h?@}3F9qFn1p*R3NcpktuJF5;B{GZ; z4%LQ>3adj*Y^$p*vyG2oJl0fuIwpkE9m5{8no-L z%`L+Uf%{e-DRVeQ#>jSVRXMHCK}7=~WtLLzX;syYFvDS{Cc-a3)HN-M*YqS_7XT5E z02xpKFP~Wx3h{Y3`T$ui#4{zB(cUCjs*5N;)?zfegd)-z35saY(KIGVIfvs&sxLyx zv>YIF7Ng5CfOdM?2S5gchhUY~)D%|MHrnfl338NhPzJoKQwQg#_Rq@B%D;vzo|#$s zgW)pGXAa5bQ&EeY)ZF~6w4vFlxqQyhT-XLOsE07YFeU>A59J48CPv1EO}fi@wwIOZ z=r?u@5?MfDutfrS(N^qXpJ$09pRj91;*2d*+VeL;f*4)s$T8{HKB5-+gyBM6MkUmZ zVUrbM`<@NIMDz-HCd4KR;A(NcjTa?Z@%mIv7n(z`u}0-bX(&IsW3uEyENAoHEst~~ z`bKf0!U=WGW6Sbvz0N(Aggpd0G#P3rErbLWV!8o!h^qsjcWIfk$HQZr`3#lUgU6X= z@Rm-vM_;t3Z_^cKwPv~r$rLm@+{}nPQkuv)acnV^mGt85r5&-QV=~o3?O!m&b}-Y8%Zx3KFyYt_Szd0KNu9J`$UBj2L#AB>>OUEh z1ld$jKk6f%?FZ7VE=Yiq&1AG*)J_~mU=I{_gY3AKV=HGTR`~)~MC#@6Jy0&lG3fqE z+(Qkp%v6TRWM4o#GUzVYIB{orI%h^3(P0gscFpUM8BSRDB3`K6w#Sr}REFrRby*3! z;cjPCR$}Kze3piYPejY6Vt!N?!jx21NrQ0^V3K@o6HNb?g=W+isJKsak56*2vRMwIv*+pwici`C<#Ve^hkrA;M%d=;#ne#RaA zejYkw4YutfaalCinhP7(DQhN&{jPbUCO1Y!}Nh;h_A{72(N6k}$fwY&=zmT?^uEI>Q

@sYb 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 F_&+CNkgfm# diff --git a/buildtools/windows/bin/x86/nsinstall.exe b/buildtools/windows/bin/x86/nsinstall.exe deleted file mode 100755 index 11a32d128152c07172a70f213e0c1878cb533a0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30208 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 AF8}}l diff --git a/buildtools/windows/bin/x86/shmsdos.exe b/buildtools/windows/bin/x86/shmsdos.exe deleted file mode 100755 index a44667648cc9c043806021b651385733554f922e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58368 zcmeFaeS8zgwKu+!R`%M+NPr9iOb|q*4mQMzAhD561lYzTKx7=-G#E%*N)?y9)a(Ln z49HnIvAod@ZF75jpXRwwT+&|d?OS@A+Y2;+jlc#%5+H9Rv&}0>U^4Qp!$)FXaCOqVpFf*9 z-V{Rkv%ex!>V@jX5>h_O%(gdsefBe||uiejiVG9l=B089Yj#_UET`P2XPg;I{hq#cizdmN2IqY%)4hF+)cvuS$kX?b!oxUM#!n^}ZY8>rR41147YiLHj*Q=@-8 zjlF0+%U7;ghR`9!A4b_VbtuYFuQhmFwcgX}74xPWqBT;q@(QqUXtMw%XNQ5mg3eEW z+ke#3tL_zzg&v3ULDz@oT7B6~9Q;75p^OQ-kNE{%;z5lj{gXu5FB89kj zvjllqyLoP#X$~Hh&$~@-H73qktbE{md0ozeP>EZ~>^2F$3r*+0gmuk!LZ!}ou)ZWG zaMUl<%9T6muC4JnwOh2y?bpqksEo@#A&+cdVVbqlqzqTP&1#Q1`-Jj=w=ZrT->1H9 zwD!rvQHwb$Ncu+ ziqSQOxbde!LTCS90K$XzbO)+y^wa3s)LNAPn_9n?8PI0|e>8(SkR>;$1KEl-x?YUi z)q!D3HlEbWfYbjMH132X9PMsTUZ8qOU5!4GL33(n<7RJPy&lRS;38`CxYo_^-%Z3> zu60wDD8&k%A`we$r=9|zQB&8~?v_yv&7wUl?xJ25T_)}T3lZ-*&i_)*M)TcN$O=H? zfF5~ThU%kOr#<{A(jh0fAW&VWOKFvytDT`r)?P_eGDopQA4Fws@=ZJgYU4p|YU}iB z08#fjHN9T{qm|d>wES=Jk-Ml8@nPQ6_4>c?a3IinT5+Oy*$%2WBZP^)^#@3&?dNPQ zCD@vH*@iaKU%8yXz)&2><3M9>VbG)%vFKu8WI}@uSmZ)#&<)g})vUG>W3Ux5mZzGk zSgrT4+Spj23l(ruhY28sZAo2qKtI5Wa;_j05Gbmr@^{eKLmgTx@*4Kt8LFP84%DpA z^B!y8BDws6;rYkU#`uNGxV?C>NwI=Q1QyDbPr02*%HRNipSo^nBZT`qwfDNhH|?C}?LM(;CN81?D}1-*+< zEXcceZm8I!m@R*yu6eFTe;7cCn@J=Ac*HbVo;y`u1}_hlcUofJ6G%HF(%|vnD#Yc+ z<%)o0#n;)xPeZ9dy1ZRfTO`bZ(l@qL09Qq${F995T z>(7u8nH=`rQgyHjeP4frAtJSQ+FR#v@Q!xLzWZFXu3x=av)=CQY=0!gsNULu8ad!)4y|3_hM|+jYAG(k&FAN{FhxbxG z5|bR{?~-W*`|bm6<(?wnLXS(yqWbs#6XHV6o}vbOYiFVcp$(>Nd+UGTO$7`yRVq}R zrFfznOlhrEa6#+p>NP`pG^1z!LOYP~YRPoPoc5$(eX3E}{dT}x(GHXsxg z_9zbm7r%TT>gP|ZH^oN3XVm#omvRh@9XAqF+rWRfr})_fn0#DHr;;;8rBp(mXn_e8 zi!*sZ-MC$9%O(=xVqwMLuKUrM30sm=C^)Yh^bvm;Di&msh>Iu|jA%!X*n+wc`AVs; zMjTp~x-UPrm^)I;u1{Kwf@YKMG_^+daXDqwVz|1uDj`a2kIsryjZxs`>S9zGaC1uW4| z09rE5NEY(usKF3{h5Q!=s$`l^z+p>tWz1m6pIOM(yupw|EM(He!4R5eYUWV!G-a4J zR|FOCD1WZqQm20xV;O3k2ONVUN(<-l{}uG%73gxPrW2BqMwa+0 zc24PvMU7cWBZM;)mJp)lNq@}d0^*13(6k-Koj9D%6^d}wZnf%)auK1K8z@hb0$ zlI!GQTDRIM&QrnP{n785qT+8*Jj0X9D{-1ck1L~GDq#OdF%`8W@fblxSqpQ)V zHgf$0rrfgu9o-h7BmpD$01tB^T~d{4K#vDb(2r=YbdXK=>w=R%JL9zoP`216e)>RwLI2ciUoW49O{YyQYrFeu{*3iAXNUcV`GRze_5@2_en(eavR+ zYe6?B$mnLx(L;3>Sb8J(ZfdLJAR$I$K`!tf3;D{F5ydqo*%o@(JWI(4J!~nHM`@SR zn#%HK@hIgDEl$LmHzX!nI5xCV5aelqvr#BhrWDtjWOryI0F4W6w3Gph%jtl6i)#ht zHEqB4dO=K`%>xr!$P)wL2}5xq#sS6)pfYJZE5&^Ab=gGl z%=y0f`o6SOC``Ui%b+?BYnS|O_W3j}eU8rAohi&mtnwacg=Yw(Bw>+VA|BQx%?#B) z$|ksJGzWpf-y*Sh$<4AyGm#9Q(C#;tmMfXNiRkgn()$&Q+9lHe5<&Sh+T}(($eG#& z1jQ!>9|D(h<@asY4W;cgFI%|+{2#;UCsE>iplfu|)NeAq6$bsOJpcZsJd`4vrN@)f z7tn75IO^S<%2X77L%m)J#1O!XNGpHEmteJ=k|3C9X5&4rJ@3iGOUX@g-VW*-S|(N2 zQCww0{dz?Df4iXc;>RA|O7RnG^i%y1uwX}&)@})R%2{n0^Ux6*lylLrhYWgrbOAH# zzyBI0rEJzA1@v+@fMD8Y$RiUe1Nu!oFg_B=AQ-o>sRB!rNqy^I;vN+KvMKsj! zzm6&@1)oBQ9^!(O<7sbQj*i5qlP&wGl1x8o6oMgS44(Z2Z9)b_Bewwz7C<n+_-y6%(9OUp)*J?l5f}n zDhTba(52N%1`@gA!$X&vU_QFEL=o|x$F!$+AS$Up?8lEi`~_fYZ}A{|_%OYF%-_)P zi6^CxbQt}+eSCxiZZmkRYqijOf?KBeg(XY$!%$DueNK`#CS`nI*fRsb9K8J?D)R}q z-k;zHz&2eU2yS^b$*Z?O{ea%Yc$E*|M2Q%xq#cpRwP%MeOtpu9h@7Ddx7)*Qc$iC5 z%#VC~*NzGOz-UlL6zrwu%?|zG$}9-txrU%^6w(AmO2dyn?;$I6O3ClxSfcsRevlz2 zzfcFnO$$+nd_h?lbfr*yg17$FC>``jsvAPU_5N23c(23o}v z`o7U1!)(<+vjmph-uepB$r8}}KTFVjp{EdxuZiN&|^m&Q&Q1PU+^nj2D>Er?nQkw?Qi--ZLq59H&N%U^d3>aqg zad=VpxgZ>9Y;-1oInyCoN-7|MynR%+@q=|Eos!orpYc)%x*d24qwM$+%+r(!L#t;3 zx~NjBka;5PJbV=S zmb8m0rUDL*l`Ax9JIEnK+DTQW9!|k^^~9&wZ!^gg0VNM6n-S{CE6@d5yIQKaz(7Z4zbR9{ce;B;(&IyvT(}N zDAd&(x%UD-8fT*ZjZ20RsH+d2O;P7}43Lv$V0Z&yvf_z*%c+H^31|)zG0Ac5DNh3e z>T7F^+=l>}bX|XqUIE#Q)}%MNW9eId2#zKm6sQTVNnt*l73kPbz&L{t^w>6sa(zwE zpGr1{SMcg&>hqo;k_++(kTQozIE{!Gs4-p}qEKL*xfki8C5J1hE&CYq7@ey2 z{Pc)l*nwUmod2agyajg_S`0|cMhg4rCaBz130cr+8p=s%!4w}M*}{~_VC;4@Y0PmU z5mOwW(ZZfJzz8*GjessmgdtTrzXq0%$C!aJ*(F`*Rx~i?1!|4lHH;hVt(6ddcnwnZ zFlMGT#!v>RVYt8mY^y^jh(27H#2oDJ;)wmgmO@@@k}!P?XxY_ZY+{dqHVg^#>L4dR z{eq^xE;2Qz6``JTcn_ihY&H0i$U2Z$U%TfBI7nlI892{T_`07sIA!8=#I#Sq=&QBm zLdZ8;sck)|G)L!|V3Kl%if1d?lxKh%@%TI%)`#KUMQx)k7h6x*!#~3#!tLQ7Q5ez& zYV`k{!sGnyCdK<@PZ1F|Ig!#DYq4*lVoRPyOauI?M`4|t9RUrj~ZS+tbu2Q2z&MAz$|jo}Dq zVCtvy=Xf^cg-ehvP)O-NP;Om>W)42Za_r@)S_~qtoK>$+O3X3A8Pxm){4n&9dqFDi zu?Te58g%v`-sqfC@msR^bdY`GyG;faYou<|e@Cs6Z35|j=`6W;TP=&@vV!=4acF}@ZCmh_ki zO;lONz1n!v(}t+jz|OLvYZoSH62Rn|Bo>NrT(by>rKLlK70ECbnkKC5VX{Vno1B7t zySFpC(6h7{)yC|uWV&MV&k12#@EK>e(Li&l?~pxA10Hmm>Gsx(K-h;Sv_F29PzND~ z%Cm%V`f`dqtTU3(3_WZ@H>1U(=<}?N(=uw8Aby^-eHX>BP%eicG~8N03rJ)k(S8@i zx0~kBzn}+Z{sxiqL0=-Q_ME2~H&SRG0<`M7B>~;at+=H~@>51&r^ytbajgb1OkZw{ zgzkg>1kBMIC>0A`gTnSvSSXmFNeNs}TC=A~Lt1a6sEvjadUiTf)ZTz5p)y5nQVEzu zapTvfu%*r-faMUEFo-r*1~4d@t^Au7V{*opHUNNBQe8cp=xU~I4w+eB)D5BlT}dD% z2J&qiumo;ct_io}(c8CD>s}F4y9&L1)xl7zz;{QooTML}=cz(z`Cynf@S(3>dj)2X!USXu`wYDn`zeo{w3 z6E-$LY`O4UuOH`yYR55PR7KaCXyMEcKCvY%qXS&bcUzG5@o`|#FcXU)I&6wQUU}^- zWeDhN5RZuXC?q22AkWxj3bu~hvX2l*Q5ZxJTTYd8oV+Kn?mra}0E_H)T)hbdN#ikI zO9%~n_!I!bqE31qB!hpby!fApWT8Xk#bXGC(&}``PQdn~7!@NAYc%P9(@nHc$)6;UfX|4U^!Q!xI>C@ zLac)vY;QY!E3Jb>AIB}tXja6Qzmw&!?(Y`diU_6A!6~HfD~eH||5|~es{_-klKxB( z99Ji%K-1NM5OhVt=Bp6+Tj+*_t3d#+|4V_Gxw+DYqy;dRFb<&lrDKY8F3q&Fwfg(~(RWsh*~9Cv&R=-# z{J$N{zcnp?>up!(&%bv52L|(hD=q)y{e)>+kJ{t8cK+#u`L9pQ{}2Clb$<6%`KKo8 zpAbM)fBuO2qufp3Piu|5Yv=us!My*Pp0~MdFfZd6Et_S^LXToz0L?!wMW+9rXzLu|0&LLYkU!i;xPc(nW zjm*}z!Dr<&8U=!X1SJjW{p7SJBH2|FwLr_&ev&H zyUf|g;8ix*`Rw5*k%^(GS%N|cgN*(wAVX!HRj(NK@XryC0WD7(hG~6(HM4}l^!kuJ zyo1Vvpo6ffYB9*Tto1Zox6=b3AM5l7xrtTN)ysgjlf&}YqOLB0o5byDzWw&rqlhZF ztZc8-52MON2arzV1~!wubp#(iodNwfhz84$<&F=1)LgNkKxF*JFrF1Q$+KWtPQry* ztUB9?gy}hsAccO@wQ`L6iX6{Uj>`%3hLoYhoCK16sf;$t@d9Cdt;YS2Yv&rO&Ox8^ zKsFBA=iOi@vd`z$!zx5}(OSH?z;(2u=!R|nMsAy*%xv>cW=aSZlQs^bGfVurgeCqB zW{JND5QCQZL-h7lmiTwyPFdo~oK3BiZi$}@g+)!b#1{b=Eb+et<6`-b5QQm#J;chM#W3raH#}UE53ZjdA3VdbKg0)dj}*bz?#sm@)o{dXbFr8<;WP z|F?|sg+L`W`GYZ@5Cw-_ZH)JjF@8IBMuw%CVVQ2qWmql=im8f_KLs%Y4PBhsSQ3ao zkHC!ad8tvEm^fvOcc&ZU-7LAi^(6oygLUIyQpWgvqIsGz{^d_nBu^OQ2XUzZE+D%* zVGnl$uc0V8Ofbf;N>%TAp8m_mc-|IZG6+PX6f6=%zyQ=zx>sX}_Vn9Zhl1E-VIyEHreV9madStDwL%JD+3Wrt_w1=plnrh?`9 zQsbqixc=HHND#q(egX39Kd3=4IAYoJq(l9yLzx0yX%ZoUnMG=3fo%<8+$K2K&$W}hdAR%abR!K;I23Gs}yDT(v} z8Pj+g^b9a6vIIp6 z5h&y{#;wd3L*$O?x3G|O+W?7TluPj#yGLF#UM+hXt!`pIIktLbI2vpVkO5AQ~)j8l`1&{8K?|PY3e|aVH_}}V7LHN zFxA890ke}{1Bo+$hQV}}N5m0<-lv^qul2gd-le1|qND9YKV=lrSQwfKvBAa$J(;Vz zO}%n*ot5{FKE=wdFFnaBnXJ9A`QCK*{|1)NZ@_ z(OKV28D*~@sdabha0z;Z&F%?+J&jYIBu+`gs8%~wUst0oa=d?o_NKN`()zu$ZQxDI z3)&S;v7P^Ad!^w$IBUMKUX;ZJ3;K_0UCUOiJeYzIoog(MP1id4f2|X)yXDv#p&jo! zNq!en|6UTn@~HOgxy5hFN5co@Y96GV9(KH5i*>#4s2g@%%id#Lxw1*?Lh&zH&RQ<0 z=M43%;eFZLjnTU0UBP5(QSzqHO@4)LCPixb2!KP%z7;E%c{^j;+%Jlc%eTTq;Y{(L z<*$W5kpJ4HI}ntMpg$uh13|CGf3jjF!#Fzk3i8FGb1(DT7jz?vHfHNtMU3)|qxCb> z_>)EdoGqSUFGhmV>-6)J7=th~4lxKcx;p)($&|sS9j~j`o7l6&W_2lY9ahU8BDSwn zY&}-?gb^h^iibKkX7fNNYSt)rP<%kY$4fA!t!vQP(U>=;Cuwx*zM;|CjpOv~E{67w zXVKBTomwvCg!5Wtq4^87%dHLsn&aNSot=o)y0w?olYdp;o!B*C(L(p0Ly&j?s<}*j zlhI=)wLsnLu57vJKH(RdUQTBn#(?_IW}p?ys80*BwRaJ)8LTW)kmm_{oU^3tUSMH= z^dC_*tp{bI!01m|fq0v!4U5j$k0=cnS>|qN{=Ggufv&1UxO)w;q#=NHHtWE~XS3tie<-0kU_Fpki!|=Ah6C>1@_# z@c^}qAPdboY&ojLx>WZIo2?ym)10l_{))K_)4?t#Jf9h`D-I6K#MY1i>@*KpnW8b| zvyBD_!Yk0|$2uSMZ6H8vN%W_l%45p2ljd$xgs-+CIizXvY$6d|4mXigesSP4#aDS?&1^`q`7 z0#w&B0SPus^0y%IYvZ?+36M*hhsnV*0m2_kuh6k6aJm^w#}~mF>15 z6By!#w_xf5$8e$LMZAj01}2a*@P_RD-EK-Fu{bF{yuTZfJQlMLJ?9oM0~XB(lu7CM z6X}OAI5iWRBCk<^0^+F!H|3Ga;h_yR{v`oz+EeIY)yW0;yo6JgKKo|kwZT3`V6dwF zQ{Ee|$0K#jWNODXQiFpOYv=`V1UC05;4i5*^n$5gcM{^T$0bF@wn0%*D|DT-(5$bm z!7R4NJXP4Z;k36tk2>|mFfsoF9{Rh9*7oqf;U9Oin^HtCtMr2JkfKt+F)q zi+HxCGPEiX>!TV?-Q}J!Wasa&6H2t7p%D8*MvYUZzzO(y29~)TkFM8;UjqnfSM~a< ztUk=@fpi~TBn^LPVSwor6lZ@oIcLC9TtRAtE3{A&-N{{bd9f|OuJ8+g#MO!G5H1bZ z)q54L-lTB#&IAh=4eS?;%%1GTcXFMGNs|O*#z=`D;-{8V161T_rCN?Q-u#+$dn}7=|^f%2KaEYK}dFWLK|4x`MZ9<+=A1=8W8I zK_mr7B=`S1>wTCJ*RGoj<;o4Jxf1kS13LvW!l5Gamzctx7Wq%>uL-7 zbsDBo34m~|KTPn^>b%zjGum)U^P_We9>xKuw)YMUnIqaW+Q+tCSBX8qEI>KK{fIDs zsPlFP5`S8)4HJQOb9SekIoJLx(Gx$fDN=g|-m@$1TSd>>^U+FlPxp%C3?ecAzyjJv zDQdkJiiWyD5)|LFhSrH()7vvD+rKuyc%S@f;hfTO;|_-2b(_1yIgg$k@>+aSJ~pm1 z4?8zI<1@A!s2x`DDgW0f|HS#22Yd=IBYP1T<~ZuATk(W@aZG-TEySeeG}PbNl=?Z= z0k#8_pupHbPQ)OCJ)qw)m1SieAcmPoI`{MbT36rN*(~{(ir1V_@k$3(ysN~@o`=r( z2hDNY=`GC-u&#a&xWS+X(JF1*{Iad5l7tzQXj*1h<+*kGwtR+>Hc+Qe;Puif;a=SW zPfygbwR2-8gApI2Rpy}%hJ$#auOhu=#1i8I4T-qmy!k_7ed+M#dE}*wk$yX#6Ly#4YLpQ_?RJ zh@>(cb+Py7ScfxtXyeEQot{cqmYUSYfZ>2K#3XUZZ>{bsG_i?r!#a{gA! z9XQG!|JW~V8qtXS?QpsH9aB)G_$co&EhhwCY{w9>S`(|)leG85QW<~Id!qfiO6`(* zX&SJ-RG?T{0Jh;XP^L{e*czmNCjrOKp)eRHcH^^`_zX>}&HkbrCr?1PQ zNUL`Xq3{VsT)o@xSKl=?PG6#4Fpck=5&{S->5Qv~olWQ?e53rrU|uKrv~A&N1It^3 zP8PB$72*lnSjd`G$jG3`Lheb1phWd0|7xv!^^{K2>Mq@~5(N#uX7IP6?uXDX8qCbE z^*QG1R$m*;2h=)UX0tV-`o!%>0CVzI8pl^`CB2RD0LEO(8VhX#IZE3zFwdV7+GG}# z|1JZqvFo4l*yPpxD8@AKW6)nW2Q&0vdt}66{3~yy?Ys*E z7?vAoCm1cjVef*e(G+|>QxNojV6@JQRN%iWQsM6XS2X8;Lmwy$ZVdIM>5&Qjvjid38^PWTFzP?u=A8Bg#YG^Z#OA-w$C*s9{uWGGv4N+CrXK+vt%a8hr|-($=8a?peQAismd!cnhqK^5<(C% z5BjeQv+0stvLG>)^3l`8AA7kK$x1Ur^coihOoY62VS1>I)pUgAwU-x&+pu8#JThSa z!>>Iv00|r0-M&u--N*@gY@1uo!Auc*cW<0R6egDuGQH2r26Rd4kpdiZ zVK)+>1Y-3J4_L!h85d!tD=l#Cb=b#NiX%h1Gjl5EV?&$PgC6H8=wc>@=GVYK=C+nGV8L)Ah&>?+28zb=&Bz9tdC{{pGc%W9xT7piM zNJ>T)jwGp~$P!Oj#qjJvS8&5E`6<)^kJvytpKey=`a#1NN`l|Wpq!=24Wkf61oS&6 zG5$+qyksP!mgeXy&ldgI5XdPLDjs(gp?OYT9%&#$>=1)RxtABvu_%dv^h{r}&Lz?$ z^%3mnbCg&InWcc_E;l%GD*~tvPKoC2XH8ilSYmyC5lq4kn7ErA&`<~>vYAOM4vjbo z=0OUxz4dkeR3(pZ_ghP|WoMgt?gGrzDK(;m?sAtkn_3boWc3nS0&++(DO`(!(Wf)F9>CVjVB@aaH91=Z=he}wC(9giZV**&P1|gVM*=W+l zan+czCaONjg0yuCc8;YS%W4p>uiPb8$rH$?!n#U!d^Y;ad`w|Sfr4%2W3BP&KH#p{ z(vplvEj$<)je!3BNkknUiG66uig`_*{gE4>jlxf}0tmVoef&fVbDLBEVDQytCvA}I zBy#dCCG_++S&b5;t7nI+%g7ps>Pt<|mR@?EMnA147QXgW!2xYwt4Vto`%nF1Aa;0F z2Z$y>Yi%@wMNlh(`+n#b0;?jBIjF@c2jpAi+q#i^7%T%V^g#QoT=&CbMkMzk=suC0 zHTd1S3O`-%N|r;BoFE?AdLFdp?8ZEu+75a~PsJAmQ=c^!Kd-?OZse8%=+@w;NKW(r zt^U9GX-<=+mQfhauxT{(Q&<^AX8lzRU-~;ZGC==#gmi?c%rJfe9UIuMOuzak&oPA` z`_GXm{xz-Q6r6@J=zf4F9KrBGK({e-0oED6t+V%EbNE0Gtz&2vXIHM;N@%WFrhT{^ zq*con0xPp@)#qZ8ibjU9VgsIlQxK{MDp7@ayd|0;v9GhyWaPd|wWB4`#PmgXBR!t& zY@HOmc!X%$8DoP@vK3MH5B;Qo*4HX)b}t3&Mo}yKGg1Zx=FQK58E0kGT2s=OSASQY>9_Uib8d%T*h`K~jye#OHur(#Mf=lai z+F95~TAM)^&W*9249ea?nIe^9WF|dmcqsCo-hLKk?lADP^BjI6|Kb3+$O97Qat^#l zOQ)-s9UHA}^Br+Z+g*-|wtsS9sA#!Nw(aJ3wM#gB05!wm1KOjM(@M4R#nw&RnSvXg zCq*og8nI0q0Kk?QvGtI|>;IBCr;2$_HG&wq$59JT2&`BRRxZp4&*nCDEHO=IF@CY4 z(J+*)Wab()gd(ASTj?nQW|EenEf(tNQ5HT6H(oP2g@^y9^8H@-KD}08)yGB=%qGen(5ceWZEpQQnn7S`5@^7POKhoR)Noi5R; z5up-8$(}o>qS0vfF z01vh#SbnhvSVoPi?nyMrbD+MqUTV2Qq}X`3_DR==w)Ta$!DFPo%NJ{!5xQW|HjDPh zZ=>>jFRYtf6VM)`%$EHD{cC1{BtD%V^=ANTdy1uM*-wp72_6S6nt$&-jV=8TN}Cq` z{cv9fT@rAA@+G(>>!r=lX}6cKir8CkM(Z$nfu4j%ql7WDY%N)AQy$Q6O^AbD{byJb zAQ|x;z}B`<4WhPDZTCoO7nXEEl1TQBvnZ?Jh2<+FcZe(UmpZf%rCP?O>apb!R$hL? zZH~x#iJ1t#6r$DHw2RR@94!|ZV_A35ZNBg2O%7%XD=weyP^@_0{JHjVqXY}0y?BN6)Y#+#YoiPlPUBDDgic=Yb!hVSJ_ zs|X(JZXLj{(Kgr7{Rrcf=2s)EW5Yv|TH2YyNY0wi!Tmc zvsw1GEtMjRrTm8Bj;IYsF<_f?M7nXQ$WyFX77aUyr4xgA^2Ww#;^i9j7dSC#Rbs7H ztex>4UGI&ykx+}ynAJAMcW!N_$#G*qjN5wrz!AY!=rsic%e($6M#GsQgb>{=FJs%4 zY}R_CGp6$FzH^XcF1z|DQo!Fkd{CJdU1VaL3228_=A3zyb$$l5AK|_?*Lyi~lfMGF$qb|1L5zHt*LNn+_&>si8lcA8SqD9)0ehrr zGF96?%6Dk(t!NcGlh37HnR>KsSiyE;x#eAkO}IPLv9jPkely9%2JFT40?L zEgeSLqQ9lq1DdO%h2wl@*5=UpC5pAecc$rc-x+0b+b}J|cYOVHU(ed9iL__d!M7_i zyEs$H^v@67j%LA#3W8Sh7O#{d8HCi-qp8w`yE6uN2&N<&_upam)$c(&f+7M9gS+yy zTp`aP94^!u&uO`GmY!EI)D3G9ByxWx&Nsr!9#0%CZQVcu5eII#Sa;O-o?x0+1l~^x zfLdmxQd$|wU_Ql>N*6F@@LCqz%p+*Hqot=5W{lkrW9$&&s*UkgF6^t!amX|4^tO>0 zzgOD~cuV$Fxei`)+U2-?)hAwT`jB@~AfS7M7?nL!Z z+Tp3u3C<{O4|gp^NauivqxjSdnOYY-c1!J#{TuS);ID1>`)Sx-Nac9@c9EFCYZblX zUX-}Qjt4DB_7wNh1|1Zn_PW&z4*O%@!YdVe5?}!B0B-6_=H7(}Zh0w$OucjPsJ>+C zEn#=D_hxpNdTB-#x-?ap8V!3^p?U%RK1@I{m!84e-X4VsN9aGUz9b^7sP`gZfsu+( zcGMY)F04L+Y80`9`MjrlX|y6>o)oY=00SU08``705Y4LA`v*LcrI^61nRBFFsKrd8$t1=qK;2DZT3~Y`mB;SaMoJV`yL*^#??pMg*|JzK|2HSlRf^o5ZEZUz6`EtTmBt(h?5{YE( zuJ8$a>j2-{nb>hj+!Rw^a>rj)Uvk7>25w-$cn_=FJoUm%`(wM%BdKo9yl%y~^>-H` zm6E|z!^Ht_NebG-7095A2m&1gK&>I5XB5yIvu@j?w;~=jtwK8qy*Kg~YIq?ObHiYb z981x3E^2^UsEE6$WAxVJX=t&30?TcNBR__Kza$H1=glHBdGKR_N zHRUnXZUoD|r?~5ki9FkTA45(GMkocdu(b&52muT3Su{Y%@WrR-_l;hvD{}a=kppCi zH>V120|n3}$=f>NUSeGxk>chEdF^mAx)Paz4#*V3uUv}OLF2|}?4m%VEC>Fq1ZZW+ zL}R+K>R*J&8AwVUrCh9rv3nG176Oc$Q#d$*1MqcYS00@s*86Az7GWDdO3=SXPfsTh z1Zn(uPiB`#>oKUr_C1{h1Nr|MaNO~7{Wlc)U!4ev7hIKP6gzKrNP4Hf5$TZ_q2y!a zMiHoqAHVWVkZo>ZbAB_~xATOx6HysDuf+{naFkHb?|%~%K{KH(3fUQ!ESh2{gx6Tf zR#$oQ4g3@et*19;GQS@zfqm2usD*-J#|?+#5aF3@Lj~(WIRJ5K`xmu#ZXV9l5fb@= zybMUtVqD=r6UKPSr+SlF5lrZ=UxE{`F6DzvON%HG#Zw#$UyE?UO}$itJcXM?O9S@4 zp&Xjww7KG2qR+FUiB&Q2aRGlIVh;~T4JlcuxJZ#&aRwvQZ(%-VqR?)ksP_~ClKg&NSTo4^NxI;sDrdsu(6(nk57VEsN;f6IBp2s zKP{fu-%Y)jzZS%ExU-U+L$PjZX^I6UiVAuP@YdgL!#lN&LOXSnA{s514;kI))|Y~c zFiZ`Nn?a&*bT#(Yf1gJu9E&{t-4KD;fj%@j168Ew@U*A`mTZ=^8k-iA&vtY^ElcHT zF*F8FXc5$y8Sc#;Q>a+-peRSU2i9mBIZz@XyK%lbUWm)U3UESj;E<3#@$o|oh0kpL z68%k77YR6C_VD%#Y-7Zit4W7@B3zdSS`g9O46qp}~;`njPHH?n0xFsI95fqZkx1?&G8u zL($n3B#B7kp758xM*cBccWq@29SW__PlNK_P$)nTXZO)2LrI(SMU44F(L32S<_u`n zU#Pu9Y#3?jS5pQp=cjO}z~D*NUhK^{if)Y&HG?VAP@u1_FSj3&%QCqBiaOxrZmIJ3 zNYRSkjazEv1CV079{O6&aD4~Y zWL!d~DKj(EoSA9CO~jR%Y0XIR&(3Fo95HRl9ilv1-D~S8BIHGXRBWXv*t|XjzZZ02 zEq#3F^?R>w&kiytlXG1T^sMP>SpcslWlHc1R8OBsb=)U*6nz91;d^Eb3eV)>1gquL zHc-ZUaQo9}sv5|+XYmSSaft(Vx=v|M8Rcy{SK@q;5=8S}L{0))0)Bs}cl7CcA89UyfWZTA|2jLyA-v|a)`#B~9_ zk4KZoyC4xMk9TQ@_{lE(B&_VpBcF)K}Q^!`(rAUtySUB zxIkLz@Y;ua60M!4fg2QJ>Zx*C8(_yG>k|*NPDyrp03Wa4^;h;DeUzzrGpXnvw(#f% zF@4?Zrg#tT%*JCIzF*J{)BFInQCr<*h9tA^`MTG?hdR+YsHcF!Y7D${!4Iz>6CTU) zcmR*+Q{`Gwbb|Uevt!hem0(=G4S5gt$mxywPDxom z#L+I(w@Jz{7~r{|H%^M#kF#=9+eo&sCa^?pha#r-F>Tdi#e5tT==-Gkd91)sp!SHC zevVoR7S?F$?S@jb9bUWm%t!Zpu|*zEE`kH5?Vlq^Jz@lmS7?~h<@}UqxjbPC_0z~r zqRHhAP!7mgXOJ5RpJ(J<-VOzVeiqVB?dc-u^orct|_1 zMqneJ#P?Iht-ERFqD`Q+8SgQQy}g9(v1+;@vB&DVUd|A3HkL+t#9e!*yd2S z9uez;;If!F-^Tzq|32-rBdHF+{P)1_Sgz4KDLvVS>hziX5d~+m@sJsiXw{z_4<$EC zM{S5?*qC_4z(~tYN(p@cM;uk!v;(1cEujl$rS#tC!LjZ_ucRf9oA{BNu{jg;y3&AuDu{!bb9S8Av z4R*BC1lnY^X&Da3gmekS9UC@wZ%{ zJwZ)p)r+H=Ca4!Z>s{PUAP2RHY2yBJQwBHs*1KU381gNo^6>AFA}jXykGL^O`pXbPzNYa!PKtH zmZ&@dDvP1qr^0%&SDfE+k$P9tj?`KpT2k-pW}F80m>bR8MWt|Aln_J_3q;ZNN#U3- zkJE&0x_|3K^S`p7zjElCxqsq^Jfq4jIm*4Xy*iF(G z&&KcPari0I07nP{wH~pE+KBoY>yg*Sj(mE>1U3_Z&ASsh{WK=Dqv9ckgGEcS4)vYE z$}zx0#1pGuO{CB@1}2)(nBlp5M69t{QR%#^jYIcT)}q9%>GzvHf#H7O6|g7 zWS<;o;*i9UL=ZNgz`)10GFh3!0XjR$2km%$o&M=K1}9#&(btGW_Vgtjl{)1y&fyT}4929!6FT1> zoypO1iAL~stGu0U&7O?*9_$aw>hzG^bfoFWs}*0s)su*K&!3-r# zWqd#CXa{+c_mu}=Vs|oM-8NLIyWEp4pwe0K;cP03M+(cL`clWXXt{({HE(&Q+AY!l z7lv$gUwVZx#wx=wxi9yKtYQfQSZUr*1Q^B$kfJ{JpJO*ebPr+quK zK(zQstp3gXDOuuPGR24QG=XZ#cQdngT3*B|DgO=xOz`1eumvEiI(C>YSU;f${D%;s zJ@i2cCmZ37I1)=Z&*K#-Kvtxp^E>%>AW#=~@EMXZSQ`z%F0*JKwSnr|DL&EXtl_BrejKSAT_9)SL2HrleQ8JUMQ2~vqmODu|)zA^-39SJe z_O^A2^SSc6xi?dPK|7{z}KN1JrGp zc|`1gcdtXJ>3>%{PO<%~;Eu_k-nG243{mMIU_^k>gMXTmi=Io&Z-Wzg_aP#iM57%7 zD8lbOxZ3{5fYE-auZ2lbc~QFrj|A&#@3Huj)m`sNe#9SKJ?!XeU+z+XY#ND&d+@M6 zYqce}0T1y4gsh;b$#}SzqQ)ZXn-ql=tBZ4*vhjP*dTjH+i2&XcfVbFaf3r_bmUkU? zouIsfRNlK%CE`!49`?d&Urw^ToMd@9$?|fN<>e&H%So1Zft7cGmDlB7?K`9lUrmPt zkK|g;ve@{}73xXzvZ^5p3Hck8Sczu!%4k^e*r)$68otV=#ms?*(UAt;V;C$(4-(AX zzSvZW11d&>Smc^9>@D9r$_PwGCA?upWDg%HhpOnTF!E=7trK2F$LO9 z`*~qyxP%sQGn}wHQJeM*v=ZYrUw6|az`{A%Z$gQKd`m%?JO}~pasyBF98Z+oCGiWK z8O!q|%1UmbhAc&4Xb)Fijc)8^-6(xZmg;Zt2OWc2(q~MtBR$l2J*3*{|{&rtB_X8Jcav4Ep+Rrm^z#Z9y!d&f7P1m$W<<{?XQ1%1Evc z1oTd(Ns7^jI&ofa;#}JQm-H_*TtIig31z4{@>TlR9MZq;A^ppJmHq`!XzD*CXM=5z z!N{&ix~q`8Gm%Fy$@l&_B3UPyp2R*VN~c{oBIfPXi(<$QHg^OXuLQRMz$$}m6GFnH z8ZmBdsiZxGBX)y^)8Y$O8%lAbp2%jmfwrNXjCDoE*<;w{*)qi^WV@S*F#Dlg-irgth z=82K-+P=PQuL#KwgfJfr=y#(yFerHj&Z3e75@cKWCJMc1RqQ=}n!ocZ!^cOxhy!o< zTm~OCok_NT8dM@VY&l?qC}C>?l5084*q=l8eINVXG+AT!sBJ;CG)jhko~8$q3PttU z7T}o1GBVd|LfJnELMNR|L$5T1#~&)&k`~lLLCed2m=;7DRs4>!AEyPiQqXN>(X^mP zD9BUxL|PCn=f_8s{fL6#DNQAkv`nov9K+}qVR*s%z-dAL^9I8CmeG|FMg>pY|(E_KQn#t;G{C_nF@q5}FK{{V&EO3(BMoY(-vEZTTUm*D9CIO2)~ z@9wA1V522{RgRV#I%o?(WabuBiNq94zZ3vDW1|UJ0P}Es%|u@T=-^25Ix7BC0HZLDq)O(mij>h#f|XloCjmdZjOj~QVJ3e~ zC-Y&Wp6#lICES%*pz1LLbA0{_DO@Vz#E3aGd$L?$`KYIb_>w4@oK8{8j#`kunt7qM^lMbDh->5&#~|$2xm1KQVUebZJ62g z!+Sb3yFtmUtiVmaKrlW1`>EQ>Sj;YL(K=IT)?}QQ{3%@LPSAI(jsADKPMfsX7QqTV z0<{4y4Swx4!-N3kO#5h5_%3Q3!UZJAlILK$a~l#)N+(oCo1+qyYai{eYzr80MtYDG ztu#tnKxM;J*;|irUW$P9z4SdhUY~4gl^!!NB@cBs4XcJZo%ztfY4%rbrVX98WP%@^ zU%AzI-51jau)W<%?^NCR`Ck6eDa5Kf%6|sqlzSTp&My>-$v0c1#YW3;=!Fx1%xO@vmW6e7) z8G7!p8olIMmdJYodom@;%yw~8ze@xR;=<82D-T0rU}O8;=y+Uu3?|`U=o?L&NT=LIab{8+p(F>fgaTPLuu748-7E`*Aq6WSm^sUTLEJ z+}?xehQr&B_>MM>2t`=KH`R-*n6N{Nk_1cr>x5mRK27@5P8sAa1ViqC)Rhf&gClQ0#5tFtcN z@p`N*B~k$um|L$X4jx23%$SnL8s_rQKo<-A0$K>mOes4yKrbSQ1ZCPYP`uQEk=!+6 z%@3Jt#8TX7bJYk8kg@ILjv3oNl0Vb0AJLV#7UEihs|**NTQuaXBD3Xiy|ms6@W0TQ}%8s zMXDNo5f&xUiipMZ;Su&CAseU(SN5)kxu`)1f8pMr{rb;F^OY+9xCuG3}AB7h!UavAM}YJAC%4?J0v2 zJrKkAuugmqluq)2=lRQ3Qaiv(C9vuR)*$St++I9tDIBDd78P+iM#csQpH{l6T2H{xwrO$=nS|?g zwUapAhNBecsRuBYqcqlpm0|SO~YKx^d zQ+zbjacE$uK`9fGrTF6Va4x-QVVCAx)KJUWIzPQ#jYE=ynA%=4GlbzrnH$6g8I0f_ z@F4q=*aJZU0onvN0_u%dwo)oECqBW~4f~MsO7PFPZw(`qV%u=Az?{HuM%Ov>901#GMlQ?pD z#ZPWnSEKF4=kro-BJ8x$_VNRw2j2=>qJN8T42B5FXCj1&%(Rt0&)~As;MV!X0(TZL zV$1{oK*+lqz8tykn_phwTzE)qAJMnhBv-cY^`7vA+R5;0D-%M{uC1Z>HpjEe1V5ff zhYp3>MyQwIQ?_ghg;?o_+r^e~OxUVAD>V^7Sj1{No&-14wRXaObQiX`mKCBl&>T%c z7g&+4{nZ<5P0R}0{cAJgXtp+ zD%K3oveH>BxyDRFbUrBJfjDF5Ip)!Mj(PatR<-d44LGqxQfOw!P!bIJ@H&T^GmZ9G z&nzVHs04PfKtB#NW?`Z&0yR>P$pp?oBtEkp&`tl!#zv;lCL;*|jc7$R$ZkqxN99Qj zZd9YYl4#laL%Kr)Aiy4^odXa@ zYiBfIz@Z!pXb#K|cVIqqo-|ys;9T-}X_`NEJWY+?N&1bl5Q221Hgg8B1AQ5f;ZOv@ zczuw;ZlWXrlI@hUQGieO1a+P2@%luLd1?w)5w_QG1e@3=zN`t6+1dd73^FEMQpaHC+X%VLceD zne~wg+sO@N%?w2L-_(vbtnK zAD*H%e~*=bQSXg9BN1kj#~H686f`75JVH$@bhTP`2SRB-N!e2Na6<>(3#^I6JytT> zGe|63B$rI}aT{g{6tR`w8vPx`g!OYMGoVMHdt>D8C`C}CKPUlOK$p`3yZyHdELO{< zY|B@+SKYp1S=$}A$7s@tv4o^anIBQ)leHiAF+8?QI7@_o~Y>yE@HRrb>Nj6T4Q z$K>~n>|xqk)j>J5%g|msSmUJmTUP6D@&?;VX{djXM}{F*vO%jCLxRj+jTX#iYtKKU zR#gTWA>q=cqC5!V<65NAan9R18IJp{RHev#_nSGSXfllosH8 zqN3)^(vr=ViufnUI7_L;1p6c=*k~To@6%cc(M8R)!?a{`CQZkSHlAlWu1AjFA_tP2 ztOWTQ3CVELL2>=ZS>gDam%y40>^!m2!Wsed?l=OpPL{3w%Ek z7``kJ>bNrzZ*9z`!`TEK%|!L-SP1e*>+(vh4S3MZn+mWLiKopIc}VjZ{=V@x{=VrZ zHo((H-W4$(w7H2VX>R228*Ti36L0TIDIq_^h@}!99!!?t8TMK#sN@#L>=E|+B9Ic4 z5hd0DVpu_&#;w4d5oaSM12$(-KmrNIW00{nj4_zL+2GiO<6B$X0R^fn78^;m%hG1- zA{iRb!~?BoRz|Chu8U^$uxMcyZCTw#OAD4G(eN!(o-&Mo?!OFyonJy*${f+4fyGNl z*N2t@+~Qf$!u^C}fnM-2OxlH(&*^BSS+t<1iMxWl6mi$nc<`OwG+F&5Gd`iO%R;Dp z84ru>DIznZNvT4CGa`&0L?9=G?T@ftT1<t#_D?d`=TNoEX& z{~!1#VHCvqpzOra|0Dk-@Slj!KpesMx>n-@P0Hs5UH?ye-yR=Dk?mgz5dsE-JTxfk zfN&RtK=-`5XL@=jfrOUhl1jY@cW+Xo<|6*?C1XOAHRF)@TGdXt4^Idb?Q`g)#>V% zQ(5UXehd~q*uagh-iuf3PBCN%_1EZs2Bo7a97%gecE!Ua{O$|52hWxGk<&D?CvM>q z7}g)G+j=1kiYY=Dq|3Y3} z#Fj?zUl5oEj0S2NJJ#ISY01d!#iOz@14W-fQ?aZ_bU4?|<_l z2oHV>5_k)p-PVTv$z1NCT#yD=b!s^OzQgej-x@64##w4OlGAWBC&}0jB)Q^g%vl1b zaK4}OH8Q*AzERnjLtQ*7>$E|v5gR<}*OOP4jO?&@REOlR#^&)8h{FNx`D-}Rq2XwX zOUiQTSF4lhxPKj<4NJ&rcQPuefIJ8KE63t_N^63zrb9*X&Qt!Pw|Sq%J@JgsYwA0y zChFjx+#PM+G--0{^{6!(C${ph#FEcIPjm~D8oSacvwBi;^qriAx|Zgav8VdN`5n)~ z<7zvy7_E;Ia}5`V^!yZWbh$LuMV~V=Wst@0@y4iLUmKvsfU7v={Ci%2QZ$V)w&{VV zA?2rUub15G?e_e8uolXck7HGwc2}B4gF_>RybcGxnO9Wu}O;MQ=wxCvYsg}lIJ za_D##v8entjrlcqeS4P8y{a+J&~XEa~ht`POtIaO)t>e7o~lqWSh!h8cgPw~g8JUG!c$Ma~-C*Bd$ z^kWkzus(JLUjxb=d>jiuO(U~XevL^I)aNx8(#kF#ac{)z56&1~C*Oi{gIwyl)`$|X zfKvCwQ_I-KGZ}+iybsBmevH>;8W&`~=`;o#85J~^vW2b!HIa`;;?_ct#mJAB^>zJ& z_uGu8R>Xt2uy&hti#p(*Zd3dNSI}~38-X&Kv7l8oRB>uK z)Pz;KJ1Wp-`eeu2rh;QoKU&Q17w?S^Vq&7N`;yD$+_^cqFe^l~pqjIiSzygJnFUv5xFg((a^SIeoKBZMJ&FVll58braWbc>Xwsuw zCGMEYkqM?gO8S>n;AaU{0jU1`5shg zE^i(Ai-thAz(m0;wW1XZLV90FX1fP&;L`#H`HMQ^Y~g||Ok84@7qs(l_HZ@qN}D$( zu9(<575BlC?!2N>40KpeK^UYrES@rX*R<|5b}qXYH&aa+NvW5^&atUl!Udg9V(_e- z*6&d4Bz;s>*ET8nK9X;O9Rx@QCRZB&&2VT&$Ho>LPG)&K;2g!DkGxz z^?dcvXig;m9(ubLJNjjR^GQ<<-_!)JL99q7IHzPyc^i51E8i?ey2gzb4pq(N z_;3V$dKI?jWK&KPNvXVbJ1VI06u8sfAm9e|-E(@CA;qdW)wMtuO5SEXUtW#&YASEN^MN*! z%fp)@^akihcms5Ee#2+S4qf&Nc{n5;9dI}QU+JA68oprFleEx8+a%3=p6Fn$jGE#u zq)@J-Pw~aVaK}K@mLv4eL_zf=Y?^WS1&WHPUVOV8JW$&_G`hO=T~NTeVTUBF;+Eo} zGY4BCVv8Us2z{~8)VOsLAKK%&0B@JBMtZ*GGN_K!88GyA891m+@4iW|uTnn9v*Mp6 z{KdcVk{#+z%;KF)zV#+t;;{{@Zuw}4){Q0lC*NwlwzBm;-KQT@d-uGCmxhwsm`Bgk zh8Ifu6GLf#TexduCE4&2GJYEXu;uaN4%FJ#A}Uy(0H{DvhH zvx?ED4bI5Ou9?^gh&Gvq zX9|{iZfqe1rsqFA`%UKGUz}2e{o0`;Q{Vy68BUuIBI7AjGCwE5?fEyfZ4aFiNP(K zn~Kk*&c08boi@(6+SBJOa}UkJ)1dy3?oBor%GViEk_`Q0UTy?0*XX=lk>&;a;&g4Q zKXWLzss8&z9h&MX^E`uo?4j+?YlI5D%<6pMI$nyChP2g7p% z8411dKsc06XTM;&Sls^)(%C3oBoWn2a{|$L!W%TzBtkx-ZSr}8L7oBeWxXK%+rlAj zULZcq8>he&ry{2K5*?H-UG8v11L1He7KR-B+MIwdBd#GMZC*t4#Wg>dOj?SV1hWew zmrnvY8gc3p!FV8E8`ZpiNXR$)-1rxki;>9hjeEgv*Dl@}p>VVg0*FMzGo#)*Q(TMI z1ww7*Eb#K2w|=w`Bp43WX`wjifmeZ-=e%*f(U}Q~7)#1mFq52Wf?;GAnrVuJ1EDxq z16=WIeqEm90={TC7Osh#ssk~qsu6<+n<@+iEep(udZYDFN7e;OnY>&|dfT^4mvX&O z)CAekp+m7}j8V#v7uuZ&%?^d9RuE5PAUTsiDRkm7-sS@F zobc5qS!HADh%*gl0%b>flC=p9G8T_z%9t7)o21uvN{GYJcD#OnRExz}IVpWCM(y9P zg#x@DDDO;jMEs@d4I+(%p?Lv_8SOk>+gz@`+Cb1xEy@St5Cx;Wcy0K#m@gWLK&4pe zJk3WYuFi{mNMAv}I64zWi5a!8>q^@)n_v@@TvMG!67gZ-L>xhq$QUSNG@6KzEoo!b zKtD;#U@i5V^9ITpqGuD5waaxMKk5Q;QghHqvdczk@iK2LUJTPYM=K9U5)tgwry0K| z2SWbvTs96e@XpkRhvyZuL`;iX%tQUbAW2g{Difh`;ZRjVo2>b(Y7--)flA&(*39xS8*S< zfJ{O1oI-RW;V38$#kmuh>kV-Fi8^nL+E7f3vtW28l!{Rp2=O#}91K^u%r%%2TxLEP zEI)EaCY)a_7~^5QR-f0>2NN5;E1GYlLlrtqqX* z;)W6N%f0bhZfa`6i4gS4l-H$e=gTwbq#A&ecTc>}OLiWR1;#_B!jdlOd^6%_3`bHa zh@lbT1PnFZ^+5yCy-_hUj3BX&Xla_hh!Z2k5Kj?~)SFOWl*k)GaWG(|?kCfXf>BN~ zM#Bx*epDduFe&epd@h3K1<3FW+tDJXlZL(>M;Y>=d?~KCZbo2cBAke2a@f8s?ee*R zP%l_6C@jj6(uOwia4*oN@9%=~8e=z|E2lWBPb0nK(J>;TzMhnn3VKf2lJ%t5Y^qk% z9AL}{`lif0$dIOLm=9)*&Xo(YJ@0yaK6U^T8F9NXZ+p6FNgFYvn$8xQCb7ciW~PbO z>Gg9lb(x?p)@h2?nWh%jR77vps}Doo44LTk+Q~Up4|LygC$cbY;^Xmym84BWQs`VC&Xe|BeoaW8mV4ctR2_1u|G%(L z7eVu)?Gw?uSo@TWn{GAj%ARR!Nnk1cqqIL{pUy4Uh3r#CJScKh*PfIqXq#tB=lK&K zC=T@U3LT`IKKhw5M1wNgW=0-S{b^B8n~t0&Kx&4x|6NDq%OXyiLVATgb#zOerA{z| z&c`sR3+J5BeZr;Vk_7&%66oeB;v~3ALKo?qRD|R~3*eWIOA@#wf&ZNnxYYjtch>u* zQeTolQUb~G!2XPJYgseq-GB=nG(IiZjJZREhhM`UhX|Vy(g=G6LK^l)5Mpa8R)nxS z!afLlAUxKBxkrQ>5%xy76yY@pZ$Wr1LKDJ12u~sZc?eq((q!x>sHyijel}--3|r z*LsA>gVuqG2`UP`8JcaNgAwK+q`WT!x&l}a=DcI2m*oLe9tx>E6jFKU9;Vb%_lPc~ zr7$0$JgB^Mjmk@9CD8T009~ieu;_QO@q2{vyBr~3#!1_ZI;~2fIh{)$zxT-%lbW{#FB&-){hlw*esj z{trO+-v{V^0fa*G+3^P6X#rLM_X81N8c+lb0SbT|;MnV!I|eoatAXXfVqhK+1f~IH zfD0G`6ac5TU>+K11}N@2gv;q1hyc@pDxd@q0E*Mo2pPh|n~T^EU=y$!p!knm|Kb&z+cC8aYZT^1X((%tpAS;`;$bsF1AgAA5e|KLa`7@vBCr>`D zhj%@(pSm1YbjLy-u0i~kr#^hjq~C7$KfVyck0K*{@gn0F8}VO4{Qq2aVAVD3;HuVD zQ!h;ajwgAFiBQ0aAO7S+6T9uhSs$9)$A4$fzWv`aCf=cQw(=>g*_{XN68^x2h3JT= zT^u`38&hCCsjup9Ua zxDo{v0Q#y_9TgS_(V=usfcogU0NOfR54;0>33NkT+DVc&zX}@ZaQV`45fT_k!ZVI; zS7$L7Rl<3Ww|Zu=n(kR_KClE>0jvey0QLdL0M;Xm;sMg*^m<*mt@jjCI`vG zrW8(xBf@^IT=y}8S4Z|__;HL3M=P-!8q_Atm<7i*b~U~N7>;S9;V*!tD;FEV*Fud% z#f8p%KK`&O!_VZlZ-Cz$fA3u$Q@Qegj@sMHx{I)`V&MCW>pO4q(>CxEdM6F$lyLhaTfoRN# z#>Qa{jn*vnd_Kym;H!=$NmnxDvN~%VmT&a?by=g~e@bP=S2f^?6^JJVS)5&EI6$Ul zyNh@jk%(etCKYccr%)V(^By~rqK`9jxwnZGV;#6HkW(FRl)nFDqP8(0qGoH%E-80 z7KYm^G0bnx$(~Frr1YEZf+W3ue#)NZWzpSF%HZ`;%x=yC$JJVtJm(mj&1FJsnbB}P z3-DjM#-V4)uGT$mxzMYVzjOhzK}4rA?l%;beMdQs3;Pp6&V?bLtEkj^6fBH};*9-B zPv?aXZ)8lUCS1(=Q=AM+J?S^GUrx@Y8Xht)rz@o)|AZR7RDaH@hzBQy=0XM8&DoPe zaOOZ`@t4l?X%X_7K`fr`*{pHobvqm`qE+F^aMm1A>y4tPJb#Os%s!t@(8_}~zocl9>gPWUl8B#mf)s7Xmy@EKS=nCn^6u7w%ht%YG zonMF6T^I32wG{p9+g?HH2-k!PO|R^mODo2gmYwSbc%BaNf6Aq9j4ei4jtbL6zxb}W z!u*V-hxHokOzZnrvrV$OY}0MnCfRnjz9arw{EPUkdB6Ffxxup7@{Hv$ zDp_ZM%ahhCZCBY!ZDVaSZ9&_YwrlJ+*emQld#!z~eT#j!{R8`Vb|wvz8liew%pOt(=podqT>&a-Hro}zdAZNbDjO1RZgGt6J@x|@4DT!UEQw++%fm#?q>Jv zZqZ}+L_7)463+_Hlfd!oJeJ+P((duCuSVZ?tc+H-qo3_AoeJ zEIlW^B)FEy5VR6oKhMnD%UW!GLm1mScDO;4I$_ZtG>z9!3 zcGoV~QP&BVOD$G4b(Z>&`jq;d`ik1Deyko*zfw!x|K@(l-QwQn-s#@w{>*LmjPQ*0 zlzV)h*`By(foG}bQIzvp&-0#U&)XhW#MoMtwS&+{7%UVEe-z#q_6sx2LGwKGUFQ4E zzcQ~jzii%S-fjMy`FnG3i)5K%30XE+S}a-C%dIzCr&@j1fHh*BYh7;bWm8aF3vK^u zd)W4vt)G2}z25$*{jj}28Yq=YnFHom%q`}9=C92)mOCtmEjiX|>#wcPSzD|-t)E-Jv97TF-nP{Kiv4~2 z-|d~HSyEhjLV8yE59t$Wl6;#yOP(W_JEl0gID0yS&YwCLgR7^UYn;D#e(e0zdD!{2 z^J=A!(oY$v+^wuqUQwErca^=$m&zHXqf2p(aFw~rUDdAJTs~LWHP7{+YnkgYms>4S z%hX9~Lj9R~kJ_j{t*%wqt6SAPcW?I{?kC+_+(SK9&lJ+T>H7S`jlxi2EZWJ#!qdX{ zLY1gm$DkCmt+Qt`@Er1i>zh7pjD*f*0*KB&-ykMH~KuuuIq@>=O%8td)Wb=D1NQJ2~BZH2ZHo7WbyJz;y-w%69v-q&7f_uC({KW~4>e$f84 z{kU{S8Y|D07s!qBWAd}|^YZKR4*7^|aa5r#t#P~z?fS}*?Yz=C)G0e}an?HTbH3o* z=6uij7w5Om%hASUWt=i!c|=*Gys!LO>Fny~TJQR!>kHTSu1;#6TB_cmHmQ%PC)FF= zHb|?{UG1sy{0i*{GFpiFbp($Kn}lXzi?CJLChQP)Ln?dGhGelwoFe+fdE#B-7IB~W zka-KN+!6CPW@hPZ>29%FCRu)BnQ4hw>MeI$-msjs+-luy-Df>zz17x$^0wHr?W63s zqo&W;yGqwd^QAvZ{~{O3W8|mhf0zG+a=tCUBY!M^CZCjZ99P4BsE%@n&oRewr=!X7 zoMWS-#j(@zk>jLeh_lqW&bi5X$aw-~KI`lPdmUBYR`Ov*dZ~4444>$GQ2n*~J2l%q z$nAkvOn2A8itKXdLNiBusy%*Kj6ZnZ^6d4Tp>i+9C*GhNeT06n7&i+)=6Z3j&?r14 ztbtY>6pjji7jndWSWUC&$k2&J(1=I4^?b&>$^02C%C(jumLkhUOS5&Wb%0H^ZLqy+ z+hY4q)b_{F^CPyeY~R_Ky}P}S-Dem+zGy zmwzKSLoUbA1N24h-|qN#$KM?VPKR@~^Cjo2&X1g*InOvdC|4;?Wg>d5Wy)`royvaY zw36-WFMyt`a&K_|$^Ewb1NQ;<7w)g!XWd;qJv@CpH+d`` zm#5S--ZK@w&d)rHJWZZQ(C_@#^OEN^SmfQFk3E0!d`)s*$=Cq|Zef%#kxMxs%oi33 z_oG+(1N7{m&|fSRmxvFejlC$oCH_t9WbSS@n@5=^nx~?bh0XQmh2~$F|73pGe8N1~ z@_Y1DvejiRvX)qXY29YsVcl)rW8G`@*zUC556Qn_J8rwee!cx>`wV-?KHvVH{R_K8 z8Y?BFd!?09N4c9k2zGm;d{90vCmaoqC5~l|#~qs;Z=s*v=eWvQ=v17Oook)-%ImO- zm%E0culj(?s)H)2W7OLqtp)1C>J#c1XxBk^U(YZP4Gd@vX0-5@@Qz>-2Z>HGDn2i+ zvfyH~zCL0VWP$C_=auq=0-?N}or$BB%@-Gni^QekGI2RHY^AtbTm!kR6W5Cy#Z6)} z+Td375!pp-CaGE4 zB5jqnNjs$7(jIBAv|lR diff --git a/buildtools/windows/bin/x86/uname.exe b/buildtools/windows/bin/x86/uname.exe deleted file mode 100755 index 5788c84b195b21e3c9b8622dd5225f5030790806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28160 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 - Copyright (C) 19yy - - 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. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/buildtools/windows/source/make/ChangeLog b/buildtools/windows/source/make/ChangeLog deleted file mode 100644 index 3532eb6dcd1..00000000000 --- a/buildtools/windows/source/make/ChangeLog +++ /dev/null @@ -1,3263 +0,0 @@ -Fri May 19 16:36:32 1995 Roland McGrath - - * Version 3.74 released. - -Wed May 10 17:43:34 1995 Roland McGrath - - * Version 3.73.3. - -Tue May 9 17:15:23 1995 Roland McGrath - - * compatMakefile ($(infodir)/make.info): Make sure $$dir is set in - install-info cmd. - -Wed May 3 15:56:06 1995 Roland McGrath - - * file.c (print_file): Grok update_status of 1 for -q. - -Thu Apr 27 12:39:35 1995 Roland McGrath - - * Version 3.73.2. - -Wed Apr 26 17:15:57 1995 Roland McGrath - - * file.c (remove_intermediates): Fix inverted test to bail under - -n for signal case. Bail under -q or -t. - Skip files with update_status==-1. - - * job.c (job_next_command): Skip empty lines. - (new_job): Don't test the return of job_next_command. - Just let start_waiting_job handle the case of empty commands. - -Wed Apr 19 03:25:54 1995 Roland McGrath - - * function.c [__MSDOS__]: Include . From DJ Delorie. - - * Version 3.73.1. - -Sat Apr 8 14:53:24 1995 Roland McGrath - - * remake.c (notice_finished_file): Set FILE->update_status to zero - if it's -1. - -Wed Apr 5 00:20:24 1995 Roland McGrath - - * Version 3.73 released. - -Tue Mar 28 13:25:46 1995 Roland McGrath - - * main.c (main): Fixed braino in assert. - - * Version 3.72.13. - -Mon Mar 27 05:29:12 1995 Roland McGrath - - * main.c: Avoid string in assert expression. Some systems are broken. - -Fri Mar 24 00:32:32 1995 Roland McGrath - - * main.c (main): Handle 1 and 2 returns from update_goal_chain - makefile run properly. - - * Version 3.72.12. - - * main.c (handle_non_switch_argument): New function, broken out of - decode_switches. - (decode_switches): Set optind to 0 to reinitialize getopt, not to 1. - When getopt_long returns EOF, break the loop and handle remaining args - with a simple second loop. - - * remake.c (remake_file): Set update_status to 2 instead of 1 for - no rule to make. Mention parent (dependent) in error message. - (update_file_1): Handle FILE->update_status == 2 in -d printout. - * job.c (start_job_command, reap_children): Set update_status to 2 - instead of 1 for failed commands. - -Tue Mar 21 16:23:38 1995 Roland McGrath - - * job.c (search_path): Function removed (was already #if 0'd out). - * configure.in: Remove AC_TYPE_GETGROUPS; nothing needs it any more. - -Fri Mar 17 15:57:40 1995 Roland McGrath - - * configure.bat: Write @CPPFLAGS@ translation. - -Mon Mar 13 00:45:59 1995 Roland McGrath - - * read.c (parse_file_seq): Rearranged `l(a b)' -> `l(a) l(b)' loop - to not skip the elt immediately preceding `l(...'. - -Fri Mar 10 13:56:49 1995 Roland McGrath - - * Version 3.72.11. - - * read.c (find_char_unquote): Make second arg a string of stop - chars instead of a single stop char. Stop when any char in the - string is hit. All callers changed. - (find_semicolon): Pass stop chars "#;" to one find_char_unquote call, - instead of using two calls. If the match is not a ; but a #, - return zero. - * misc.c: Changed find_char_unquote callers here too. - - * Version 3.72.10. - - * read.c (read_makefile, parse_file_seq): Fix typo __MS_DOS__ -> - __MSDOS__. - - * GNUmakefile (globfiles): Add glob/configure.bat. - (distfiles): Add configh.dos, configure.bat. - -Wed Mar 8 13:10:57 1995 Roland McGrath - - Fixes for MS-DOS from DJ Delorie. - * read.c (read_makefile, parse_file_seq) [__MS_DOS__]: Don't see : - as separator in "C:\...". - * configh.dos (STDC_HEADERS): Define only if undefined. - (HAVE_SYS_PARAM_H): Don't define this. - (HAVE_STRERROR): Define this. - * job.c (construct_command_argv_internal) [__MSDOS__]: Fix typos. - - * Version 3.72.9. - - * main.c (decode_switches): Reset optind to 1 instead of 0. - -Tue Mar 7 17:31:06 1995 Roland McGrath - - * main.c (decode_switches): If non-option arg is "-", ignore it. - -Mon Mar 6 23:57:38 1995 Roland McGrath - - * Version 3.72.8. - -Wed Feb 22 21:26:36 1995 Roland McGrath - - * Version 3.72.7. - -Tue Feb 21 22:10:43 1995 Roland McGrath - - * main.c (main): Pass missing arg to tmpnam. - - * configure.in: Check for strsignal. - * job.c (child_error): Use strsignal. - * main.c (main): Don't call signame_init #ifdef HAVE_STRSIGNAL. - - * misc.c (strerror): Fix swapped args in sprintf. - -Mon Feb 13 11:50:08 1995 Roland McGrath - - * configure.in (CFLAGS, LDFLAGS): Don't set these variables. - -Fri Feb 10 18:44:12 1995 Roland McGrath - - * main.c (print_version): Add 95 to copyright years. - - * Version 3.72.6. - - * job.c (start_job_command): Remember to call notice_finished_file - under -n when not recursing. To do this, consolidate that code - under the empty command case and goto there for the -n case. - -Tue Feb 7 13:36:03 1995 Roland McGrath - - * make.h [! STDC_HEADERS]: Don't declare qsort. Sun headers - declare it int. - -Mon Feb 6 17:37:01 1995 Roland McGrath - - * read.c (read_makefile): For bogus line starting with tab, ignore - it if blank after removing comments. - - * main.c: Cast results of `alloca' to `char *'. - * expand.c: Likewise. - -Sun Feb 5 18:35:46 1995 Roland McGrath - - * Version 3.72.5. - - * configure.in: Check for mktemp. - * main.c (main) [! HAVE_MKTEMP]: Use tmpnam instead of mktemp. - - * configure.in (make_cv_sysconf_open_max): New check for `sysconf - (_SC_OPEN_MAX)'. - * acconfig.h: Added #undef HAVE_SYSCONF_OPEN_MAX. - * job.c [HAVE_SYSCONF_OPEN_MAX] (getdtablesize): Define as macro - using sysconf. - -Fri Jan 27 04:42:09 1995 Roland McGrath - - * remake.c (update_file_1): When !MUST_MAKE, don't set - FILE->update_status to zero before calling notice_finished_file. - (notice_finished_file): Touch only when FILE->update_status is zero. - (remake_file): Set FILE->update_status to zero after not calling - execute_file_command and deciding to touch instead. - -Thu Jan 26 01:29:32 1995 Roland McGrath - - * main.c (debug_signal_handler): New function; toggles debug_flag. - (main): Handle SIGUSR1 with that. - -Mon Jan 16 15:46:56 1995 Roland McGrath - - * compatMakefile (realclean): Remove Info files. - -Sun Jan 15 08:23:09 1995 Roland McGrath - - * Version 3.72.4. - - * job.c (start_job_command): Save and restore environ around vfork - call. - (search_path): Function #if 0'd out. - (exec_command): Use execvp instead of search_path. - - * expand.c (variable_expand): Rewrote computed variable name and - substitution reference handling to be simpler. First expand the - entire text between the parens if it contains any $s, then examine - the result of that for subtitution references and do no further - expansion while parsing them. - - * job.c (construct_command_argv_internal): Handle " quoting too, - when no backslash, $ or ` characters appear inside the quotes. - - * configure.in (union wait check): If WEXITSTATUS and WTERMSIG are - defined, just use int. - -Tue Jan 10 06:27:27 1995 Roland McGrath - - * default.c (default_variables) [__hpux]: Remove special - definition of ARFLAGS. Existence of the `f' flag is not - consistent across HPUX versions; and one might be using GNU ar - anyway. - - * compatMakefile (clean): Don't remove Info files. - - * compatMakefile (check): Remove gratuitous target declaration. - -Sat Jan 7 11:38:23 1995 Roland McGrath - - * compatMakefile (ETAGS, CTAGS): Don't use -t. - - * arscan.c (ar_name_equal) [cray]: Subtract 1 like [__hpux]. - - * main.c (decode_switches): For --help, print usage to stdout. - -Mon Dec 5 12:42:18 1994 Roland McGrath - - * Version 3.72.3. - - * remake.c (update_file_1): Do set_command_state (FILE, - cs_not_started) only if old state was deps_running. - -Mon Nov 28 14:24:03 1994 Roland McGrath - - * job.c (start_waiting_job): Use set_command_state. - - * build.template (CPPFLAGS): New variable. - (prefix, exec_prefix): Set from @...@. - (compilation loop): Pass $CPPFLAGS to compiler. - - * GNUmakefile (build.sh.in): Make it executable. - - * GNUmakefile (globfiles): Add configure.in, configure. - - * Version 3.72.2. - - * configure.in (AC_OUTPUT): Don't write glob/Makefile. - - * configure.in (AC_CHECK_SYMBOL): Use AC_DEFINE_UNQUOTED. - - * configure.in: Don't check for ranlib. - -Tue Nov 22 22:42:40 1994 Roland McGrath - - * remake.c (notice_finished_file): Only mark also_make's as - updated if really ran cmds. - -Tue Nov 15 06:32:46 1994 Roland McGrath - - * configure.in: Put dnls before random whitespace. - -Sun Nov 13 05:02:25 1994 Roland McGrath - - * compatMakefile (CPPFLAGS): New variable, set from @CPPFLAGS@. - (RANLIB): Variable removed. - (prefix, exec_prefix): Set these from @...@. - (.c.o): Use $(CPPFLAGS). - (glob/libglob.a): Don't pass down variables to sub-make. - glob/Makefile should be configured properly by configure. - (distclean): Remove config.log and config.cache (autoconf stuff). - -Mon Nov 7 13:58:06 1994 Roland McGrath - - * acconfig.h: Add #undef HAVE_UNION_WAIT. - * configure.in: Converted to Autoconf v2. - * dir.c: Test HAVE_DIRENT_H, HAVE_SYS_DIR_H, HAVE_NDIR_H instead - of DIRENT, SYSDIR, NDIR. - * build.sh.in (prefix, exec_prefix): Set these from @...@. - (CPPFLAGS): New variable, set from @CPPFLAGS@. - (compiling loop): Pass $CPPFLAGS before $CFLAGS. - * install.sh: File renamed to install-sh. - - * main.c (define_makeflags): When no flags, set WORDS to zero. - -Sun Nov 6 18:34:01 1994 Roland McGrath - - * Version 3.72.1. - - * main.c (define_makeflags): Terminate properly when FLAGSTRING is - empty. - -Fri Nov 4 16:02:51 1994 Roland McGrath - - * Version 3.72. - -Tue Nov 1 01:18:10 1994 Roland McGrath - - * Version 3.71.5. - - * job.c (start_job_command): When ARGV is nil, only set - update_state and call notice_finished_file if job_next_command - returns zero. - - * job.c (start_job_command): Call notice_finished_file for empty - command line. - -Thu Oct 27 02:02:45 1994 Roland McGrath - - * file.c (snap_deps): Set COMMANDS_SILENT for .SILENT, not - COMMANDS_NOERROR. - -Wed Oct 26 02:14:10 1994 Roland McGrath - - * Version 3.71.4. - -Tue Oct 25 22:49:24 1994 Roland McGrath - - * file.c (snap_deps): Set command_flags bits in all :: entries. - -Mon Oct 24 18:47:50 1994 Roland McGrath - - * make.h (posix_pedantic): Declare it. - * main.c (main): Move checks .IGNORE, .SILENT, .POSIX to - snap_deps. - * file.c (snap_deps): Check .IGNORE, .SILENT, .POSIX here instead - of in main. If .IGNORE has deps, OR COMMANDS_NOERROR into their - command_flags and don't set -i. Likewise .SILENT. - * job.c (start_job_command): In FLAGS initialization, OR in - CHILD->file->command_flags. - * file.h (struct file): New member `command_flags'. - -Sun Oct 16 01:01:51 1994 Roland McGrath - - * main.c (switches): Bump flag values for --no-print-directory and - --warn-undefined-variables, so neither is 1 (which indicates a - nonoption argument). - -Sat Oct 15 23:39:48 1994 Roland McGrath - - * main.c (main): Add missing code in .IGNORE test. - -Mon Oct 10 04:09:03 1994 Roland McGrath - - * variable.c (define_automatic_variables): Define +D and +F. - -Sat Oct 1 04:07:48 1994 Roland McGrath - - * main.c (main): Define hidden automatic variable with command - vars, and MAKEOVERRIDES to a reference to that. - (define_makeflags): If posix_pedantic, write a reference to that - instead. - -Thu Sep 29 00:14:26 1994 Roland McGrath - - * main.c (posix_pedantic): New variable. - (main): Set posix_pedantic if .POSIX is a target. - Fix .IGNORE and .SILENT checks to require is_target. - - * commands.c (set_file_variables): Define new automatic variable - $+, like $^ but before calling uniquize_deps. - - * job.c (reap_children): Call delete_child_targets for non-signal - error if .DELETE_ON_ERROR is a target. - -Tue Sep 27 01:57:14 1994 Roland McGrath - - * Version 3.71.3. - -Mon Sep 26 18:16:55 1994 Roland McGrath - - * job.c (reap_children): Don't change C->file->command_state when - dying. Test it only after calling start_job_command for a new - command line. When no more cmds, just set C->file->update_status. - (start_job_command): When the last line is empty or under -n, set - C->file->update_status. - (start_waiting_job): Grok cs_not_started after start_job_command - as success. - (new_job): Set C->file->update_status when there are no cmds. - (job_next_command): When out of lines, don't set - CHILD->file->update_status or CHILD->file->command_state. - - * main.c (quote_as_word): Renamed from shell_quote. Take new arg; - if nonzero, also double $s. - (main): Define MAKEOVERRIDES from command_variables here. - (define_makeflags): Don't use command_variables here; instead write a - reference $(MAKEOVERRIDES) in MAKEFLAGS. Make vars recursive. - - * dir.c [__MSDOS__]: Fixed typo. - - * vpath.c (selective_vpath_search): Reset EXISTS when stat fails. - -Sat Sep 10 03:01:35 1994 Roland McGrath - - * remake.c: Include and use assert instead of printfs - and abort. - - * main.c (decode_switches): Loop until optind hits ARGC, not just - until getopt_long returns EOF. Initialize C to zero before loop; - in loop if C is EOF, set optarg from ARGV[optind++], else call - getopt_long. - (decode_env_switches): Use variable_expand instead of - allocated_variable_expand. Allocate a fresh buffer to copy split - words into; scan characters by hand to break words and - debackslashify. - (shell_quote): New function. - (define_makeflags): Allocate doubled space for switch args, and command - variable names and values; use shell_quote to quote those things. - -Fri Sep 9 01:37:47 1994 Roland McGrath - - * Version 3.71.2. - - * acconfig.h: Add HAVE_SYS_SIGLIST and HAVE__SYS_SIGLIST. - - * main.c (decode_switches): The non-option return from getopt is - 1, not 0. - (command_variables): New type and variable. - (decode_switches, decode_env_switches): After making a variable - definition, record the struct variable pointer in the - command_variables chain. - (define_makeflags): If ALL, write variable definitions for - command_variables. - - * main.c (other_args): Variable removed. - (goals, lastgoal): New static variables (moved from auto in main). - (main): Don't process OTHER_ARGS at all. - Don't set variable MAKEOVERRIDES at all; define MAKE to just - $(MAKE_COMMAND). - (init_switches): Prepend a - {return in order} instead of a + - {require order}. - (decode_switches): Don't set OTHER_ARGS at all. - Grok '\0' return from getopt_long as non-option argument; try - variable definition and (if !ENV) enter goal targets here. - (decode_env_switches): Use allocated_variable_expand to store value. - Use find_next_token to simplify word-splitting loop. Don't - prepend a dash to uninterpreted value. Instead, if split into - only one word, try variable definition and failing that prepend a - dash to the word and pass it to decode_switches as a single arg. - -Wed Sep 7 03:02:46 1994 Roland McGrath - - * remake.c (notice_finished_file): Only recheck modtimes if - FILE->command_state was cs_running on entry (meaning the commands - actually just ran). - (update_file_1): Whenever we set FILE->update_status, call - notice_finished_file instead of just set_command_state. - * job.c (start_job_command): Whenever we set - CHILD->file->update_status, call notice_finished_file instead of - just set_command_state. - -Tue Sep 6 19:13:54 1994 Roland McGrath - - * default.c: Add missing ". - - * job.c: Changed all assignments of command_state members to calls - to set_command_state. - * remake.c: Likewise. - * file.c (set_command_state): New function. - * file.h: Declare set_command_state. - - * main.c (init_switches): Put a + first in options. - -Mon Jul 25 18:07:46 1994 Roland McGrath - - Merge MSDOS/GO32 port from DJ Delorie . - * vpath.c: Changed all uses of ':' to PATH_SEPARATOR_CHAR. - * main.c (directory_before_chdir): New variable, moved out of main - (was local). - (main) [__MSDOS__]: Look for \ or : to delimit last component of - PROGRAM. Don't frob ARGV[0] before setting MAKE_COMMAND variable. - (die): Change back to `directory_before_chdir' before dying. - * make.h (PATH_SEPARATOR_CHAR): New macro; differing defns for - [__MSDOS__] and not. - * job.c [__MSDOS__]: Include . - [__MSDOS__] (dos_pid, dos_status, dos_bname, dos_bename, - dos_batch_file): New variables. - (reap_children) [__MSDOS__]: Don't call wait; just examine those vars. - (unblock_sigs) [__MSDOS__]: Do nothing. - (start_job_command) [__MSDOS__]: Use spawnvpe instead of vfork & exec. - (load_too_high) [__MSDOS__]: Always return true. - (search_path) [__MSDOS__]: Check for : or / in FILE to punt. - Use PATH_SEPARATOR_CHAR instead of ':'. - (construct_command_argv_internal) [__MSDOS__]: Wholly different - values for sh_chars and sh_cmds. Wholly new code to handle shell - scripts. - * function.c (expand_function: `shell') [__MSDOS__]: Wholly new - implementation. - * dir.c [__MSDOS__] (dosify): New function. - (dir_contents_file_exists_p) [__MSDOS__]: Call it on FILENAME and - process the result instead of FILENAME itself. - (file_impossible_p) [__MSDOS__]: Likewise. - * default.c [__MSDOS__]: Define GCC_IS_NATIVE. - (default_suffix_rules) [__MSDOS__]: Use `y_tab.c' instead of `y.tab.c'. - (default_variables) [GCC_IS_NATIVE]: Set CC and CXX to `gcc', YACC to - `bison -y', and LEX to `flex'. - * configure.bat, configh.dos: New files. - * commands.c (fatal_error_signal) [__MSDOS__]: Just remove - intermediates and exit. - - * commands.c (set_file_variables): Add parens in length - computation in .SUFFIXES dep loop to quiet compiler warning. From - Jim Meyering. - - * read.c (read_makefile): Free FILENAME if we allocated it. From - Jim Meyering. - -Mon Jul 4 17:47:08 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * misc.c (safe_stat): New function, EINTR-safe wrapper around stat. - * vpath.c (selective_vpath_search): Use safe_stat in place of stat. - * read.c (construct_include_path): Use safe_stat in place of stat. - * job.c (search_path): Use safe_stat in place of stat. - * dir.c (find_directory): Use safe_stat in place of stat. - * commands.c (delete_target): Use safe_stat in place of stat. - * arscan.c (ar_member_touch) [EINTR]: Do EINTR looping around fstat. - * remake.c (name_mtime): Use safe_stat in place of stat. - (touch_file) [EINTR]: Do EINTR looping around fstat. - -Fri Jun 24 05:40:24 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Check for a shell command first, and - then strip leading tabs before further checking if it's not a - shell command line. - - * make.h [__arm]: Undefine POSIX. - [!__GNU_LIBRARY__ && !POSIX && !_POSIX_VERSION]: Don't declare system - functions that return int. - - * job.c (construct_command_argv_internal): After swallowing a - backslash-newline combination, if INSTRING is set goto string_char - (new label) for normal INSTRING handling code. - -Sat Jun 4 01:11:20 1994 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * configure.in: Don't check for sys_siglist and _sys_siglist with - AC_HAVE_FUNCS. Instead use two AC_COMPILE_CHECKs. - -Mon May 23 18:20:38 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.71.1 released. - - * make.h [!__GNU_LIBRARY__ && !POSIX]: Also test #ifndef - _POSIX_VERSION for these declarations. - - * misc.c [GETLOADAVG_PRIVILEGED] [POSIX]: Remove bogus #ifndefs - around #undefs of HAVE_SETREUID and HAVE_SETREGID. - -Sat May 21 16:26:38 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.71 released. - - * misc.c [GETLOADAVG_PRIVILEGED] [POSIX]: Don't test [HAVE_SETUID] - and [HAVE_SETGID]. Every system has those, and configure doesn't - check for them. - - * make.h [_POSIX_VERSION]: Don't #define POSIX #ifdef ultrix. - - * compatMakefile (loadavg): Depend on and use loadavg.c instead of - getloadavg.c. - (loadavg.c): Link or copy it from getloadavg.c. - (distclean): Remove loadavg.c. - -Mon May 16 22:59:04 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.70.4. - - * misc.c [GETLOADAVG_PRIVILEGED] [! POSIX]: Undefine HAVE_SETEUID - and HAVE_SETEGID. - - * default.c (default_terminal_rules): In SCCS rules, put - $(SCCS_OUTPUT_OPTION) before $<. On some systems -G is grokked - only before the file name. - * configure.in (SCCS_GET_MINUS_G check): Put -G flag before file name. - -Tue May 10 16:27:38 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Swallow - backslash-newline combinations inside '' strings too. - -Thu May 5 04:15:10 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (do_define): Call collapse_continuations on each line - before all else. - -Mon Apr 25 19:32:02 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Notice newline inside - '' string when RESTP is non-null. - -Fri Apr 22 17:33:30 1994 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.70.3. - - * remake.c (update_goal_chain): Reset FILE to G->file after the - double-colon loop so it is never null for following code. - - * read.c (read_makefile): Fix `override define' parsing to skip - whitespace after `define' properly. - - * compatMakefile (srcdir): Define as @srcdir@; don't reference - $(VPATH). - (glob/Makefile): New target. - -Thu Apr 21 16:16:55 1994 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.70.2. - - * misc.c (remove_comments): Use find_char_unquote. - * make.h (find_char_unquote): Declare it. - * read.c (find_char_unquote): New function, generalized from - find_percent. - (find_percent, find_semicolon, parse_file_seq): Use that. - -Wed Apr 20 18:42:39 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * implicit.c (pattern_search): Always allocate new storage for - FILE->stem. It is not safe to store STEM's address because it - might be auto storage. - - * configure.in: Check for seteuid and setegid. - * misc.c [HAVE_SETEUID]: Declare seteuid. - [HAVE_SETEGID]: Declare setegid. - (make_access, user_access) [HAVE_SETEUID]: Use seteuid. - [HAVE_SETEGID]: Use setegid. - - * remake.c (update_goal_chain): Set STATUS to FILE->update_status, - to preserve whether it's 2 for error or 1 for -q trigger. When - STATUS gets nonzero and -q is set, always stop immediately. - * main.c (main, decode_switches): Die with 2 for errors. - (main): Accept 2 return from update_goal_chain and die with that. - * misc.c (fatal, makefile_fatal): Die with 2; 1 is reserved for -q - answer. - * job.c (reap_children): Die with 2 for error. - (start_job_command): Set update_status to 2 for error. Set it to - 1 when we would run a command and question_flag is set. - - * read.c (read_makefile): Don't mark makefiles as precious. Just - like other targets, they can be left inconsistent and in need of - remaking by aborted commands. - - * read.c (read_makefile): Write no error msg for -include file. - -Tue Apr 5 05:22:19 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * commands.c (fatal_error_signal): Don't unblock signals. - - * file.h (struct file): Change member `double_colon' from flag to - `struct file *'. - * read.c (record_files): Set double_colon pointer instead of flag. - * main.c (main): When disqualifying makefiles for updating, use - double_colon pointer to find all entries for a file. - * file.c (enter_file): If there is already a double-colon entry - for the file, set NEW->double_colon to that pointer. - (file_hash_enter): Use FILE->double_colon to find all entries to - set name. - * remake.c (update_goal_chain): Do inner loop on double-colon entries. - (update_file): Use FILE->double_colon pointer to find all entries. - (f_mtime): Likewise. - (notice_finished_file): Propagate mtime change to all entries. - - * variable.c (try_variable_definition): Return after abort. - -Fri Apr 1 18:44:15 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Remove unused variable. - (parse_file_seq): When removing an elt that is just `)', properly - fix up the previous elt's next pointer. - -Mon Mar 28 18:31:49 1994 Roland McGrath (roland@mole.gnu.ai.mit.edu) - - * configure.in: Do AC_SET_MAKE. - * GNUmakefile (Makefile.in): Edit MAKE assignment into @SET_MAKE@. - -Fri Mar 4 00:02:32 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * function.c (subst_expand): If BY_WORD or SUFFIX_ONLY is set and - the search string is the empty string, find a match at the end of - each word (using end_of_token in place of sindex). - - * misc.c (end_of_token): Don't treat backslashes specially; you - can no longer escape blanks with backslashes in export, unexport, - and vpath. This was never documented anyway. - -Thu Mar 3 23:53:46 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Variable name for `define' is not just - first token; use whole rest of line and strip trailing blanks. - -Wed Feb 16 16:03:45 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.70.1. - - * read.c (read_makefile): Add -d msg stating args. - - * read.c (read_makefile): Use isspace to skip over leading - whitespace, and explicitly avoid skipping over tabs. Don't want - to skip just spaces though; formfeeds et al should be skipped. - - * default.c (default_variables) [__hpux]: Add f in ARFLAGS. - - * arscan.c (ar_name_equal) [__hpux]: Subtract 2 instead of 1 from - sizeof ar_name for max length to compare. - - * misc.c [GETLOADAVG_PRIVILEGED] [POSIX]: Undefine HAVE_SETREUID - #ifdef HAVE_SETUID; likewise HAVE_SETREGID and HAVE_SETGID. - - * main.c (main): Call user_access after setting `program', in case - it needs to use it in an error message. - - * read.c (read_makefile): Ignore an empty line starting with a tab. - -Thu Feb 10 21:45:31 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in (AC_SYS_SIGLIST_DECLARED): Use this instead of - AC_COMPILE_CHECK that is now its contents. - -Fri Feb 4 16:28:54 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h: #undef strerror after #include . - [! ANSI_STRING]: Declare strerror. - -Thu Feb 3 02:21:22 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * misc.c (strerror): #undef any macro before function definition. - -Mon Jan 31 19:07:23 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (try_variable_definition): Calculate BEG before loop - to strip blanks by decrementing END. Don't decr END to before BEG. - - * read.c (read_makefile): Skip over leading space characters, but - not tabs, after removing continuations and comments (it used to - use isspace). - -Tue Jan 25 16:45:05 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (define_automatic_variables): In $(@D) et al, use - patsubst to remove trailing slash. - - * commands.c (delete_target): New function, broken out of - delete_child_targets. Check for archive members and give special msg. - (delete_child_targets): Use delete_target. - -Mon Jan 17 17:03:22 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (default_suffix_rules): Use $(TEXI2DVI_FLAGS) in - texi2dvi rules. Use $(MAKEINFO_FLAGS) in makeinfo rules. - -Tue Jan 11 19:29:55 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * GNUmakefile (tarfiles): Omit make-doc. - (make-$(version).tar): Include make.info*. - -Fri Jan 7 16:27:00 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (configure, config.h.in): Comment out rules. - -Thu Jan 6 18:08:08 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (binprefix, manprefix): New variables. - (instname): Variable removed. - (install): Use $({bin,man}prefix)make in place of $(instname). - File targets likewised renamed. - -Mon Jan 3 17:50:25 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.70 released. - -Thu Dec 23 14:46:54 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.69.3. - - * read.c (parse_file_seq): Inside multi-word archive ref - translation loop, check NEW1==0 at end and break out of the loop. - - * GNUmakefile (make-$(version).tar): Distribute install.sh. - * install.sh: New file. - - * configure.in (SCCS_GET_MINUS_G check): Put redirection for admin - cmds outside subshell parens, to avoid "command not found" msgs - from the shell. - -Wed Dec 22 17:00:43 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in (SCCS_GET_MINUS_G check): Put -G flag last in get cmd. - Redirect output & error from get to /dev/null. - Fix reversed sense of test. - -Fri Dec 17 15:31:36 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in (SCCS_GET_MINUS_G check): Use parens instead of - braces inside if condition command; some shells lose. - -Thu Dec 16 15:10:23 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.69.2. - - * arscan.c [M_UNIX]: Move #undef M_XENIX for PORTAR stuff. - (PORTAR) [M_XENIX]: Define to 0 instead of 1. - - * main.c (define_makeflags): Only export MAKEFLAGS if !ALL. - -Wed Dec 15 17:47:48 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (main): Cast result of pointer arith to unsigned int - before passing to define_variable for envars. Matters when - sizeof(unsigned)!=sizeof(ptrdiff_t). - -Tue Dec 14 14:21:16 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in: Add new check for SCCS_GET_MINUS_G. - * config.h.in: Add #undef SCCS_GET_MINUS_G. - * default.c (default_terminal_rules): Use `$(SCCS_OUTPUT_OPTION)' in - place of `-G $@' in SCCS commands. - (default_variables) [SCCS_GET_MINUS_G]: Define SCCS_OUTPUT_OPTION - to "-G$@". - - * configure.in (AC_OUTPUT): Put touch stamp-config in second arg - (so it goes in config.status), rather than afterward. - - * ar.c (ar_member_date): Don't call enter_file on the archive file - if it doesn't exist (by file_exists_p). - - * compatMakefile ($(infodir)/make.info): Replace `$$d/foo.info' - with `$$dir/make.info' in install-info invocation (oops). - - * vpath.c (construct_vpath_list): Only set LASTPATH set PATH when - we do not unlink and free PATH. - - * file.c (print_file_data_base): Fix inverted calculation for - average files per hash bucket. - - * read.c (readline): When we see a NUL, give only a warning and - synthesize a newline to terminate the building line (used to - fatal). Move fgets call into the loop condition, and after the - loop test ferror (used to test !feof in the loop). - -Fri Dec 3 16:40:31 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in: Check for strerror in AC_HAVE_FUNCS. - -Thu Dec 2 15:37:50 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - Differentiate different flavors of missing makefile error msgs, - removing gratuitous `fopen: ' and giving caller for included makefiles. - * misc.c [! HAVE_STRERROR]: Define our own strerror here. - (perror_with_name, pfatal_with_name): Use strerror instead of - replicating its functionality. - * read.c (read_makefile): Return int instead of void. - (read_all_makefiles, read_makefile): Change callers to notice zero - return and give error msg. - -Thu Nov 11 11:47:36 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.69.1. - - * default.c: Put `-G $@' before $< in SCCS cmds. - -Wed Nov 10 06:06:14 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): After trying a variable defn, notice if - the line begins with a tab, and diagnose an error. - -Sun Nov 7 08:07:37 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.69. - -Wed Nov 3 06:54:33 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.10. - - * implicit.c (try_implicit_rule): Look for a normal rule before an - archive rule. - -Fri Oct 29 16:45:28 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * function.c (expand_function: `sort'): Double NWORDS when it - overflows, instead of adding five. - - * compatMakefile (clean): Remove loadavg. - -Wed Oct 27 17:58:33 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.9. - - * file.h (NEW_MTIME): Define new macro. - * main.c (main): Set time of NEW_FILES to NEW_MTIME, not to - current time returned from system. Removed variable NOW. - * remake.c (notice_finished_file): Use NEW_MTIME in place of - current time here too. - -Tue Oct 26 19:45:35 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.8. - - * remake.c (update_file_1): Don't clear MUST_MAKE when FILE has no - cmds and !DEPS_CHANGED unless also !NOEXIST. - -Mon Oct 25 15:25:21 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (parse_file_seq): When converting multi-word archive - refs, ignore a word beginning with a '('. - -Fri Oct 22 02:53:38 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in: Check for sys/timeb.h. - * make.h [HAVE_SYS_TIMEB_H]: Test this before including it. - -Thu Oct 21 16:48:17 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.7. - - * rule.c (convert_suffix_rule): New local TARGPERCENT. Set it to - TARGNAME+1 for "(%.o)", to TARGNAME for "%.?". Use it in place of - TARGNAME to initialize PERCENTS[0]. - -Mon Oct 18 06:49:35 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in: Use AC_HAVE_HEADERS(unistd.h) instead of AC_UNISTD_H. - Remove AC_USG; it is no longer used. - - * file.c (print_file): New function, broken out of - print_file_data_base. - (print_file_data_base): Call it. - * rule.c (print_rule): New function, broken out of - print_rule_data_base. - (print_rule_data_base): Call it. - -Thu Oct 14 14:54:03 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (install_default_suffix_rules): New function, broken - out of install_default_implicit_rules. - (install_default_implicit_rules): Move suffix rule code there. - * make.h: Declare install_default_suffix_rules. - * main.c (main): Call install_default_suffix_rules before reading - makefiles. Move convert_to_pattern call before - install_default_implicit_rules. - - * job.h (struct child): Make `pid' member type `pid_t' instead of - `int'. - - * compatMakefile (RANLIB): New variable, set by configure. - (glob/libglob.a): Pass RANLIB value down to submake. - - Fixes for SCO 3.2 "devsys 4.2" from pss@tfn.com (Peter Salvitti). - * make.h: Include before for SCO lossage. - * job.c [! getdtablesize] [! HAVE_GETDTABLESIZE]: If NOFILE is not - defined but NOFILES_MAX is, define it to be that. - -Mon Oct 11 19:47:33 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * GNUmakefile (make-$(version).tar): Depend on acconfig.h, so it - is distributed. - -Sun Oct 3 15:15:33 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (default_terminal_rules): Add `-G $@' to SCCS get cmds. - -Tue Sep 28 14:18:20 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Add ^ to SH_CHARS; it - is another symbol for | in some shells. - * main.c (main): Add it to CMD_DEFS quoting list as well. - -Mon Sep 20 18:05:24 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Remove '=' from - SH_CHARS. Only punt on '=' if it is unquoted in a word before the - first word without an unquoted '='. - - * main.c (define_makeflags): Set v_export for MAKEFLAGS. - -Fri Sep 17 00:37:18 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (update_file_1): Use .DEFAULT cmds for phony targets. - - * make.h [_AIX && _POSIX_SOURCE]: Define POSIX. - - * commands.c (delete_child_targets): Don't delete phony files. - - * job.c (start_job_command): Set COMMANDS_RECURSE in FLAGS if we - see a `+' at the beginning of the command line. - -Thu Sep 9 17:57:14 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.6. - -Wed Sep 8 20:14:21 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (define_makeflags): Define MAKEFLAGS with o_file, not o_env. - -Mon Aug 30 12:31:58 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * expand.c (variable_expand): Fatal on an unterminated reference. - -Thu Aug 19 16:27:53 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.5. - - * variable.c (define_automatic_variables): Define new o_default - variable `MAKE_VERSION' from version_string and remote_description. - - * make.h (version_string, remote_description): Declare these here. - * main.c: Don't declare version_string. - (print_version): Don't declare remote_description. - -Wed Aug 18 15:01:24 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Free space pointed to by CONDITIONALS - before restoring the old pointer. - -Mon Aug 16 17:33:36 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile ($(objs)): Depend on config.h. - - * GNUmakefile (build.sh.in): Depend on compatMakefile. - - * configure.in: Touch stamp-config after AC_OUTPUT. - -Fri Aug 13 16:04:22 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.4. - -Thu Aug 12 17:18:57 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h: Include instead of "config.h". - -Wed Aug 11 02:35:25 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (main): Make all variables interned from ENVP be v_export. - * variable.c (try_variable_definition): In v_default case, don't - check for an o_file variable that `getenv' finds. - - * job.c (reap_children): New local variable ANY_LOCAL; set it - while setting ANY_REMOTE. If !ANY_LOCAL, don't wait for local kids. - - * main.c (main): Don't call decode_env_switches on MFLAGS. DOC THIS. - - * function.c (expand_function): #if 0 out freeing of ENVP since it - is environ. - -Mon Aug 9 17:37:20 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.3. - - * remote-stub.c (remote_status): Set errno to ECHILD before return. - * job.c (reap_children): Scan the chain for remote children and - never call remote_status if there are none. - - * function.c (expand_function: `shell'): #if 0 out calling - target_environment; just set ENVP to environ instead. - - * job.c (reap_children): Check for negative return from - remote_status and fatal for it. - When blocking local child wait returns 0, then try a blocking call - to remote_status. - -Tue Aug 3 00:19:00 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (clean): Delete make.info* and make.dvi here. - (distclean): Not here. - - * dep.h (RM_*): Use #defines instead of enum to avoid lossage from - compilers that don't like enum values used as ints. - -Mon Aug 2 16:46:34 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (loadavg): Add $(LOADLIBES). - -Sun Aug 1 16:01:15 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.2. - - * compatMakefile (loadavg, check-loadavg): New targets. - (check): Depend on check-loadavg. - - * compatMakefile (glob/libglob.a): Depend on config.h. - - * misc.c (log_access): Write to stderr instead of stdout. - -Fri Jul 30 00:07:02 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.1. - -Thu Jul 29 23:26:40 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in (SYS_SIGLIST_DECLARED): In test program include - #ifdef HAVE_UNISTD_H. - - * compatMakefile (.PHONY): Put after `all' et al. - - * configure.in: Add AC_IRIX_SUN. - -Wed Jul 28 17:41:12 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68. - -Mon Jul 26 14:36:49 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.8. - -Sun Jul 25 22:09:08 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.7. - - * compatMakefile ($(infodir)/make.info): Don't use $(instname). - Run install-info script if present. - -Fri Jul 23 16:03:50 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h [STAT_MACROS_BROKEN]: Test this instead of [uts]. - - * configure.in: Add AC_STAT_MACROS_BROKEN. - -Wed Jul 14 18:48:11 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.6. - - * read.c (read_makefile): Recognize directive `-include', like - `include' but sets RM_DONTCARE flag. - - * variable.c (target_environment): If FILE is nil, use - current_variable_set_list in place of FILE->variables. - * function.c (expand_function: `shell'): Get an environment for - the child from target_environment instead of using environ. - - * dep.h: Declare read_all_makefiles here. - (RM_*): Define new enum constants. - * read.c (read_makefile): Second arg is FLAGS instead of TYPE. - Treat it as a bit mask containing RM_*. - (read_all_makefiles): For default makefiles, set D->changed to - RM_DONTCARE instead of 1. - * main.c: Don't declare read_all_makefiles here. - (main): Check `changed' member of read_makefiles elts for RM_* - flags instead of specific integer values. - -Mon Jul 12 22:42:17 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h [sequent && i386]: #undef POSIX. From trost@cse.ogi.edu. - -Thu Jul 8 19:51:23 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * vpath.c (construct_vpath_list): If ELEM is zero 0, free PATTERN - as well as VPATH. - (build_vpath_lists): Empty `vpaths' around construct_vpath_list - call for $(VPATH). Expand $(strip $(VPATH)), not just $(VPATH). - - * rule.c (convert_suffix_rule): Use alloca instead of xmalloc for - PERCENTS, whose storage is not consumed by create_pattern_rule. - - * make.h [__mips && _SYSTYPE_SVR3]: #undef POSIX. - -Wed Jun 30 18:11:40 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.5. - - * rule.c (max_pattern_targets): New variable. - (count_implicit_rule_limits): Compute its value. - * rule.h: Declare it. - * implicit.c (pattern_search): Make TRYRULES max_target_patterns - times bigger. Move adding new TRYRULES elt inside the inner - targets loop, so each matching target gets its own elt in MATCHES - and CHECKED_LASTSLASH. - - * file.c (remove_intermediates): If SIG!=0 say `intermediate file' - instead of just `file' in error msg. - -Fri Jun 25 14:55:15 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv): Turn off - --warn-undefined-variables around expansion of SHELL and IFS. - * read.c (tilde_expand): Likewise for HOME. - (read_all_makefiles): Likewise for MAKEFILES. - * vpath.c (build_vpath_lists): Likewise for VPATH. - - * main.c (warn_undefined_variables_flag): New flag variable. - (switches): Add --warn-undefined-variables. - * make.h (warn_undefined_variables_flag): Declare it. - * expand.c (warn_undefined): New function. - (reference_variable): Call it if the variable is undefined. - (variable_expand): In substitution ref, call warn_undefined if the - variable is undefined. - - * default.c (default_pattern_rules): Add `%.c: %.w %.ch' and - `%.tex: %.w %.ch' rules. - (default_suffix_rules: .w.c, .w.tex): Pass three args: $< - $@. - (default_suffixes): Add `.ch'. - -Mon Jun 21 17:55:39 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (default_suffixes): Replace `.cweb' with `.w'. - (default_suffix_rules): Rename `.cweb.c' and `.cweb.tex' to `.w.c' - and `.w.tex'. - -Fri Jun 11 14:42:09 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile ($(bindir)/$(instname)): Add missing backslash. - -Thu Jun 10 18:14:08 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.4. - - * read.c (multi_glob): Don't free OLD and OLD->name in the - FOUND!=0 fork. Use new block-local variable F instead of - clobbering OLD. - - * ar.c (glob_pattern_p): New function, snarfed from glob/glob.c. - (ar_glob): Call it; return nil immediately if MEMBER_PATTERN - contains no metacharacters. - -Wed Jun 9 16:25:35 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * ar.c (ar_glob{_match,_alphacompare}): New function. - - * dep.h [! NO_ARCHIVES]: Declare it. - * read.c (multi_glob) [! NO_ARCHIVES]: Use it on archive member elts. - - * read.c (read_makefile): Pass flag (1) to parse_file_seq, not to - multi_glob (which doesn't take a 3rd arg). - * rule.c (install_pattern_rule): Likewise. - * default.c (set_default_suffixes): Here too. - * function.c (string_glob): Don't pass gratuitous arg to multi_glob. - - * read.c (parse_file_seq) [! NO_ARCHIVES]: Add post-processing - loop to translate archive refs "lib(a b)" into "lib(a) lib(b)". - -Mon Jun 7 19:26:51 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (installdirs): Actually pass directory names. - ($(bindir)/$(instname)): Test chgrp&&chmod exit status with `if'; - if it fails, echo a warning msg, but don't make the rule fail. - - * read.c (tilde_expand): New function, broken out of tilde_expand. - (multi_glob): Call it. - (construct_include_path): Expand ~ in directory names. - * dep.h: Declare tilde_expand. - * main.c (enter_command_line_file): Expand ~ at the start of NAME. - (main): Expand ~ in -C args. - * read.c (read_makefile): Expand ~ in FILENAME unless TYPE==2. - -Fri Jun 4 13:34:47 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (decode_env_switches): Use xmalloc instead of alloca for ARGS. - - * main.c (main): Put result of alloca in temporary variable with - simple assignment, to make SGI compiler happy. - -Thu Jun 3 20:15:46 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.3. - - * main.c (main): Before re-execing, remove intermediate files, and - print the data base under -p. Sexier debugging message. - - * implicit.c (pattern_search): Allocate an extra copy of the name - of a winning intermediate file when putting it in FOUND_FILES. - -Wed Jun 2 16:38:08 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Pass flag (1) to parse_file_seq, not to - multi_glob (which doesn't take a 3rd arg). - - * dir.c (dir_contents_file_exists_p): When reading dirents, ignore - chars within D_NAMLEN that are NULs. - - * main.c (decode_switches): Don't savestring ARGV[0] to put it - into `other_args'. - For string switch, don't savestring `optarg'. - (main): Don't free elts of makefiles->list that are "-". - Use alloca'd rather than savestring'd storage for elts of - makefiles->list that are temporary file names. - * read.c (read_all_makefiles): Don't free *MAKEFILES. - * file.c (enter_file): Don't strip `./'s. - * main.c (enter_command_line_file): New function. - (main): Use it in place of enter_file for command-line goals from - other_files, and for old_files and new_files. - -Mon May 31 18:41:40 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.2. - - * compatMakefile (.SUFFIXES): Add .info. - ($(infodir)/$(instname).info): Find make.info* in cwd if there, - else in $srcdir. Use basename to remove dir name from installed name. - -Thu May 27 17:35:02 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * implicit.c (pattern_search): When interning FOUND_FILES, try - lookup_file first; if found, free the storage for our copy of the name. - -Wed May 26 14:31:20 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.1. - - * main.c (decode_switches): In usage msg, write `--switch=ARG' or - `--switch[=OPTARG]' rather than `--switch ARG' or `--switch [ARG]'. - -Mon May 24 16:17:31 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * rule.c (convert_suffix_rule): New function. - (convert_to_pattern): Use it instead of doing all the work here - several times. - For target suffix `.a', generate both the archive magic rule and - the normal rule. - - * compatMakefile (distclean): Remove stamp-config. - -Sat May 22 16:15:18 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67. - - * file.c (remove_intermediates): Don't write extra space after `rm'. - - * main.c (struct command_switch.type): Remove `usage_and_exit'. - (print_usage_flag): New variable. - (switches: --help): Make type `flag', to set print_usage_flag. - (init_switches): Remove `usage_and_exit' case. - (decode_switches): Likewise. - (decode_switches): Print usage if print_usage_flag is set. - When printing usage, die with status of BAD. - (main): Die with 0 if print_version_flag. - -Fri May 21 16:09:28 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.66. - -Wed May 19 21:30:44 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (installdirs): New target. - (install): Depend on it. - -Sun May 16 20:15:07 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.65.2. - -Fri May 14 16:40:09 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * vpath.c (construct_vpath_list): In removal loop for DIRPATH==0, - set LASTPATH to PATH, not NEXT. - - * dir.c (read_dirstream): Break out of loop after incrementing - DS->buckets such that it reaches DIRFILE_BUCKETS; avoid trying to - dereference DS->contents->files[DIRFILE_BUCKETS]. - - * read.c (read_makefile): Clear no_targets after reading a - targetful rule line. - - * main.c (main): If print_version_flag is set, exit after printing - the version. - (switches): Change --version docstring to say it exits. - - * make.h [butterfly]: #undef POSIX. - -Wed May 12 15:20:21 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.65.1. - - * arscan.c (ar_scan) [! AIAMAG]: Don't declare LONG_NAME. - [AIAMAG]: Pass TRUNCATE flag arg to (*FUNCTION), always zero. - - * function.c (handle_function): Use fatal instead of - makefile_fatal when reading_filename is nil. - - * configure.in: Add AC_GETGROUPS_T. - * job.c (search_path): Use GETGROUPS_T in place of gid_t. - -Sun May 9 15:41:25 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.65. - -Fri May 7 18:34:56 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * function.c (handle_function): Fatal for unmatched paren. - -Thu May 6 16:13:41 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.64.3. - - * commands.c (handling_fatal_signal): New variable. - (fatal_error_signal): Set it. - * job.c (reap_children): Avoid nonreentrant operations if that is set. - * make.h: Declare handling_fatal_signal. - - * expand.c (reference_variable): New function, snippet of code - broken out of simple-reference case of variable_expand. - (variable_expand): Use it for simple refs. - (variable_expand): When checking for a computed variable name, - notice a colon that comes before the final CLOSEPAREN. Expand - only up to the colon, and then replace the pending text with a - copy containing the expanded name and fall through to subst ref - handling. - (variable_expand): Don't bother expanding the name if a colon - appears before the first $. - (expand_argument): Use alloca instead of savestring. - (variable_expand): For subst ref, expand both sides of = before - passing to [pat]subst_expand. Use find_percent instead of lindex - to check the lhs for a %. - -Wed May 5 14:45:52 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.64.2. - -Mon May 3 17:00:32 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * arscan.c (ar_name_equal) [AIAMAG]: Abort if TRUNCATED is nonzero. - - * read.c (read_makefile): Pass extra arg of 1 to parse_file_seq, - not to multi_glob. - -Thu Apr 29 19:47:33 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.64.1. - - * arscan.c (ar_scan): New local flag var LONG_NAME. Set it when - we read the member name in any of the fashions that allow it to be - arbitrarily long. Pass its negation to FUNCTION. - (describe_member): Take TRUNCATED from ar_scan and print it. - (ar_name_equal): Take new arg TRUNCATED; if nonzero, compare only - the first sizeof (struct ar_hdr.ar_name) chars. - (ar_member_pos): Take TRUNCATED from ar_scan, pass to ar_name_equal. - * ar.c (ar_member_date_1): Likewise. - -Wed Apr 28 21:18:22 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (reap_children): Before calling start_job_command to start - the next command line, reset C->remote by calling start_remote_job_p. - -Mon Apr 26 15:56:15 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * arscan.c (ar_scan): New local var NAMEMAP. - In loop, rename NAME to NAMEBUF; new var NAME is a pointer; new - flag IS_NAMEMAP. When extracting the member name, always put a - null at its end first. If the name is "//" or "/ARFILENAMES", set - IS_NAMEMAP. If we have already read in NAMEMAP, and NAME looks - like " /N", get full name from NAMEMAP+N. - Else if NAME looks like "#1/N", read N chars from the - elt data to be the full name. At end of loop, if IS_NAMEMAP, read - the elt's data into alloca'd NAMEMAP. - (ar_name_equal): #if 0 truncating code. - - * make.h: Don't declare vfork at all. It returns int anyway, - unless declared it; and we conflicted with some systems. - - * main.c (define_makeflags): If FLAGSTRING[1] is '-', define - MAKEFLAGS to all of FLAGSTRING, not &FLAGSTRING[1]. Don't want to - define it to something like "-no-print-directory". - Use %g format instead of %f for floating-valued things. - -Thu Apr 22 18:40:58 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * GNUmakefile (Makefile.in): Use a substitution ref on nolib-deps - to change remote-%.dep to remote-stub.dep. - -Wed Apr 21 15:17:54 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.64. - -Fri Apr 16 14:22:22 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (install): Remove - prefix from chgrp+chmod. - - * Version 3.63.8. - -Thu Apr 15 18:24:07 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * acconfig.h: New file; contains "#undef SCCS_GET" for autoheader. - * configure.in: If /usr/sccs/get exists, define SCCS_GET to that, - else to "get". - * default.c (default_variables): Set GET to macro SCCS_GET. - - * read.c (parse_file_seq): Take extra arg STRIP; strip `./' only - if nonzero. I hope this is the last time this argument is added - or removed. - (read_makefile): Pass it 1 when parsing include file names. - Pass it 1 when parsing target file names. - Pass it 1 when parsing static pattern target pattern names. - * rule.c (install_pattern_rule): Pass it 1 when parsing rule deps. - * default.c (set_default_suffixes): Pass it 1 when parsing - default_suffixes. - * function.c (string_glob): Pass it 0 here. - -Wed Apr 14 11:32:05 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * misc.c (log_access): New function. - ({init,user,make,child}_access): Call it. - (child_access): Abort if !access_inited. - - * main.c (switches: --no-print-directory): Use 1 instead of -1 for - single-letter option. - (init_switches, decode_switches, define_makeflags): An option with - no single-letter version is no longer indicated by a value of -1; - instead a value that is !isalnum. - (init_switches): Don't put such switches into the string, only - into the long_option table. - - * make.h [!NSIG] [!_NSIG]: #define NSIG 32. - - * job.c [HAVE_WAITPID]: Remove #undef HAVE_UNION_WAIT. AIX's - bsdcc defined WIF* to use union wait. - - * main.c (struct command_switch): Change member `c' to type int. - (switches): Make const. - (decode_switches): Use `const struct command_switch *'. - (define_makeflags): Likewise. - - * default.c (default_suffix_rules): Add `-o $@' to makeinfo rules. - -Mon Apr 12 12:30:04 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.63.7. - - * configure.in (AC_HAVE_HEADERS): Check for string.h and memory.h. - Removed AC_MEMORY_H. - * make.h [USG, NeXT]: Don't test these. - [HAVE_STRING_H]: Test this to include string.h and define ANSI_STRING. - [HAVE_MEMORY_H]: Test this instead of NEED_MEMORY_H. - [! ANSI_STRING]: Put decls of bcopy et al here. - [sparc]: Don't test this for alloca.h; HAVE_ALLOCA_H is sufficient. - [HAVE_SIGSETMASK]: Test this rather than USG. - [__GNU_LIBRARY__ || POSIX]: Don't #include again. - * main.c (main): Handle SIGCHLD if defined, and SIGCLD if defined. - It doesn't hurt to do both if they are both defined, and testing - USG is useless. - * dir.c: Rationalize directory header conditionals. - * arscan.c [HAVE_FCNTL_H]: Test this rather than USG || POSIX. - - * default.c (default_suffixes): Add `.txinfo'. - (default_suffix_rules): Add `.txinfo.info' and `.txinfo.dvi' rules. - - * variable.c (try_variable_definition): Replace RECURSIVE flag - with enum FLAVOR, which can be simple, recursive, or append. - Recognize += as append flavor. Set new variable VALUE in a switch - on FLAVOR. For append flavor, prepend the variable's old value. - If the variable was previously defined recursive, set FLAVOR to - recursive; if it was defined simple, expand the new value before - appending it to the old value. Pass RECURSIVE flag to - define_variable iff FLAVOR == recursive. - - * variable.c (try_variable_definition): Use alloca and bcopy for - NAME, instead of savestring. Might as well use stack storage - since we free it immediately anyway. - -Thu Apr 8 18:04:43 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (start_waiting_jobs): Move decl of JOB outside of loop. - - * main.c (define_makeflags): Rename `struct flag' member `switch' - to `cs', which is not a reserved word. - -Wed Apr 7 15:30:51 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (new_job): Call start_waiting_jobs first thing. - (start_waiting_job): Changed return type from void to int. - Return 0 when putting the child on the waiting_jobs chain. - (start_waiting_jobs): Don't check load and job_slots here. - Always take a job off the chain and call start_waiting_job on it; - give up and return when start_waiting_job returns zero. - - * main.c (define_makeflags: struct flag): Change member `char c' to - `struct command_switch *switch'. - (ADD_FLAG): Set that to CS instead of CS->c. - If CS->c is -1, increment FLAGSLEN for the long name. - When writing out FLAGS, handle FLAGS->switch->c == -1 and write - the long name instead. - - * compatMakefile (stamp-config): New target of old config.h rule. - Touch stamp-config after running config.status. - (config.h): Just depend on stamp-config, and have empty commands. - -Mon Apr 5 20:14:02 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c [HAVE_WAITPID]: #undef HAVE_UNION_WAIT. - - * configure.in (AC_HAVE_FUNCS): Check for psignal. - -Fri Apr 2 17:15:46 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (long_option_aliases): Remove "new"; it is already an - unambiguous prefix of "new-file". - -Sun Mar 28 16:57:17 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.63.6. - -Wed Mar 24 14:26:19 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * vpath.c (selective_vpath_search): When adding the - name-within-directory at the end of NAME, and we don't add a - slash, don't copy FILENAME in one char too far into NAME. - - * variable.c (define_automatic_variables): Find default_shell's - length with strlen, not numerology. - -Wed Mar 17 20:02:27 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (define_makeflags): Add the elts of a string option in - reverse order, so they come out right when reversed again. - -Fri Mar 12 15:38:45 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (make.info): Use `-o make.info'. - -Thu Mar 11 14:13:00 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (REMOTE): Set to @REMOTE@; change comments to - reflect new use. - (objs): Replace remote.o with remote-$(REMOTE).o. - (srcs): Replace remote.c with remote-$(REMOTE).c. - (remote.o): Rule removed. - - * configure.in (REMOTE): Subst this in Makefile et al; default "stub". - Use AC_WITH to grok --with-customs arg to set REMOTE=cstms. - * GNUmakefile (build.sh.in): Filter out remote-% from objs list. - * build.template (REMOTE): New var; set to @REMOTE@. - (objs): Add remote-${REMOTE}.o. - -Wed Mar 10 15:12:24 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.63.5. - - * implicit.c (pattern_search): Fix "dependent"->"dependency" in - "Rejecting impossible" -d msg. - - * file.c (file_hash_enter): New local vars {OLD,NEW}BUCKET. Store - mod'd values there; never mod {OLD,NEW}HASH. - -Mon Mar 8 13:32:48 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * remake.c [eta10]: Include instead of . - - * compatMakefile (VPATH): Set this to @srcdir@. - (srcdir): Set this to $(VPATH). - - * main.c (main): New local var DIRECTORY_BEFORE_CHDIR. Save in it - a copy of CURRENT_DIRECTORY after the first getcwd. Use it - instead of CURRENT_DIRECTORY when chdir'ing back before re-execing. - - * remake.c (notice_finished_file): Pass missing SEARCH arg to f_mtime. - - * read.c (read_makefile): Remove extraneous arg to parse_file_seq. - -Mon Feb 22 14:19:38 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile ($(infodir)/$(instname).info): Use , instead of / - as the sed delimiter char. - -Sun Feb 21 14:11:04 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.63.4. - - * rule.h (struct rule): Removed `subdir' member. - * rule.c (new_pattern_rule): No need to clear it. - (count_implicit_rule_limits): Set the `changed' flag in each dep - that refers to a nonexistent directory. No longer set rule-global - `subdir' flag with that information. - (print_rule_data_base): Don't record info on `subdir' flags. - - * implicit.c (pattern_search): Check the DEP->changed flag rather - than the (now gone) RULE->subdir flag. Also test CHECK_LASTSLASH; - if it is set, the file might exist even though the DEP->changed - flag is set. - - * rule.c (count_implicit_rule_limits): Pass "", not ".", as file - name arg to dir_file_exists_p to check for existence of directory. - - * implicit.c (pattern_search): Inside dep-finding loop, set - CHECK_LASTSLASH from the value recorded in CHECKED_LASTSLASH[I], - rather than computing it anew. - - * commands.c (set_file_variables): Must alloca space for PERCENT - and copy it, to avoid leaving the trailing `)' in the value. - - * misc.c (remove_comments): Fixed backslash-checking loop - condition to allow it to look at the first char on the line. - P2 >= LINE, not P2 > LINE. - - * compatMakefile ($(bindir)/$(instname)): Before moving $@.new to - $@, rm $@.old and mv $@ to $@.old. - - * variable.c (try_variable_definition): Take new args FILENAME and - LINENO. Fatal if the variable name is empty. - * read.c (read_makefile): Change callers. - * main.c (main): Likewise. - - * compatMakefile (group): Define to @KMEM_GROUP@, autoconf magic - that configure will replace with the group owning /dev/kmem. - -Mon Feb 8 14:26:43 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * vpath.c (vpath_search): Take second arg MTIME_PTR, pass thru to - selective_vpath_search. - (selective_vpath_search): Take second arg MTIME_PTR. - If the dir cache thinks a file exists, stat it to make sure, and - put the modtime in *MTIME_PTR. - * remake.c (library_search): Take second arg MTIME_PTR. - When we find a match, record its mtime there. - Pass MTIME_PTR through to vpath_search to do same. - (f_mtime): Pass &MTIME as new 2nd arg to {vpath,library}_search; - store it in FILE->last_mtime if set nonzero. - * implicit.c (pattern_search): Pass nil 2nd arg to vpath_search. - - * compatMakefile (remote.o): Prepend `$(srcdir)/' to `remote-*.c', - so globbing looks somewhere it will find things. - - * compatMakefile ($(infodir)/$(instname).info): Install `make.info*' - not `$(srcdir)/make.info*'; no need to use basename. - -Fri Feb 5 12:52:43 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.63.3. - - * compatMakefile (install): Add missing ;\s. - - Make -, @, and + prefixes on a pre-expanded command line affect - all lines in the expansion, not just the first. - * commands.h (struct commands): Replace `lines_recurse' member - with `lines_flags'. - (COMMANDS_{RECURSE,SILENT,NOERROR}): New macros, bits to set in - that flag byte. - * commands.c (chop_commands): Set `lines_flags' instead of - `lines_recurse'. Record not only + but also @ and - prefixes. - * remake.c (notice_finished_file): Check the COMMANDS_RECURSE bit - in FILE->cmds->lines_flags, rather than FILE->cmds->lines_recurse. - * job.c (start_job_command): Replaced RECURSIVE and NOPRINT local - var with FLAGS; initialize it to the appropriate `lines_flags' byte. - Set CHILD->noerror if the COMMANDS_NOERROR bit is set in FLAGS. - Set the COMMANDS_SILENT bit in FLAGS for a @ prefix. - - * remake.c (update_goal_chain): Set G->file to its prev after - checking for G being finished, since that check needs to examine - G->file. - - * configure.in (union wait check) [HAVE_WAITPID]: Try using - waitpid with a `union wait' STATUS arg. If waitpid and union wait - don't work together, we should not use union wait. - - * Version 3.63.2. - - * remake.c (update_goal_chain): When G->file->updated, move - G->file to its prev. We aren't finished until G->file is nil. - -Thu Feb 4 12:53:04 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (starting_directory): New global variable. - (main): Set it to cwd after doing -Cs. - (log_working_directory): Use it, rather than computing each time. - * make.h: Declare it. - - * compatMakefile (SHELL): Define to /bin/sh for losing Unix makes. - - * main.c (decode_env_switches): Allocate (1 + LEN + 1) words for - ARGV, rather than LEN words plus one byte. - -Wed Feb 3 18:13:52 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile ($(bindir)/$(instname)): Put - before - install_setgid command line, so its failure won't be an error. - (infodir): New variable. - (install): Depend on $(infodir)/$(instname).info. - ($(infodir)/$(instname).info): New target. - - * read.c (read_makefile): If FILENAMES is nil when we see a line - starting with a tab, don't treat it as a command. Just fall - through, rather than giving an error. - - * read.c (read_makefile): If the NO_TARGETS flag is set when we see a - command line, don't clear it before continuing. We want - subsequent command lines to be ignored as well. - - * job.c (new_job): Before expanding each command line, collapse - backslash-newline combinations that are inside var or fn references. - -Mon Feb 1 16:00:13 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (exec_prefix): Default to $(prefix), not /usr/local. - - * compatMakefile (make.info): Pass -I$(srcdir) to makeinfo. - - * job.c [POSIX] (unblock_sigs): Made global. - [!POSIX] (unblock_sigs): Move defns to job.h. - * job.h [POSIX] (unblock_sigs): Declare. - -Sun Jan 31 19:11:05 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * read.c (read_makefile): In vpath parsing, after finding the - pattern token, take entire rest of line as the search path, not - just the next token. - - * compatMakefile (remote.o): Depend on remote-*.c. - -Thu Jan 28 16:40:29 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * commands.c (set_file_variables): Don't define any F or D versions. - * variable.c (define_automatic_variables): Define them here as - recursively-expanded variables that use the dir and notdir funcs. - - * variable.c (target_environment): In v_default case, don't export - o_default or o_automatic variables. - - * configure.in (union wait check): Remove ` and ' inside C code; - they confuse the shell script. - -Mon Jan 25 13:10:42 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.63.1. - - * vpath.c (construct_vpath_list): When skipping further processing - of an elt that is ".", don't also skip the code that pushes P past - the next separator. - - * compatMakefile (distclean): Don't remove make-*. - - * configure.in (HAVE_UNION_WAIT): Try to use WEXITSTATUS if it's - defined. If one cannot use WEXITSTATUS with a `union wait' - argument, we don't want to believe the system has `union wait' at all. - - * remake.c (update_file): Do nothing to print "up to date" msgs. - (update_goal_chain): Do it here instead. - Use the `changed' flag of each goal's `struct dep' to keep track - of whether files_remade (now commands_started) changed around a - call to update_file for that goal. - When a goal is finished, and its file's update_status is zero (i.e., - success or nothing done), test the `changed' flag and give an "up - to date" msg iff it is clear. - * make.h (files_remade): Renamed to commands_started. - * remake.c: Changed defn. - (update_goal_chain): Changed uses. - * job.c (start_job_command): Increment commands_started here. - (reap_children): Not here. - - * remake.c (update_goal_chain): Don't do anything with files' - `prev' members. update_file now completely handles this. - - * variable.c (target_environment): Don't expand recursive - variables if they came from the environment. - - * main.c (define_makeflags): For flags with omitted optional args, - store {"", 0} with ADD_FLAG. When constructing FLAGSTRING, a flag - so stored cannot have more flags appended to the same word. - -Fri Jan 22 14:46:16 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (print_variable_set): In vars/bucket calculation, - don't spuriously multiply by 100. - - * Version 3.63. - - * job.c [!HAVE_UNION_WAIT] (WTERMSIG, WCOREDUMP, WEXITSTATUS): - Don't define if already defined. - - * remake.c (update_file): Don't keep track of the command_state before - calling update_file_1. Remove local variable COMMANDS_FINISHED, - and don't test it to decide to print the "is up to date" msg. - Testing for files_remade having changed should always be sufficient. - The old method lost when we are called in the goal chain run on a - makefile, because the makefile's command_state is already - `cs_finished' from the makefile chain run. - - * misc.c [HAVE_SETRE[GU]ID]: Test these to decl setre[gu]id. - - * configure.in: Rewrote wait checking. - Use AC_HAVE_HEADERS to check for . - Use AC_HAVE_FUNCS to check for waitpid and wait3. - Use a compile check to test just for `union wait'. - * job.c: Rewrote conditionals accordingly. - [HAVE_WAITPID]: Test this only to define WAIT_NOHANG. - [HAVE_WAIT3]: Likewise. - [HAVE_UNION_WAIT]: Test this to define WAIT_T and W*. - - * configure.in: Set CFLAGS and LDFLAGS before all checks. - - * dir.c: Add static forward decls of {open,read}_dirstream. - -Thu Jan 21 17:18:00 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.31. - - * job.c [NGROUPS_MAX && NGROUPS_MAX==0]: #undef NGROUPS_MAX. - - * compatMakefile (CFLAGS, LDFLAGS): Set to @CFLAGS@/@LDFLAGS@. - * build.template (CFLAGS, LDFLAGS): Same here. - * configure.in: AC_SUBST(CFLAGS) and LDFLAGS. - Set them to -g if not defined in the environment. - - * remake.c (library_search): Use LIBNAME consistently, setting it - only once, to be the passed name sans `-l'. - Pass new var FILE to be modified by vpath_search. - -Mon Jan 18 14:53:54 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.30. - - * job.c (start_waiting_jobs): Return when job_slots_used is equal to - job_slots. - - * configure.in: Add AC_CONST for the sake of getopt. - - * read.c (read_makefile): Continue after parsing `override' - directive, rather than falling through to lossage. - Check for EOL or blank after "override define". - - * compatMakefile (.c.o, remote.o): Put $(CFLAGS) after other switches. - -Fri Jan 15 12:52:52 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.29. - - * main.c (define_makeflags): After writing everything into - FLAGSTRING, only back up two chars if [-1] is a dash, meaning we - just wrote " -". Always terminate the string at *P. - - * remake.c (library_search): When constructing names in std dirs, - use &(*LIB)[2] for the stem, not LIBNAME (which points at the - buffer we are writing into!). - -Thu Jan 14 13:50:06 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Set IN_IGNORED_DEFINE for "override - define" when IGNORING is true. - - * compatMakefile (distclean): Remove config.status and build.sh. - -Wed Jan 13 16:01:12 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.28. - - * misc.c (xmalloc, xrealloc): Cast result of malloc/realloc to - (char *). - - * arscan.c (ar_scan) [AIAMAG]: Cast read arg to (char *). - - * variable.c (define_automatic_variables): Override SHELL value for - origin o_env_override as well as o_env. - - * GNUmakefile (build.sh.in): Don't replace %globobjs%. Instead, - add the names of the glob objects (w/subdir) to %objs%. - * build.template (globobjs): Removed. - Take basename of $objs before linking. - -Tue Jan 12 12:31:06 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.27. - - * configure.in (AC_OUTPUT): Also edit build.sh. - * build.template: New file. - * GNUmakefile (build.sh.in): New rule to create it from build.template. - (make-$(version).tar.Z): Depend on build.sh.in. - - * main.c (die): Call print_data_base if -p. - (main): Don't call it here. - - * compatMakefile (defines): Add @DEFS@. configure should turn this - into -DHAVE_CONFIG_H. - -Mon Jan 11 14:39:23 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.26. - - * misc.c (init_access): Surround with #ifdef GETLOADAVG_PRIVILEGED. - ({make,user,child}_access) [! GETLOADAVG_PRIVILEGED]: Make no-op. - * compatMakefile (install_setgid): New var, set by configure. - (install): Install setgid $(group) only if $(install_setgid) is true. - -Fri Jan 8 15:31:55 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (load_too_high): If getloadavg fails with errno==0, give a - message saying that load limits are not supported. - - * vpath.c (construct_vpath_list): Rewrote path deletion code to - not try to use PATH's next link after freeing PATH. - - * main.c (define_makeflags): Rewritten; now handles string-valued - option, and has no arbitrary limits. - (switches): Set `toenv' flag for -I and -v. - - * main.c (decode_env_switches): Cast return value of alloca to char *. - - * misc.c (child_access) [HAVE_SETREUID, HAVE_SETREGID]: Use - setre[gu]id in place of set[gu]id. - -Wed Jan 6 15:06:12 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (main): Define MAKEOVERRIDES, MAKE, and MAKE_COMMAND with - origin o_default. - - * make.h [POSIX]: Don't test this to use ANSI_STRING. - Testing STDC_HEADERS should be sufficient. - - * job.h: Declare start_waiting_jobs. - - * read.c (read_makefile): Add missing parens in if stmt that find - conditional directives. - - * main.c (main): Declare init_dir. - * implicit.c (pattern_search): Always use two % specs in a - DEBUGP2, and always pass two non-nil args. - Cast field width args to int. - Add missing parens in !RULE->subdir if stmt. - * function.c (expand_function, patsubst_expand): Add parens around - assignments inside `while' stmts. - * commands.c (print_commands): Cast field width args to int. - - * read.c (do_define): Cast return value of alloca to (char *). - - * main.c (init_switches): New function, broken out of decode_switches. - (decode_switches): Take new arg ENV. If set, ignore non-option - args; print no error msgs; ignore options with clear `env' flags. - (decode_env_switches): Rewritten to chop envar value into words - and pass them to decode_switches. - (switches): Set `env' flag for -I and -v. - - * dir.c (init_dir): Cast free to __glob_closedir_hook's type. - -Tue Jan 5 14:52:15 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.25. - - * job.c [HAVE_SYS_WAIT || !USG]: Don't #include and - . interacts badly with , and - we don't need these anyway. - - * configure.in (AC_HAVE_FUNCS): Check for setre[gu]id. - * misc.c ({user,make}_access): Test #ifndef HAVE_SETRE[GU]ID, not - #ifdef POSIX || USG. SunOS 4.1 is supposedly POSIX.1 compliant, - but its set[gu]id functions aren't; its setre[gu]id functions work. - - * misc.c ({user,make,child}_access): Give name of caller in error msgs. - - * job.c (load_too_high): Say "cannot enforce load limit" in error msg. - - * configure.in: Call AC_PROG_CC. - * compatMakefile (CC): Define to @CC@ (autoconf magic). - - * compatMakefile: Add .NOEXPORT magic target. - -Mon Jan 4 17:00:03 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (print_version): Updated copyright to include 93. - -Thu Dec 31 12:26:15 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * make.h [_AIX]: Don't declare alloca. - -Tue Dec 29 13:45:13 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.24. - - * compatMakefile (objs): Add signame.o. - (srcs): Add signame.[ch]. - - * compatMakefile (srcs): Add config.h.in. - (remote.o): Add -I. before -I$(srcdir). - -Mon Dec 28 15:51:26 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.23. - - * read.c (readline): Fatal when LEN==0, indicating a line starting - with a NUL. - (readline): Take new arg LINENO, for use in error msg. - (read_makefile, do_define): Pass it. - - * compatMakefile (glob/libglob.a): Pass -DHAVE_CONFIG_H in CPPFLAGS. - (.c.o): Add -I. before -I$(srcdir). - -Wed Dec 23 12:12:04 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Accept and ignore a rule with no targets. - - * compatMakefile (ALLOCA_SRC): New variable. - (srcs): Include its value. - - * read.c (struct conditional): Renamed member `max_ignoring' to - `allocated'; added new member `seen_else'. - (conditional_line): Initialize seen_else flag when starting an `if...'; - set it when we see an `else'; fatal if set when we see `else'. - (read_makefile): Fatal "missing `endif'" if there are any pending - conditionals, not just if we are still ignoring. - -Tue Dec 22 15:36:28 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (manext): Set to 1, not l. - ($(mandir)/$(instname).$(manext)): Use $(srcdir) for make.man in cmds. - - * file.c (file_hash_enter): Don't call uniquize_deps here. - * read.c (record_files): Likewise. - * implicit.c (pattern_search): Likewise. - * commands.c (set_file_variables): Call it only here. - - * default.c (default_variables) [__convex__]: FC=fc. - - * variable.c (target_environment): Expand the values of recursively - expanded variables when putting them into the environment. - * expand.c (recursively_expand): Made global. - * make.h (recursively_expand): Declare it. - - * remake.c (check_dep): Set FILE->command_state to cs_deps_running - when a dep's command_state is cs_running or cs_deps_running. - - * read.c (read_makefile): Changed error msg for spurious cmds to - not say "first target". - -Sun Dec 20 17:56:09 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * configure.in: Do AC_CONFIG_HEADER right after AC_INIT. - * make.h (HAVE_CONFIG_H): #include "config.h", then #define this. - * compatMakefile (config.h, configure, config.h.in): New rules. - (defines): Removed @DEFS@. - -Thu Dec 17 16:11:40 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (realclean): Just depend on distclean; no cmds. - (distclean): Do what realclean did before; also remove Makefile and - config.h; don't remove configure. - (info, dvi): New targets; depend on make.{info,dvi}. - (doc): Removed target. - (MAKEINFO, TEXI2DVI): New vars. - (make.info, make.dvi): Use them instead of explicit cmds. - -Wed Dec 16 16:25:24 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in: Added fcntl.h to AC_HAVE_HEADERS. getloadavg cares. - -Wed Dec 9 15:21:01 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (long_option_aliases): Add --new-file alias for -W. - - * default.c (default_variables): Change all C++ to CXX and C++FLAGS - to CXXFLAGS. - - * read.c (do_define): Expand the variable name before using it. - - * main.c (main): Define variable "MAKE_COMMAND" to argv[0]; - define "MAKE=$(MAKE_COMMAND) $(MAKEOVERRIDES)" always. - - * remake.c (library_search): Search for libNAME.a in cwd; look in - vpath before looking in standard dirs, not after. - Changed order of std dirs to: /lib, /usr/lib, ${prefix}/lib. - -Mon Nov 23 14:57:34 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (default_pattern_rules, default_terminal_rules): Added - brackets around initializers. - - * variable.c (try_variable_definition): Don't check for LINE[0]=='\t'. - (try_variable_definition): Expand the name before defining the var. - - * job.c (init_siglist): Removed function. - Removed decl of `sys_siglist'. - * make.h [! HAVE_SYS_SIGLIST]: #include "signame.h". - [HAVE_SYS_SIGLIST && !SYS_SIGLIST_DECLARED]: Declare sys_siglist - only under these conditions. - * main.c (main): Don't declare init_siglist. - (main) [! HAVE_SYS_SIGLIST]: Call signame_init instead of init_siglist. - -Wed Nov 18 14:52:51 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (record_files): Don't try to append to FIRSTDEPS if it's - nil; instead just set it to MOREDEPS. - -Mon Nov 16 17:49:17 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * vpath.c (construct_vpath_list): Initialize P to DIRPATH before - loop that sets MAXELEM. - -Fri Nov 13 18:23:18 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.22. - -Thu Nov 12 15:45:31 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (start_job_command): Under -n, increment files_remade after - processing (i.e., printing) all command lines. - -Tue Nov 10 15:33:53 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * read.c (record_files): Append new deps if this rule has no - commands; prepend them to existing deps if this rule has no commands. - - * dir.c (open_dirstream): Return nil if DIR->contents->files is nil. - - * read.c (parse_file_seq): Removed last arg STRIP. Always strip `./'s. - (read_makefile): Changed callers. - * function.c (string_glob): Likewise. - * rule.c (install_pattern_rule): Likewise. - -Mon Nov 9 17:50:16 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (files_remade): Made global. - (notice_finished_file): Don't increment files_remade here; this - function gets called in many situations where no remaking was in - fact done. - * job.c (reap_children): Do it here instead, when we know that - actual commands have been run for the file. - * make.h (files_remade): Declare it. - -Thu Nov 5 18:26:10 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * vpath.c (construct_vpath_list): Allow blanks as well as colons to - separate elts in the search path. - - * read.c (read_makefile): Don't fatal on extra tokens in `vpath'. - The search path can contain spaces now. - -Tue Nov 3 20:44:32 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (check): New target; no-op. - - * file.c (file_hash_enter): Mod OLDHASH by FILE_BUCKETS after - testing for OLDHASH==0 but before using the value. - (rename_file): Don't mod OLDHASH by FILE_BUCKETS before passing it - to file_hash_enter. - - * file.c (rename_file): Notice when OLDFILE->cmds came from - default.c, and don't try to print ->filename in that case. - -Sun Oct 25 01:48:23 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (update_file): Don't process F->also_make here. - (notice_finished_file): Don't process FILE->also_make if no attempt - to update FILE was actually made. - Fixed to call f_mtime directly to refresh their modtimes. - -Sat Oct 24 22:08:59 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (find_percent): Don't increment P again after skipping - an escaped %. - - * expand.c (variable_expand): In call to patsubst_expand, don't - find `%'s ourselves; let that function do it. - - * read.c (read_makefile: record_waiting_files): Don't call - record_files if FILENAMES is nil. - (read_makefile): All alternatives in the parsing, except for rule - lines, fall through to the end of the loop. At the end of the - loop, do record_waiting_files so we notice later spurious cmds. - -Fri Oct 23 15:57:37 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (define_automatic_variables): Free old value of SHELL - before replacing it. - -Thu Oct 15 18:57:56 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (.c.o): Add -I$(srcdir)/glob to flags. - - * dir.c (open_dirstream): Cast return value to __ptr_t. - - * default.c (default_variables: "GET") [_IBMR2]: Use USG defn. - - * make.h (MAXPATHLEN): Moved out of #ifndef POSIX. - (GET_PATH_MAX): Moved from #ifdef POSIX to #ifdef PATH_MAX #else. - Define as (get_path_max ()). - [! PATH_MAX] (NEED_GET_PATH_MAX): Define. - [! PATH_MAX] (get_path_max): Declare fn. - * misc.c [NEED_GET_PATH_MAX] (get_path_max): New function. - -Mon Oct 12 13:34:45 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.21. - - * job.c (sys_siglist): Only declare #ifndef SYS_SIGLIST_DECLARED. - * make.h [! HAVE_SYS_SIGLIST && HAVE__SYS_SIGLIST]: #define - SYS_SIGLIST_DECLARED. - - * dir.c (file_impossible): When initializing DIR->contents, set - DIR->contents->dirstream to nil. - - * compatMakefile (GLOB): Define new variable. - (objs): Use it, rather than glob/libglob.a explicitly. - - * read.c (parse_file_seq): When stripping "./", handle cases like - ".///foo" and "./////". - * file.c (lookup_file, enter_file): Likewise. - -Sun Oct 11 17:00:35 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * dir.c (struct dirstream, {open,read}_dirstream): New - data type and functions to read a directory sequentially. - (init_dir): New function to hook it into glob. - * main.c (main): Call init_dir. - - * compatMakefile (objs): Added glob/libglob.a. - * configure.in: Remove code to test for glob. - -Fri Oct 9 12:08:30 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (record_files): Generalized test for NAME pointing - somewhere into F->name. - - * variable.c (define_variable_in_set): Free old value when replacing. - - * read.c (do_define): Free the linebuffer before returning. - (record_files): When clearing .SUFFIXES deps, free their data. - (multi_glob): Free OLD and its data when replacing it with results - of glob run. - - * commands.c (set_file_variables): Use alloca in place of xmalloc - for temp space for $^, $?, et al. - - * dir.c (struct directory): New member `contents' replaces `files' - and `dirstream'. - (struct directory_contents): New type. - (directories_contents): New hash table. - (dir_struct_file_exists_p): Take a struct directory_contents. - (dir_file_exists_p): Pass it the `contents' member of the dir found. - (dir_struct_file_exists_p): Renamed to dir_contents_file_exists_p; - made static. Return 0 if DIR is nil (meaning it couldn't be stat'd). - (dir_file_exists_p, find_directory): Change all callers. - (file_impossible): Use DIR->contents, initializing it if nil. - (print_dir_data_base): Use DIR->contents, and print out device and - inode numbers with each directory. - - * Changes for performance win from John Gilmore : - * dir.c (DIRECTORY_BUCKETS): Increase to 199. - (DIRFILE_BUCKETS): Decrease to 107. - (find_directory): Allocate and zero a multiple of - sizeof (struct dirfile *), not of sizeof (struct dirfile). - (dir_struct_file_exists_p): New function, nearly all code from - dir_file_exists_p. - (dir_file_exists_p): Just call find_directory+dir_struct_file_exists_p. - * vpath.c (selective_vpath_search): Remove redundant - dir_file_exists_p call. - - * configure.in: Comment out glob check; always use our code. - -Fri Oct 2 19:41:20 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * make.h [! HAVE_SYS_SIGLIST && HAVE__SYS_SIGLIST]: #define - HAVE_SYS_SIGLIST; after doing #define sys_siglist _sys_siglist, we - do have it. - -Wed Sep 30 19:21:01 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (main): Don't do -w automatically if -s. - -Tue Sep 29 21:07:55 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (printed_version): Move variable inside print_version. - (print_version): Return immediately if printed_version is set. - (die): Don't test printed_version here. - (decode_switches): Under -v, do print_version before giving usage. - (DESCRIPTION_COLUMN): New macro. - (decode_switches): Use it when printing the usage message. - Leave at least two spaces between options and their descriptions. - -Fri Sep 25 13:12:42 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.20. - -Wed Sep 16 16:15:22 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * read.c (read_makefile): Save errno value from trying to open - FILENAME, and restore it before erring; otherwise we get the errno - value from the last elt of the search path. - -Tue Sep 15 15:12:47 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (long_option_aliases): Add --stop for -S. - - * read.c (word1eq): Do strncmp before dereferencing someplace that - may be out in space. - -Wed Sep 9 15:50:41 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (notice_finished_file): If all the command lines were - recursive, don't do the touching. - - * job.c (start_job_command): Don't check for + here. - * commands.c (chop_commands): Do it here instead. - - * default.c (default_terminal_rules): Prepend + to cmds for RCS. - -Wed Sep 2 17:53:08 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (objs): Include $(ALLOCA). - - * make.h [CRAY]: Move #define signal bsdsignal to before #includes. - -Thu Aug 27 17:45:43 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * read.c (default_include_directories): Add INCLUDEDIR first. - * compatMakefile (includedir): Define. - (defines): Add -D for INCLUDEDIR="$(includedir)". - - * read.c (read_makefile): Grok multiple files in `include'; - globbing too. - - * remake.c (library_search): New function. - (library_file_mtime): Remove function. - (f_mtime): Use library_search instead of library_file_mtime. - * compatMakefile (libdir): Define. - (defines): Add -D for LIBDIR="$(libdir)". - * make.texinfo (Libraries/Search): Document change. - - * file.c (rename_file): Fix file_hash_enter call with missing arg. - -Wed Aug 26 17:10:46 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.19. - - * main.c (main): Set command_state to cs_finished for temp files - made for stdin makefiles. - - * main.c (decode_switches): Don't tell getopt to return non-option - args in order. - Ignore an argument of `-'. - -Thu Aug 20 13:36:04 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c (start_job_command): If (touch_flag && !RECURSIVE), ignore - the command line and go to the next. - (notice_finished_file): Under -t, touch FILE. - * remake.c (remake_file): Don't touch it here. - -Wed Aug 19 16:06:09 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * function.c (pattern_matches): Use temporary for strlen (WORD) - instead of two function calls. - - * compatMakefile (LOAD_AVG): Remove variable and comments. - -Tue Aug 18 14:58:58 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * make.texinfo (Running): Node renamed to `make Invocation'. - -Fri Aug 14 12:27:10 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * arscan.c (ar_name_equal): Don't compare [MAX-3..MAX] if - NAMELEN != MEMLEN. - -Thu Aug 13 17:50:09 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.18. - - * main.c: Don't #include ; make.h already does. - -Mon Aug 10 17:03:01 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * implicit.c (pattern_search): Fixed copying of suffix when building - also_make elts. - - * function.c (expand_function: `shell'): Make sure BUFFER is - null-terminated before replacing newlines. - - * compatMakefile (mandir): Use man$(manext), not always manl. - -Sun Aug 2 01:42:50 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * rule.c (new_pattern_rule): Not static. - * rule.h: Declare it. - - * file.c (file_hash_enter): New function, most code from rename_file. - (rename_file): Call it. - * file.h (file_hash_enter): Declare it. - - * dep.h: Doc fix. - -Thu Jul 30 15:40:48 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (decode_switches): Handle usage_and_exit when building - long options vector. - - * default.c (default_terminal_rules): Make RCS rules use $(CHECKOUT,v). - (default_variables): Define CHECKOUT,v (hairy). - - * make.h [!HAVE_SYS_SIGLIST && HAVE__SYS_SIGLIST]: #define - sys_siglist to _sys_siglist. - -Sun Jul 26 16:56:32 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * NEWS: Add header and tail copyright info like Emacs NEWS. - - * make.h [ANSI_STRING]: Don't #define index, rindex, bcmp, bzero, - bcopy if already #define'd. - [STDC_HEADERS] (qsort, abort, exit): Declare here. - [! __GNU_LIBRARY__ && !POSIX]: Not here. - - * make.h [_AIX]: #pragma alloca first thing. - - * job.c (start_waiting_job): Set the command_state to cs_running - when we queue a job on waiting_jobs. - -Fri Jul 24 02:16:28 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (define_automatic_variables): Use "" instead of nil - for empty value. - -Thu Jul 23 22:31:18 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.17. - - * main.c (struct command_switch.type): Add alternative usage_and_exit. - (command_switches): Add -h/--help. - -Thu Jul 16 14:27:50 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * GNUmakefile (make-$(version).tar.Z): Include NEWS, not CHANGES. - * README.template: Mention NEWS. - * CHANGES: Renamed to NEWS. - - * main.c [! STDC_HEADERS] [sun]: Don't declare exit. - -Tue Jul 14 18:48:41 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (main): Set -o files' command_states to cs_finished. - - * rule.c (count_implicit_rule_limits): Decrement num_pattern_rules - when tossing a rule. - - * main.c (main): Use alloca only in simple local var assignment, - for braindead SGI compiler. - - * rule.c (print_rule_data_base): Barf if num_pattern_rules is - inconsistent with the number computed when listing them. - -Mon Jul 13 17:51:53 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * commands.c (set_file_variables): For $? and $^ elts that are archive - member refs, use member name only. - -Fri Jul 10 00:05:04 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.h (struct variable.export): Add new alternative v_ifset. - * variable.c (target_environment): Check for it. - (define_automatic_variables): Set it for MAKEFILES. - -Thu Jul 9 21:24:28 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (objs): Remove getloadavg.o; $(extras) gets it. - (remote.o): Use $(srcdir)/remote.c, not $remote.c<. - (distclean, mostlyclean): New targets. - -Tue Jul 7 19:12:49 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.16. - - * compatMakefile (config.status): Remove rule. - - * job.c (start_waiting_job): Free C after using C->file, not before. - -Sat Jul 4 20:51:49 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * commands.c, job.c, main.c, make.h, remote-cstms.c: Use #ifdef - HAVE_* instead of #ifndef *_MISSING. - * configure.in: Use AC_HAVE_FUNCS instead of AC_MISSING_FUNCS (gone). - -Thu Jul 2 18:47:52 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (main): makelevel>0 or -C implies -w. - -Tue Jun 30 20:50:17 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * file.c, job.c, function.c: Don't #include . - make.h: Do it here instead. - * arscan.c (ar_member_touch): Don't declare errno. - -Thu Jun 25 17:06:55 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * GNUmakefile (make-$(version).tar.Z): Depend on INSTALL, configure.in. - - * remake.c (update_file): If commands or deps are running after - update_file_1 returns, break out of the :: rule (->prev) loop and - just return. - - * job.c (job_next_command): New function; code from start_job. - (start_job_command): Renamed from start_job. Call job_next_command - and recurse for empty command lines and -n. - (start_waiting_job): Call start_job_command, not start_job. - (new_job): Call job_next_command to prime the child structure, and - then call start_waiting_job. - (reap_children): Use job_next_command and start_job_command. - (start_waiting_job): Call start_remote_job_p here, and store its - result in C->remote. If zero, check the load average and - maybe put C on waiting_jobs. - (start_job_command): Test CHILD->remote rather than calling - start_remote_job_p. Don't do load avg checking at all here. - - * main.c (main): Don't handle SIGILL, SIGIOT, SIGEMT, SIGBUS, - SIGSEGV, SIGFPE or SIGTRAP. - - * compatMakefile (glob/libglob.a): Don't pass srcdir to sub-make. - configure will set it in glob/Makefile. - -Wed Jun 24 19:40:34 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * dir.c [DIRENT] (direct): Don't define to dirent. - [! DIRENT] (direct): Define to dirent. - (dir_file_exists_p): Use struct dirent instead of struct direct. - - * make.h (getcwd): No space between macro and ( for args! - - * job.c (start_job): Don't put the job on waiting_jobs if - job_slots_used==0. - - * make.texinfo (Missing): Shortened title. - -Tue Jun 23 18:42:21 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * file.c (remove_intermediates): Print "rm" commands under -n. - -Mon Jun 22 16:20:02 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.15. - -Fri Jun 19 16:20:26 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * arscan.c [M_UNIX]: #undef M_XENIX. - -Wed Jun 17 17:59:28 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * default.c (default_terminal_rules): Put @ prefix on RCS cmds. - -Tue Jun 16 19:24:17 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (getloadavg.o): Removed special rule. - (CFLAGS): Don't include $(defines). - (.c.o): Define suffix rule. - (glob/libglob.a): Pass CPPFLAGS=$(defines) to submake. - (GETOPT_SRC, srcs, tagsrcs): Prefix files with $(srcdir)/. - - * arscan.c (ar_name_equal): Moved local vars inside #if'd block. - - * make.h (max): Removed. - * expand.c (variable_buffer_output): Don't use it. - - * compatMakefile (INSTALL): Define. - (Makefile): New rule to make from Makefile.in. - (srcdir): Define. - (VPATH): Define. - (getloadavg.o, remote.o): Use autoconf $foo< hack. - - * commands.c (fatal_error_signal): Removed return. - -Mon Jun 15 17:42:51 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.14. - - * make.texinfo (Summary): New node. - (Special Targets): Mention .EXPORT_ALL_VARIABLES here. - - * variable.c (max): Moved to make.h. - - * compatMakefile (objs, srcs): Added ar & arscan. - - * job.c (start_waiting_job): New function, 2nd half of new_job. - (new_job): Call it. - (start_waiting_jobs): New function. - * remake.c (update_goal_chain): Call start_waiting_jobs at the top - of the main loop. - * compatMakefile (objs, srcs): Removed load, added getloadavg. - -Fri Jun 12 19:33:16 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c (load_too_high): New function. Uses getloadavg. - (waiting_jobs): New variable. - (start_job): Don't call wait_to_start_job. Instead, if - load_too_high returns nonzero, add the child to the - `waiting_jobs' chain and return without starting the job. - -Thu Jun 11 00:05:28 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * expand.c (variable_buffer_output): Made global again. - * variable.h: And declare it. - - * arscan.c (PORTAR): Define for all systems if PORT5AR is not defined. - (AR_NAMELEN, AR_TRAILING_SLASH): Removed. - (ar_scan): Don't use it. Don't #ifdef AR_TRAILING_SLASH; just look - for a slash in the archive at run time. - (ar_name_equal): Rewrote .o hacking to not use AR_NAMELEN, and to - cope with trailing-slash and non-trailing-slash archives. - - * main.c (main) [! SETVBUF_REVERSED]: Test this instead of USGr3 et al. - [SETVBUF_REVERSED]: Always allocate a buffer ourselves. - - * load.c (load_average) [sgi]: Use sysmp call. - - * compatMakefile (INSTALL_DATA, INSTALL_PROGRAM): Define. - ($(bindir)/$(instname), $(mandir)/make.$(manext)): Use them. - - * make.h [HAVE_VFORK_H]: #include . - (vfork, VFORK_NAME): Don't define. - * job.c (start_job): Use "vfork" in place of VFORK_NAME. - - * make.h [HAVE_LIMITS_H, HAVE_SYS_PARAM_H]: If #define'd, #include - the each file. Rearranged PATH_MAX hacking. - * job.c: Rearranged NGROUPS_MAX hacking. - - * remake.c (fstat, time): Don't declare. - - * compatMakefile (defines): Value is @DEFS@. - (LOADLIBES): Value is @LIBS@. - (extras): Value is @LIBOBJS@. - (ARCHIVES, ARCHIVES_SRC, ALLOCASRC): Removed. - * arscan.c, ar.c: Surround body with #ifndef NO_ARCHIVES. - - * misc.c [! HAVE_UNISTD_H]: Test instead of !POSIX to decl get*id. - - * make.h [GETCWD_MISSING]: Test instead of !USG && !POSIX et al. - (getcwd): Just declare if present. If not, declare as a macro - using getwd, and declare getwd. - [PATH_MAX] (GET_PATH_MAX): #define to PATH_MAX. - * main.c (main, log_working_directory): Use getcwd instead of getwd. - - * main.c (main) [SETLINEBUF_MISSING]: Test this instead of USG. - - * make.h (SIGHANDLER, SIGNAL): Removed. - (RETSIGTYPE): Define if not #define'd. - * main.c (main): Use signal in place of SIGNAL. - - * main.c [SYS_SIGLIST_MISSING]: Test instead of USG. - - * job.c (search_path) [GETGROUPS_MISSING]: Test instead of USG. - [HAVE_UNISTD_H]: Test instead of POSIX to not decl getgroups. - - * main.c [! HAVE_UNISTD_H]: Test instead of !POSIX to decl chdir. - [! STDC_HEADERS]: Test instead of !POSIX to decl exit & atof. - - * job.c (child_handler), commands.c (fatal_error_signal): Return - RETSIGTYPE instead of int. - * main.c (main): Declare fatal_error_signal and child_handler here - to return RETSIGTYPE; removed top-level decl of former. - - * commands.c (fatal_error_signal), job.c (unblock_sigs, start_job), - main.c [SIGSETMASK_MISSING]: Test this instead of USG. - -Wed Jun 10 22:06:13 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c [HAVE_WAITPID]: Test this instead of USG. - [! HAVE_UNISTD_H]: Test this instead of !POSIX to declare misc fns. - (GID_T): Don't #define. - (search_path): Use gid_t instead of GID_T. - [GETDTABLESIZE_MISSING, SYS_SIGLIST_MISSING, DUP2_MISSING]: Test - these individually instead of USG for all. - * make.h (ctime): Don't declare. #include time.h instead. - [HAVE_UNISTD_H]: #include and #define POSIX #ifdef - _POSIX_VERSION. - * dir.c [__GNU_LIBRARY__] (D_NAMLEN): Define to use d_namlen member. - * make.h [NEED_MEMORY_H]: Only include memory.h #ifdef this. - - * arscan.c: Removed #ifdef mess about string.h et al. - Just #include make.h instead. - * make.h (fstat, atol): Declare. - - * commands.c (fatal_error_signal): Don't use sigmask to check for - propagated signals; use ||s instead. - (PROPAGATED_SIGNAL_MASK): Removed. - (fatal_error_signal) [POSIX]: Use sigprocmask in place of sigsetmask. - - * variable.c (variable_buffer, variable_buffer_length, - initialize_variable_output, variable_output): Moved to expand.c; - made all static. - (struct output_state, save_variable_output, - restore_variable_output): Removed. - * expand.c (initialize_variable_output): Put a NUL at the beginning - of the new buffer after allocating it. - (allocated_variable_expand_for_file): Don't use - {save,restore}_variable_output. Do it by hand instead, keeping - state on the stack instead of malloc'ing it. - (allocated_variable_expand): Removed. - * variable.h (allocated_variable_expand): Define here as macro. - (variable_buffer_output, initialize_variable_output, - save_variable_output, restore_variable_output): Removed decls. - - * read.c (conditional_line): For an if cmd, if any elt of the - conditionals stack is ignoring, just push a new level that ignores - and return 1; don't evaluate the condition. - -Thu Jun 4 21:01:20 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (main): Put #ifdef's around frobbing SIGSYS and SIGBUS. - - * job.c (getdtablesize): Don't declare or #define if already #define'd. - -Wed Jun 3 23:42:36 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * file.c (snap_deps): If `.EXPORT_ALL_VARIABLES' is a target, set - export_all_variables. - * make.texinfo (Variables/Recursion): Document .EXPORT_ALL_VARIABLES. - -Tue Jun 2 21:08:35 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.13. - - * commands.c (set_file_variables): Calculate length for ^D and ?D - individually, making sure to give them at least enough space for "./". - - * make.h [CRAY]: #define signal to bsdsignal. - - * default.c (default_variables) [CRAY]: Define PC, SEGLDR, - CF77PPFLAGS, CF77PP, CFT, CF, and FC. - - * arscan.c (AR_HDR_SIZE): Define to sizeof (struct ar_hdr), if it - wasn't defined by . - -Thu May 28 00:56:53 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.12. - -Tue May 26 01:26:30 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * rule.c (new_pattern_rule): Initialize LASTRULE to nil, not - pattern_rules. - -Mon May 25 19:02:15 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (decode_switches): Initialize all the long_option elt members. - -Thu May 21 16:34:24 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * make.texinfo (Text Functions): Correct filter-out description. - -Tue May 19 20:50:01 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (realclean): Don't remove backup files. - - * main.c (decode_switches): Allocate ARGC+1 elts in `other_args'. - -Sun May 17 16:38:48 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.62.11. - -Thu May 14 16:42:33 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * job.c (reap_children): Don't die if wait returns EINTR. - -Wed May 13 18:28:25 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c (reap_children): Always run the next command for a - successful target. If we are going to die, we don't want to leave - the target partially made. - -Tue May 12 00:39:19 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): After loop, if we only - have one word, check it for being a shell command. - - * main.c (decode_switches): Allocate ARGC slots in other_args to - begin with, so we never need to worry about growing it. - If we get a non-option arg and POSIXLY_CORRECT is in the - environment, break out of the loop. After the loop, add all remaining - args to other_args list. - - * main.c (decode_switches): For positive_int and floating switches - when optarg is nil, use next arg if it looks right (start with a - digit, or maybe decimal point for floating). - - * variable.c (define_automatic_variables): Always set SHELL to - default if it comes from the environment. Set its export bit. - * make.texinfo (Environment): Document change. - -Mon May 11 00:32:46 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.62.10. - - * compatMakefile (tags, TAGS): Use vars for cmds. - (ETAGS, CTAGS): Define. - - * main.c (decode_switches): If a switches elt has a nil long_name, - make the long option name elt be "". - Fixed loop to not ignore all the options. - - * make.texinfo (Option Summary): Added long options. - - * main.c (switches): Changed -m's description to "-b". - (decode_switches): When printing the usage message, don't print - switches whose descriptions start with -. - When constructing the list of names for switch -C, search the - switches vector for switches whose descriptions are "-C". - - * main.c (switches): Call -S --no-keep-going, not --dont-keep-going. - Call -I --include-dir, not --include-path. - (long_option_aliases): Added --new == -W, --assume-new == -W, - --assume-old == -o, --max-load == -l, --dry-run == -n, --recon == -n, - --makefile == -f. - - * main.c (switches): Removed bogus "silent" elt. - (long_option_aliases): Define new var. - (decode_switches): Add long_option_aliases onto the end of the long - options vector created for getopt_long. - Look through long_option_aliases for extra names to list - in usage message. - -Sat May 9 00:21:05 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (log_working_directory): Fixed to properly not print the - leaving message when we haven't printed the entering message. - -Fri May 8 21:55:35 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (struct command_switch): Added elts `long_name', - `description', and `argdesc'. - (switches): Added initializers for new members. - (decode_switches): Rewritten to use getopt_long. - * compatMakefile (GETOPT, GETOPT_SRC): Define. - (objs, srcs): Include them. - - * job.c (child_died): Renamed to dead_children; made static. - (child_handler): Increment dead_children instead of setting child_died. - (reap_children): Decrement dead_children instead of clearing - child_died. The point of all this is to avoid printing "waiting - for unfinished jobs" when we don't actually need to block. - This happened when multiple SIGCHLDs before reap_children was called. - - * job.c (reap_children): If ERR is set, so we don't call start_job - on the child being reaped, instead set its command_state to - cs_finished. - (reap_children, child_handler, new_job): I added several - debugging printf's while fixing this. I left them in if (debug_flag) - because they may be useful for debugging this stuff again. - -Wed May 6 22:02:37 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * read.c (read_makefile): v_export is not 1. - -Mon May 4 17:27:37 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.9. - - * variable.c (export_all_variables): New variable. - (target_environment): Export variables whose `export' member is - v_default if export_all_variables is set and their names are benign. - * variable.h: Declare export_all_variables. - * read.c (read_makefile): If export or unexport is given with no - args, set or clear export_all_variables, respectively. - - * variable.c (target_environment): Exclude MAKELEVEL in the loop, - so it isn't duplicated when we add it at the end. - -Sun May 3 17:44:48 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.8. - - * variable.h (struct variable): Added new member `export'. - * variable.c (define_variable_in_set): Initialize it to v_default. - (target_environment): Don't check for .NOEXPORT. - Export variables whose `export' member is v_default and that would - have been exported under .NOEXPORT, and variables whose `export' - member is v_export. - (try_variable_definition): Return the variable defined. - * variable.h (try_variable_definition): Changed decl. - * read.c (read_makefile): Recognize `export' and `unexport' directives. - -Fri May 1 11:39:38 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * main.c (main) [POSIX]: Reversed args to sigaddset. - -Thu Apr 30 17:33:32 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c [POSIX || !USG] (unblock_sigs): New fn. - (start_job): Block signals before forking. - (new_job): Unblock signals after putting the new child on the chain. - * main.c (main) [POSIX]: Use sigset_t fatal_signal_set instead of - int fatal_signal_mask. - - * load.c [sgi] (LDAV_CVT): Define. - -Wed Apr 29 17:15:59 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.62.7. - - * load.c (load_average) [sgi]: Clear the high bit of the address - from the symbol table before looking it up in kmem. - - * misc.c (fatal, makefile_fatal): Put *** in fatal error messages. - (remake_file): No longer needed in message here. - - * main.c (die): Call reap_children with BLOCK==1. - -Tue Apr 28 20:44:35 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * rule.c (freerule): Don't set LASTRULE->next if LASTRULE is nil. - -Sun Apr 26 15:09:51 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * rule.c (count_implicit_rule_limits): Initialize LASTRULE to nil, - not to head of chain. Extract next ptr before we might do - freerule, and use that for next iteration. - (freerule): Still do next ptr frobbing if LASTRULE is nil. - -Tue Apr 21 03:16:29 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c (child_error): Removed extra %s from error msg format. - - * Version 3.62.6. - - * job.c (reap_children): Don't start later commands in a sequence - if ERR is nonzero. - - * job.c (new_job): Always call reap_children with BLOCK==0 first thing. - - * job.c (reap_children): New function; work that used to be done in - child_handler. - (child_died): New global var. - (child_handler): Now just sets child_died. - (wait_for_children): Removed. - (unknown_children_possible, block_signals, unblock_signals, - push_signals_blocked_p, pop_signals_blocked_p): Removed. - (child_execute_job): Removed call to unblock_signals. - (new_job): Removed calls to push_signals_blocked_p and - pop_signals_blocked_p. - * job.h: Declare reap_children, not wait_for_children. - * commands.c (fatal_error_signal), job.c (new_job), - load.c [LDAV_BASED] (wait_to_start_job), main.c (die), - remake.c (update_goal_chain), function.c (expand_function: `shell'): - Changed wait_for_children calls to reap_children. - Some needed to be loops to wait for all children to die. - * commands.c (fatal_error_signal), main.c (main, - log_working_directory), function.c (expand_function): Removed calls - to push_signals_blocked_p and pop_signals_blocked_p. - * job.h: Removed decls. - - * job.h: Added copyright notice. - -Wed Apr 15 02:02:40 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (child_error): No *** for ignored error. - -Tue Apr 14 18:31:21 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * implicit.c (DEBUGP2): Use do ... while (0) instead of if ... else to - avoid compiler warnings. - - * read.c (parse_file_seq): Don't remove ./ when it is followed by a - blank. - -Mon Apr 13 21:56:15 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h (DEBUGPR): Use do ... while (0) instead of if ... else to - avoid compiler warnings. - - * remake.c (notice_finished_file): Run file_mtime on the also_make - files, so vpath_search can happen. - - * GNUmakefile (tests): Use perl test suite from csa@sw.stratus.com. - (alpha-files): Include test suite tar file. - -Fri Apr 3 00:50:13 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.5. - -Wed Apr 1 05:31:18 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (update_file, update_file_1): Do check_renamed on elts - of dep chains when traversing them. Something unrelated might have - renamed one of the files the dep chain points to. - - * file.c (rename_file): If FILE has been renamed, follow its - `renamed' ptr, so we get to the final real FILE. Using the renamed - ones loses because they are not in the hash table, so the removal - code loops infinitely. - - * read.c (read_all_makefiles): Clobber null terminator into - MAKEFILES expansion, so string passed to read_makefile is properly - terminated. - -Mon Mar 30 20:18:02 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * commands.c (set_file_variables): $* for archive member with - explicit cmds is stem of member, not of whole `lib(member)'. - -Thu Mar 26 15:24:38 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.62.4. - -Tue Mar 24 05:20:51 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * rule.c (new_pattern_rule): Rules are identical only if all their - targets match (regardless of order). - -Wed Mar 11 13:49:54 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * remake.c (remake_file): Changed error "no way to make" to "no - rule to make". Fiat Hugh. - - * make.texinfo (Last Resort): Describe %:: rules and new .DEFAULT - behavior. - - * remake.c (update_file_1): Only use .DEFAULT cmds if FILE is not a - target. - -Tue Mar 10 18:13:13 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * remote-stub.c, remote-cstms.c (start_remote_job): Take new arg, - environment to pass to child. - * job.c (start_job): Pass it. - -Mon Mar 9 19:00:11 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * file.c (enter_file): Also strip ./s here, to get command-line - target names. - - * remote-cstms.c: Add comment telling people to leave me alone. - - * compatMakefile (manpage install): Remove target before copying. - -Tue Mar 3 18:43:21 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.texinfo (Missing): Renamed to "Incompatibilities and ...". - Added paragraph describing $? incompatibility with Unix and POSIX.2. - -Sun Mar 1 15:50:54 1992 Roland McGrath (roland@nutrimat.gnu.ai.mit.edu) - - * function.c (expand_function: `shell'): Don't declare fork or pipe. - Use vfork instead of fork. - -Tue Feb 25 22:05:32 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * make.texinfo (Chained Rules): Clarify .PRECIOUS to save - intermediate files. - - * load.c [sun] (LDAV_CVT): Define to divide by FSCALE. - -Sun Feb 16 02:05:16 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * Version 3.62.3. - -Sat Feb 15 17:12:20 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * compatMakefile (makeinfo): Use emacs batch-texinfo-format fn. - -Fri Feb 14 00:11:55 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * read.c (read_makefile): Correctly handle define & endef in ifdefs. - - * read.c (record_files): Pass arg for %s in error msg. - - * main.c (main) [__IBMR2, POSIX]: Use correct (a la USGr3) setvbuf - call. - -Wed Feb 12 12:07:39 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * make.texinfo (Libraries/Search): Say it does /usr/local/lib too. - -Sun Feb 9 23:06:24 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Check for extraneous `endef' when ignoring. - -Thu Feb 6 16:15:48 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.2. - -Tue Feb 4 20:04:46 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Correctly ignore - whitespace after backslash-NL. - -Fri Jan 31 18:30:05 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile: Ignore errors from chgrp and chmod when installing. - -Wed Jan 29 18:13:30 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * main.c (main): When setting MAKELEVEL in the env to re-exec, - allocate space so as not to clobber past the end of the old string. - - * make.h [HAVE_ALLOCA_H]: Include - * compatMakefile (defines): Document HAVE_ALLOCA_H. - -Mon Jan 20 13:40:05 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * make.h [VFORK_MISSING]: Use fork instead. - * compatMakefile (defines): Document same. - - * job.c (construct_command_argv_internal): Don't create an empty - arg if backslash-NL is at beginning of word. - -Sun Jan 19 16:26:53 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * main.c [DGUX]: Call setvbuf as for USGr3. - - * job.c (construct_command_argv_internal): Notice correctly that - backslash-NL is the end of the arg (because it is replaced with a - space). - -Thu Jan 16 18:42:38 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): If SHELL is nil, set it - to default_shell before proceeding. - - * make.h [sgi]: No alloca.h, after all. - -Wed Jan 15 12:30:04 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * read.c (multi_glob): Cons up the chain of the results of glob - from back to front, so it comes out in forward order. - - * job.c (construct_command_argv_internal): Don't eat char following - backslash-NL. - -Mon Jan 13 19:16:56 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.62.1. - - * default.c (default_variables) [ultrix]: GET=get, like USG. - - * job.c (construct_command_argv_internal): Remove tabs following - backslash-NL combos in the input line, so they don't show up when - that line is printed. - - * read.c (read_makefile): Don't collapse_continuations the line on - input; do it on the copy we do remove_comments on. - For rule lines, collapse_continuations the line after chopping - ";cmds" off the end, so we don't eat conts in the cmds. - Give error for ";cmds" with no rule. - * job.c (construct_command_argv_internal): Eat backslash-NL combos - when constructing the line to recurse on for slow, too. - -Sat Jan 11 02:20:27 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * file.c (enter_file): Don't strip leading `./'s. - * read.c (parse_file_seq): Take new arg STRIP; if nonzero, do it here. - * default.c (set_default_suffixes), function.c (string_glob), - read.c (read_makefile), rule.c (install_pattern_rule): Change callers. - - * default.c (default_variables) [_IBMR2]: FC=xlf - - * job.c (construct_command_argv_internal): Turn backslash-NL and - following whitespace into a single space, rather than just eating - the backslash. - - * make.texinfo (Copying): @include gpl.texinfo, rather than - duplicating its contents. - -Fri Nov 8 20:06:03 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Make sure not to bother - processing an empty line. - - * Version 3.62.0. - - * job.c (construct_command_argv_internal): Always recurse for slow; - simple case didn't handle finding newlines. - -Tue Nov 5 18:51:10 1991 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Set RESTP properly when - slow; don't \ify past a newline. - -Fri Nov 1 19:34:28 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h [sgi]: #include . - - - -See ChangeLog.1 for earlier changes. diff --git a/buildtools/windows/source/make/INSTALL b/buildtools/windows/source/make/INSTALL deleted file mode 100644 index 95d84c820fb..00000000000 --- a/buildtools/windows/source/make/INSTALL +++ /dev/null @@ -1,176 +0,0 @@ -Basic Installation -================== - - These are generic installation instructions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. - - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. 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. - - Running `configure' takes awhile. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, 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 -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. - -Installation Names -================== - - By default, `make install' will install the package's files in -`/usr/local/bin', `/usr/local/man', etc. You can specify an -installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. -Documentation and other data files will still use the regular prefix. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: - CPU-COMPANY-SYSTEM - -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. - - If you are building compiler tools for cross-compiling, you can also -use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Operation Controls -================== - - `configure' recognizes the following options to control how it -operates. - -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - -`--help' - Print a summary of the options to `configure', and exit. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. - diff --git a/buildtools/windows/source/make/Makefile b/buildtools/windows/source/make/Makefile deleted file mode 100644 index 9c049840c46..00000000000 --- a/buildtools/windows/source/make/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -# -# GNU Makefile for building gmake.exe on WIN32 -# This is the top-level makefile. It only does the optimized build. -# - -CSRCS = ar.c \ - arscan.c \ - commands.c \ - default.c \ - dir.c \ - expand.c \ - file.c \ - function.c \ - getloadavg.c \ - getopt.c \ - getopt1.c \ - implicit.c \ - job.c \ - main.c \ - misc.c \ - read.c \ - remake.c \ - remote-stub.c \ - rule.c \ - signame.c \ - variable.c \ - version.c \ - vpath.c - -OBJS = $(CSRCS:.c=.obj) glob/fnmatch.obj glob/glob.obj - -CC = cl - -CFLAGS = $(CC_SWITCHES) $(INCLUDES) $(DEFINES) $(CC_OUTPUTS) - -CC_SWITCHES = -nologo -ML -W3 -O2 - -INCLUDES = -I. -Iglob - -DEFINES = -DWIN32 -DNDEBUG -D_CONSOLE -DNETSCAPE -DHAVE_CONFIG_H - -CC_OUTPUTS = -Fpgmake.pch -YX -c - -LINK = link - -LINK_FLAGS = -nologo -subsystem:console \ - -incremental:no -machine:I386 -out:$@ - -all: gmake.exe - -build_glob: - cd glob; $(MAKE) - -gmake.exe: build_glob $(OBJS) - $(LINK) $(LINK_FLAGS) $(OBJS) - -%.obj: %.c - $(CC) $(CFLAGS) $< - -clean: - cd glob; $(MAKE) $@ - rm -rf $(OBJS) gmake.pch gmake.exe diff --git a/buildtools/windows/source/make/Makefile.in b/buildtools/windows/source/make/Makefile.in deleted file mode 100644 index b77794f744c..00000000000 --- a/buildtools/windows/source/make/Makefile.in +++ /dev/null @@ -1,307 +0,0 @@ -# NOTE: If you have no `make' program at all to process this makefile, run -# `build.sh' instead. -# -# Copyright (C) 1988, 89, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. -# This file is part of GNU Make. -# -# GNU Make 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. -# -# GNU Make 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 GNU Make; see the file COPYING. If not, write to -# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -# -# Makefile for GNU Make -# - -# Ultrix 2.2 make doesn't expand the value of VPATH. -VPATH = @srcdir@ -# This must repeat the value, because configure will remove `VPATH = .'. -srcdir = @srcdir@ - -CC = @CC@ - -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ - -# Define these for your system as follows: -# -DNO_ARCHIVES To disable `ar' archive support. -# -DNO_FLOAT To avoid using floating-point numbers. -# -DENUM_BITFIELDS If the compiler isn't GCC but groks enum foo:2. -# Some compilers apparently accept this -# without complaint but produce losing code, -# so beware. -# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline. -# See also `config.h'. -defines = @DEFS@ -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" - -# Which flavor of remote job execution support to use. -# The code is found in `remote-$(REMOTE).c'. -REMOTE = @REMOTE@ - -# If you are using the GNU C library, or have the GNU getopt functions in -# your C library, you can comment these out. -GETOPT = getopt.o getopt1.o -GETOPT_SRC = $(srcdir)/getopt.c $(srcdir)/getopt1.c $(srcdir)/getopt.h - -# If you are using the GNU C library, or have the GNU glob functions in -# your C library, you can comment this out. GNU make uses special hooks -# into the glob functions to be more efficient (by using make's directory -# cache for globbing), so you must use the GNU functions even if your -# system's C library has the 1003.2 glob functions already. Also, the glob -# functions in the AIX and HPUX C libraries are said to be buggy. -GLOB = glob/libglob.a - -# If your system doesn't have alloca, or the one provided is bad, define this. -ALLOCA = @ALLOCA@ -ALLOCA_SRC = $(srcdir)/alloca.c - -# If your system needs extra libraries loaded in, define them here. -# System V probably need -lPW for alloca. HP-UX 7.0's alloca in -# libPW.a is broken on HP9000s300 and HP9000s400 machines. Use -# alloca.c instead on those machines. -LOADLIBES = @LIBS@ - -# Any extra object files your system needs. -extras = @LIBOBJS@ - -# Common prefix for machine-independent installed files. -prefix = @prefix@ -# Common prefix for machine-dependent installed files. -exec_prefix = @exec_prefix@ - -# Directory to install `make' in. -bindir = $(exec_prefix)/bin -# Directory to find libraries in for `-lXXX'. -libdir = $(exec_prefix)/lib -# Directory to search by default for included makefiles. -includedir = $(prefix)/include -# Directory to install the Info files in. -infodir = $(prefix)/info -# Directory to install the man page in. -mandir = $(prefix)/man/man$(manext) -# Number to put on the man page filename. -manext = 1 -# Prefix to put on installed `make' binary file name. -binprefix = -# Prefix to put on installed `make' man page file name. -manprefix = $(binprefix) - -# Whether or not make needs to be installed setgid. -# The value should be either `true' or `false'. -# On many systems, the getloadavg function (used to implement the `-l' -# switch) will not work unless make is installed setgid kmem. -install_setgid = @NEED_SETGID@ -# Install make setgid to this group so it can read /dev/kmem. -group = @KMEM_GROUP@ - -# Program to install `make'. -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -# Program to install the man page. -INSTALL_DATA = @INSTALL_DATA@ -# Generic install program. -INSTALL = @INSTALL@ - -# Program to format Texinfo source into Info files. -MAKEINFO = makeinfo -# Program to format Texinfo source into DVI files. -TEXI2DVI = texi2dvi - -# Programs to make tags files. -ETAGS = etags -w -CTAGS = ctags -w - -objs = commands.o job.o dir.o file.o misc.o main.o read.o remake.o \ - rule.o implicit.o default.o variable.o expand.o function.o \ - vpath.o version.o ar.o arscan.o signame.o remote-$(REMOTE).o \ - $(GLOB) $(GETOPT) $(ALLOCA) $(extras) -srcs = $(srcdir)/commands.c $(srcdir)/job.c $(srcdir)/dir.c \ - $(srcdir)/file.c $(srcdir)/getloadavg.c $(srcdir)/misc.c \ - $(srcdir)/main.c $(srcdir)/read.c $(srcdir)/remake.c \ - $(srcdir)/rule.c $(srcdir)/implicit.c $(srcdir)/default.c \ - $(srcdir)/variable.c $(srcdir)/expand.c $(srcdir)/function.c \ - $(srcdir)/vpath.c $(srcdir)/version.c \ - $(srcdir)/remote-$(REMOTE).c \ - $(srcdir)/ar.c $(srcdir)/arscan.c \ - $(srcdir)/signame.c $(srcdir)/signame.h $(GETOPT_SRC) \ - $(srcdir)/commands.h $(srcdir)/dep.h $(srcdir)/file.h \ - $(srcdir)/job.h $(srcdir)/make.h $(srcdir)/rule.h \ - $(srcdir)/variable.h $(ALLOCA_SRC) $(srcdir)/config.h.in - - -.SUFFIXES: -.SUFFIXES: .o .c .h .ps .dvi .info .texinfo - -all: make -info: make.info -dvi: make.dvi -# Some makes apparently use .PHONY as the default goal if it is before `all'. -.PHONY: all check info dvi - -make.info: make.texinfo - $(MAKEINFO) -I$(srcdir) $(srcdir)/make.texinfo -o make.info - -make.dvi: make.texinfo - $(TEXI2DVI) $(srcdir)/make.texinfo - -make.ps: make.dvi - dvi2ps make.dvi > make.ps - -make: $(objs) - $(CC) $(LDFLAGS) $(objs) $(LOADLIBES) -o make.new - mv -f make.new make - -# -I. is needed to find config.h in the build directory. -.c.o: - $(CC) $(defines) -c -I. -I$(srcdir) -I$(srcdir)/glob \ - $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) - -# For some losing Unix makes. -SHELL = /bin/sh -@SET_MAKE@ - -glob/libglob.a: FORCE config.h - cd glob; $(MAKE) libglob.a -FORCE: - -tagsrcs = $(srcs) $(srcdir)/remote-*.c -TAGS: $(tagsrcs) - $(ETAGS) $(tagsrcs) -tags: $(tagsrcs) - $(CTAGS) $(tagsrcs) - -.PHONY: install installdirs -install: installdirs \ - $(bindir)/$(binprefix)make $(infodir)/make.info \ - $(mandir)/$(manprefix)make.$(manext) - -installdirs: - $(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(infodir) $(mandir) - -$(bindir)/$(binprefix)make: make - $(INSTALL_PROGRAM) make $@.new - @if $(install_setgid); then \ - if chgrp $(group) $@.new && chmod g+s $@.new; then \ - echo "chgrp $(group) $@.new && chmod g+s $@.new"; \ - else \ - echo "$@ needs to be owned by group $(group) and setgid;"; \ - echo "otherwise the \`-l' option will probably not work."; \ - echo "You may need special privileges to install $@."; \ - fi; \ - else true; fi -# Some systems can't deal with renaming onto a running binary. - -rm -f $@.old - -mv $@ $@.old - mv $@.new $@ - -$(infodir)/make.info: make.info - if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \ - for file in $${dir}/make.info*; do \ - name="`basename $$file`"; \ - $(INSTALL_DATA) $$file \ - `echo $@ | sed "s,make.info\$$,$$name,"`; \ - done -# Run install-info only if it exists. -# Use `if' instead of just prepending `-' to the -# line so we notice real errors from install-info. -# We use `$(SHELL) -c' because some shells do not -# fail gracefully when there is an unknown command. - if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ - if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \ - install-info --infodir=$(infodir) $$dir/make.info; \ - else true; fi - -$(mandir)/$(manprefix)make.$(manext): make.man - $(INSTALL_DATA) $(srcdir)/make.man $@ - - -loadavg: loadavg.c config.h - $(CC) $(defines) -DTEST -I. -I$(srcdir) $(CFLAGS) $(LDFLAGS) \ - loadavg.c $(LOADLIBES) -o $@ -# We copy getloadavg.c into a different file rather than compiling it -# directly because some compilers clobber getloadavg.o in the process. -loadavg.c: getloadavg.c - ln $(srcdir)/getloadavg.c loadavg.c || \ - cp $(srcdir)/getloadavg.c loadavg.c -check-loadavg: loadavg - @echo The system uptime program believes the load average to be: - -uptime - @echo The GNU load average checking code believes: - ./loadavg -check: check-loadavg - - -.PHONY: clean realclean distclean mostlyclean -clean: glob-clean - -rm -f make loadavg *.o core make.dvi -distclean: clean glob-realclean - -rm -f Makefile config.h config.status build.sh stamp-config - -rm -f config.log config.cache - -rm -f TAGS tags - -rm -f make.?? make.??s make.log make.toc make.*aux - -rm -f loadavg.c -realclean: distclean - -rm -f make.info* -mostlyclean: clean - -.PHONY: glob-clean glob-realclean -glob-clean glob-realclean: - cd glob; $(MAKE) $@ - -Makefile: config.status $(srcdir)/Makefile.in - $(SHELL) config.status -glob/Makefile: config.status $(srcdir)/glob/Makefile.in - $(SHELL) config.status -config.h: stamp-config ; -stamp-config: config.status $(srcdir)/config.h.in - $(SHELL) config.status - touch stamp-config - -#configure: configure.in aclocal.m4 -# cd $(srcdir) && autoconf $(ACFLAGS) -#config.h.in: configure.in aclocal.m4 -# cd $(srcdir) && autoheader $(ACFLAGS) - -# This tells versions [3.59,3.63) of GNU make not to export all variables. -.NOEXPORT: - -# The automatically generated dependencies below may omit config.h -# because it is included with ``#include '' rather than -# ``#include "config.h"''. So we add the explicit dependency to make sure. -$(objs): config.h - -# Automatically generated dependencies will be put at the end of the file. - -# Automatically generated dependencies. -commands.o : commands.c make.h dep.h commands.h file.h variable.h job.h -job.o: job.c make.h commands.h job.h file.h variable.h -dir.o: dir.c make.h -file.o: file.c make.h commands.h dep.h file.h variable.h -misc.o: misc.c make.h dep.h -main.o: main.c make.h commands.h dep.h file.h variable.h job.h getopt.h -read.o: read.c make.h commands.h dep.h file.h variable.h glob/glob.h -remake.o: remake.c make.h commands.h job.h dep.h file.h -rule.o : rule.c make.h config.h commands.h dep.h file.h variable.h rule.h -implicit.o : implicit.c make.h rule.h dep.h file.h -default.o: default.c make.h rule.h dep.h file.h commands.h variable.h -variable.o : variable.c make.h commands.h variable.h dep.h file.h -expand.o: expand.c make.h commands.h file.h variable.h -function.o: function.c make.h variable.h dep.h commands.h job.h -vpath.o : vpath.c make.h file.h variable.h -version.o: version.c -ar.o : ar.c make.h file.h dep.h -arscan.o: arscan.c make.h -signame.o: signame.c signame.h -remote-stub.o : remote-stub.c make.h commands.h -getopt.o: getopt.c getopt.h -getopt1.o : getopt1.c getopt.h -getloadavg.o: getloadavg.c diff --git a/buildtools/windows/source/make/NEWS b/buildtools/windows/source/make/NEWS deleted file mode 100644 index 6c97107a97b..00000000000 --- a/buildtools/windows/source/make/NEWS +++ /dev/null @@ -1,557 +0,0 @@ -GNU make NEWS -- history of user-visible changes. 26 January 1995 - -Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc. -See the end for copying conditions. - -Please send GNU make bug reports to bug-gnu-utils@prep.ai.mit.edu. - -Version 3.73 - -* Converted to use Autoconf version 2, so `configure' has some new options. - See INSTALL for details. - -* You can now send a SIGUSR1 signal to Make to toggle printing of debugging - output enable by -d, at any time during the run. - -Version 3.72 - -* DJ Delorie has ported Make to MS-DOS using the GO32 extender. - He is maintaining the DOS port, not the GNU Make maintainer; - please direct bugs and questions for DOS to . - MS-DOS binaries are available for FTP from oak.oakland.edu:pub/msdos/djgpp. - -* The `MAKEFLAGS' variable (in the environment or in a makefile) can now - contain variable definitions itself; these are treated just like - command-line variable definitions. Make will automatically insert any - variable definitions from the environment value of `MAKEFLAGS' or from - the command line, into the `MAKEFLAGS' value exported to children. The - `MAKEOVERRIDES' variable previously included in the value of `$(MAKE)' - for sub-makes is now included in `MAKEFLAGS' instead. As before, you can - reset `MAKEOVERRIDES' in your makefile to avoid putting all the variables - in the environment when its size is limited. - -* If `.DELETE_ON_ERROR' appears as a target, Make will delete the target of - a rule if it has changed when its commands exit with a nonzero status, - just as when the commands get a signal. - -* The automatic variable `$+' is new. It lists all the dependencies like - `$^', but preserves duplicates listed in the makefile. This is useful - for linking rules, where library files sometimes need to be listed twice - in the link order. - -* You can now specify the `.IGNORE' and `.SILENT' special targets with - dependencies to limit their effects to those files. If a file appears as - a dependency of `.IGNORE', then errors will be ignored while running the - commands to update that file. Likewise if a file appears as a dependency - of `.SILENT', then the commands to update that file will not be printed - before they are run. (This change was made to conform to POSIX.2.) - -Version 3.71 - -* The automatic variables `$(@D)', `$(%D)', `$(*D)', `$( renames program database file -# /Fo creates an object file -# /Fp specifies a precompiled header file name -# /O2 creates fast code -# /Od disables optimization -# /W sets warning levels -# /YX Automates precompiled header -# /Zi Generates complete debugging information - -CFLAGS_any = /nologo /W3 /YX /I . /I glob /D NETSCAPE /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H -CFLAGS_debug = $(CFLAGS_any) /MLd /Zi /Od /D _DEBUG /FpWinDebug/make.pch /FoWinDebug/ /FdWinDebug/make.pdb -CFLAGS_release = $(CFLAGS_any) /ML /O2 /D NDEBUG /FpWinRel/make.pch /FoWinRel/ - -LDFLAGS_debug = /NOLOGO /SUBSYSTEM:console\ - /INCREMENTAL:no /PDB:WinDebug/make.pdb \ - /OUT:WinDebug/make.exe /DEBUG -LDFLAGS_release = /NOLOGO /SUBSYSTEM:console\ - /INCREMENTAL:no /OUT:WinRel/make.exe - -all: Release Debug - -Release: - nmake /f $(MAKEFILE) LDFLAGS="$(LDFLAGS_release)" CFLAGS="$(CFLAGS_release)" OUTDIR=WinRel WinRel/make.exe -Debug: - nmake /f $(MAKEFILE) LDFLAGS="$(LDFLAGS_debug)" CFLAGS="$(CFLAGS_debug)" OUTDIR=WinDebug WinDebug/make.exe - -clean: - rmdir /s /q WinDebug WinRel - -$(OUTDIR): - if not exist .\$@\nul mkdir .\$@ - -#LIBS = kernel32.lib user32.lib advapi32.lib -#LIBS = kernel32.lib - -OBJS = \ - $(OUTDIR)/ar.obj \ - $(OUTDIR)/arscan.obj \ - $(OUTDIR)/commands.obj \ - $(OUTDIR)/default.obj \ - $(OUTDIR)/dir.obj \ - $(OUTDIR)/expand.obj \ - $(OUTDIR)/file.obj \ - $(OUTDIR)/function.obj \ - $(OUTDIR)/getloadavg.obj \ - $(OUTDIR)/getopt.obj \ - $(OUTDIR)/getopt1.obj \ - $(OUTDIR)/implicit.obj \ - $(OUTDIR)/job.obj \ - $(OUTDIR)/main.obj \ - $(OUTDIR)/misc.obj \ - $(OUTDIR)/read.obj \ - $(OUTDIR)/remake.obj \ - $(OUTDIR)/remote-stub.obj \ - $(OUTDIR)/rule.obj \ - $(OUTDIR)/signame.obj \ - $(OUTDIR)/variable.obj \ - $(OUTDIR)/version.obj \ - $(OUTDIR)/vpath.obj \ - $(OUTDIR)/glob.obj \ - $(OUTDIR)/fnmatch.obj - -$(OUTDIR)/make.exe: $(OUTDIR) $(OBJS) - $(LINK) @<< - $(LDFLAGS) $(LIBS) $(OBJS) -<< - -.c{$(OUTDIR)}.obj: - $(CC) $(CFLAGS) /c $< - -$(OUTDIR)/ar.obj : ar.c make.h file.h dep.h -$(OUTDIR)/arscan.obj : arscan.c make.h -$(OUTDIR)/commands.obj : commands.c -$(OUTDIR)/default.obj : default.c make.h rule.h dep.h file.h job.h commands.h variable.h -$(OUTDIR)/dir.obj : dir.c make.h -$(OUTDIR)/expand.obj : expand.c make.h file.h job.h commands.h variable.h -$(OUTDIR)/file.obj : file.c make.h dep.h file.h job.h commands.h variable.h -$(OUTDIR)/function.obj : function.c make.h file.h variable.h dep.h job.h commands.h -$(OUTDIR)/getloadavg.obj : getloadavg.c -$(OUTDIR)/getopt.obj : getopt.c -$(OUTDIR)/getopt1.obj : getopt1.c getopt.h -$(OUTDIR)/implicit.obj : implicit.c make.h rule.h dep.h file.h -$(OUTDIR)/job.obj : job.c make.h job.h file.h commands.h variable.h -$(OUTDIR)/main.obj : main.c make.h dep.h file.h variable.h job.h commands.h getopt.h -$(OUTDIR)/misc.obj : misc.c make.h dep.h -$(OUTDIR)/read.obj : read.c make.h dep.h file.h job.h commands.h variable.h glob/glob.h -$(OUTDIR)/remake.obj : remake.c make.h file.h job.h commands.h dep.h -$(OUTDIR)/remote-stub.obj : remote-stub.c make.h file.h job.h commands.h -$(OUTDIR)/rule.obj : rule.c make.h dep.h file.h job.h commands.h variable.h rule.h -$(OUTDIR)/signame.obj : signame.c signame.h -$(OUTDIR)/variable.obj : variable.c make.h dep.h file.h job.h commands.h variable.h -$(OUTDIR)/version.obj : version.c -$(OUTDIR)/vpath.obj : vpath.c make.h file.h variable.h -$(OUTDIR)/glob.obj : glob/glob.c - $(CC) $(CFLAGS) /c glob/glob.c -$(OUTDIR)/fnmatch.obj : glob/fnmatch.c - $(CC) $(CFLAGS) /c glob/fnmatch.c diff --git a/buildtools/windows/source/make/README b/buildtools/windows/source/make/README deleted file mode 100644 index 43003a33861..00000000000 --- a/buildtools/windows/source/make/README +++ /dev/null @@ -1,28 +0,0 @@ -This directory contains the 3.74 test release of GNU Make. -All bugs reported for previous test releases have been fixed. -Some bugs surely remain. - -For general building and installation instructions, see the file INSTALL. -If you need to build GNU Make and have no other `make' program to use, -you can use the shell script `build.sh' instead. To do this, first run -`configure' as described in INSTALL. Then, instead of typing `make' to -build the program, type `sh build.sh'. This should compile the program -in the current directory. Then you will have a Make program that you can -use for `make install', or whatever else. - -It has been reported that the XLC 1.2 compiler on AIX 3.2 is buggy such -that if you compile make with `cc -O' on AIX 3.2, it will not work correctly. -It is said that using `cc' without `-O' does work. - -One area that is often a problem in configuration and porting is the code -to check the system's current load average. To make it easier to test and -debug this code, you can do `make check-loadavg' to see if it works -properly on your system. (You must run `configure' beforehand, but you -need not build Make itself to run this test.) - -See the file NEWS for what has changed since previous releases. - -GNU Make is fully documented in make.texinfo. See the section entitled -`Problems and Bugs' for information on submitting bug reports. - -GNU Make is free software. See the file COPYING for copying conditions. diff --git a/buildtools/windows/source/make/README.MOZILLA b/buildtools/windows/source/make/README.MOZILLA deleted file mode 100644 index 3a751d64405..00000000000 --- a/buildtools/windows/source/make/README.MOZILLA +++ /dev/null @@ -1,16 +0,0 @@ -This directory contains the source files for the GNU make -that is used to build some components (e.g., NSPR) on Win32. - -This GNU make is based on version 3.74 and was ported to -Win32 by Netscape engineers. Its default shell is shmsdos.exe, -a lightweight shell written by Netscape engineers. - -To build it, you need Microsoft Visual C++ and nmake. If -you want to change the build number, which is displayed by -the '-v' command line option, you can edit the value of the -macro BUILD_NUMBER in main.c. Then, issue the command: - nmake /f NMakefile -The outputs are WinDebug\make.exe and WinRel\make.exe. -Assuming you want to use the optmized executable file, -copy WinRel\make.exe to a directory on your Path and -rename it gmake.exe. diff --git a/buildtools/windows/source/make/acconfig.h b/buildtools/windows/source/make/acconfig.h deleted file mode 100644 index 192dc0f828a..00000000000 --- a/buildtools/windows/source/make/acconfig.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Define to the name of the SCCS `get' command. */ -#undef SCCS_GET - -/* Define this if the SCCS `get' command understands the `-G' option. */ -#undef SCCS_GET_MINUS_G - -/* Define this if the C library defines the variable `sys_siglist'. */ -#undef HAVE_SYS_SIGLIST - -/* Define this if the C library defines the variable `_sys_siglist'. */ -#undef HAVE__SYS_SIGLIST - -/* Define this if you have the `union wait' type in . */ -#undef HAVE_UNION_WAIT - -/* Define this if the POSIX.1 call `sysconf (_SC_OPEN_MAX)' works properly. */ -#undef HAVE_SYSCONF_OPEN_MAX diff --git a/buildtools/windows/source/make/alloca.c b/buildtools/windows/source/make/alloca.c deleted file mode 100644 index 7020f32c882..00000000000 --- a/buildtools/windows/source/make/alloca.c +++ /dev/null @@ -1,492 +0,0 @@ -/* alloca.c -- allocate automatically reclaimed memory - (Mostly) portable public-domain implementation -- D A Gwyn - - This implementation of the PWB library alloca function, - which is used to allocate space off the run-time stack so - that it is automatically reclaimed upon procedure exit, - was inspired by discussions with J. Q. Johnson of Cornell. - J.Otto Tennant contributed the Cray support. - - There are some preprocessor constants that can - be defined when compiling for your specific system, for - improved efficiency; however, the defaults should be okay. - - The general concept of this implementation is to keep - track of all alloca-allocated blocks, and reclaim any - that are found to be deeper in the stack than the current - invocation. This heuristic does not reclaim storage as - soon as it becomes invalid, but it will do so eventually. - - As a special case, alloca(0) reclaims storage without - allocating any. It is a good idea to use alloca(0) in - your main control loop, etc. to force garbage collection. */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifdef emacs -#include "blockinput.h" -#endif - -/* If compiling with GCC 2, this file's not needed. */ -#if !defined (__GNUC__) || __GNUC__ < 2 - -/* If someone has defined alloca as a macro, - there must be some other way alloca is supposed to work. */ -#ifndef alloca - -#ifdef emacs -#ifdef static -/* actually, only want this if static is defined as "" - -- this is for usg, in which emacs must undefine static - in order to make unexec workable - */ -#ifndef STACK_DIRECTION -you -lose --- must know STACK_DIRECTION at compile-time -#endif /* STACK_DIRECTION undefined */ -#endif /* static */ -#endif /* emacs */ - -/* If your stack is a linked list of frames, you have to - provide an "address metric" ADDRESS_FUNCTION macro. */ - -#if defined (CRAY) && defined (CRAY_STACKSEG_END) -long i00afunc (); -#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) -#else -#define ADDRESS_FUNCTION(arg) &(arg) -#endif - -#if __STDC__ -typedef void *pointer; -#else -typedef char *pointer; -#endif - -#define NULL 0 - -/* Different portions of Emacs need to call different versions of - malloc. The Emacs executable needs alloca to call xmalloc, because - ordinary malloc isn't protected from input signals. On the other - hand, the utilities in lib-src need alloca to call malloc; some of - them are very simple, and don't have an xmalloc routine. - - Non-Emacs programs expect this to call use xmalloc. - - Callers below should use malloc. */ - -#ifndef emacs -#define malloc xmalloc -#endif -extern pointer malloc (); - -/* Define STACK_DIRECTION if you know the direction of stack - growth for your system; otherwise it will be automatically - deduced at run-time. - - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ - -#ifndef STACK_DIRECTION -#define STACK_DIRECTION 0 /* Direction unknown. */ -#endif - -#if STACK_DIRECTION != 0 - -#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ - -#else /* STACK_DIRECTION == 0; need run-time code. */ - -static int stack_dir; /* 1 or -1 once known. */ -#define STACK_DIR stack_dir - -static void -find_stack_direction () -{ - static char *addr = NULL; /* Address of first `dummy', once known. */ - auto char dummy; /* To get stack address. */ - - if (addr == NULL) - { /* Initial entry. */ - addr = ADDRESS_FUNCTION (dummy); - - find_stack_direction (); /* Recurse once. */ - } - else - { - /* Second entry. */ - if (ADDRESS_FUNCTION (dummy) > addr) - stack_dir = 1; /* Stack grew upward. */ - else - stack_dir = -1; /* Stack grew downward. */ - } -} - -#endif /* STACK_DIRECTION == 0 */ - -/* An "alloca header" is used to: - (a) chain together all alloca'ed blocks; - (b) keep track of stack depth. - - It is very important that sizeof(header) agree with malloc - alignment chunk size. The following default should work okay. */ - -#ifndef ALIGN_SIZE -#define ALIGN_SIZE sizeof(double) -#endif - -typedef union hdr -{ - char align[ALIGN_SIZE]; /* To force sizeof(header). */ - struct - { - union hdr *next; /* For chaining headers. */ - char *deep; /* For stack depth measure. */ - } h; -} header; - -static header *last_alloca_header = NULL; /* -> last alloca header. */ - -/* Return a pointer to at least SIZE bytes of storage, - which will be automatically reclaimed upon exit from - the procedure that called alloca. Originally, this space - was supposed to be taken from the current stack frame of the - caller, but that method cannot be made to work for some - implementations of C, for example under Gould's UTX/32. */ - -pointer -alloca (size) - unsigned size; -{ - auto char probe; /* Probes stack depth: */ - register char *depth = ADDRESS_FUNCTION (probe); - -#if STACK_DIRECTION == 0 - if (STACK_DIR == 0) /* Unknown growth direction. */ - find_stack_direction (); -#endif - - /* Reclaim garbage, defined as all alloca'd storage that - was allocated from deeper in the stack than currently. */ - - { - register header *hp; /* Traverses linked list. */ - -#ifdef emacs - BLOCK_INPUT; -#endif - - for (hp = last_alloca_header; hp != NULL;) - if ((STACK_DIR > 0 && hp->h.deep > depth) - || (STACK_DIR < 0 && hp->h.deep < depth)) - { - register header *np = hp->h.next; - - free ((pointer) hp); /* Collect garbage. */ - - hp = np; /* -> next header. */ - } - else - break; /* Rest are not deeper. */ - - last_alloca_header = hp; /* -> last valid storage. */ - -#ifdef emacs - UNBLOCK_INPUT; -#endif - } - - if (size == 0) - return NULL; /* No allocation required. */ - - /* Allocate combined header + user data storage. */ - - { - register pointer new = malloc (sizeof (header) + size); - /* Address of header. */ - - ((header *) new)->h.next = last_alloca_header; - ((header *) new)->h.deep = depth; - - last_alloca_header = (header *) new; - - /* User storage begins just after header. */ - - return (pointer) ((char *) new + sizeof (header)); - } -} - -#if defined (CRAY) && defined (CRAY_STACKSEG_END) - -#ifdef DEBUG_I00AFUNC -#include -#endif - -#ifndef CRAY_STACK -#define CRAY_STACK -#ifndef CRAY2 -/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ -struct stack_control_header - { - long shgrow:32; /* Number of times stack has grown. */ - long shaseg:32; /* Size of increments to stack. */ - long shhwm:32; /* High water mark of stack. */ - long shsize:32; /* Current size of stack (all segments). */ - }; - -/* The stack segment linkage control information occurs at - the high-address end of a stack segment. (The stack - grows from low addresses to high addresses.) The initial - part of the stack segment linkage control information is - 0200 (octal) words. This provides for register storage - for the routine which overflows the stack. */ - -struct stack_segment_linkage - { - long ss[0200]; /* 0200 overflow words. */ - long sssize:32; /* Number of words in this segment. */ - long ssbase:32; /* Offset to stack base. */ - long:32; - long sspseg:32; /* Offset to linkage control of previous - segment of stack. */ - long:32; - long sstcpt:32; /* Pointer to task common address block. */ - long sscsnm; /* Private control structure number for - microtasking. */ - long ssusr1; /* Reserved for user. */ - long ssusr2; /* Reserved for user. */ - long sstpid; /* Process ID for pid based multi-tasking. */ - long ssgvup; /* Pointer to multitasking thread giveup. */ - long sscray[7]; /* Reserved for Cray Research. */ - long ssa0; - long ssa1; - long ssa2; - long ssa3; - long ssa4; - long ssa5; - long ssa6; - long ssa7; - long sss0; - long sss1; - long sss2; - long sss3; - long sss4; - long sss5; - long sss6; - long sss7; - }; - -#else /* CRAY2 */ -/* The following structure defines the vector of words - returned by the STKSTAT library routine. */ -struct stk_stat - { - long now; /* Current total stack size. */ - long maxc; /* Amount of contiguous space which would - be required to satisfy the maximum - stack demand to date. */ - long high_water; /* Stack high-water mark. */ - long overflows; /* Number of stack overflow ($STKOFEN) calls. */ - long hits; /* Number of internal buffer hits. */ - long extends; /* Number of block extensions. */ - long stko_mallocs; /* Block allocations by $STKOFEN. */ - long underflows; /* Number of stack underflow calls ($STKRETN). */ - long stko_free; /* Number of deallocations by $STKRETN. */ - long stkm_free; /* Number of deallocations by $STKMRET. */ - long segments; /* Current number of stack segments. */ - long maxs; /* Maximum number of stack segments so far. */ - long pad_size; /* Stack pad size. */ - long current_address; /* Current stack segment address. */ - long current_size; /* Current stack segment size. This - number is actually corrupted by STKSTAT to - include the fifteen word trailer area. */ - long initial_address; /* Address of initial segment. */ - long initial_size; /* Size of initial segment. */ - }; - -/* The following structure describes the data structure which trails - any stack segment. I think that the description in 'asdef' is - out of date. I only describe the parts that I am sure about. */ - -struct stk_trailer - { - long this_address; /* Address of this block. */ - long this_size; /* Size of this block (does not include - this trailer). */ - long unknown2; - long unknown3; - long link; /* Address of trailer block of previous - segment. */ - long unknown5; - long unknown6; - long unknown7; - long unknown8; - long unknown9; - long unknown10; - long unknown11; - long unknown12; - long unknown13; - long unknown14; - }; - -#endif /* CRAY2 */ -#endif /* not CRAY_STACK */ - -#ifdef CRAY2 -/* Determine a "stack measure" for an arbitrary ADDRESS. - I doubt that "lint" will like this much. */ - -static long -i00afunc (long *address) -{ - struct stk_stat status; - struct stk_trailer *trailer; - long *block, size; - long result = 0; - - /* We want to iterate through all of the segments. The first - step is to get the stack status structure. We could do this - more quickly and more directly, perhaps, by referencing the - $LM00 common block, but I know that this works. */ - - STKSTAT (&status); - - /* Set up the iteration. */ - - trailer = (struct stk_trailer *) (status.current_address - + status.current_size - - 15); - - /* There must be at least one stack segment. Therefore it is - a fatal error if "trailer" is null. */ - - if (trailer == 0) - abort (); - - /* Discard segments that do not contain our argument address. */ - - while (trailer != 0) - { - block = (long *) trailer->this_address; - size = trailer->this_size; - if (block == 0 || size == 0) - abort (); - trailer = (struct stk_trailer *) trailer->link; - if ((block <= address) && (address < (block + size))) - break; - } - - /* Set the result to the offset in this segment and add the sizes - of all predecessor segments. */ - - result = address - block; - - if (trailer == 0) - { - return result; - } - - do - { - if (trailer->this_size <= 0) - abort (); - result += trailer->this_size; - trailer = (struct stk_trailer *) trailer->link; - } - while (trailer != 0); - - /* We are done. Note that if you present a bogus address (one - not in any segment), you will get a different number back, formed - from subtracting the address of the first block. This is probably - not what you want. */ - - return (result); -} - -#else /* not CRAY2 */ -/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. - Determine the number of the cell within the stack, - given the address of the cell. The purpose of this - routine is to linearize, in some sense, stack addresses - for alloca. */ - -static long -i00afunc (long address) -{ - long stkl = 0; - - long size, pseg, this_segment, stack; - long result = 0; - - struct stack_segment_linkage *ssptr; - - /* Register B67 contains the address of the end of the - current stack segment. If you (as a subprogram) store - your registers on the stack and find that you are past - the contents of B67, you have overflowed the segment. - - B67 also points to the stack segment linkage control - area, which is what we are really interested in. */ - - stkl = CRAY_STACKSEG_END (); - ssptr = (struct stack_segment_linkage *) stkl; - - /* If one subtracts 'size' from the end of the segment, - one has the address of the first word of the segment. - - If this is not the first segment, 'pseg' will be - nonzero. */ - - pseg = ssptr->sspseg; - size = ssptr->sssize; - - this_segment = stkl - size; - - /* It is possible that calling this routine itself caused - a stack overflow. Discard stack segments which do not - contain the target address. */ - - while (!(this_segment <= address && address <= stkl)) - { -#ifdef DEBUG_I00AFUNC - fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); -#endif - if (pseg == 0) - break; - stkl = stkl - pseg; - ssptr = (struct stack_segment_linkage *) stkl; - size = ssptr->sssize; - pseg = ssptr->sspseg; - this_segment = stkl - size; - } - - result = address - this_segment; - - /* If you subtract pseg from the current end of the stack, - you get the address of the previous stack segment's end. - This seems a little convoluted to me, but I'll bet you save - a cycle somewhere. */ - - while (pseg != 0) - { -#ifdef DEBUG_I00AFUNC - fprintf (stderr, "%011o %011o\n", pseg, size); -#endif - stkl = stkl - pseg; - ssptr = (struct stack_segment_linkage *) stkl; - size = ssptr->sssize; - pseg = ssptr->sspseg; - result += size; - } - return (result); -} - -#endif /* not CRAY2 */ -#endif /* CRAY */ - -#endif /* no alloca */ -#endif /* not GCC version 2 */ diff --git a/buildtools/windows/source/make/ar.c b/buildtools/windows/source/make/ar.c deleted file mode 100644 index 63fcd34f6f0..00000000000 --- a/buildtools/windows/source/make/ar.c +++ /dev/null @@ -1,317 +0,0 @@ -/* Interface to `ar' archives for GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" - -#ifndef NO_ARCHIVES - -#include "file.h" -#include "dep.h" -#include - -/* Defined in arscan.c. */ -extern long int ar_scan (); -extern int ar_member_touch (); -extern int ar_name_equal (); - - -/* Return nonzero if NAME is an archive-member reference, zero if not. - An archive-member reference is a name like `lib(member)'. - If a name like `lib((entry))' is used, a fatal error is signaled at - the attempt to use this unsupported feature. */ - -int -ar_name (name) - char *name; -{ - char *p = index (name, '('), *end = name + strlen (name) - 1; - - if (p == 0 || p == name || *end != ')') - return 0; - - if (p[1] == '(' && end[-1] == ')') - fatal ("attempt to use unsupported feature: `%s'", name); - - return 1; -} - - -/* Parse the archive-member reference NAME into the archive and member names. - Put the malloc'd archive name in *ARNAME_P if ARNAME_P is non-nil; - put the malloc'd member name in *MEMNAME_P if MEMNAME_P is non-nil. */ - -void -ar_parse_name (name, arname_p, memname_p) - char *name, **arname_p, **memname_p; -{ - char *p = index (name, '('), *end = name + strlen (name) - 1; - - if (arname_p != 0) - *arname_p = savestring (name, p - name); - - if (memname_p != 0) - *memname_p = savestring (p + 1, end - (p + 1)); -} - -static long int ar_member_date_1 (); - -/* Return the modtime of NAME. */ - -time_t -ar_member_date (name) - char *name; -{ - char *arname; - int arname_used = 0; - char *memname; - long int val; - - ar_parse_name (name, &arname, &memname); - - /* Make sure we know the modtime of the archive itself because we are - likely to be called just before commands to remake a member are run, - and they will change the archive itself. - - But we must be careful not to enter_file the archive itself if it does - not exist, because pattern_search assumes that files found in the data - base exist or can be made. */ - { - struct file *arfile; - arfile = lookup_file (arname); - if (arfile == 0 && file_exists_p (arname)) - { - arfile = enter_file (arname); - arname_used = 1; - } - - if (arfile != 0) - (void) f_mtime (arfile, 0); - } - - val = ar_scan (arname, ar_member_date_1, (long int) memname); - - if (!arname_used) - free (arname); - free (memname); - - return (val <= 0 ? (time_t) -1 : (time_t) val); -} - -/* This function is called by `ar_scan' to find which member to look at. */ - -/* ARGSUSED */ -static long int -ar_member_date_1 (desc, mem, truncated, - hdrpos, datapos, size, date, uid, gid, mode, name) - int desc; - char *mem; - int truncated; - long int hdrpos, datapos, size, date; - int uid, gid, mode; - char *name; -{ - return ar_name_equal (name, mem, truncated) ? date : 0; -} - -/* Set the archive-member NAME's modtime to now. */ - -int -ar_touch (name) - char *name; -{ - char *arname, *memname; - int arname_used = 0; - register int val; - - ar_parse_name (name, &arname, &memname); - - /* Make sure we know the modtime of the archive itself before we - touch the member, since this will change the archive itself. */ - { - struct file *arfile; - arfile = lookup_file (arname); - if (arfile == 0) - { - arfile = enter_file (arname); - arname_used = 1; - } - - (void) f_mtime (arfile, 0); - } - - val = 1; - switch (ar_member_touch (arname, memname)) - { - case -1: - error ("touch: Archive `%s' does not exist", arname); - break; - case -2: - error ("touch: `%s' is not a valid archive", arname); - break; - case -3: - perror_with_name ("touch: ", arname); - break; - case 1: - error ("touch: Member `%s' does not exist in `%s'", memname, arname); - break; - case 0: - val = 0; - break; - default: - error ("touch: Bad return code from ar_member_touch on `%s'", name); - } - - if (!arname_used) - free (arname); - free (memname); - - return val; -} - -/* State of an `ar_glob' run, passed to `ar_glob_match'. */ - -struct ar_glob_state - { - char *arname; - char *pattern; - unsigned int size; - struct nameseq *chain; - unsigned int n; - }; - -/* This function is called by `ar_scan' to match one archive - element against the pattern in STATE. */ - -static long int -ar_glob_match (desc, mem, truncated, - hdrpos, datapos, size, date, uid, gid, mode, - state) - int desc; - char *mem; - int truncated; - long int hdrpos, datapos, size, date; - int uid, gid, mode; - struct ar_glob_state *state; -{ - if (fnmatch (state->pattern, mem, FNM_PATHNAME|FNM_PERIOD) == 0) - { - /* We have a match. Add it to the chain. */ - struct nameseq *new = (struct nameseq *) xmalloc (state->size); - new->name = concat (state->arname, mem, ")"); - new->next = state->chain; - state->chain = new; - ++state->n; - } - - return 0L; -} - -/* Alphabetic sorting function for `qsort'. */ - -static int -ar_glob_alphacompare (a, b) - char **a, **b; -{ - return strcmp (*a, *b); -} - -/* Return nonzero if PATTERN contains any metacharacters. - Metacharacters can be quoted with backslashes if QUOTE is nonzero. */ -static int -glob_pattern_p (pattern, quote) - const char *pattern; - const int quote; -{ - register const char *p; - int open = 0; - - for (p = pattern; *p != '\0'; ++p) - switch (*p) - { - case '?': - case '*': - return 1; - - case '\\': - if (quote) - ++p; - break; - - case '[': - open = 1; - break; - - case ']': - if (open) - return 1; - break; - } - - return 0; -} - -/* Glob for MEMBER_PATTERN in archive ARNAME. - Return a malloc'd chain of matching elements (or nil if none). */ - -struct nameseq * -ar_glob (arname, member_pattern, size) - char *arname, *member_pattern; - unsigned int size; -{ - struct ar_glob_state state; - char **names; - struct nameseq *n; - unsigned int i; - - if (! glob_pattern_p (member_pattern, 1)) - return 0; - - /* Scan the archive for matches. - ar_glob_match will accumulate them in STATE.chain. */ - i = strlen (arname); - state.arname = (char *) alloca (i + 2); - bcopy (arname, state.arname, i); - state.arname[i] = '('; - state.arname[i + 1] = '\0'; - state.pattern = member_pattern; - state.size = size; - state.chain = 0; - state.n = 0; - (void) ar_scan (arname, ar_glob_match, (long int) &state); - - if (state.chain == 0) - return 0; - - /* Now put the names into a vector for sorting. */ - names = (char **) alloca (state.n * sizeof (char *)); - i = 0; - for (n = state.chain; n != 0; n = n->next) - names[i++] = n->name; - - /* Sort them alphabetically. */ - qsort ((char *) names, i, sizeof (*names), ar_glob_alphacompare); - - /* Put them back into the chain in the sorted order. */ - i = 0; - for (n = state.chain; n != 0; n = n->next) - n->name = names[i++]; - - return state.chain; -} - -#endif /* Not NO_ARCHIVES. */ diff --git a/buildtools/windows/source/make/arscan.c b/buildtools/windows/source/make/arscan.c deleted file mode 100644 index a3dce83c329..00000000000 --- a/buildtools/windows/source/make/arscan.c +++ /dev/null @@ -1,561 +0,0 @@ -/* Library function for scanning an archive file. - Copyright (C) 1987, 89, 91, 92, 93, 94 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" - -#ifdef HAVE_FCNTL_H -#include -#else -#include -#endif - -#ifndef NO_ARCHIVES - -/* SCO Unix's compiler defines both of these. */ -#ifdef M_UNIX -#undef M_XENIX -#endif - -/* On the sun386i and in System V rel 3, ar.h defines two different archive - formats depending upon whether you have defined PORTAR (normal) or PORT5AR - (System V Release 1). There is no default, one or the other must be defined - to have a nonzero value. */ - -#if (!defined (PORTAR) || PORTAR == 0) && (!defined (PORT5AR) || PORT5AR == 0) -#undef PORTAR -#ifdef M_XENIX -/* According to Jim Sievert , for SCO XENIX defining - PORTAR to 1 gets the wrong archive format, and defining it to 0 gets the - right one. */ -#define PORTAR 0 -#else -#define PORTAR 1 -#endif -#endif - -#include - -/* Cray's apparently defines this. */ -#ifndef AR_HDR_SIZE -#define AR_HDR_SIZE (sizeof (struct ar_hdr)) -#endif - -/* Takes three arguments ARCHIVE, FUNCTION and ARG. - - Open the archive named ARCHIVE, find its members one by one, - and for each one call FUNCTION with the following arguments: - archive file descriptor for reading the data, - member name, - member name might be truncated flag, - member header position in file, - member data position in file, - member data size, - member date, - member uid, - member gid, - member protection mode, - ARG. - - The descriptor is poised to read the data of the member - when FUNCTION is called. It does not matter how much - data FUNCTION reads. - - If FUNCTION returns nonzero, we immediately return - what FUNCTION returned. - - Returns -1 if archive does not exist, - Returns -2 if archive has invalid format. - Returns 0 if have scanned successfully. */ - -long int -ar_scan (archive, function, arg) - char *archive; - long int (*function) (); - long int arg; -{ -#ifdef AIAMAG - FL_HDR fl_header; -#else - int long_name = 0; -#endif - char *namemap = 0; - register int desc = open (archive, O_RDONLY, 0); - if (desc < 0) - return -1; -#ifdef SARMAG - { - char buf[SARMAG]; - register int nread = read (desc, buf, SARMAG); - if (nread != SARMAG || bcmp (buf, ARMAG, SARMAG)) - { - (void) close (desc); - return -2; - } - } -#else -#ifdef AIAMAG - { - register int nread = read (desc, (char *) &fl_header, FL_HSZ); - if (nread != FL_HSZ || bcmp (fl_header.fl_magic, AIAMAG, SAIAMAG)) - { - (void) close (desc); - return -2; - } - } -#else - { -#ifndef M_XENIX - int buf; -#else - unsigned short int buf; -#endif - register int nread = read(desc, &buf, sizeof (buf)); - if (nread != sizeof (buf) || buf != ARMAG) - { - (void) close (desc); - return -2; - } - } -#endif -#endif - - /* Now find the members one by one. */ - { -#ifdef SARMAG - register long int member_offset = SARMAG; -#else -#ifdef AIAMAG - long int member_offset; - long int last_member_offset; - - sscanf (fl_header.fl_fstmoff, "%12ld", &member_offset); - sscanf (fl_header.fl_lstmoff, "%12ld", &last_member_offset); -#else -#ifndef M_XENIX - register long int member_offset = sizeof (int); -#else /* Xenix. */ - register long int member_offset = sizeof (unsigned short int); -#endif /* Not Xenix. */ -#endif -#endif - - while (1) - { - register int nread; - struct ar_hdr member_header; -#ifdef AIAMAG - char name[256]; - int name_len; - long int dateval; - int uidval, gidval; - long int data_offset; -#else - char namebuf[sizeof member_header.ar_name + 1]; - char *name; - int is_namemap; /* Nonzero if this entry maps long names. */ -#endif - long int eltsize; - int eltmode; - long int fnval; - - if (lseek (desc, member_offset, 0) < 0) - { - (void) close (desc); - return -2; - } - -#ifdef AIAMAG -#define AR_MEMHDR (AR_HDR_SIZE - sizeof (member_header._ar_name)) - nread = read (desc, (char *) &member_header, AR_MEMHDR); - - if (nread != AR_MEMHDR) - { - (void) close (desc); - return -2; - } - - sscanf (member_header.ar_namlen, "%4d", &name_len); - nread = read (desc, name, name_len); - - if (nread != name_len) - { - (void) close (desc); - return -2; - } - - name[name_len] = 0; - - sscanf (member_header.ar_date, "%12ld", &dateval); - sscanf (member_header.ar_uid, "%12d", &uidval); - sscanf (member_header.ar_gid, "%12d", &gidval); - sscanf (member_header.ar_mode, "%12o", &eltmode); - sscanf (member_header.ar_size, "%12ld", &eltsize); - - if ((data_offset = member_offset + AR_MEMHDR + name_len + 2) % 2) - ++data_offset; - - fnval = - (*function) (desc, name, 0, - member_offset, data_offset, eltsize, - dateval, uidval, gidval, - eltmode, arg); - -#else /* Not AIAMAG. */ - nread = read (desc, (char *) &member_header, AR_HDR_SIZE); - if (nread == 0) - /* No data left means end of file; that is OK. */ - break; - - if (nread != AR_HDR_SIZE -#ifdef ARFMAG - || bcmp (member_header.ar_fmag, ARFMAG, 2) -#endif - ) - { - (void) close (desc); - return -2; - } - - name = namebuf; - bcopy (member_header.ar_name, name, sizeof member_header.ar_name); - { - register char *p = name + sizeof member_header.ar_name; - do - *p = '\0'; - while (p > name && *--p == ' '); - -#ifndef AIAMAG - /* If the member name is "//" or "ARFILENAMES/" this may be - a list of file name mappings. The maximum file name - length supported by the standard archive format is 14 - characters. This member will actually always be the - first or second entry in the archive, but we don't check - that. */ - is_namemap = (!strcmp (name, "//") - || !strcmp (name, "ARFILENAMES/")); -#endif /* Not AIAMAG. */ - /* On some systems, there is a slash after each member name. */ - if (*p == '/') - *p = '\0'; - -#ifndef AIAMAG - /* If the member name starts with a space or a slash, this - is an index into the file name mappings (used by GNU ar). - Otherwise if the member name looks like #1/NUMBER the - real member name appears in the element data (used by - 4.4BSD). */ - if (! is_namemap - && (name[0] == ' ' || name[0] == '/') - && namemap != 0) - { - name = namemap + atoi (name + 1); - long_name = 1; - } - else if (name[0] == '#' - && name[1] == '1' - && name[2] == '/') - { - int namesize = atoi (name + 3); - - name = (char *) alloca (namesize + 1); - nread = read (desc, name, namesize); - if (nread != namesize) - { - close (desc); - return -2; - } - name[namesize] = '\0'; - - long_name = 1; - } -#endif /* Not AIAMAG. */ - } - -#ifndef M_XENIX - sscanf (member_header.ar_mode, "%o", &eltmode); - eltsize = atol (member_header.ar_size); -#else /* Xenix. */ - eltmode = (unsigned short int) member_header.ar_mode; - eltsize = member_header.ar_size; -#endif /* Not Xenix. */ - - fnval = - (*function) (desc, name, ! long_name, member_offset, - member_offset + AR_HDR_SIZE, eltsize, -#ifndef M_XENIX - atol (member_header.ar_date), - atoi (member_header.ar_uid), - atoi (member_header.ar_gid), -#else /* Xenix. */ - member_header.ar_date, - member_header.ar_uid, - member_header.ar_gid, -#endif /* Not Xenix. */ - eltmode, arg); - -#endif /* AIAMAG. */ - - if (fnval) - { - (void) close (desc); - return fnval; - } - -#ifdef AIAMAG - if (member_offset == last_member_offset) - /* End of the chain. */ - break; - - sscanf (member_header.ar_nxtmem, "%12ld", &member_offset); - - if (lseek (desc, member_offset, 0) != member_offset) - { - (void) close (desc); - return -2; - } -#else - - /* If this member maps archive names, we must read it in. The - name map will always precede any members whose names must - be mapped. */ - if (is_namemap) - { - char *clear; - char *limit; - - namemap = (char *) alloca (eltsize); - nread = read (desc, namemap, eltsize); - if (nread != eltsize) - { - (void) close (desc); - return -2; - } - - /* The names are separated by newlines. Some formats have - a trailing slash. Null terminate the strings for - convenience. */ - limit = namemap + eltsize; - for (clear = namemap; clear < limit; clear++) - { - if (*clear == '\n') - { - *clear = '\0'; - if (clear[-1] == '/') - clear[-1] = '\0'; - } - } - - is_namemap = 0; - } - - member_offset += AR_HDR_SIZE + eltsize; - if (member_offset % 2 != 0) - member_offset++; -#endif - } - } - - close (desc); - return 0; -} - -/* Return nonzero iff NAME matches MEM. - If TRUNCATED is nonzero, MEM may be truncated to - sizeof (struct ar_hdr.ar_name) - 1. */ - -int -ar_name_equal (name, mem, truncated) - char *name, *mem; - int truncated; -{ - char *p; - - p = rindex (name, '/'); - if (p != 0) - name = p + 1; - - /* We no longer use this kludge, since we - now support long archive member names. */ - -#if 0 && !defined (AIAMAG) && !defined (APOLLO) - - { - /* `reallylongname.o' matches `reallylongnam.o'. - If member names have a trailing slash, that's `reallylongna.o'. */ - - struct ar_hdr h; - unsigned int max = sizeof (h.ar_name); - unsigned int namelen, memlen; - - if (strncmp (name, mem, max - 3)) - return 0; - - namelen = strlen (name); - memlen = strlen (mem); - - if (namelen > memlen && memlen >= max - 1 - && name[namelen - 2] == '.' && name[namelen - 1] == 'o' - && mem[memlen - 2] == '.' && mem[memlen - 1] == 'o') - return 1; - - if (namelen != memlen) - return 0; - - return (namelen < max - 3 || !strcmp (name + max - 3, mem + max - 3)); - } - -#else /* AIX or APOLLO. */ - - if (truncated) - { -#ifdef AIAMAG - /* TRUNCATED should never be set on this system. */ - abort (); -#else - struct ar_hdr hdr; - return !strncmp (name, mem, - sizeof (hdr.ar_name) - -#if !defined (__hpux) && !defined (cray) - 1 -#else - 2 -#endif /* !__hpux && !cray */ - ); -#endif - } - - return !strcmp (name, mem); - -#endif -} - -/* ARGSUSED */ -static long int -ar_member_pos (desc, mem, truncated, - hdrpos, datapos, size, date, uid, gid, mode, name) - int desc; - char *mem; - int truncated; - long int hdrpos, datapos, size, date; - int uid, gid, mode; - char *name; -{ - if (!ar_name_equal (name, mem, truncated)) - return 0; - return hdrpos; -} - -/* Set date of member MEMNAME in archive ARNAME to current time. - Returns 0 if successful, - -1 if file ARNAME does not exist, - -2 if not a valid archive, - -3 if other random system call error (including file read-only), - 1 if valid but member MEMNAME does not exist. */ - -int -ar_member_touch (arname, memname) - char *arname, *memname; -{ - register long int pos = ar_scan (arname, ar_member_pos, (long int) memname); - register int fd; - struct ar_hdr ar_hdr; - register int i; - struct stat statbuf; - - if (pos < 0) - return (int) pos; - if (!pos) - return 1; - - fd = open (arname, O_RDWR, 0666); - if (fd < 0) - return -3; - /* Read in this member's header */ - if (lseek (fd, pos, 0) < 0) - goto lose; - if (AR_HDR_SIZE != read (fd, (char *) &ar_hdr, AR_HDR_SIZE)) - goto lose; - /* Write back the header, thus touching the archive file. */ - if (lseek (fd, pos, 0) < 0) - goto lose; - if (AR_HDR_SIZE != write (fd, (char *) &ar_hdr, AR_HDR_SIZE)) - goto lose; - /* The file's mtime is the time we we want. */ -#ifdef EINTR - while (fstat (fd, &statbuf) < 0 && errno == EINTR); -#else - fstat (fd, &statbuf); -#endif -#if defined(ARFMAG) || defined(AIAMAG) - /* Advance member's time to that time */ - for (i = 0; i < sizeof ar_hdr.ar_date; i++) - ar_hdr.ar_date[i] = ' '; - sprintf (ar_hdr.ar_date, "%ld", (long int) statbuf.st_mtime); -#ifdef AIAMAG - ar_hdr.ar_date[strlen(ar_hdr.ar_date)] = ' '; -#endif -#else - ar_hdr.ar_date = statbuf.st_mtime; -#endif - /* Write back this member's header */ - if (lseek (fd, pos, 0) < 0) - goto lose; - if (AR_HDR_SIZE != write (fd, (char *) &ar_hdr, AR_HDR_SIZE)) - goto lose; - close (fd); - return 0; - - lose: - i = errno; - close (fd); - errno = i; - return -3; -} - -#ifdef TEST - -long int -describe_member (desc, name, truncated, - hdrpos, datapos, size, date, uid, gid, mode) - int desc; - char *name; - int truncated; - long int hdrpos, datapos, size, date; - int uid, gid, mode; -{ - extern char *ctime (); - - printf ("Member `%s'%s: %ld bytes at %ld (%ld).\n", - name, truncated ? " (name might be truncated)" : "", - size, hdrpos, datapos); - printf (" Date %s", ctime (&date)); - printf (" uid = %d, gid = %d, mode = 0%o.\n", uid, gid, mode); - - return 0; -} - -main (argc, argv) - int argc; - char **argv; -{ - ar_scan (argv[1], describe_member); - return 0; -} - -#endif /* TEST. */ - -#endif /* NO_ARCHIVES. */ diff --git a/buildtools/windows/source/make/build.sh.in b/buildtools/windows/source/make/build.sh.in deleted file mode 100644 index 1667f0e15ac..00000000000 --- a/buildtools/windows/source/make/build.sh.in +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh -# Shell script to build GNU Make in the absence of any `make' program. -# @configure_input@ - -# Copyright (C) 1993, 1994 Free Software Foundation, Inc. -# This file is part of GNU Make. -# -# GNU Make 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. -# -# GNU Make 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 GNU Make; see the file COPYING. If not, write to -# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -# See Makefile.in for comments describing these variables. - -srcdir='@srcdir@' -CC='@CC@' -CFLAGS='@CFLAGS@' -CPPFLAGS='@CPPFLAGS@' -LDFLAGS='@LDFLAGS@' -defines='@DEFS@ -DLIBDIR="${libdir}" -DINCLUDEDIR="${includedir}"' -ALLOCA='@ALLOCA@' -LOADLIBES='@LIBS@' -extras='@LIBOBJS@' -REMOTE='@REMOTE@' - -# Common prefix for machine-independent installed files. -prefix='@prefix@' -# Common prefix for machine-dependent installed files. -exec_prefix='@exec_prefix@' -# Directory to find libraries in for `-lXXX'. -libdir=${exec_prefix}/lib -# Directory to search by default for included makefiles. -includedir=${prefix}/include - -# Exit as soon as any command fails. -set -e - -# These are all the objects we need to link together. -objs="commands.o job.o dir.o file.o misc.o main.o read.o remake.o rule.o implicit.o default.o variable.o expand.o function.o vpath.o version.o ar.o arscan.o signame.o getopt.o getopt1.o glob/glob.o glob/fnmatch.o remote-${REMOTE}.o ${extras} ${ALLOCA}" - -# Compile the source files into those objects. -for file in `echo ${objs} | sed 's/\.o/.c/g'`; do - echo compiling ${file}... - $CC $defines $CPPFLAGS $CFLAGS \ - -c -I. -I${srcdir} -I${srcdir}/glob ${srcdir}/$file -done - -# The object files were actually all put in the current directory. -# Remove the source directory names from the list. -srcobjs="$objs" -objs= -for obj in $srcobjs; do - objs="$objs `basename $obj`" -done - -# Link all the objects together. -echo linking make... -$CC $LDFLAGS $objs $LOADLIBES -o make.new -echo done -mv -f make.new make diff --git a/buildtools/windows/source/make/commands.c b/buildtools/windows/source/make/commands.c deleted file mode 100644 index 7c5614f0f4a..00000000000 --- a/buildtools/windows/source/make/commands.c +++ /dev/null @@ -1,521 +0,0 @@ -/* Command processing for GNU Make. -Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "dep.h" -#include "commands.h" -#include "file.h" -#include "variable.h" -#include "job.h" - -extern int remote_kill (); - -#ifndef HAVE_UNISTD_H -extern int getpid (); -#endif - -/* Set FILE's automatic variables up. */ - -static void -set_file_variables (file) - register struct file *file; -{ -// register char *p; - char *at, *percent, *star, *less; - -#ifndef NO_ARCHIVES - /* If the target is an archive member `lib(member)', - then $@ is `lib' and $% is `member'. */ - - if (ar_name (file->name)) - { - unsigned int len; - p = index (file->name, '('); - at = (char *) alloca (p - file->name + 1); - bcopy (file->name, at, p - file->name); - at[p - file->name] = '\0'; - len = strlen (p + 1); - percent = (char *) alloca (len); - bcopy (p + 1, percent, len - 1); - percent[len - 1] = '\0'; - } - else -#endif /* NO_ARCHIVES. */ - { - at = file->name; - percent = ""; - } - - /* $* is the stem from an implicit or static pattern rule. */ - if (file->stem == 0) - { - /* In Unix make, $* is set to the target name with - any suffix in the .SUFFIXES list stripped off for - explicit rules. We store this in the `stem' member. */ - register struct dep *d; - char *name; - unsigned int len; - -#ifndef NO_ARCHIVES - if (ar_name (file->name)) - { - name = index (file->name, '(') + 1; - len = strlen (name) - 1; - } - else -#endif - { - name = file->name; - len = strlen (name); - } - - for (d = enter_file (".SUFFIXES")->deps; d != 0; d = d->next) - { - unsigned int slen = strlen (dep_name (d)); - if (len > slen && !strncmp (dep_name (d), name + (len - slen), slen)) - { - file->stem = savestring (name, len - slen); - break; - } - } - if (d == 0) - file->stem = ""; - } - star = file->stem; - - /* $< is the first dependency. */ - less = file->deps != 0 ? dep_name (file->deps) : ""; - - if (file->cmds == default_file->cmds) - /* This file got its commands from .DEFAULT. - In this case $< is the same as $@. */ - less = at; - -#define DEFINE_VARIABLE(name, len, value) \ - (void) define_variable_for_file (name, len, value, o_automatic, 0, file) - - /* Define the variables. */ - - DEFINE_VARIABLE ("<", 1, less); - DEFINE_VARIABLE ("*", 1, star); - DEFINE_VARIABLE ("@", 1, at); - DEFINE_VARIABLE ("%", 1, percent); - - /* Compute the values for $^, $+, and $?. */ - - { - register unsigned int qmark_len, plus_len; - char *caret_value, *plus_value; - register char *cp; - char *qmark_value; - register char *qp; - register struct dep *d; - unsigned int len; - - /* Compute first the value for $+, which is supposed to contain - duplicate dependencies as they were listed in the makefile. */ - - plus_len = 0; - for (d = file->deps; d != 0; d = d->next) - plus_len += strlen (dep_name (d)) + 1; - - len = plus_len == 0 ? 1 : plus_len; - cp = plus_value = (char *) alloca (len); - - qmark_len = plus_len; /* Will be this or less. */ - for (d = file->deps; d != 0; d = d->next) - { - char *c = dep_name (d); - -#ifndef NO_ARCHIVES - if (ar_name (c)) - { - c = index (c, '(') + 1; - len = strlen (c) - 1; - } - else -#endif - len = strlen (c); - - bcopy (c, cp, len); - cp += len; - *cp++ = ' '; - - if (! d->changed) - qmark_len -= len + 1; /* Don't space in $? for this one. */ - } - - /* Kill the last space and define the variable. */ - - cp[cp > plus_value ? -1 : 0] = '\0'; - DEFINE_VARIABLE ("+", 1, plus_value); - - /* Make sure that no dependencies are repeated. This does not - really matter for the purpose of updating targets, but it - might make some names be listed twice for $^ and $?. */ - - uniquize_deps (file->deps); - - /* Compute the values for $^ and $?. */ - - cp = caret_value = plus_value; /* Reuse the buffer; it's big enough. */ - len = qmark_len == 0 ? 1 : qmark_len; - qp = qmark_value = (char *) alloca (len); - - for (d = file->deps; d != 0; d = d->next) - { - char *c = dep_name (d); - -#ifndef NO_ARCHIVES - if (ar_name (c)) - { - c = index (c, '(') + 1; - len = strlen (c) - 1; - } - else -#endif - len = strlen (c); - - bcopy (c, cp, len); - cp += len; - *cp++ = ' '; - - if (d->changed) - { - bcopy (c, qp, len); - qp += len; - *qp++ = ' '; - } - } - - /* Kill the last spaces and define the variables. */ - - cp[cp > caret_value ? -1 : 0] = '\0'; - DEFINE_VARIABLE ("^", 1, caret_value); - - qp[qp > qmark_value ? -1 : 0] = '\0'; - DEFINE_VARIABLE ("?", 1, qmark_value); - } - -#undef DEFINE_VARIABLE -} - -/* Chop CMDS up into individual command lines if necessary. - Also set the `lines_flag' and `any_recurse' members. */ - -void -chop_commands (cmds) - register struct commands *cmds; -{ - if (cmds != 0 && cmds->command_lines == 0) - { - /* Chop CMDS->commands up into lines in CMDS->command_lines. - Also set the corresponding CMDS->lines_flags elements, - and the CMDS->any_recurse flag. */ - register char *p; - unsigned int nlines, idx; - char **lines; - - nlines = 5; - lines = (char **) xmalloc (5 * sizeof (char *)); - idx = 0; - p = cmds->commands; - while (*p != '\0') - { - char *end = p; - find_end:; - end = index (end, '\n'); - if (end == 0) - end = p + strlen (p); - else if (end > p && end[-1] == '\\') - { - int backslash = 1; - register char *b; - for (b = end - 2; b >= p && *b == '\\'; --b) - backslash = !backslash; - if (backslash) - { - ++end; - goto find_end; - } - } - - if (idx == nlines) - { - nlines += 2; - lines = (char **) xrealloc ((char *) lines, - nlines * sizeof (char *)); - } - lines[idx++] = savestring (p, end - p); - p = end; - if (*p != '\0') - ++p; - } - - if (idx != nlines) - { - nlines = idx; - lines = (char **) xrealloc ((char *) lines, - nlines * sizeof (char *)); - } - - cmds->ncommand_lines = nlines; - cmds->command_lines = lines; - - cmds->any_recurse = 0; - cmds->lines_flags = (char *) xmalloc (nlines); - for (idx = 0; idx < nlines; ++idx) - { - int flags = 0; - - for (p = lines[idx]; - isblank (*p) || *p == '-' || *p == '@' || *p == '+'; - ++p) - switch (*p) - { - case '+': - flags |= COMMANDS_RECURSE; - break; - case '@': - flags |= COMMANDS_SILENT; - break; - case '-': - flags |= COMMANDS_NOERROR; - break; - } - if (!(flags & COMMANDS_RECURSE)) - { - unsigned int len = strlen (p); - if (sindex (p, len, "$(MAKE)", 7) != 0 - || sindex (p, len, "${MAKE}", 7) != 0) - flags |= COMMANDS_RECURSE; - } - - cmds->lines_flags[idx] = flags; - cmds->any_recurse |= flags & COMMANDS_RECURSE; - } - } -} - -/* Execute the commands to remake FILE. If they are currently executing, - return or have already finished executing, just return. Otherwise, - fork off a child process to run the first command line in the sequence. */ - -void -execute_file_commands (file) - struct file *file; -{ - register char *p; - - /* Don't go through all the preparations if - the commands are nothing but whitespace. */ - - for (p = file->cmds->commands; *p != '\0'; ++p) - if (!isspace (*p) && *p != '-' && *p != '@') - break; - if (*p == '\0') - { - /* We are all out of commands. - If we have gotten this far, all the previous commands - have run successfully, so we have winning update status. */ - file->update_status = 0; - notice_finished_file (file); - return; - } - - /* First set the automatic variables according to this file. */ - - initialize_file_variables (file); - - set_file_variables (file); - - /* Start the commands running. */ - new_job (file); -} - -/* This is set while we are inside fatal_error_signal, - so things can avoid nonreentrant operations. */ - -int handling_fatal_signal = 0; - -/* Handle fatal signals. */ - -RETSIGTYPE -fatal_error_signal (sig) - int sig; -{ -#if defined(__MSDOS__) || defined(NETSCAPE) - remove_intermediates (1); - exit (1); -#else /* Not MSDOS. */ - handling_fatal_signal = 1; - - /* Set the handling for this signal to the default. - It is blocked now while we run this handler. */ - signal (sig, SIG_DFL); - - /* A termination signal won't be sent to the entire - process group, but it means we want to kill the children. */ - - if (sig == SIGTERM) - { - register struct child *c; - for (c = children; c != 0; c = c->next) - if (!c->remote) - (void) kill (c->pid, SIGTERM); - } - - /* If we got a signal that means the user - wanted to kill make, remove pending targets. */ - - if (sig == SIGTERM || sig == SIGINT || sig == SIGHUP || sig == SIGQUIT) - { - register struct child *c; - - /* Remote children won't automatically get signals sent - to the process group, so we must send them. */ - for (c = children; c != 0; c = c->next) - if (c->remote) - (void) remote_kill (c->pid, sig); - - for (c = children; c != 0; c = c->next) - delete_child_targets (c); - - /* Clean up the children. We don't just use the call below because - we don't want to print the "Waiting for children" message. */ - while (job_slots_used > 0) - reap_children (1, 0); - } - else - /* Wait for our children to die. */ - while (job_slots_used > 0) - reap_children (1, 1); - - /* Delete any non-precious intermediate files that were made. */ - - remove_intermediates (1); - - if (sig == SIGQUIT) - /* We don't want to send ourselves SIGQUIT, because it will - cause a core dump. Just exit instead. */ - exit (1); - - /* Signal the same code; this time it will really be fatal. The signal - will be unblocked when we return and arrive then to kill us. */ - if (kill (getpid (), sig) < 0) - pfatal_with_name ("kill"); -#endif /* MSDOS. */ -} - -/* Delete FILE unless it's precious or not actually a file (phony), - and it has changed on disk since we last stat'd it. */ - -static void -delete_target (file, on_behalf_of) - struct file *file; - char *on_behalf_of; -{ - struct stat st; - - if (file->precious || file->phony) - return; - -#ifndef NO_ARCHIVES - if (ar_name (file->name)) - { - if (ar_member_date (file->name) != file->last_mtime) - { - if (on_behalf_of) - error ("*** [%s] Archive member `%s' may be bogus; not deleted", - on_behalf_of, file->name); - else - error ("*** Archive member `%s' may be bogus; not deleted", - file->name); - } - return; - } -#endif - - if (safe_stat (file->name, &st) == 0 - && S_ISREG (st.st_mode) - && (time_t) st.st_mtime != file->last_mtime) - { - if (on_behalf_of) - error ("*** [%s] Deleting file `%s'", on_behalf_of, file->name); - else - error ("*** Deleting file `%s'", file->name); - if (unlink (file->name) < 0) - perror_with_name ("unlink: ", file->name); - } -} - - -/* Delete all non-precious targets of CHILD unless they were already deleted. - Set the flag in CHILD to say they've been deleted. */ - -void -delete_child_targets (child) - struct child *child; -{ - struct dep *d; - - if (child->deleted) - return; - - /* Delete the target file if it changed. */ - delete_target (child->file, (char *) 0); - - /* Also remove any non-precious targets listed in the `also_make' member. */ - for (d = child->file->also_make; d != 0; d = d->next) - delete_target (d->file, child->file->name); - - child->deleted = 1; -} - -/* Print out the commands in CMDS. */ - -void -print_commands (cmds) - register struct commands *cmds; -{ - register char *s; - - fputs ("# commands to execute", stdout); - - if (cmds->filename == 0) - puts (" (built-in):"); - else - printf (" (from `%s', line %u):\n", cmds->filename, cmds->lineno); - - s = cmds->commands; - while (*s != '\0') - { - char *end; - - while (isspace (*s)) - ++s; - - end = index (s, '\n'); - if (end == 0) - end = s + strlen (s); - - printf ("\t%.*s\n", (int) (end - s), s); - - s = end; - } -} diff --git a/buildtools/windows/source/make/commands.h b/buildtools/windows/source/make/commands.h deleted file mode 100644 index 31de16ae79e..00000000000 --- a/buildtools/windows/source/make/commands.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Definition of data structures describing shell commands for GNU Make. -Copyright (C) 1988, 1989, 1991, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* Structure that gives the commands to make a file - and information about where these commands came from. */ - -struct commands - { - char *filename; /* File that contains commands. */ - unsigned int lineno; /* Line number in file. */ - char *commands; /* Commands text. */ - unsigned int ncommand_lines;/* Number of command lines. */ - char **command_lines; /* Commands chopped up into lines. */ - char *lines_flags; /* One set of flag bits for each line. */ - int any_recurse; /* Nonzero if any `lines_recurse' elt has */ - /* the COMMANDS_RECURSE bit set. */ - }; - -/* Bits in `lines_flags'. */ -#define COMMANDS_RECURSE 1 /* Recurses: + or $(MAKE). */ -#define COMMANDS_SILENT 2 /* Silent: @. */ -#define COMMANDS_NOERROR 4 /* No errors: -. */ - -extern void execute_file_commands (); -extern void print_commands (); -extern void delete_child_targets (); -extern void chop_commands (); diff --git a/buildtools/windows/source/make/config.h b/buildtools/windows/source/make/config.h deleted file mode 100644 index 8c12f31d0c2..00000000000 --- a/buildtools/windows/source/make/config.h +++ /dev/null @@ -1,275 +0,0 @@ -/* config.h.in. Generated automatically from configure.in by autoheader. */ - -/* Define if on AIX 3. - System headers sometimes define this. - We just want to avoid a redefinition error message. */ -#ifndef _ALL_SOURCE -#undef _ALL_SOURCE -#endif - -/* Define if using alloca.c. */ -#undef C_ALLOCA - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. - This function is required for alloca.c support on those systems. */ -#undef CRAY_STACKSEG_END - -/* Define for DGUX with . */ -#undef DGUX - -/* Define if the `getloadavg' function needs to be run setuid or setgid. */ -#undef GETLOADAVG_PRIVILEGED - -/* Define to `int' if doesn't define. */ -#define gid_t - -/* Define if you have alloca, as a function or macro. */ -#undef HAVE_ALLOCA - -/* Define if you have and it should be used (not on Ultrix). */ -#undef HAVE_ALLOCA_H - -/* Define if you don't have vprintf but do have _doprnt. */ -#undef HAVE_DOPRNT - -/* Define if your system has its own `getloadavg' function. */ -#undef HAVE_GETLOADAVG - -/* Define if you have the getmntent function. */ -#undef HAVE_GETMNTENT - -/* Define if the `long double' type works. */ -#undef HAVE_LONG_DOUBLE - -/* Define if you support file names longer than 14 characters. */ -#define HAVE_LONG_FILE_NAMES - -/* Define if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define if system calls automatically restart after interruption - by a signal. */ -#undef HAVE_RESTARTABLE_SYSCALLS - -/* Define if your struct stat has st_blksize. */ -#undef HAVE_ST_BLKSIZE - -/* Define if your struct stat has st_blocks. */ -#undef HAVE_ST_BLOCKS - -/* Define if you have the strcoll function and it is properly defined. */ -#undef HAVE_STRCOLL - -/* Define if your struct stat has st_rdev. */ -#undef HAVE_ST_RDEV - -/* Define if you have the strftime function. */ -#define HAVE_STRFTIME - -/* Define if you have that is POSIX.1 compatible. */ -#undef HAVE_SYS_WAIT_H - -/* Define if your struct tm has tm_zone. */ -#undef HAVE_TM_ZONE - -/* Define if you don't have tm_zone but do have the external array - tzname. */ -#define HAVE_TZNAME - -/* Define if you have . */ -#undef HAVE_UNISTD_H - -/* Define if utime(file, NULL) sets file's timestamp to the present. */ -#define HAVE_UTIME_NULL - -/* Define if you have . */ -#undef HAVE_VFORK_H - -/* Define if you have the vprintf function. */ -#undef HAVE_VPRINTF - -/* Define if you have the wait3 system call. */ -#undef HAVE_WAIT3 - -/* Define if on MINIX. */ -#undef _MINIX - -/* Define if your struct nlist has an n_un member. */ -#undef NLIST_NAME_UNION - -/* Define if you have . */ -#undef NLIST_STRUCT - -/* Define if your C compiler doesn't accept -c and -o together. */ -#define NO_MINUS_C_MINUS_O - -/* Define to `int' if doesn't define. */ -#define pid_t int - -/* Define if the system does not provide POSIX.1 features except - with this defined. */ -#undef _POSIX_1_SOURCE - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - -/* Define as the return type of signal handlers (int or void). */ -#undef RETSIGTYPE - -/* Define if the setvbuf function takes the buffering type as its second - argument and the buffer pointer as the third, as on System V - before release 3. */ -#undef SETVBUF_REVERSED - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown - */ -#undef STACK_DIRECTION - -/* Define if the `S_IS*' macros in do not work properly. */ -#define STAT_MACROS_BROKEN - -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS - -/* Define on System V Release 4. */ -#undef SVR4 - -/* Define if `sys_siglist' is declared by . */ -#undef SYS_SIGLIST_DECLARED - -/* Define to `int' if doesn't define. */ -#define uid_t int - -/* Define for Encore UMAX. */ -#undef UMAX - -/* Define for Encore UMAX 4.3 that has - instead of . */ -#undef UMAX4_3 - -/* Define vfork as fork if vfork does not work. */ -#undef vfork - -/* Define to the name of the SCCS `get' command. */ -#define SCCS_GET "get" - -/* Define this if the SCCS `get' command understands the `-G' option. */ -#undef SCCS_GET_MINUS_G - -/* Define this if the C library defines the variable `sys_siglist'. */ -#undef HAVE_SYS_SIGLIST - -/* Define this if the C library defines the variable `_sys_siglist'. */ -#undef HAVE__SYS_SIGLIST - -/* Define this if you have the `union wait' type in . */ -#undef HAVE_UNION_WAIT - -/* Define this if the POSIX.1 call `sysconf (_SC_OPEN_MAX)' works properly. */ -#undef HAVE_SYSCONF_OPEN_MAX - -/* Define if you have the dup2 function. */ -#undef HAVE_DUP2 - -/* Define if you have the getcwd function. */ -#define HAVE_GETCWD - -/* Define if you have the getdtablesize function. */ -#undef HAVE_GETDTABLESIZE - -/* Define if you have the getgroups function. */ -#undef HAVE_GETGROUPS - -/* Define if you have the mktemp function. */ -#undef HAVE_MKTEMP - -/* Define if you have the psignal function. */ -#undef HAVE_PSIGNAL - -/* Define if you have the setegid function. */ -#undef HAVE_SETEGID - -/* Define if you have the seteuid function. */ -#undef HAVE_SETEUID - -/* Define if you have the setlinebuf function. */ -#undef HAVE_SETLINEBUF - -/* Define if you have the setregid function. */ -#undef HAVE_SETREGID - -/* Define if you have the setreuid function. */ -#undef HAVE_SETREUID - -/* Define if you have the sigsetmask function. */ -#undef HAVE_SIGSETMASK - -/* Define if you have the strerror function. */ -#undef HAVE_STRERROR - -/* Define if you have the strsignal function. */ -#undef HAVE_STRSIGNAL - -/* Define if you have the wait3 function. */ -#undef HAVE_WAIT3 - -/* Define if you have the waitpid function. */ -#undef HAVE_WAITPID - -/* Define if you have the header file. */ -#undef HAVE_DIRENT_H - -/* Define if you have the header file. */ -#define HAVE_FCNTL_H - -/* Define if you have the header file. */ -#undef HAVE_LIMITS_H - -/* Define if you have the header file. */ -#undef HAVE_MACH_MACH_H - -/* Define if you have the header file. */ -#define HAVE_MEMORY_H - -/* Define if you have the header file. */ -#undef HAVE_NDIR_H - -/* Define if you have the header file. */ -#define HAVE_STRING_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_DIR_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_NDIR_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_TIMEB_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_WAIT_H - -/* Define if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define if you have the dgc library (-ldgc). */ -#undef HAVE_LIBDGC - -/* Define if you have the sun library (-lsun). */ -#undef HAVE_LIBSUN - -/* NETSCAPE: Under win32, define default libdir */ -#define LIBDIR "\\msvc20\\lib" -#define NO_ARCHIVES -#define HAVE_GLOB_H diff --git a/buildtools/windows/source/make/config.h.in b/buildtools/windows/source/make/config.h.in deleted file mode 100644 index 56af1f3a4ac..00000000000 --- a/buildtools/windows/source/make/config.h.in +++ /dev/null @@ -1,270 +0,0 @@ -/* config.h.in. Generated automatically from configure.in by autoheader. */ - -/* Define if on AIX 3. - System headers sometimes define this. - We just want to avoid a redefinition error message. */ -#ifndef _ALL_SOURCE -#undef _ALL_SOURCE -#endif - -/* Define if using alloca.c. */ -#undef C_ALLOCA - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. - This function is required for alloca.c support on those systems. */ -#undef CRAY_STACKSEG_END - -/* Define for DGUX with . */ -#undef DGUX - -/* Define if the `getloadavg' function needs to be run setuid or setgid. */ -#undef GETLOADAVG_PRIVILEGED - -/* Define to `int' if doesn't define. */ -#undef gid_t - -/* Define if you have alloca, as a function or macro. */ -#undef HAVE_ALLOCA - -/* Define if you have and it should be used (not on Ultrix). */ -#undef HAVE_ALLOCA_H - -/* Define if you don't have vprintf but do have _doprnt. */ -#undef HAVE_DOPRNT - -/* Define if your system has its own `getloadavg' function. */ -#undef HAVE_GETLOADAVG - -/* Define if you have the getmntent function. */ -#undef HAVE_GETMNTENT - -/* Define if the `long double' type works. */ -#undef HAVE_LONG_DOUBLE - -/* Define if you support file names longer than 14 characters. */ -#undef HAVE_LONG_FILE_NAMES - -/* Define if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define if system calls automatically restart after interruption - by a signal. */ -#undef HAVE_RESTARTABLE_SYSCALLS - -/* Define if your struct stat has st_blksize. */ -#undef HAVE_ST_BLKSIZE - -/* Define if your struct stat has st_blocks. */ -#undef HAVE_ST_BLOCKS - -/* Define if you have the strcoll function and it is properly defined. */ -#undef HAVE_STRCOLL - -/* Define if your struct stat has st_rdev. */ -#undef HAVE_ST_RDEV - -/* Define if you have the strftime function. */ -#undef HAVE_STRFTIME - -/* Define if you have that is POSIX.1 compatible. */ -#undef HAVE_SYS_WAIT_H - -/* Define if your struct tm has tm_zone. */ -#undef HAVE_TM_ZONE - -/* Define if you don't have tm_zone but do have the external array - tzname. */ -#undef HAVE_TZNAME - -/* Define if you have . */ -#undef HAVE_UNISTD_H - -/* Define if utime(file, NULL) sets file's timestamp to the present. */ -#undef HAVE_UTIME_NULL - -/* Define if you have . */ -#undef HAVE_VFORK_H - -/* Define if you have the vprintf function. */ -#undef HAVE_VPRINTF - -/* Define if you have the wait3 system call. */ -#undef HAVE_WAIT3 - -/* Define if on MINIX. */ -#undef _MINIX - -/* Define if your struct nlist has an n_un member. */ -#undef NLIST_NAME_UNION - -/* Define if you have . */ -#undef NLIST_STRUCT - -/* Define if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - -/* Define to `int' if doesn't define. */ -#undef pid_t - -/* Define if the system does not provide POSIX.1 features except - with this defined. */ -#undef _POSIX_1_SOURCE - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - -/* Define as the return type of signal handlers (int or void). */ -#undef RETSIGTYPE - -/* Define if the setvbuf function takes the buffering type as its second - argument and the buffer pointer as the third, as on System V - before release 3. */ -#undef SETVBUF_REVERSED - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown - */ -#undef STACK_DIRECTION - -/* Define if the `S_IS*' macros in do not work properly. */ -#undef STAT_MACROS_BROKEN - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define on System V Release 4. */ -#undef SVR4 - -/* Define if `sys_siglist' is declared by . */ -#undef SYS_SIGLIST_DECLARED - -/* Define to `int' if doesn't define. */ -#undef uid_t - -/* Define for Encore UMAX. */ -#undef UMAX - -/* Define for Encore UMAX 4.3 that has - instead of . */ -#undef UMAX4_3 - -/* Define vfork as fork if vfork does not work. */ -#undef vfork - -/* Define to the name of the SCCS `get' command. */ -#undef SCCS_GET - -/* Define this if the SCCS `get' command understands the `-G' option. */ -#undef SCCS_GET_MINUS_G - -/* Define this if the C library defines the variable `sys_siglist'. */ -#undef HAVE_SYS_SIGLIST - -/* Define this if the C library defines the variable `_sys_siglist'. */ -#undef HAVE__SYS_SIGLIST - -/* Define this if you have the `union wait' type in . */ -#undef HAVE_UNION_WAIT - -/* Define this if the POSIX.1 call `sysconf (_SC_OPEN_MAX)' works properly. */ -#undef HAVE_SYSCONF_OPEN_MAX - -/* Define if you have the dup2 function. */ -#undef HAVE_DUP2 - -/* Define if you have the getcwd function. */ -#undef HAVE_GETCWD - -/* Define if you have the getdtablesize function. */ -#undef HAVE_GETDTABLESIZE - -/* Define if you have the getgroups function. */ -#undef HAVE_GETGROUPS - -/* Define if you have the mktemp function. */ -#undef HAVE_MKTEMP - -/* Define if you have the psignal function. */ -#undef HAVE_PSIGNAL - -/* Define if you have the setegid function. */ -#undef HAVE_SETEGID - -/* Define if you have the seteuid function. */ -#undef HAVE_SETEUID - -/* Define if you have the setlinebuf function. */ -#undef HAVE_SETLINEBUF - -/* Define if you have the setregid function. */ -#undef HAVE_SETREGID - -/* Define if you have the setreuid function. */ -#undef HAVE_SETREUID - -/* Define if you have the sigsetmask function. */ -#undef HAVE_SIGSETMASK - -/* Define if you have the strerror function. */ -#undef HAVE_STRERROR - -/* Define if you have the strsignal function. */ -#undef HAVE_STRSIGNAL - -/* Define if you have the wait3 function. */ -#undef HAVE_WAIT3 - -/* Define if you have the waitpid function. */ -#undef HAVE_WAITPID - -/* Define if you have the header file. */ -#undef HAVE_DIRENT_H - -/* Define if you have the header file. */ -#undef HAVE_FCNTL_H - -/* Define if you have the header file. */ -#undef HAVE_LIMITS_H - -/* Define if you have the header file. */ -#undef HAVE_MACH_MACH_H - -/* Define if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define if you have the header file. */ -#undef HAVE_NDIR_H - -/* Define if you have the header file. */ -#undef HAVE_STRING_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_DIR_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_NDIR_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_TIMEB_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_WAIT_H - -/* Define if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define if you have the dgc library (-ldgc). */ -#undef HAVE_LIBDGC - -/* Define if you have the sun library (-lsun). */ -#undef HAVE_LIBSUN diff --git a/buildtools/windows/source/make/configh.dos b/buildtools/windows/source/make/configh.dos deleted file mode 100644 index da5681bc93d..00000000000 --- a/buildtools/windows/source/make/configh.dos +++ /dev/null @@ -1,136 +0,0 @@ -/* Generated automatically from configure.in by autoheader. DO NOT EDIT! */ - - - -#define INCLUDEDIR "c:/djgpp/include" - -#define LIBDIR "c:/djgpp/lib" - - - -/* Define if you have dirent.h. */ - -#define DIRENT - - - -/* Define if you have the strcoll function and it is properly defined. */ - -#define HAVE_STRCOLL - - - -/* Define if you have unistd.h. */ - -#define HAVE_UNISTD_H - - - -/* Define as the return type of signal handlers (int or void). */ - -#define RETSIGTYPE void - - - -/* Define if you have the ANSI C header files. */ - -#ifndef STDC_HEADERS - -#define STDC_HEADERS - -#endif - - - -/* Define if `sys_siglist' is declared by . */ - -#define SYS_SIGLIST_DECLARED - - - -/* Define if you have getdtablesize. */ - -#define HAVE_GETDTABLESIZE - - - -/* Define if you have dup2. */ - -#define HAVE_DUP2 - - - -/* Define if you have sys_siglist. */ - -#undef HAVE_SYS_SIGLIST - - - -/* Define if you have _sys_siglist. */ - -#undef HAVE__SYS_SIGLIST - - - -/* Define if you have psignal. */ - -#define HAVE_PSIGNAL - - - -/* Define if you have getcwd. */ - -#define HAVE_GETCWD - - - -/* Define if you have sigsetmask. */ - -#define HAVE_SIGSETMASK - - - -/* Define if you have setlinebuf. */ - -#define HAVE_SETLINEBUF - - - -/* Define if you have the header file. */ - -#define HAVE_LIMITS_H - - - -/* Define if you have the header file. */ - -#undef HAVE_SYS_PARAM_H - - - -/* Define if you have the header file. */ - -#define HAVE_FCNTL_H - - - -/* Define if you have the header file. */ - -#define HAVE_STRING_H - - - -/* Define if you have the header file. */ - -#define HAVE_MEMORY_H - - - -/* Define if you have the `strerror' function. */ - -#define HAVE_STRERROR - - - -#define SCCS_GET "get" - diff --git a/buildtools/windows/source/make/configure b/buildtools/windows/source/make/configure deleted file mode 100644 index ec939c3e779..00000000000 --- a/buildtools/windows/source/make/configure +++ /dev/null @@ -1,2991 +0,0 @@ -#! /bin/sh - -# From configure.in Id: configure.in,v 1.48 1995/03/21 21:23:26 roland Exp -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.3 -# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help -export jobs with the Customs daemon (NOT SUPPORTED)" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE - -# Initialize some other variables. -subdirs= - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -build | --build | --buil | --bui | --bu | --b) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=PREFIX install architecture-dependent files in PREFIX - [same as prefix] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR ---enable and --with options recognized:$ac_help -EOF - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.3" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# 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 -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# 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 "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LANG+set}" = set; then LANG=C; export LANG; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=vpath.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5' - -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 - - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - -subdirs="glob" - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -set dummy ${MAKE-make}; ac_make=$2 -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="cc" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5 | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 -if test $ac_cv_prog_gcc = yes; then - GCC=yes - if test "${CFLAGS+set}" != set; then - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_gcc_g=yes -else - ac_cv_prog_gcc_g=no -fi -rm -f conftest* - -fi - echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 - if test $ac_cv_prog_gcc_g = yes; then - CFLAGS="-g -O" - else - CFLAGS="-O" - fi - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - for ac_prog in ginstall installbsd scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - # OSF/1 installbsd also uses dspmsg, but is usable. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_ifs" - # As a last resort, use the slow shell script. - test -z "$ac_cv_path_install" && ac_cv_path_install="$ac_install_sh" -fi - INSTALL="$ac_cv_path_install" -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi -fi -CPP="$ac_cv_prog_CPP" -echo "$ac_t""$CPP" 1>&6 - echo $ac_n "checking for AIX""... $ac_c" 1>&6 -cat > conftest.$ac_ext <&5 | - egrep "yes" >/dev/null 2>&1; then - rm -rf conftest* - echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF -#define _ALL_SOURCE 1 -EOF - -else - rm -rf conftest* - echo "$ac_t""no" 1>&6 -fi -rm -f conftest* - - -echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 -if test -d /etc/conf/kconfig.d && - grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 -then - echo "$ac_t""yes" 1>&6 - ISC=yes # If later tests want to check for ISC. - cat >> confdefs.h <<\EOF -#define _POSIX_SOURCE 1 -EOF - - if test "$GCC" = yes; then - CC="$CC -posix" - else - CC="$CC -Xp" - fi -else - echo "$ac_t""no" 1>&6 - ISC= -fi - -ac_safe=`echo "minix/config.h" | tr './\055' '___'` -echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - MINIX=yes -else - echo "$ac_t""no" 1>&6 -MINIX= -fi - -if test "$MINIX" = yes; then - cat >> confdefs.h <<\EOF -#define _POSIX_SOURCE 1 -EOF - - cat >> confdefs.h <<\EOF -#define _POSIX_1_SOURCE 2 -EOF - - cat >> confdefs.h <<\EOF -#define _MINIX 1 -EOF - -fi - -# If we cannot run a trivial program, we must be cross compiling. -echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_cross=yes -else -cat > conftest.$ac_ext </dev/null; then - ac_cv_c_cross=no -else - ac_cv_c_cross=yes -fi -fi -rm -fr conftest* -fi -cross_compiling=$ac_cv_c_cross -echo "$ac_t""$ac_cv_c_cross" 1>&6 - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -#include -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - ac_cv_header_stdc=no -else -cat > conftest.$ac_ext < -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - : -else - ac_cv_header_stdc=no -fi -fi -rm -fr conftest* -fi -fi -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -ac_header_dirent=no -for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h -do -ac_safe=`echo "$ac_hdr" | tr './\055' '___'` -echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include <$ac_hdr> -int main() { return 0; } -int t() { -DIR *dirp = 0; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - eval "ac_cv_header_dirent_$ac_safe=yes" -else - rm -rf conftest* - eval "ac_cv_header_dirent_$ac_safe=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'` - cat >> confdefs.h <&6 -fi -done -# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. -if test $ac_header_dirent = dirent.h; then -echo $ac_n "checking for -ldir""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_dir'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldir $LIBS" -cat > conftest.$ac_ext <&6 - LIBS="$LIBS -ldir" -else - echo "$ac_t""no" 1>&6 -fi - -else -echo $ac_n "checking for -lx""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_x'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lx $LIBS" -cat > conftest.$ac_ext <&6 - LIBS="$LIBS -lx" -else - echo "$ac_t""no" 1>&6 -fi - -fi - -echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "uid_t" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_uid_t=yes -else - rm -rf conftest* - ac_cv_type_uid_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_uid_t" 1>&6 -if test $ac_cv_type_uid_t = no; then - cat >> confdefs.h <<\EOF -#define uid_t int -EOF - - cat >> confdefs.h <<\EOF -#define gid_t int -EOF - -fi - echo $ac_n "checking for pid_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "pid_t" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_pid_t=yes -else - rm -rf conftest* - ac_cv_type_pid_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_pid_t" 1>&6 -if test $ac_cv_type_pid_t = no; then - cat >> confdefs.h <<\EOF -#define pid_t int -EOF - -fi - -echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#ifdef signal -#undef signal -#endif -#ifdef __cplusplus -extern "C" -#endif -void (*signal ()) (); -int main() { return 0; } -int t() { -int i; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - ac_cv_type_signal=void -else - rm -rf conftest* - ac_cv_type_signal=int -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_signal" 1>&6 -cat >> confdefs.h <&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'` - cat >> confdefs.h <&6 -fi -done - -if test "x$CC" != xcc; then - echo $ac_n "checking whether $CC and cc understand -c and -o together""... $ac_c" 1>&6 -else - echo $ac_n "checking whether cc understands -c and -o together""... $ac_c" 1>&6 -fi -set dummy $CC; ac_cc="`echo $2 | - sed -e 's/[^a-zA-Z0-9_]/_/g' -e 's/^[0-9]/_/'`" -if eval "test \"`echo '$''{'ac_cv_prog_cc_${ac_cc}_c_o'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -echo 'foo(){}' > conftest.c -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -if ${CC-cc} -c conftest.c -o conftest.o 1>&5 2>&5 && - test -f conftest.o && ${CC-cc} -c conftest.c -o conftest.o 1>&5 2>&5 -then - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if cc -c conftest.c 1>&5 2>&5 - then - if cc -c conftest.c -o conftest2.o 1>&5 2>&5 && - test -f conftest2.o && cc -c conftest.c -o conftest2.o 1>&5 2>&5 - then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - fi - fi - fi -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" = yes"; then - echo "$ac_t""yes" 1>&6 -else - echo "$ac_t""no" 1>&6 - cat >> confdefs.h <<\EOF -#define NO_MINUS_C_MINUS_O 1 -EOF - -fi - -echo $ac_n "checking for working const""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <j = 5; -} -{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -} - -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - ac_cv_c_const=yes -else - rm -rf conftest* - ac_cv_c_const=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_c_const" 1>&6 -if test $ac_cv_c_const = no; then - cat >> confdefs.h <<\EOF -#define const -EOF - -fi - echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include - -#if defined(S_ISBLK) && defined(S_IFDIR) -# if S_ISBLK (S_IFDIR) -You lose. -# endif -#endif - -#if defined(S_ISBLK) && defined(S_IFCHR) -# if S_ISBLK (S_IFCHR) -You lose. -# endif -#endif - -#if defined(S_ISLNK) && defined(S_IFREG) -# if S_ISLNK (S_IFREG) -You lose. -# endif -#endif - -#if defined(S_ISSOCK) && defined(S_IFREG) -# if S_ISSOCK (S_IFREG) -You lose. -# endif -#endif - -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "You lose" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_header_stat_broken=yes -else - rm -rf conftest* - ac_cv_header_stat_broken=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_header_stat_broken" 1>&6 -if test $ac_cv_header_stat_broken = yes; then - cat >> confdefs.h <<\EOF -#define STAT_MACROS_BROKEN 1 -EOF - -fi - - - - - -for ac_func in getdtablesize psignal mktemp \ - dup2 getcwd sigsetmask getgroups setlinebuf \ - seteuid setegid setreuid setregid strerror strsignal -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+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. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* 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_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr '[a-z]' '[A-Z]'` - cat >> confdefs.h <&6 -fi -done - -echo $ac_n "checking for sys_siglist""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_check_symbol_sys_siglist'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <> confdefs.h <&6 -echo $ac_n "checking for _sys_siglist""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_check_symbol__sys_siglist'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <> confdefs.h <&6 -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -char *p = alloca(2 * sizeof(int)); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - ac_cv_header_alloca_h=yes -else - rm -rf conftest* - ac_cv_header_alloca_h=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 -if test $ac_cv_header_alloca_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA_H 1 -EOF - -fi - -echo $ac_n "checking for alloca""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_alloca'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -#endif - -int main() { return 0; } -int t() { -char *p = (char *) alloca(1); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - ac_cv_func_alloca=yes -else - rm -rf conftest* - ac_cv_func_alloca=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_func_alloca" 1>&6 -if test $ac_cv_func_alloca = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA 1 -EOF - -fi - -if test $ac_cv_func_alloca = no; then - # The SVR3 libPW and SVR4 libucb both contain incompatible functions - # that cause trouble. Some versions do not even contain alloca or - # contain a buggy version. If you still want to use their alloca, - # use ar to extract alloca.o from them instead of compiling alloca.c. - ALLOCA=alloca.o - cat >> confdefs.h <<\EOF -#define C_ALLOCA 1 -EOF - - -echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5 | - egrep "webecray" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_os_cray=yes -else - rm -rf conftest* - ac_cv_os_cray=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_os_cray" 1>&6 -if test $ac_cv_os_cray = yes; then -for ac_func in _getb67 GETB67 getb67; do - echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+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. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* 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_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <&6 -fi - -done -fi - -echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_stack_direction=0 -else -cat > conftest.$ac_ext < addr) ? 1 : -1; -} -main () -{ - exit (find_stack_direction() < 0); -} -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_c_stack_direction=1 -else - ac_cv_c_stack_direction=-1 -fi -fi -rm -fr conftest* -fi -echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 -cat >> confdefs.h <&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - cat >> confdefs.h <<\EOF -#define HAVE_VFORK_H 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking for working vfork""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_vfork'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_vfork=no -else -cat > conftest.$ac_ext < -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_VFORK_H -#include -#endif -/* On some sparc systems, changes by the child to local and incoming - argument registers are propagated back to the parent. - The compiler is told about this with #include , - but some compilers (e.g. gcc -O) don't grok . - Test for this by using a static variable whose address - is put into a register that is clobbered by the vfork. */ -static -#ifdef __cplusplus -sparc_address_test (int arg) -#else -sparc_address_test (arg) int arg; -#endif -{ - static pid_t child; - if (!child) { - child = vfork (); - if (child < 0) - perror ("vfork"); - if (!child) { - arg = getpid(); - write(-1, "", 0); - _exit (arg); - } - } -} -main() { - pid_t parent = getpid (); - pid_t child; - - sparc_address_test (); - - child = vfork (); - - if (child == 0) { - /* Here is another test for sparc vfork register problems. - This test uses lots of local variables, at least - as many local variables as main has allocated so far - including compiler temporaries. 4 locals are enough for - gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. - A buggy compiler should reuse the register of parent - for one of the local variables, since it will think that - parent can't possibly be used any more in this routine. - Assigning to the local variable will thus munge parent - in the parent process. */ - pid_t - p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), - p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); - /* Convince the compiler that p..p7 are live; otherwise, it might - use the same hardware register for all 8 local variables. */ - if (p != p1 || p != p2 || p != p3 || p != p4 - || p != p5 || p != p6 || p != p7) - _exit(1); - - /* On some systems (e.g. IRIX 3.3), - vfork doesn't separate parent from child file descriptors. - If the child closes a descriptor before it execs or exits, - this munges the parent's descriptor as well. - Test for this by closing stdout in the child. */ - _exit(close(fileno(stdout)) != 0); - } else { - int status; - struct stat st; - - while (wait(&status) != child) - ; - exit( - /* Was there some problem with vforking? */ - child < 0 - - /* Did the child fail? (This shouldn't happen.) */ - || status - - /* Did the vfork/compiler bug occur? */ - || parent != getpid() - - /* Did the file descriptor bug occur? */ - || fstat(fileno(stdout), &st) != 0 - ); - } -} -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_func_vfork=yes -else - ac_cv_func_vfork=no -fi -fi -rm -fr conftest* -fi -echo "$ac_t""$ac_cv_func_vfork" 1>&6 -if test $ac_cv_func_vfork = no; then - cat >> confdefs.h <<\EOF -#define vfork fork -EOF - -fi - -echo $ac_n "checking whether setvbuf arguments are reversed""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_setvbuf_reversed'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext < -/* If setvbuf has the reversed format, exit 0. */ -main () { - /* This call has the arguments reversed. - A reversed system may check and see that the address of main - is not _IOLBF, _IONBF, or _IOFBF, and return nonzero. */ - if (setvbuf(stdout, _IOLBF, (char *) main, BUFSIZ) != 0) - exit(1); - putc('\r', stdout); - exit(0); /* Non-reversed systems segv here. */ -} -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_func_setvbuf_reversed=yes -else - ac_cv_func_setvbuf_reversed=no -fi -fi -rm -fr conftest* -rm -f core core.* *.core -fi -echo "$ac_t""$ac_cv_func_setvbuf_reversed" 1>&6 -if test $ac_cv_func_setvbuf_reversed = yes; then - cat >> confdefs.h <<\EOF -#define SETVBUF_REVERSED 1 -EOF - -fi - -ac_have_func=no # yes means we've found a way to get the load average. - -# Some systems with -lutil have (and need) -lkvm as well, some do not. -# On Solaris, -lkvm requires nlist from -lelf, so check that first -# to get the right answer into the cache. -echo $ac_n "checking for -lelf""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_elf'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lelf $LIBS" -cat > conftest.$ac_ext <&6 - LIBS="-lelf $LIBS" -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking for -lkvm""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_kvm'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lkvm $LIBS" -cat > conftest.$ac_ext <&6 - LIBS="-lkvm $LIBS" -else - echo "$ac_t""no" 1>&6 -fi - -# Check for the 4.4BSD definition of getloadavg. -echo $ac_n "checking for -lutil""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_util'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lutil $LIBS" -cat > conftest.$ac_ext <&6 - LIBS="-lutil $LIBS" ac_have_func=yes ac_cv_func_getloadavg_setgid=yes -else - echo "$ac_t""no" 1>&6 -fi - - -if test $ac_have_func = no; then - # There is a commonly available library for RS/6000 AIX. - # Since it is not a standard part of AIX, it might be installed locally. - ac_save_LIBS="$LIBS" LIBS="-L/usr/local/lib $LIBS" - echo $ac_n "checking for -lgetloadavg""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_getloadavg'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lgetloadavg $LIBS" -cat > conftest.$ac_ext <&6 - LIBS="-lgetloadavg $LIBS" -else - echo "$ac_t""no" 1>&6 -LIBS="$ac_save_LIBS" -fi - -fi - -# Make sure it is really in the library, if we think we found it. -for ac_func in getloadavg -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+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. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* 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_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - : -else - echo "$ac_t""no" 1>&6 -LIBOBJS="$LIBOBJS ${ac_func}.o" -fi - -done - - -if test $ac_cv_func_getloadavg = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_GETLOADAVG 1 -EOF - - ac_have_func=yes -else - # Figure out what our getloadavg.c needs. - ac_have_func=no - ac_safe=`echo "sys/dg_sys_info.h" | tr './\055' '___'` -echo $ac_n "checking for sys/dg_sys_info.h""... $ac_c" 1>&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - ac_have_func=yes; cat >> confdefs.h <<\EOF -#define DGUX 1 -EOF - - echo $ac_n "checking for -ldgc""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_dgc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldgc $LIBS" -cat > conftest.$ac_ext <&6 - ac_tr_lib=HAVE_LIB`echo dgc | tr '[a-z]' '[A-Z]'` - cat >> confdefs.h <&6 -fi - -else - echo "$ac_t""no" 1>&6 -fi - - - # We cannot check for , because Solaris 2 does not use dwarf (it - # uses stabs), but it is still SVR4. We cannot check for because - # Irix 4.0.5F has the header but not the library. - if test $ac_have_func = no && test $ac_cv_lib_elf = yes; then - ac_have_func=yes; cat >> confdefs.h <<\EOF -#define SVR4 1 -EOF - - fi - - if test $ac_have_func = no; then - ac_safe=`echo "inq_stats/cpustats.h" | tr './\055' '___'` -echo $ac_n "checking for inq_stats/cpustats.h""... $ac_c" 1>&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - ac_have_func=yes; cat >> confdefs.h <<\EOF -#define UMAX 1 -EOF - - cat >> confdefs.h <<\EOF -#define UMAX4_3 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - - fi - - if test $ac_have_func = no; then - ac_safe=`echo "sys/cpustats.h" | tr './\055' '___'` -echo $ac_n "checking for sys/cpustats.h""... $ac_c" 1>&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - ac_have_func=yes; cat >> confdefs.h <<\EOF -#define UMAX 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - - fi - - if test $ac_have_func = no; then - for ac_hdr in mach/mach.h -do -ac_safe=`echo "$ac_hdr" | tr './\055' '___'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'` - cat >> confdefs.h <&6 -fi -done - - fi - - ac_safe=`echo "nlist.h" | tr './\055' '___'` -echo $ac_n "checking for nlist.h""... $ac_c" 1>&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - cat >> confdefs.h <<\EOF -#define NLIST_STRUCT 1 -EOF - - echo $ac_n "checking for n_un in struct nlist""... $ac_c" 1>&6 - if eval "test \"`echo '$''{'ac_cv_struct_nlist_n_un'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -struct nlist n; n.n_un.n_name = 0; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - ac_cv_struct_nlist_n_un=yes -else - rm -rf conftest* - ac_cv_struct_nlist_n_un=no -fi -rm -f conftest* - -fi - echo "$ac_t""$ac_cv_struct_nlist_n_un" 1>&6 - if test $ac_cv_struct_nlist_n_un = yes; then - cat >> confdefs.h <<\EOF -#define NLIST_NAME_UNION 1 -EOF - - fi - -else - echo "$ac_t""no" 1>&6 -fi -fi # Do not have getloadavg in system libraries. - -# Some definitions of getloadavg require that the program be installed setgid. -echo $ac_n "checking whether getloadavg requires setgid""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_getloadavg_setgid'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5 | - egrep "Yowza Am I SETGID yet" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_func_getloadavg_setgid=yes -else - rm -rf conftest* - ac_cv_func_getloadavg_setgid=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_func_getloadavg_setgid" 1>&6 -if test $ac_cv_func_getloadavg_setgid = yes; then - NEED_SETGID=true; cat >> confdefs.h <<\EOF -#define GETLOADAVG_PRIVILEGED 1 -EOF - -else - NEED_SETGID=false -fi - -if test $ac_cv_func_getloadavg_setgid = yes; then - echo $ac_n "checking group of /dev/kmem""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_group_kmem'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # On Solaris, /dev/kmem is a symlink. Get info on the real file. - ac_ls_output=`ls -lgL /dev/kmem 2>/dev/null` - # If we got an error (system does not support symlinks), try without -L. - test -z "$ac_ls_output" && ac_ls_output=`ls -lg /dev/kmem` - ac_cv_group_kmem=`echo $ac_ls_output \ - | sed -ne 's/[ ][ ]*/ /g; - s/^.[sSrwx-]* *[0-9]* *\([^0-9]*\) *.*/\1/; - / /s/.* //;p;'` - -fi - KMEM_GROUP=$ac_cv_group_kmem - echo "$ac_t""$KMEM_GROUP" 1>&6 -fi - -echo $ac_n "checking for strcoll""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_strcoll'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_strcoll=no -else -cat > conftest.$ac_ext < -main () -{ - exit (strcoll ("abc", "def") >= 0 || - strcoll ("ABC", "DEF") >= 0 || - strcoll ("123", "456") >= 0); -} -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_func_strcoll=yes -else - ac_cv_func_strcoll=no -fi -fi -rm -fr conftest* -fi -echo "$ac_t""$ac_cv_func_strcoll" 1>&6 -if test $ac_cv_func_strcoll = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_STRCOLL 1 -EOF - -fi - - -if test $ac_cv_func_getdtablesize = no; then - echo $ac_n "checking for sysconf (_SC_OPEN_MAX)""... $ac_c" 1>&6 - if eval "test \"`echo '$''{'make_cv_sysconf_open_max'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -int max = sysconf (_SC_OPEN_MAX); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - make_cv_sysconf_open_max=yes -else - rm -rf conftest* - make_cv_sysconf_open_max=no -fi -rm -f conftest* - -fi - - if test $make_cv_sysconf_open_max = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_SYSCONF_OPEN_MAX 1 -EOF - - fi - echo "$ac_t""$make_cv_sysconf_open_max" 1>&6 -fi - -# Check out the wait reality. -for ac_hdr in sys/wait.h -do -ac_safe=`echo "$ac_hdr" | tr './\055' '___'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'` - cat >> confdefs.h <&6 -fi -done - for ac_func in waitpid wait3 -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+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. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* 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_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr '[a-z]' '[A-Z]'` - cat >> confdefs.h <&6 -fi -done - -echo $ac_n "checking for union wait""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'make_cv_union_wait'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -int main() { return 0; } -int t() { -union wait status; int pid; pid = wait (&status); -#ifdef WEXITSTATUS -/* Some POSIXoid systems have both the new-style macros and the old - union wait type, and they do not work together. If union wait - conflicts with WEXITSTATUS et al, we don't want to use it at all. */ -if (WEXITSTATUS (status) != 0) pid = -1; -#ifdef WTERMSIG -/* If we have WEXITSTATUS and WTERMSIG, just use them on ints. */ --- blow chunks here -- -#endif -#endif -#ifdef HAVE_WAITPID -/* Make sure union wait works with waitpid. */ -pid = waitpid (-1, &status, 0); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - make_cv_union_wait=yes -else - rm -rf conftest* - make_cv_union_wait=no -fi -rm -f conftest* - -fi - -if test "$make_cv_union_wait" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_UNION_WAIT 1 -EOF - -fi -echo "$ac_t""$make_cv_union_wait" 1>&6 - -echo $ac_n "checking for sys_siglist declaration in signal.h or unistd.h""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_decl_sys_siglist'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -/* NetBSD declares sys_siglist in unistd.h. */ -#ifdef HAVE_UNISTD_H -#include -#endif -int main() { return 0; } -int t() { -char *msg = *(sys_siglist + 1); -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - ac_cv_decl_sys_siglist=yes -else - rm -rf conftest* - ac_cv_decl_sys_siglist=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_decl_sys_siglist" 1>&6 -if test $ac_cv_decl_sys_siglist = yes; then - cat >> confdefs.h <<\EOF -#define SYS_SIGLIST_DECLARED 1 -EOF - -fi - - -# The presence of the following is not meant to imply -# that make necessarily works on those systems. -echo $ac_n "checking for -lsun""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_sun'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lsun $LIBS" -cat > conftest.$ac_ext <&6 - ac_tr_lib=HAVE_LIB`echo sun | tr '[a-z]' '[A-Z]'` - cat >> confdefs.h <&6 -fi - - - REMOTE=stub -# Check whether --with-customs or --without-customs was given. -withval="$with_customs" -if test -n "$withval"; then - REMOTE=cstms LIBS="$LIBS libcustoms.a" -fi - - -echo checking for location of SCCS get command -if test -f /usr/sccs/get; then - SCCS_GET=/usr/sccs/get - cat >> confdefs.h <<\EOF -#define SCCS_GET "/usr/sccs/get" -EOF - -else - SCCS_GET=get - cat >> confdefs.h <<\EOF -#define SCCS_GET "get" -EOF - -fi -ac_clean_files="$ac_clean_files s.conftest conftoast" # Remove these later. -if ( /usr/sccs/admin -n s.conftest || admin -n s.conftest ) >/dev/null 2>&1 && - test -f s.conftest; then - # We successfully created an SCCS file. - echo checking if SCCS get command understands -G - if $SCCS_GET -Gconftoast s.conftest >/dev/null 2>&1 && - test -f conftoast; then - cat >> confdefs.h <<\EOF -#define SCCS_GET_MINUS_G 1 -EOF - - fi -fi -rm -f s.conftest conftoast - -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 -# 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 | - sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ - >> 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 - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.3" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile build.sh config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 - -# Protect against being on the right side of a sed subst in config.status. -sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; - s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF -$ac_vpsub -$extrasub -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@subdirs@%$subdirs%g -s%@SET_MAKE@%$SET_MAKE%g -s%@CC@%$CC%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@CPP@%$CPP%g -s%@LIBOBJS@%$LIBOBJS%g -s%@ALLOCA@%$ALLOCA%g -s%@NEED_SETGID@%$NEED_SETGID%g -s%@KMEM_GROUP@%$KMEM_GROUP%g -s%@REMOTE@%$REMOTE%g - -CEOF -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust relative srcdir, etc. for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file -fi; done -rm -f conftest.subs - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -CONFIG_HEADERS=${CONFIG_HEADERS-"config.h"} -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - cp $ac_given_srcdir/$ac_file_in conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. -# Maximum number of lines to put in a single here document. -ac_max_here_lines=12 - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - - - -# Makefile uses this timestamp file to know when to remake Makefile, -# build.sh, and glob/Makefile. -touch stamp-config -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - -if test "$no_recursion" != yes; then - - # Remove --cache-file and --srcdir arguments so they do not pile up. - ac_sub_configure_args= - ac_prev= - for ac_arg in $ac_configure_args; do - if test -n "$ac_prev"; then - ac_prev= - continue - fi - case "$ac_arg" in - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - ;; - *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; - esac - done - - for ac_config_dir in glob; do - - # Do not complain, so a configure script can configure whichever - # parts of a large source tree are present. - if test ! -d $srcdir/$ac_config_dir; then - continue - fi - - echo configuring in $ac_config_dir - - case "$srcdir" in - .) ;; - *) - if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :; - else - { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; } - fi - ;; - esac - - ac_popdir=`pwd` - cd $ac_config_dir - - case "$srcdir" in - .) # No --srcdir option. We are building in place. - ac_sub_srcdir=$srcdir ;; - /*) # Absolute path. - ac_sub_srcdir=$srcdir/$ac_config_dir ;; - *) # Relative path. - ac_sub_srcdir=../$srcdir/$ac_config_dir ;; - esac - - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_sub_srcdir/configure; then - ac_sub_configure=$ac_sub_srcdir/configure - elif test -f $ac_sub_srcdir/configure.in; then - ac_sub_configure=$ac_configure - else - echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2 - ac_sub_configure= - fi - - # The recursion is here. - if test -n "$ac_sub_configure"; then - - # Make the cache file name correct relative to the subdirectory. - # A "../" for each directory in /$ac_config_dir. - ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` - case "$cache_file" in - /*) ac_sub_cache_file=$cache_file ;; - *) # Relative path. - ac_sub_cache_file="$ac_dots$cache_file" ;; - esac - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir" - # The eval makes quoting arguments work. - if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir - then : - else - { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; } - fi - fi - - cd $ac_popdir - done -fi - - diff --git a/buildtools/windows/source/make/configure.bat b/buildtools/windows/source/make/configure.bat deleted file mode 100755 index 9c3693dcc39..00000000000 --- a/buildtools/windows/source/make/configure.bat +++ /dev/null @@ -1,88 +0,0 @@ -@echo off - -echo Configuring MAKE for go32 - -rem This batch file assumes a unix-type "sed" program - - - -update configh.dos config.h - - - -echo # Makefile generated by "configure.bat"> Makefile - - - -if exist config.sed del config.sed - - - -echo ": try_sl ">> config.sed - -echo "/\\$/ { ">> config.sed - -echo " N ">> config.sed - -echo " s/[ ]*\\\n[ ]*/ / ">> config.sed - -echo " b try_sl ">> config.sed - -echo "} ">> config.sed - - - -echo "s/@srcdir@/./ ">> config.sed - -echo "s/@CC@/gcc/ ">> config.sed - -echo "s/@CFLAGS@/-O2 -g/ ">> config.sed - -echo "s/@CPPFLAGS@/-DHAVE_CONFIG_H/ ">> config.sed - -echo "s/@LDFLAGS@// ">> config.sed - -echo "s/@RANLIB@/ranlib/ ">> config.sed - -echo "s/@DEFS@// ">> config.sed - -echo "s/@REMOTE@/stub/ ">> config.sed - -echo "s/@ALLOCA@// ">> config.sed - -echo "s/@LIBS@// ">> config.sed - -echo "s/@LIBOBJS@// ">> config.sed - -echo "s/@SET_MAKE@// ">> config.sed - -echo "s/^Makefile *:/_Makefile:/ ">> config.sed - -echo "s/^config.h *:/_config.h:/ ">> config.sed - -echo "s/^defines *=.*$/defines =/ ">> config.sed - -echo "/mv -f make.new make/d ">> config.sed - - - -echo "s/cd glob; $(MAKE)/$(MAKE) -C glob/ ">> config.sed - - - -sed -e "s/^\"//" -e "s/\"$//" -e "s/[ ]*$//" config.sed > config2.sed - -sed -f config2.sed Makefile.in >> Makefile - -del config.sed - -del config2.sed - - - -cd glob - -call configure - -cd .. - diff --git a/buildtools/windows/source/make/configure.in b/buildtools/windows/source/make/configure.in deleted file mode 100644 index 2b533e7a7c5..00000000000 --- a/buildtools/windows/source/make/configure.in +++ /dev/null @@ -1,131 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_REVISION([$Id: configure.in,v 1.1 1998-04-13 22:35:14 cyeh Exp $]) -AC_PREREQ(2.1)dnl dnl Minimum Autoconf version required. -AC_INIT(vpath.c)dnl dnl A distinctive file to look for in srcdir. -AC_CONFIG_HEADER(config.h) -AC_CONFIG_SUBDIRS(glob) dnl Run configure in glob subdirectory. - -AC_PROG_MAKE_SET -AC_PROG_CC -AC_PROG_INSTALL -AC_PROG_CPP dnl Later checks need this. -AC_AIX -AC_ISC_POSIX -AC_MINIX -AC_HEADER_STDC -AC_HEADER_DIRENT -AC_TYPE_UID_T dnl Also does gid_t. -AC_TYPE_PID_T -AC_TYPE_SIGNAL -AC_CHECK_HEADERS(unistd.h limits.h sys/param.h fcntl.h string.h memory.h \ - sys/timeb.h) -AC_PROG_CC_C_O -AC_C_CONST dnl getopt needs this. -AC_HEADER_STAT - -AC_SUBST(LIBOBJS) - -AC_DEFUN(AC_CHECK_SYMBOL, [dnl -AC_MSG_CHECKING(for $1) -AC_CACHE_VAL(ac_cv_check_symbol_$1, [dnl -AC_TRY_LINK(, [extern char *sys_siglist[]; puts(*sys_siglist);], - ac_cv_check_symbol_$1=yes, ac_cv_check_symbol_$1=no)]) -if test "$ac_cv_check_symbol_$1" = yes; then -changequote(,)dnl - ac_tr_symbol=`echo $1 | tr '[a-z]' '[A-Z]'` -changequote([,])dnl - AC_DEFINE_UNQUOTED(HAVE_${ac_tr_symbol}) -fi -AC_MSG_RESULT($ac_cv_check_symbol_$1)])dnl - -AC_CHECK_FUNCS(getdtablesize psignal mktemp \ - dup2 getcwd sigsetmask getgroups setlinebuf \ - seteuid setegid setreuid setregid strerror strsignal) -AC_CHECK_SYMBOL(sys_siglist) -AC_CHECK_SYMBOL(_sys_siglist) -AC_FUNC_ALLOCA -AC_FUNC_VFORK -AC_FUNC_SETVBUF_REVERSED -AC_FUNC_GETLOADAVG -AC_FUNC_STRCOLL - -if test $ac_cv_func_getdtablesize = no; then - AC_MSG_CHECKING(for sysconf (_SC_OPEN_MAX)) - AC_CACHE_VAL(make_cv_sysconf_open_max, [dnl - AC_TRY_LINK([#include ], [int max = sysconf (_SC_OPEN_MAX);], - [make_cv_sysconf_open_max=yes], [make_cv_sysconf_open_max=no])]) - if test $make_cv_sysconf_open_max = yes; then - AC_DEFINE(HAVE_SYSCONF_OPEN_MAX) - fi - AC_MSG_RESULT($make_cv_sysconf_open_max) -fi - -# Check out the wait reality. -AC_CHECK_HEADERS(sys/wait.h) AC_CHECK_FUNCS(waitpid wait3) -AC_MSG_CHECKING(for union wait) -AC_CACHE_VAL(make_cv_union_wait, [dnl -AC_TRY_LINK([#include -#include ], - [union wait status; int pid; pid = wait (&status); -#ifdef WEXITSTATUS -/* Some POSIXoid systems have both the new-style macros and the old - union wait type, and they do not work together. If union wait - conflicts with WEXITSTATUS et al, we don't want to use it at all. */ -if (WEXITSTATUS (status) != 0) pid = -1; -#ifdef WTERMSIG -/* If we have WEXITSTATUS and WTERMSIG, just use them on ints. */ --- blow chunks here -- -#endif -#endif -#ifdef HAVE_WAITPID -/* Make sure union wait works with waitpid. */ -pid = waitpid (-1, &status, 0); -#endif -], - [make_cv_union_wait=yes], [make_cv_union_wait=no])]) -if test "$make_cv_union_wait" = yes; then - AC_DEFINE(HAVE_UNION_WAIT) -fi -AC_MSG_RESULT($make_cv_union_wait) - -AC_DECL_SYS_SIGLIST - -# The presence of the following is not meant to imply -# that make necessarily works on those systems. -AC_CHECK_LIB(sun, getpwnam) - -AC_SUBST(REMOTE) REMOTE=stub -AC_ARG_WITH(customs, [export jobs with the Customs daemon (NOT SUPPORTED)], -[REMOTE=cstms LIBS="$LIBS libcustoms.a"]) - -echo checking for location of SCCS get command -if test -f /usr/sccs/get; then - SCCS_GET=/usr/sccs/get - AC_DEFINE(SCCS_GET, "/usr/sccs/get") -else - SCCS_GET=get - AC_DEFINE(SCCS_GET, "get") -fi -ac_clean_files="$ac_clean_files s.conftest conftoast" # Remove these later. -if ( /usr/sccs/admin -n s.conftest || admin -n s.conftest ) >/dev/null 2>&1 && - test -f s.conftest; then - # We successfully created an SCCS file. - echo checking if SCCS get command understands -G - if $SCCS_GET -Gconftoast s.conftest >/dev/null 2>&1 && - test -f conftoast; then - AC_DEFINE(SCCS_GET_MINUS_G) - fi -fi -rm -f s.conftest conftoast - -AC_OUTPUT(Makefile build.sh, [ -# Makefile uses this timestamp file to know when to remake Makefile, -# build.sh, and glob/Makefile. -touch stamp-config]) - -dnl Local Variables: -dnl comment-start: "dnl " -dnl comment-end: "" -dnl comment-start-skip: "\\bdnl\\b\\s *" -dnl compile-command: "make configure config.h.in" -dnl End: diff --git a/buildtools/windows/source/make/default.c b/buildtools/windows/source/make/default.c deleted file mode 100644 index 5cdca48c094..00000000000 --- a/buildtools/windows/source/make/default.c +++ /dev/null @@ -1,403 +0,0 @@ -/* Data base of default implicit rules for GNU Make. -Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "rule.h" -#include "dep.h" -#include "file.h" -#include "commands.h" -#include "variable.h" - -/* Define GCC_IS_NATIVE if gcc is the native development environment on - your system (gcc/bison/flex vs cc/yacc/lex). */ -#ifdef __MSDOS__ -#define GCC_IS_NATIVE -#endif - - -/* This is the default list of suffixes for suffix rules. - `.s' must come last, so that a `.o' file will be made from - a `.c' or `.p' or ... file rather than from a .s file. */ - -static char default_suffixes[] - = ".out .a .ln .o .c .cc .C .p .f .F .r .y .l .s .S \ -.mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \ -.w .ch .web .sh .elc .el"; - -static struct pspec default_pattern_rules[] = - { - { "(%)", "%", - "$(AR) $(ARFLAGS) $@ $<" }, - - /* The X.out rules are only in BSD's default set because - BSD Make has no null-suffix rules, so `foo.out' and - `foo' are the same thing. */ - { "%.out", "%", - "@rm -f $@ \n cp $< $@" }, - - /* Syntax is "ctangle foo.w foo.ch foo.c". */ - { "%.c", "%.w %.ch", - "$(CTANGLE) $^ $@" }, - { "%.tex", "%.w %.ch", - "$(CWEAVE) $^ $@" }, - - { 0, 0, 0 } - }; - -static struct pspec default_terminal_rules[] = - { - /* RCS. */ - { "%", "%,v", - "+$(CHECKOUT,v)" }, - { "%", "RCS/%,v", - "+$(CHECKOUT,v)" }, - - /* SCCS. */ - { "%", "s.%", - "$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<" }, - { "%", "SCCS/s.%", - "$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<" }, - - { 0, 0, 0 } - }; - -static char *default_suffix_rules[] = - { - ".o", - "$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@", - ".s", - "$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@", - ".S", - "$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@", - ".c", - "$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@", - ".cc", - "$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@", - ".C", - "$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@", - ".f", - "$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@", - ".p", - "$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@", - ".F", - "$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@", - ".r", - "$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@", - ".mod", - "$(COMPILE.mod) -o $@ -e $@ $^", - - ".def.sym", - "$(COMPILE.def) -o $@ $<", - - ".sh", - "cat $< >$@ \n chmod a+x $@", - - ".s.o", -#if !defined(M_XENIX) || defined(__GNUC__) - "$(COMPILE.s) -o $@ $<", -#else /* Xenix. */ - "$(COMPILE.s) -o$@ $<", -#endif /* Not Xenix. */ - ".S.o", -#if !defined(M_XENIX) || defined(__GNUC__) - "$(COMPILE.S) -o $@ $<", -#else /* Xenix. */ - "$(COMPILE.S) -o$@ $<", -#endif /* Not Xenix. */ - ".c.o", - "$(COMPILE.c) $< $(OUTPUT_OPTION)", - ".cc.o", - "$(COMPILE.cc) $< $(OUTPUT_OPTION)", - ".C.o", - "$(COMPILE.C) $< $(OUTPUT_OPTION)", - ".f.o", - "$(COMPILE.f) $< $(OUTPUT_OPTION)", - ".p.o", - "$(COMPILE.p) $< $(OUTPUT_OPTION)", - ".F.o", - "$(COMPILE.F) $< $(OUTPUT_OPTION)", - ".r.o", - "$(COMPILE.r) $< $(OUTPUT_OPTION)", - ".mod.o", - "$(COMPILE.mod) -o $@ $<", - - ".c.ln", - "$(LINT.c) -C$* $<", - ".y.ln", -#ifndef __MSDOS__ - "$(YACC.y) $< \n $(LINT.c) -C$* y.tab.c \n $(RM) y.tab.c", -#else - "$(YACC.y) $< \n $(LINT.c) -C$* y_tab.c \n $(RM) y_tab.c", -#endif - ".l.ln", - "@$(RM) $*.c\n $(LEX.l) $< > $*.c\n$(LINT.c) -i $*.c -o $@\n $(RM) $*.c", - - ".y.c", -#ifndef __MSDOS__ - "$(YACC.y) $< \n mv -f y.tab.c $@", -#else - "$(YACC.y) $< \n mv -f y_tab.c $@", -#endif - ".l.c", - "@$(RM) $@ \n $(LEX.l) $< > $@", - - ".F.f", - "$(PREPROCESS.F) $< $(OUTPUT_OPTION)", - ".r.f", - "$(PREPROCESS.r) $< $(OUTPUT_OPTION)", - - /* This might actually make lex.yy.c if there's no %R% - directive in $*.l, but in that case why were you - trying to make $*.r anyway? */ - ".l.r", - "$(LEX.l) $< > $@ \n mv -f lex.yy.r $@", - - ".S.s", - "$(PREPROCESS.S) $< > $@", - - ".texinfo.info", - "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@", - - ".texi.info", - "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@", - - ".txinfo.info", - "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@", - - ".tex.dvi", - "$(TEX) $<", - - ".texinfo.dvi", - "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<", - - ".texi.dvi", - "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<", - - ".txinfo.dvi", - "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<", - - ".w.c", - "$(CTANGLE) $< - $@", /* The `-' says there is no `.ch' file. */ - - ".web.p", - "$(TANGLE) $<", - - ".w.tex", - "$(CWEAVE) $< - $@", /* The `-' says there is no `.ch' file. */ - - ".web.tex", - "$(WEAVE) $<", - - 0, 0, - }; - -static char *default_variables[] = - { - "AR", "ar", - "ARFLAGS", "rv", - "AS", "as", -#ifdef GCC_IS_NATIVE - "CC", "gcc", - "CXX", "gcc", -#else - "CC", "cc", - "CXX", "g++", -#endif - - /* This expands to $(CO) $(COFLAGS) $< $@ if $@ does not exist, - and to the empty string if $@ does exist. */ - "CHECKOUT,v", - "$(patsubst $@-noexist,$(CO) $(COFLAGS) $< $@,\ - $(filter-out $@,$(firstword $(wildcard $@) $@-noexist)))", - - "CO", "co", - "CPP", "$(CC) -E", -#ifdef CRAY - "CF77PPFLAGS", "-P", - "CF77PP", "/lib/cpp", - "CFT", "cft77", - "CF", "cf77", - "FC", "$(CF)", -#else /* Not CRAY. */ -#ifdef _IBMR2 - "FC", "xlf", -#else -#ifdef __convex__ - "FC", "fc", -#else - "FC", "f77", -#endif /* __convex__ */ -#endif /* _IBMR2 */ - /* System V uses these, so explicit rules using them should work. - However, there is no way to make implicit rules use them and FC. */ - "F77", "$(FC)", - "F77FLAGS", "$(FFLAGS)", -#endif /* Cray. */ - "GET", SCCS_GET, - "LD", "ld", -#ifdef GCC_IS_NATIVE - "LEX", "flex", -#else - "LEX", "lex", -#endif - "LINT", "lint", - "M2C", "m2c", -#ifdef pyr - "PC", "pascal", -#else -#ifdef CRAY - "PC", "PASCAL", - "SEGLDR", "segldr", -#else - "PC", "pc", -#endif /* CRAY. */ -#endif /* pyr. */ -#ifdef GCC_IS_NATIVE - "YACC", "bison -y", -#else - "YACC", "yacc", /* Or "bison -y" */ -#endif - "MAKEINFO", "makeinfo", - "TEX", "tex", - "TEXI2DVI", "texi2dvi", - "WEAVE", "weave", - "CWEAVE", "cweave", - "TANGLE", "tangle", - "CTANGLE", "ctangle", - - "RM", "rm -f", - - "LINK.o", "$(CC) $(LDFLAGS) $(TARGET_ARCH)", - "COMPILE.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c", - "LINK.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)", - "COMPILE.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c", - "COMPILE.C", "$(COMPILE.cc)", - "LINK.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)", - "LINK.C", "$(LINK.cc)", - "YACC.y", "$(YACC) $(YFLAGS)", - "LEX.l", "$(LEX) $(LFLAGS) -t", - "COMPILE.f", "$(FC) $(FFLAGS) $(TARGET_ARCH) -c", - "LINK.f", "$(FC) $(FFLAGS) $(LDFLAGS) $(TARGET_ARCH)", - "COMPILE.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c", - "LINK.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)", - "COMPILE.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c", - "LINK.r", "$(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) $(TARGET_ARCH)", - "COMPILE.def", "$(M2C) $(M2FLAGS) $(DEFFLAGS) $(TARGET_ARCH)", - "COMPILE.mod", "$(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)", - "COMPILE.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c", - "LINK.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)", - "LINK.s", "$(CC) $(ASFLAGS) $(LDFLAGS) $(TARGET_MACH)", - "COMPILE.s", "$(AS) $(ASFLAGS) $(TARGET_MACH)", - "LINK.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)", - "COMPILE.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c", -#if !defined(M_XENIX) || defined(__GNUC__) - "PREPROCESS.S", "$(CC) -E $(CPPFLAGS)", -#else /* Xenix. */ - "PREPROCESS.S", "$(CC) -EP $(CPPFLAGS)", -#endif /* Not Xenix. */ - "PREPROCESS.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F", - "PREPROCESS.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -F", - "LINT.c", "$(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)", - -#ifndef NO_MINUS_C_MINUS_O -#if !defined(M_XENIX) || defined(__GNUC__) - "OUTPUT_OPTION", "-o $@", -#else /* Xenix. */ - "OUTPUT_OPTION", "-Fo$@", -#endif /* Not Xenix. */ -#endif - -#ifdef SCCS_GET_MINUS_G - "SCCS_OUTPUT_OPTION", "-G$@", -#endif - - 0, 0 - }; - -/* Set up the default .SUFFIXES list. */ - -void -set_default_suffixes () -{ - suffix_file = enter_file (".SUFFIXES"); - - if (no_builtin_rules_flag) - (void) define_variable ("SUFFIXES", 8, "", o_default, 0); - else - { - char *p = default_suffixes; - suffix_file->deps = (struct dep *) - multi_glob (parse_file_seq (&p, '\0', sizeof (struct dep), 1), - sizeof (struct dep)); - (void) define_variable ("SUFFIXES", 8, default_suffixes, o_default, 0); - } -} - -/* Enter the default suffix rules as file rules. This used to be done in - install_default_implicit_rules, but that loses because we want the - suffix rules installed before reading makefiles, and thee pattern rules - installed after. */ - -void -install_default_suffix_rules () -{ - register char **s; - - if (no_builtin_rules_flag) - return; - - for (s = default_suffix_rules; *s != 0; s += 2) - { - register struct file *f = enter_file (s[0]); - /* Don't clobber cmds given in a makefile if there were any. */ - if (f->cmds == 0) - { - f->cmds = (struct commands *) xmalloc (sizeof (struct commands)); - f->cmds->filename = 0; - f->cmds->commands = s[1]; - f->cmds->command_lines = 0; - } - } -} - - -/* Install the default pattern rules. */ - -void -install_default_implicit_rules () -{ - register struct pspec *p; - - if (no_builtin_rules_flag) - return; - - for (p = default_pattern_rules; p->target != 0; ++p) - install_pattern_rule (p, 0); - - for (p = default_terminal_rules; p->target != 0; ++p) - install_pattern_rule (p, 1); -} - -void -define_default_variables () -{ - register char **s; - - for (s = default_variables; *s != 0; s += 2) - (void) define_variable (s[0], strlen (s[0]), s[1], o_default, 1); -} diff --git a/buildtools/windows/source/make/dep.h b/buildtools/windows/source/make/dep.h deleted file mode 100644 index 244cde243f4..00000000000 --- a/buildtools/windows/source/make/dep.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Definitions of dependency data structures for GNU Make. -Copyright (C) 1988, 1989, 1991, 1992, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* Structure representing one dependency of a file. - Each struct file's `deps' points to a chain of these, - chained through the `next'. - - Note that the first two words of this match a struct nameseq. */ - -struct dep - { - struct dep *next; - char *name; - struct file *file; - int changed; - }; - - -/* Structure used in chains of names, for parsing and globbing. */ - -struct nameseq - { - struct nameseq *next; - char *name; - }; - - -extern struct nameseq *multi_glob (), *parse_file_seq (); -extern char *tilde_expand (); - -#ifndef NO_ARCHIVES -extern struct nameseq *ar_glob (); -#endif - -#ifndef iAPX286 -#define dep_name(d) ((d)->name == 0 ? (d)->file->name : (d)->name) -#else -/* Buggy compiler can't hack this. */ -extern char *dep_name (); -#endif - -extern struct dep *read_all_makefiles (); - -/* Flag bits for the second argument to `read_makefile'. - These flags are saved in the `changed' field of each - `struct dep' in the chain returned by `read_all_makefiles'. */ -#define RM_NO_DEFAULT_GOAL (1 << 0) /* Do not set default goal. */ -#define RM_INCLUDED (1 << 1) /* Search makefile search path. */ -#define RM_DONTCARE (1 << 2) /* No error if it doesn't exist. */ -#define RM_NO_TILDE (1 << 3) /* Don't expand ~ in file name. */ -#define RM_NOFLAG 0 diff --git a/buildtools/windows/source/make/dir.c b/buildtools/windows/source/make/dir.c deleted file mode 100644 index eac29fd2f87..00000000000 --- a/buildtools/windows/source/make/dir.c +++ /dev/null @@ -1,760 +0,0 @@ -/* Directory hashing for GNU Make. -Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" - -#ifdef NETSCAPE -#include "windir.h" - -DIR *opendir(char *pathp) -{ - DIR *ret = (DIR *) malloc(sizeof(DIR)); - char path[_MAX_PATH]; - int l; - - sprintf(path, "%s", pathp); - l = strlen(path) - 1; - path[strlen(pathp)] = '\0'; - if(path[strlen(path) - 1] != '\\') - strcpy (path + strlen(path), "\\*.*"); - else - strcat(path, "*.*"); - - ret->de.d_name = NULL; - if( (ret->dp = FindFirstFile(path, &ret->fdata)) != INVALID_HANDLE_VALUE) - return ret; - free(ret); - return NULL; -} - -struct dirent *readdir(DIR *ds) -{ - if(FindNextFile(ds->dp, &ds->fdata) == FALSE) - return NULL; - if(ds->de.d_name) - free(ds->de.d_name); - ds->de.d_name = strdup(ds->fdata.cFileName); - - return &ds->de; -} - -void closedir(DIR *ds) -{ - FindClose(ds->dp); - if(ds->de.d_name) - free(ds->de.d_name); - free(ds); -} - - -#endif - - -#if !defined(NETSCAPE) && defined (POSIX) || defined (HAVE_DIRENT_H) || defined (__GNU_LIBRARY__) -#include -#ifndef __GNU_LIBRARY__ -#define D_NAMLEN(d) strlen((d)->d_name) -#else /* GNU C library. */ -#define D_NAMLEN(d) ((d)->d_namlen) -#endif /* Not GNU C library. */ -#else /* Not POSIX or HAVE_DIRENT_H. */ -#define direct dirent -#define D_NAMLEN(d) (strlen(d->d_name)) -#ifdef HAVE_SYS_NDIR_H -#include -#endif /* HAVE_SYS_NDIR_H */ -#ifdef HAVE_SYS_DIR_H -#include -#endif /* HAVE_SYS_DIR_H */ -#ifdef HAVE_NDIR_H -#include -#endif /* HAVE_NDIR_H */ -#endif /* POSIX or HAVE_DIRENT_H or __GNU_LIBRARY__. */ - -#if defined (POSIX) && !defined (__GNU_LIBRARY__) || defined(NETSCAPE) -/* Posix does not require that the d_ino field be present, and some - systems do not provide it. */ -#define REAL_DIR_ENTRY(dp) 1 -#else -#define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) -#endif /* POSIX */ - -#ifdef __MSDOS__ -#include - -static char * -dosify (filename) - char *filename; -{ - static char dos_filename[14]; - char *df; - int i; - - if (filename == 0) - return 0; - - if (strpbrk (filename, "\"*+,;<=>?[\\]|") != 0) - return filename; - - df = dos_filename; - - /* First, transform the name part. */ - for (i = 0; *filename != '\0' && i < 8 && *filename != '.'; ++i) - *df++ = tolower (*filename++); - - /* Now skip to the next dot. */ - while (*filename != '\0' && *filename != '.') - ++filename; - if (*filename != '\0') - { - *df++ = *filename++; - for (i = 0; *filename != '\0' && i < 3 && *filename != '.'; ++i) - *df++ = tolower (*filename++); - } - - /* Look for more dots. */ - while (*filename != '\0' && *filename != '.') - ++filename; - if (*filename == '.') - return filename; - *df = 0; - return dos_filename; -} -#endif - -/* Hash table of directories. */ - -#ifndef DIRECTORY_BUCKETS -#define DIRECTORY_BUCKETS 199 -#endif - -struct directory_contents - { - struct directory_contents *next; - -#ifdef NETSCAPE - int dev; /* Device number of this dir. */ - /* - * Inode means nothing on WIN32. Even file key information is - * unreliable because it is random per file open and undefined - * for remote filesystems. The most unique attribute I can - * come up with is the fully qualified name of the directory. Beware - * though, this is also unreliable. I'm open to suggestion on a better - * way to emulate inode. - */ - char *path_key; - int mtime; /* controls check for stale directory cache */ -#else - int dev, ino; /* Device and inode numbers of this dir. */ -#endif - - struct dirfile **files; /* Files in this directory. */ - DIR *dirstream; /* Stream reading this directory. */ - }; - -/* Table of directory contents hashed by device and inode number. */ -static struct directory_contents *directories_contents[DIRECTORY_BUCKETS]; - -struct directory - { - struct directory *next; - - char *name; /* Name of the directory. */ - - /* The directory's contents. This data may be shared by several - entries in the hash table, which refer to the same directory - (identified uniquely by `dev' and `ino') under different names. */ - struct directory_contents *contents; - }; - -/* Table of directories hashed by name. */ -static struct directory *directories[DIRECTORY_BUCKETS]; - - -/* Never have more than this many directories open at once. */ - -#define MAX_OPEN_DIRECTORIES 10 - -static unsigned int open_directories = 0; - - -/* Hash table of files in each directory. */ - -struct dirfile - { - struct dirfile *next; - char *name; /* Name of the file. */ - char impossible; /* This file is impossible. */ - }; - -#ifndef DIRFILE_BUCKETS -#define DIRFILE_BUCKETS 107 -#endif - -static int dir_contents_file_exists_p (); - -/* Find the directory named NAME and return its `struct directory'. */ - -static struct directory * -find_directory (name) - register char *name; -{ - register unsigned int hash = 0; - register char *p; - register struct directory *dir; -#ifdef NETSCAPE - char w32_path[_MAX_PATH]; -#endif - - for (p = name; *p != '\0'; ++p) - HASH (hash, *p); - hash %= DIRECTORY_BUCKETS; - - for (dir = directories[hash]; dir != 0; dir = dir->next) - if (streq (dir->name, name)) - break; - - if (dir == 0) - { - struct stat st; - - /* The directory was not found. Create a new entry for it. */ - - dir = (struct directory *) xmalloc (sizeof (struct directory)); - dir->next = directories[hash]; - directories[hash] = dir; - dir->name = savestring (name, p - name); - - /* The directory is not in the name hash table. - Find its device and inode numbers, and look it up by them. */ - - if (safe_stat (name, &st) < 0) - /* Couldn't stat the directory. Mark this by - setting the `contents' member to a nil pointer. */ - dir->contents = 0; - else - { - /* Search the contents hash table; device and inode are the key. */ - - struct directory_contents *dc; - -#ifdef NETSCAPE - _fullpath (w32_path, name, sizeof (w32_path)); - hash = ((unsigned int) st.st_dev << 16) | (unsigned int) st.st_ctime; -#else - hash = ((unsigned int) st.st_dev << 16) | (unsigned int) st.st_ino; -#endif - hash %= DIRECTORY_BUCKETS; - - for (dc = directories_contents[hash]; dc != 0; dc = dc->next) -#ifdef NETSCAPE - if (!strcmp(dc->path_key, w32_path)) -#else - if (dc->dev == (int)st.st_dev && dc->ino == (int)st.st_ino) -#endif - break; - - if (dc == 0) - { - /* Nope; this really is a directory we haven't seen before. */ - - dc = (struct directory_contents *) - xmalloc (sizeof (struct directory_contents)); - - /* Enter it in the contents hash table. */ - dc->dev = st.st_dev; -#ifdef NETSCAPE - dc->path_key = strdup(w32_path); - dc->mtime = st.st_mtime; -#else - dc->ino = st.st_ino; -#endif - dc->next = directories_contents[hash]; - directories_contents[hash] = dc; - - dc->dirstream = opendir (name); - if (dc->dirstream == 0) - /* Couldn't open the directory. Mark this by - setting the `files' member to a nil pointer. */ - dc->files = 0; - else - { - /* Allocate an array of buckets for files and zero it. */ - dc->files = (struct dirfile **) - xmalloc (sizeof (struct dirfile *) * DIRFILE_BUCKETS); - bzero ((char *) dc->files, - sizeof (struct dirfile *) * DIRFILE_BUCKETS); - - /* Keep track of how many directories are open. */ - ++open_directories; - if (open_directories == MAX_OPEN_DIRECTORIES) - /* We have too many directories open already. - Read the entire directory and then close it. */ - (void) dir_contents_file_exists_p (dc, (char *) 0); - } - } - - /* Point the name-hashed entry for DIR at its contents data. */ - dir->contents = dc; - } - } - - return dir; -} - -/* Return 1 if the name FILENAME is entered in DIR's hash table. - FILENAME must contain no slashes. */ - -static int -dir_contents_file_exists_p (dir, filename) - register struct directory_contents *dir; - register char *filename; -{ - register unsigned int hash; - register char *p; - register struct dirfile *df; - register struct dirent *d; -#ifdef NETSCAPE - struct stat st; - int rehash = 0; -#endif - - if (dir == 0 || dir->files == 0) - /* The directory could not be stat'd or opened. */ - return 0; - -#ifdef __MSDOS__ - filename = dosify (filename); -#endif - - hash = 0; - if (filename != 0) - { - if (*filename == '\0') - /* Checking if the directory exists. */ - return 1; - - for (p = filename; *p != '\0'; ++p) - HASH (hash, *p); - hash %= DIRFILE_BUCKETS; - - /* Search the list of hashed files. */ - - for (df = dir->files[hash]; df != 0; df = df->next) - if (streq (df->name, filename)) - return !df->impossible; - } - - /* The file was not found in the hashed list. - Try to read the directory further. */ - -#ifdef NETSCAPE - if (dir->dirstream == 0) - { - /* Check to see if directory has changed since last read */ - if (dir->path_key && - stat(dir->path_key, &st) == 0 && - st.st_mtime > dir->mtime) { - - /* reset date stamp to show most recent re-process */ - dir->mtime = st.st_mtime; - - /* make sure directory can still be opened */ - dir->dirstream = opendir(dir->path_key); - - if (dir->dirstream) - rehash = 1; - else - return 0; /* couldn't re-read - fail */ - } else - /* The directory has been all read in. */ - return 0; - } -#else - if (dir->dirstream == 0) - /* The directory has been all read in. */ - return 0; -#endif - - while ((d = readdir (dir->dirstream)) != 0) - { - /* Enter the file in the hash table. */ - register unsigned int newhash = 0; - unsigned int len; - register unsigned int i; - - if (!REAL_DIR_ENTRY (d)) - continue; - - len = D_NAMLEN (d); - while (d->d_name[len - 1] == '\0') - --len; - - for (i = 0; i < len; ++i) - HASH (newhash, d->d_name[i]); - newhash %= DIRFILE_BUCKETS; - -#ifdef NETSCAPE - /* - * If re-reading a directory, check that this file isn't already - * in the cache. - */ - if (rehash) { - for (df = dir->files[newhash]; df != 0; df = df->next) - if (streq(df->name, d->d_name)) - break; - } else - df = 0; - - /* - * If re-reading a directory, don't cache files that have - * already been discovered. - */ - if (!df) { -#endif - df = (struct dirfile *) xmalloc (sizeof (struct dirfile)); - df->next = dir->files[newhash]; - dir->files[newhash] = df; - df->name = savestring (d->d_name, len); - df->impossible = 0; -#ifdef NETSCAPE - } -#endif - - /* Check if the name matches the one we're searching for. */ - if (filename != 0 - && newhash == hash && streq (d->d_name, filename)) - return 1; - } - - /* If the directory has been completely read in, - close the stream and reset the pointer to nil. */ - if (d == 0) - { - --open_directories; - closedir (dir->dirstream); - dir->dirstream = 0; - } - - return 0; -} - -/* Return 1 if the name FILENAME in directory DIRNAME - is entered in the dir hash table. - FILENAME must contain no slashes. */ - -int -dir_file_exists_p (dirname, filename) - register char *dirname; - register char *filename; -{ - return dir_contents_file_exists_p (find_directory (dirname)->contents, - filename); -} - -/* Return 1 if the file named NAME exists. */ - -int -file_exists_p (name) - register char *name; -{ - char *dirend; - char *dirname; - -#ifndef NO_ARCHIVES - if (ar_name (name)) - return ar_member_date (name) != (time_t) -1; -#endif - - dirend = rindex (name, '/'); - if (dirend == 0) - return dir_file_exists_p (".", name); - - dirname = (char *) alloca (dirend - name + 1); - bcopy (name, dirname, dirend - name); - dirname[dirend - name] = '\0'; - return dir_file_exists_p (dirname, dirend + 1); -} - -/* Mark FILENAME as `impossible' for `file_impossible_p'. - This means an attempt has been made to search for FILENAME - as an intermediate file, and it has failed. */ - -void -file_impossible (filename) - register char *filename; -{ - char *dirend; - register char *p = filename; - register unsigned int hash; - register struct directory *dir; - register struct dirfile *new; - - dirend = rindex (p, '/'); - if (dirend == 0) - dir = find_directory ("."); - else - { - char *dirname = (char *) alloca (dirend - p + 1); - bcopy (p, dirname, dirend - p); - dirname[dirend - p] = '\0'; - dir = find_directory (dirname); - filename = p = dirend + 1; - } - - for (hash = 0; *p != '\0'; ++p) - HASH (hash, *p); - hash %= DIRFILE_BUCKETS; - - if (dir->contents == 0) - { - /* The directory could not be stat'd. We allocate a contents - structure for it, but leave it out of the contents hash table. */ - dir->contents = (struct directory_contents *) - xmalloc (sizeof (struct directory_contents)); -#ifdef NETSCAPE - dir->contents->dev = 0; - dir->contents->path_key = NULL; - dir->contents->mtime = 0; -#else - dir->contents->dev = dir->contents->ino = 0; -#endif - dir->contents->files = 0; - dir->contents->dirstream = 0; - } - - if (dir->contents->files == 0) - { - /* The directory was not opened; we must allocate the hash buckets. */ - dir->contents->files = (struct dirfile **) - xmalloc (sizeof (struct dirfile) * DIRFILE_BUCKETS); - bzero ((char *) dir->contents->files, - sizeof (struct dirfile) * DIRFILE_BUCKETS); - } - - /* Make a new entry and put it in the table. */ - - new = (struct dirfile *) xmalloc (sizeof (struct dirfile)); - new->next = dir->contents->files[hash]; - dir->contents->files[hash] = new; - new->name = savestring (filename, strlen (filename)); - new->impossible = 1; -} - -/* Return nonzero if FILENAME has been marked impossible. */ - -int -file_impossible_p (filename) - char *filename; -{ - char *dirend; - register char *p = filename; - register unsigned int hash; - register struct directory_contents *dir; - register struct dirfile *next; - - dirend = rindex (filename, '/'); - if (dirend == 0) - dir = find_directory (".")->contents; - else - { - char *dirname = (char *) alloca (dirend - filename + 1); - bcopy (p, dirname, dirend - p); - dirname[dirend - p] = '\0'; - dir = find_directory (dirname)->contents; - p = dirend + 1; - } - - if (dir == 0 || dir->files == 0) - /* There are no files entered for this directory. */ - return 0; - -#ifdef __MSDOS__ - p = filename = dosify (p); -#endif - - for (hash = 0; *p != '\0'; ++p) - HASH (hash, *p); - hash %= DIRFILE_BUCKETS; - - for (next = dir->files[hash]; next != 0; next = next->next) - if (streq (filename, next->name)) - return next->impossible; - - return 0; -} - -/* Return the already allocated name in the - directory hash table that matches DIR. */ - -char * -dir_name (dir) - char *dir; -{ - return find_directory (dir)->name; -} - -/* Print the data base of directories. */ - -void -print_dir_data_base () -{ - register unsigned int i, dirs, files, impossible; - register struct directory *dir; - - puts ("\n# Directories\n"); - - dirs = files = impossible = 0; - for (i = 0; i < DIRECTORY_BUCKETS; ++i) - for (dir = directories[i]; dir != 0; dir = dir->next) - { - ++dirs; - if (dir->contents == 0) - printf ("# %s: could not be stat'd.\n", dir->name); - else if (dir->contents->files == 0) -#ifdef NETSCAPE - printf ("# %s (path_key %s, mtime %d): could not be opened.\n", - dir->name, dir->contents->path_key, dir->contents->mtime); -#else - printf ("# %s (device %d, inode %d): could not be opened.\n", - dir->name, dir->contents->dev, dir->contents->ino); -#endif - else - { - register unsigned int f = 0, im = 0; - register unsigned int j; - register struct dirfile *df; - for (j = 0; j < DIRFILE_BUCKETS; ++j) - for (df = dir->contents->files[j]; df != 0; df = df->next) - if (df->impossible) - ++im; - else - ++f; -#ifdef NETSCAPE - printf ("# %s (device %d, path_key %s, mtime %d): ", - dir->name, dir->contents->dev, - dir->contents->path_key, dir->contents->mtime); -#else - printf ("# %s (device %d, inode %d): ", - dir->name, dir->contents->dev, dir->contents->ino); -#endif - if (f == 0) - fputs ("No", stdout); - else - printf ("%u", f); - fputs (" files, ", stdout); - if (im == 0) - fputs ("no", stdout); - else - printf ("%u", im); - fputs (" impossibilities", stdout); - if (dir->contents->dirstream == 0) - puts ("."); - else - puts (" so far."); - files += f; - impossible += im; - } - } - - fputs ("\n# ", stdout); - if (files == 0) - fputs ("No", stdout); - else - printf ("%u", files); - fputs (" files, ", stdout); - if (impossible == 0) - fputs ("no", stdout); - else - printf ("%u", impossible); - printf (" impossibilities in %u directories.\n", dirs); -} - -/* Hooks for globbing. */ - -#include - -/* Structure describing state of iterating through a directory hash table. */ - -struct dirstream - { - struct directory_contents *contents; /* The directory being read. */ - - unsigned int bucket; /* Current hash bucket. */ - struct dirfile *elt; /* Current elt in bucket. */ - }; - -/* Forward declarations. */ -static __ptr_t open_dirstream __P ((const char *)); -static const char *read_dirstream __P ((__ptr_t)); - -static __ptr_t -open_dirstream (directory) - const char *directory; -{ - struct dirstream *new; - struct directory *dir = find_directory (directory); - - if (dir->contents == 0 || dir->contents->files == 0) - /* DIR->contents is nil if the directory could not be stat'd. - DIR->contents->files is nil if it could not be opened. */ - return 0; - - /* Read all the contents of the directory now. There is no benefit - in being lazy, since glob will want to see every file anyway. */ - - (void) dir_contents_file_exists_p (dir->contents, (char *) 0); - - new = (struct dirstream *) xmalloc (sizeof (struct dirstream)); - new->contents = dir->contents; - new->bucket = 0; - new->elt = new->contents->files[0]; - - return (__ptr_t) new; -} - -static const char * -read_dirstream (stream) - __ptr_t stream; -{ - struct dirstream *const ds = (struct dirstream *) stream; - register struct dirfile *df; - - while (ds->bucket < DIRFILE_BUCKETS) - { - while ((df = ds->elt) != 0) - { - ds->elt = df->next; - if (!df->impossible) - return df->name; - } - if (++ds->bucket == DIRFILE_BUCKETS) - break; - ds->elt = ds->contents->files[ds->bucket]; - } - - return 0; -} - -void -init_dir () -{ - __glob_opendir_hook = open_dirstream; - __glob_readdir_hook = read_dirstream; - __glob_closedir_hook = (void (*) __P ((__ptr_t stream))) free; -} diff --git a/buildtools/windows/source/make/expand.c b/buildtools/windows/source/make/expand.c deleted file mode 100644 index 7348fb26176..00000000000 --- a/buildtools/windows/source/make/expand.c +++ /dev/null @@ -1,456 +0,0 @@ -/* Variable expansion functions for GNU Make. -Copyright (C) 1988, 89, 91, 92, 93, 95 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "commands.h" -#include "file.h" -#include "variable.h" - -/* The next two describe the variable output buffer. - This buffer is used to hold the variable-expansion of a line of the - makefile. It is made bigger with realloc whenever it is too small. - variable_buffer_length is the size currently allocated. - variable_buffer is the address of the buffer. */ - -static unsigned int variable_buffer_length; -static char *variable_buffer; - -/* Subroutine of variable_expand and friends: - The text to add is LENGTH chars starting at STRING to the variable_buffer. - The text is added to the buffer at PTR, and the updated pointer into - the buffer is returned as the value. Thus, the value returned by - each call to variable_buffer_output should be the first argument to - the following call. */ - -char * -variable_buffer_output (ptr, string, length) - char *ptr, *string; - unsigned int length; -{ - register unsigned int newlen = length + (ptr - variable_buffer); - - if (newlen > variable_buffer_length) - { - unsigned int offset = ptr - variable_buffer; - variable_buffer_length = (newlen + 100 > 2 * variable_buffer_length - ? newlen + 100 - : 2 * variable_buffer_length); - variable_buffer = (char *) xrealloc (variable_buffer, - variable_buffer_length); - ptr = variable_buffer + offset; - } - - bcopy (string, ptr, length); - return ptr + length; -} - -/* Return a pointer to the beginning of the variable buffer. */ - -static char * -initialize_variable_output () -{ - /* If we don't have a variable output buffer yet, get one. */ - - if (variable_buffer == 0) - { - variable_buffer_length = 200; - variable_buffer = (char *) xmalloc (variable_buffer_length); - variable_buffer[0] = '\0'; - } - - return variable_buffer; -} - -/* Recursively expand V. The returned string is malloc'd. */ - -char * -recursively_expand (v) - register struct variable *v; -{ - char *value; - - if (v->expanding) - { - /* Expanding V causes infinite recursion. Lose. */ - if (reading_filename == 0) - fatal ("Recursive variable `%s' references itself (eventually)", - v->name); - else - makefile_fatal - (reading_filename, *reading_lineno_ptr, - "Recursive variable `%s' references itself (eventually)", - v->name); - } - - v->expanding = 1; - value = allocated_variable_expand (v->value); - v->expanding = 0; - - return value; -} - -/* Warn that NAME is an undefined variable. */ - -#ifdef __GNUC__ -__inline -#endif -static void -warn_undefined (name, length) - char *name; - unsigned int length; -{ - if (warn_undefined_variables_flag) - { - static const char warnmsg[] = "warning: undefined variable `%.*s'"; - if (reading_filename != 0) - makefile_error (reading_filename, *reading_lineno_ptr, - warnmsg, length, name); - else - error (warnmsg, length, name); - } -} - -/* Expand a simple reference to variable NAME, which is LENGTH chars long. */ - -#ifdef __GNUC__ -__inline -#endif -static char * -reference_variable (o, name, length) - char *o; - char *name; - unsigned int length; -{ - register struct variable *v = lookup_variable (name, length); - - if (v == 0) - warn_undefined (name, length); - - if (v != 0 && *v->value != '\0') - { - char *value = (v->recursive ? recursively_expand (v) : v->value); - o = variable_buffer_output (o, value, strlen (value)); - if (v->recursive) - free (value); - } - - return o; -} - -/* Scan LINE for variable references and expansion-function calls. - Build in `variable_buffer' the result of expanding the references and calls. - Return the address of the resulting string, which is null-terminated - and is valid only until the next time this function is called. */ - -char * -variable_expand (line) - register char *line; -{ - register struct variable *v; - register char *p, *o, *p1; - - p = line; - o = initialize_variable_output (); - - while (1) - { - /* Copy all following uninteresting chars all at once to the - variable output buffer, and skip them. Uninteresting chars end - at the next $ or the end of the input. */ - - p1 = index (p, '$'); - - o = variable_buffer_output (o, p, p1 != 0 ? p1 - p : strlen (p) + 1); - - if (p1 == 0) - break; - p = p1 + 1; - - /* Dispatch on the char that follows the $. */ - - switch (*p) - { - case '$': - /* $$ seen means output one $ to the variable output buffer. */ - o = variable_buffer_output (o, p, 1); - break; - - case '(': - case '{': - /* $(...) or ${...} is the general case of substitution. */ - { - char openparen = *p; - char closeparen = (openparen == '(') ? ')' : '}'; - register char *beg = p + 1; - int free_beg = 0; - char *op, *begp; - char *end, *colon; - - op = o; - begp = p; - if (handle_function (&op, &begp)) - { - o = op; - p = begp; - break; - } - - /* Is there a variable reference inside the parens or braces? - If so, expand it before expanding the entire reference. */ - - end = index (beg, closeparen); - if (end == 0) - { - /* Unterminated variable reference. */ - if (reading_filename != 0) - makefile_fatal (reading_filename, *reading_lineno_ptr, - "unterminated variable reference"); - else - fatal ("unterminated variable reference"); - } - p1 = lindex (beg, end, '$'); - if (p1 != 0) - { - /* BEG now points past the opening paren or brace. - Count parens or braces until it is matched. */ - int count = 0; - for (p = beg; *p != '\0'; ++p) - { - if (*p == openparen) - ++count; - else if (*p == closeparen && --count < 0) - break; - } - /* If COUNT is >= 0, there were unmatched opening parens - or braces, so we go to the simple case of a variable name - such as `$($(a)'. */ - if (count < 0) - { - beg = expand_argument (beg, p); /* Expand the name. */ - free_beg = 1; /* Remember to free BEG when finished. */ - end = index (beg, '\0'); - } - } - else - /* Advance P to the end of this reference. After we are - finished expanding this one, P will be incremented to - continue the scan. */ - p = end; - - /* This is not a reference to a built-in function and - any variable references inside are now expanded. - Is the resultant text a substitution reference? */ - - colon = lindex (beg, end, ':'); - if (colon != 0) - { - /* This looks like a substitution reference: $(FOO:A=B). */ - char *subst_beg, *subst_end, *replace_beg, *replace_end; - - subst_beg = colon + 1; - subst_end = index (subst_beg, '='); - if (subst_end == 0) - /* There is no = in sight. Punt on the substitution - reference and treat this as a variable name containing - a colon, in the code below. */ - colon = 0; - else - { - replace_beg = subst_end + 1; - replace_end = end; - - /* Extract the variable name before the colon - and look up that variable. */ - v = lookup_variable (beg, colon - beg); - if (v == 0) - warn_undefined (beg, colon - beg); - - if (v != 0 && *v->value != '\0') - { - char *value = (v->recursive ? recursively_expand (v) - : v->value); - char *pattern, *percent; - if (free_beg) - { - *subst_end = '\0'; - pattern = subst_beg; - } - else - { - pattern = (char *) alloca (subst_end - subst_beg - + 1); - bcopy (subst_beg, pattern, subst_end - subst_beg); - pattern[subst_end - subst_beg] = '\0'; - } - percent = find_percent (pattern); - if (percent != 0) - { - char *replace; - if (free_beg) - { - *replace_end = '\0'; - replace = replace_beg; - } - else - { - replace = (char *) alloca (replace_end - - replace_beg - + 1); - bcopy (replace_beg, replace, - replace_end - replace_beg); - replace[replace_end - replace_beg] = '\0'; - } - - o = patsubst_expand (o, value, pattern, replace, - percent, (char *) 0); - } - else - o = subst_expand (o, value, - pattern, replace_beg, - strlen (pattern), - end - replace_beg, - 0, 1); - if (v->recursive) - free (value); - } - } - } - - if (colon == 0) - /* This is an ordinary variable reference. - Look up the value of the variable. */ - o = reference_variable (o, beg, end - beg); - - if (free_beg) - free (beg); - } - break; - - case '\0': - break; - - default: - if (isblank (p[-1])) - break; - - /* A $ followed by a random char is a variable reference: - $a is equivalent to $(a). */ - { - /* We could do the expanding here, but this way - avoids code repetition at a small performance cost. */ - char name[5]; - name[0] = '$'; - name[1] = '('; - name[2] = *p; - name[3] = ')'; - name[4] = '\0'; - p1 = allocated_variable_expand (name); - o = variable_buffer_output (o, p1, strlen (p1)); - free (p1); - } - - break; - } - - if (*p == '\0') - break; - else - ++p; - } - - (void) variable_buffer_output (o, "", 1); - return initialize_variable_output (); -} - -/* Expand an argument for an expansion function. - The text starting at STR and ending at END is variable-expanded - into a null-terminated string that is returned as the value. - This is done without clobbering `variable_buffer' or the current - variable-expansion that is in progress. */ - -char * -expand_argument (str, end) - char *str, *end; -{ - char *tmp; - - if (*end == '\0') - tmp = str; - else - { - tmp = (char *) alloca (end - str + 1); - bcopy (str, tmp, end - str); - tmp[end - str] = '\0'; - } - - return allocated_variable_expand (tmp); -} - -/* Expand LINE for FILE. Error messages refer to the file and line where - FILE's commands were found. Expansion uses FILE's variable set list. */ - -char * -variable_expand_for_file (line, file) - char *line; - register struct file *file; -{ - char *result; - struct variable_set_list *save; - - if (file == 0) - return variable_expand (line); - - save = current_variable_set_list; - current_variable_set_list = file->variables; - reading_filename = file->cmds->filename; - reading_lineno_ptr = &file->cmds->lineno; - result = variable_expand (line); - current_variable_set_list = save; - reading_filename = 0; - reading_lineno_ptr = 0; - - return result; -} - -/* Like variable_expand_for_file, but the returned string is malloc'd. - This function is called a lot. It wants to be efficient. */ - -char * -allocated_variable_expand_for_file (line, file) - char *line; - struct file *file; -{ - char *value; - - char *obuf = variable_buffer; - unsigned int olen = variable_buffer_length; - - variable_buffer = 0; - - value = variable_expand_for_file (line, file); - -#if 0 - /* Waste a little memory and save time. */ - value = xrealloc (value, strlen (value)) -#endif - - variable_buffer = obuf; - variable_buffer_length = olen; - - return value; -} diff --git a/buildtools/windows/source/make/file.c b/buildtools/windows/source/make/file.c deleted file mode 100644 index 82e7442cd66..00000000000 --- a/buildtools/windows/source/make/file.c +++ /dev/null @@ -1,566 +0,0 @@ -/* Target file hash table management for GNU Make. -Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "commands.h" -#include "dep.h" -#include "file.h" -#include "variable.h" -#include - - -/* Hash table of files the makefile knows how to make. */ - -#ifndef FILE_BUCKETS -#define FILE_BUCKETS 1007 -#endif -static struct file *files[FILE_BUCKETS]; - -/* Number of files with the `intermediate' flag set. */ - -unsigned int num_intermediates = 0; - - -/* Access the hash table of all file records. - lookup_file given a name, return the struct file * for that name, - or nil if there is none. - enter_file similar, but create one if there is none. */ - -struct file * -lookup_file (name) - char *name; -{ - register struct file *f; - register char *n; - register unsigned int hashval; - - if (*name == '\0') - abort (); - - /* This is also done in parse_file_seq, so this is redundant - for names read from makefiles. It is here for names passed - on the command line. */ - while (name[0] == '.' && name[1] == '/' && name[2] != '\0') - { - name += 2; - while (*name == '/') - /* Skip following slashes: ".//foo" is "foo", not "/foo". */ - ++name; - } - - if (*name == '\0') - /* It was all slashes after a dot. */ - name = "./"; - - hashval = 0; - for (n = name; *n != '\0'; ++n) - HASH (hashval, *n); - hashval %= FILE_BUCKETS; - - for (f = files[hashval]; f != 0; f = f->next) - if (streq (f->name, name)) - return f; - return 0; -} - -struct file * -enter_file (name) - char *name; -{ - register struct file *f, *new; - register char *n; - register unsigned int hashval; - - if (*name == '\0') - abort (); - - hashval = 0; - for (n = name; *n != '\0'; ++n) - HASH (hashval, *n); - hashval %= FILE_BUCKETS; - - for (f = files[hashval]; f != 0; f = f->next) - if (streq (f->name, name)) - break; - - if (f != 0 && !f->double_colon) - return f; - - new = (struct file *) xmalloc (sizeof (struct file)); - bzero ((char *) new, sizeof (struct file)); - new->name = name; - new->update_status = -1; - - if (f == 0) - { - /* This is a completely new file. */ - new->next = files[hashval]; - files[hashval] = new; - } - else - { - /* There is already a double-colon entry for this file. */ - new->double_colon = f; - while (f->prev != 0) - f = f->prev; - f->prev = new; - } - - return new; -} - -/* Rename FILE to NAME. This is not as simple as resetting - the `name' member, since it must be put in a new hash bucket, - and possibly merged with an existing file called NAME. */ - -void -rename_file (file, name) - register struct file *file; - char *name; -{ - char *oldname = file->name; - register unsigned int oldhash; - register char *n; - - while (file->renamed != 0) - file = file->renamed; - - /* Find the hash values of the old and new names. */ - - oldhash = 0; - for (n = oldname; *n != '\0'; ++n) - HASH (oldhash, *n); - - file_hash_enter (file, name, oldhash, file->name); -} - -void -file_hash_enter (file, name, oldhash, oldname) - register struct file *file; - char *name; - unsigned int oldhash; - char *oldname; -{ - unsigned int oldbucket = oldhash % FILE_BUCKETS; - register unsigned int newhash, newbucket; - struct file *oldfile; - register char *n; - register struct file *f; - - newhash = 0; - for (n = name; *n != '\0'; ++n) - HASH (newhash, *n); - newbucket = newhash % FILE_BUCKETS; - - /* Look for an existing file under the new name. */ - - for (oldfile = files[newbucket]; oldfile != 0; oldfile = oldfile->next) - if (streq (oldfile->name, name)) - break; - - if (oldhash != 0 && (newbucket != oldbucket || oldfile != 0)) - { - /* Remove FILE from its hash bucket. */ - - struct file *lastf = 0; - - for (f = files[oldbucket]; f != file; f = f->next) - lastf = f; - - if (lastf == 0) - files[oldbucket] = f->next; - else - lastf->next = f->next; - } - - /* Give FILE its new name. */ - - file->name = name; - for (f = file->double_colon; f != 0; f = f->prev) - f->name = name; - - if (oldfile == 0) - { - /* There is no existing file with the new name. */ - - if (newbucket != oldbucket) - { - /* Put FILE in its new hash bucket. */ - file->next = files[newbucket]; - files[newbucket] = file; - } - } - else - { - /* There is an existing file with the new name. - We must merge FILE into the existing file. */ - - register struct dep *d; - - if (file->cmds != 0) - { - if (oldfile->cmds == 0) - oldfile->cmds = file->cmds; - else if (file->cmds != oldfile->cmds) - { - /* We have two sets of commands. We will go with the - one given in the rule explicitly mentioning this name, - but give a message to let the user know what's going on. */ - if (oldfile->cmds->filename != 0) - makefile_error (file->cmds->filename, file->cmds->lineno, - "Commands were specified for \ -file `%s' at %s:%u,", - oldname, oldfile->cmds->filename, - oldfile->cmds->lineno); - else - makefile_error (file->cmds->filename, file->cmds->lineno, - "Commands for file `%s' were found by \ -implicit rule search,", - oldname); - makefile_error (file->cmds->filename, file->cmds->lineno, - "but `%s' is now considered the same file \ -as `%s'.", - oldname, name); - makefile_error (file->cmds->filename, file->cmds->lineno, - "Commands for `%s' will be ignored \ -in favor of those for `%s'.", - name, oldname); - } - } - - /* Merge the dependencies of the two files. */ - - d = oldfile->deps; - if (d == 0) - oldfile->deps = file->deps; - else - { - while (d->next != 0) - d = d->next; - d->next = file->deps; - } - - merge_variable_set_lists (&oldfile->variables, file->variables); - - if (oldfile->double_colon && !file->double_colon) - fatal ("can't rename single-colon `%s' to double-colon `%s'", - oldname, name); - if (!oldfile->double_colon && file->double_colon) - fatal ("can't rename double-colon `%s' to single-colon `%s'", - oldname, name); - - if (file->last_mtime > oldfile->last_mtime) - /* %%% Kludge so -W wins on a file that gets vpathized. */ - oldfile->last_mtime = file->last_mtime; - -#define MERGE(field) oldfile->field |= file->field - MERGE (precious); - MERGE (tried_implicit); - MERGE (updating); - MERGE (updated); - MERGE (is_target); - MERGE (cmd_target); - MERGE (phony); -#undef MERGE - - file->renamed = oldfile; - } -} - -/* Remove all nonprecious intermediate files. - If SIG is nonzero, this was caused by a fatal signal, - meaning that a different message will be printed, and - the message will go to stderr rather than stdout. */ - -void -remove_intermediates (sig) - int sig; -{ - register int i; - register struct file *f; - char doneany; - - if (question_flag || touch_flag) - return; - if (sig && just_print_flag) - return; - - doneany = 0; - for (i = 0; i < FILE_BUCKETS; ++i) - for (f = files[i]; f != 0; f = f->next) - if (f->intermediate && (f->dontcare || !f->precious)) - { - int status; - if (f->update_status == -1) - /* If nothing would have created this file yet, - don't print an "rm" command for it. */ - continue; - else if (just_print_flag) - status = 0; - else - { - status = unlink (f->name); - if (status < 0 && errno == ENOENT) - continue; - } - if (!f->dontcare) - { - if (sig) - error ("*** Deleting intermediate file `%s'", f->name); - else if (!silent_flag) - { - if (! doneany) - { - fputs ("rm ", stdout); - doneany = 1; - } - else - putchar (' '); - fputs (f->name, stdout); - fflush (stdout); - } - if (status < 0) - perror_with_name ("unlink: ", f->name); - } - } - - if (doneany && !sig) - { - putchar ('\n'); - fflush (stdout); - } -} - -/* For each dependency of each file, make the `struct dep' point - at the appropriate `struct file' (which may have to be created). - - Also mark the files depended on by .PRECIOUS and .PHONY. */ - -void -snap_deps () -{ - register struct file *f, *f2; - register struct dep *d; - register int i; - - /* Enter each dependency name as a file. */ - for (i = 0; i < FILE_BUCKETS; ++i) - for (f = files[i]; f != 0; f = f->next) - for (f2 = f; f2 != 0; f2 = f2->prev) - for (d = f2->deps; d != 0; d = d->next) - if (d->name != 0) - { - d->file = lookup_file (d->name); - if (d->file == 0) - d->file = enter_file (d->name); - else - free (d->name); - d->name = 0; - } - - for (f = lookup_file (".PRECIOUS"); f != 0; f = f->prev) - for (d = f->deps; d != 0; d = d->next) - for (f2 = d->file; f2 != 0; f2 = f2->prev) - f2->precious = 1; - - for (f = lookup_file (".PHONY"); f != 0; f = f->prev) - for (d = f->deps; d != 0; d = d->next) - for (f2 = d->file; f2 != 0; f2 = f2->prev) - { - /* Mark this file as phony and nonexistent. */ - f2->phony = 1; - f2->last_mtime = (time_t) -1; - } - - f = lookup_file (".EXPORT_ALL_VARIABLES"); - if (f != 0 && f->is_target) - export_all_variables = 1; - - f = lookup_file (".IGNORE"); - if (f != 0 && f->is_target) - { - if (f->deps == 0) - ignore_errors_flag = 1; - else - for (d = f->deps; d != 0; d = d->next) - for (f2 = d->file; f2 != 0; f2 = f2->prev) - f2->command_flags |= COMMANDS_NOERROR; - } - - f = lookup_file (".SILENT"); - if (f != 0 && f->is_target) - { - if (f->deps == 0) - silent_flag = 1; - else - for (d = f->deps; d != 0; d = d->next) - for (f2 = d->file; f2 != 0; f2 = f2->prev) - f2->command_flags |= COMMANDS_SILENT; - } - - f = lookup_file (".POSIX"); - if (f != 0 && f->is_target) - posix_pedantic = 1; -} - -/* Set the `command_state' member of FILE and all its `also_make's. */ - -void -set_command_state (file, state) - struct file *file; - int state; -{ - struct dep *d; - - file->command_state = state; - - for (d = file->also_make; d != 0; d = d->next) - d->file->command_state = state; -} - -/* Print the data base of files. */ - -static void -print_file (f) - struct file *f; -{ - register struct dep *d; - - putchar ('\n'); - if (!f->is_target) - puts ("# Not a target:"); - printf ("%s:%s", f->name, f->double_colon ? ":" : ""); - - for (d = f->deps; d != 0; d = d->next) - printf (" %s", dep_name (d)); - putchar ('\n'); - - if (f->precious) - puts ("# Precious file (dependency of .PRECIOUS)."); - if (f->phony) - puts ("# Phony target (dependency of .PHONY)."); - if (f->cmd_target) - puts ("# Command-line target."); - if (f->dontcare) - puts ("# A default or MAKEFILES makefile."); - printf ("# Implicit rule search has%s been done.\n", - f->tried_implicit ? "" : " not"); - if (f->stem != 0) - printf ("# Implicit/static pattern stem: `%s'\n", f->stem); - if (f->intermediate) - puts ("# File is an intermediate dependency."); - if (f->also_make != 0) - { - fputs ("# Also makes:", stdout); - for (d = f->also_make; d != 0; d = d->next) - printf (" %s", dep_name (d)); - putchar ('\n'); - } - if (f->last_mtime == (time_t) 0) - puts ("# Modification time never checked."); - else if (f->last_mtime == (time_t) -1) - puts ("# File does not exist."); - else - printf ("# Last modified %.24s (%ld)\n", - ctime (&f->last_mtime), (long int) f->last_mtime); - printf ("# File has%s been updated.\n", - f->updated ? "" : " not"); - switch (f->command_state) - { - case cs_running: - puts ("# Commands currently running (THIS IS A BUG)."); - break; - case cs_deps_running: - puts ("# Dependencies commands running (THIS IS A BUG)."); - break; - case cs_not_started: - case cs_finished: - switch (f->update_status) - { - case -1: - break; - case 0: - puts ("# Successfully updated."); - break; - case 1: - assert (question_flag); - puts ("# Needs to be updated (-q is set)."); - break; - case 2: - puts ("# Failed to be updated."); - break; - default: - puts ("# Invalid value in `update_status' member!"); - fflush (stdout); - fflush (stderr); - abort (); - } - break; - default: - puts ("# Invalid value in `command_state' member!"); - fflush (stdout); - fflush (stderr); - abort (); - } - - if (f->variables != 0) - print_file_variables (f); - - if (f->cmds != 0) - print_commands (f->cmds); -} - -void -print_file_data_base () -{ - register unsigned int i, nfiles, per_bucket; - register struct file *file; - - puts ("\n# Files"); - - per_bucket = nfiles = 0; - for (i = 0; i < FILE_BUCKETS; ++i) - { - register unsigned int this_bucket = 0; - - for (file = files[i]; file != 0; file = file->next) - { - register struct file *f; - - ++this_bucket; - - for (f = file; f != 0; f = f->prev) - print_file (f); - } - - nfiles += this_bucket; - if (this_bucket > per_bucket) - per_bucket = this_bucket; - } - - if (nfiles == 0) - puts ("\n# No files."); - else - { - printf ("\n# %u files in %u hash buckets.\n", nfiles, FILE_BUCKETS); -#ifndef NO_FLOAT - printf ("# average %.1f files per bucket, max %u files in one bucket.\n", - ((double) nfiles) / ((double) FILE_BUCKETS) * 100.0, per_bucket); -#endif - } -} diff --git a/buildtools/windows/source/make/file.h b/buildtools/windows/source/make/file.h deleted file mode 100644 index 5889474a550..00000000000 --- a/buildtools/windows/source/make/file.h +++ /dev/null @@ -1,111 +0,0 @@ -/* Definition of target file data structures for GNU Make. -Copyright (C) 1988, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* Structure that represents the info on one file - that the makefile says how to make. - All of these are chained together through `next'. */ - -struct file - { - struct file *next; - char *name; - struct dep *deps; - struct commands *cmds; /* Commands to execute for this target. */ - int command_flags; /* Flags OR'd in for cmds; see commands.h. */ - char *stem; /* Implicit stem, if an implicit - rule has been used */ - struct dep *also_make; /* Targets that are made by making this. */ - time_t last_mtime; /* File's modtime, if already known. */ - struct file *prev; /* Previous entry for same file name; - used when there are multiple double-colon - entries for the same file. */ - - /* File that this file was renamed to. After any time that a - file could be renamed, call `check_renamed' (below). */ - struct file *renamed; - - /* List of variable sets used for this file. */ - struct variable_set_list *variables; - - /* Immediate dependent that caused this target to be remade, - or nil if there isn't one. */ - struct file *parent; - - /* For a double-colon entry, this is the first double-colon entry for - the same file. Otherwise this is null. */ - struct file *double_colon; - - short int update_status; /* Status of the last attempt to update, - or -1 if none has been made. */ - - enum /* State of the commands. */ - { /* Note: It is important that cs_not_started be zero. */ - cs_not_started, /* Not yet started. */ - cs_deps_running, /* Dep commands running. */ - cs_running, /* Commands running. */ - cs_finished /* Commands finished. */ - } command_state ENUM_BITFIELD (2); - - unsigned int precious:1; /* Non-0 means don't delete file on quit */ - unsigned int tried_implicit:1; /* Nonzero if have searched - for implicit rule for making - this file; don't search again. */ - unsigned int updating:1; /* Nonzero while updating deps of this file */ - unsigned int updated:1; /* Nonzero if this file has been remade. */ - unsigned int is_target:1; /* Nonzero if file is described as target. */ - unsigned int cmd_target:1; /* Nonzero if file was given on cmd line. */ - unsigned int phony:1; /* Nonzero if this is a phony file - i.e., a dependency of .PHONY. */ - unsigned int intermediate:1;/* Nonzero if this is an intermediate file. */ - unsigned int dontcare:1; /* Nonzero if no complaint is to be made if - this target cannot be remade. */ - }; - -/* Number of intermediate files entered. */ - -extern unsigned int num_intermediates; - -extern struct file *default_goal_file, *suffix_file, *default_file; - - -extern struct file *lookup_file (), *enter_file (); -extern void remove_intermediates (), snap_deps (); -extern void rename_file (), file_hash_enter (); -extern void set_command_state (); - - -extern time_t f_mtime (); -#define file_mtime_1(f, v) \ - ((f)->last_mtime != (time_t) 0 ? (f)->last_mtime : f_mtime ((f), v)) -#define file_mtime(f) file_mtime_1 ((f), 1) -#define file_mtime_no_search(f) file_mtime_1 ((f), 0) - -/* Modtime value to use for `infinitely new'. We used to get the current time - from the system and use that whenever we wanted `new'. But that causes - trouble when the machine running make and the machine holding a file have - different ideas about what time it is; and can also lose for `force' - targets, which need to be considered newer than anything that depends on - them, even if said dependents' modtimes are in the future. - - NOTE: This assumes 32-bit `time_t's, but I cannot think of a portable way - to produce the largest representable integer of a given signed type. */ -#define NEW_MTIME ((time_t) 0x7fffffff) - - -#define check_renamed(file) \ - while ((file)->renamed != 0) (file) = (file)->renamed /* No ; here. */ diff --git a/buildtools/windows/source/make/function.c b/buildtools/windows/source/make/function.c deleted file mode 100644 index 428d447008c..00000000000 --- a/buildtools/windows/source/make/function.c +++ /dev/null @@ -1,1329 +0,0 @@ -/* Variable function expansion for GNU Make. -Copyright (C) 1988, 89, 91, 92, 93, 94, 95 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "variable.h" -#include "dep.h" -#include "commands.h" -#include "job.h" - -#if defined(__MSDOS__) || defined(NETSCAPE) -#include -#include -#include -#include -#endif - -static char *string_glob (); - -/* Store into VARIABLE_BUFFER at O the result of scanning TEXT and replacing - each occurrence of SUBST with REPLACE. TEXT is null-terminated. SLEN is - the length of SUBST and RLEN is the length of REPLACE. If BY_WORD is - nonzero, substitutions are done only on matches which are complete - whitespace-delimited words. If SUFFIX_ONLY is nonzero, substitutions are - done only at the ends of whitespace-delimited words. */ - -char * -subst_expand (o, text, subst, replace, slen, rlen, by_word, suffix_only) - char *o; - char *text; - char *subst, *replace; - unsigned int slen, rlen; - int by_word, suffix_only; -{ - register char *t = text; - register char *p; - - if (slen == 0 && !by_word && !suffix_only) - { - /* The first occurrence of "" in any string is its end. */ - o = variable_buffer_output (o, t, strlen (t)); - if (rlen > 0) - o = variable_buffer_output (o, replace, rlen); - return o; - } - - do - { - if ((by_word | suffix_only) && slen == 0) - /* When matching by words, the empty string should match - the end of each word, rather than the end of the whole text. */ - p = end_of_token (next_token (t)); - else - { - p = sindex (t, 0, subst, slen); - if (p == 0) - { - /* No more matches. Output everything left on the end. */ - o = variable_buffer_output (o, t, strlen (t)); - return o; - } - } - - /* Output everything before this occurrence of the string to replace. */ - if (p > t) - o = variable_buffer_output (o, t, p - t); - - /* If we're substituting only by fully matched words, - or only at the ends of words, check that this case qualifies. */ - if ((by_word - && ((p > t && !isblank (p[-1])) - || (p[slen] != '\0' && !isblank (p[slen])))) - || (suffix_only - && (p[slen] != '\0' && !isblank (p[slen])))) - /* Struck out. Output the rest of the string that is - no longer to be replaced. */ - o = variable_buffer_output (o, subst, slen); - else if (rlen > 0) - /* Output the replacement string. */ - o = variable_buffer_output (o, replace, rlen); - - /* Advance T past the string to be replaced. */ - t = p + slen; - } while (*t != '\0'); - - return o; -} - - -/* Store into VARIABLE_BUFFER at O the result of scanning TEXT - and replacing strings matching PATTERN with REPLACE. - If PATTERN_PERCENT is not nil, PATTERN has already been - run through find_percent, and PATTERN_PERCENT is the result. - If REPLACE_PERCENT is not nil, REPLACE has already been - run through find_percent, and REPLACE_PERCENT is the result. */ - -char * -patsubst_expand (o, text, pattern, replace, pattern_percent, replace_percent) - char *o; - char *text; - register char *pattern, *replace; - register char *pattern_percent, *replace_percent; -{ - register int pattern_prepercent_len, pattern_postpercent_len; - register int replace_prepercent_len, replace_postpercent_len; - register char *t; - unsigned int len; - int doneany = 0; - - /* We call find_percent on REPLACE before checking PATTERN so that REPLACE - will be collapsed before we call subst_expand if PATTERN has no %. */ - if (replace_percent == 0) - replace_percent = find_percent (replace); - if (replace_percent != 0) - { - /* Record the length of REPLACE before and after the % so - we don't have to compute these lengths more than once. */ - replace_prepercent_len = replace_percent - replace; - replace_postpercent_len = strlen (replace_percent + 1); - } - else - /* We store the length of the replacement - so we only need to compute it once. */ - replace_prepercent_len = strlen (replace); - - if (pattern_percent == 0) - pattern_percent = find_percent (pattern); - if (pattern_percent == 0) - /* With no % in the pattern, this is just a simple substitution. */ - return subst_expand (o, text, pattern, replace, - strlen (pattern), strlen (replace), 1, 0); - - /* Record the length of PATTERN before and after the % - so we don't have to compute it more than once. */ - pattern_prepercent_len = pattern_percent - pattern; - pattern_postpercent_len = strlen (pattern_percent + 1); - - while ((t = find_next_token (&text, &len)) != 0) - { - int fail = 0; - - /* Is it big enough to match? */ - if ((int)len < pattern_prepercent_len + pattern_postpercent_len) - fail = 1; - - /* Does the prefix match? */ - if (!fail && pattern_prepercent_len > 0 - && (*t != *pattern - || t[pattern_prepercent_len - 1] != pattern_percent[-1] - || strncmp (t + 1, pattern + 1, pattern_prepercent_len - 1))) - fail = 1; - - /* Does the suffix match? */ - if (!fail && pattern_postpercent_len > 0 - && (t[len - 1] != pattern_percent[pattern_postpercent_len] - || t[len - pattern_postpercent_len] != pattern_percent[1] - || strncmp (&t[len - pattern_postpercent_len], - &pattern_percent[1], pattern_postpercent_len - 1))) - fail = 1; - - if (fail) - /* It didn't match. Output the string. */ - o = variable_buffer_output (o, t, len); - else - { - /* It matched. Output the replacement. */ - - /* Output the part of the replacement before the %. */ - o = variable_buffer_output (o, replace, replace_prepercent_len); - - if (replace_percent != 0) - { - /* Output the part of the matched string that - matched the % in the pattern. */ - o = variable_buffer_output (o, t + pattern_prepercent_len, - len - (pattern_prepercent_len - + pattern_postpercent_len)); - /* Output the part of the replacement after the %. */ - o = variable_buffer_output (o, replace_percent + 1, - replace_postpercent_len); - } - } - - /* Output a space, but not if the replacement is "". */ - if (fail || replace_prepercent_len > 0 - || (replace_percent != 0 && len + replace_postpercent_len > 0)) - { - o = variable_buffer_output (o, " ", 1); - doneany = 1; - } - } - if (doneany) - /* Kill the last space. */ - --o; - - return o; -} - -/* Handle variable-expansion-time functions such as $(dir foo/bar) ==> foo/ */ - -/* These enumeration constants distinguish the - various expansion-time built-in functions. */ - -enum function - { - function_subst, - function_addsuffix, - function_addprefix, - function_dir, - function_notdir, - function_suffix, - function_basename, - function_wildcard, - function_firstword, - function_word, - function_words, - function_findstring, - function_strip, - function_join, - function_patsubst, - function_filter, - function_filter_out, - function_foreach, - function_sort, - function_origin, - function_shell, - function_invalid - }; - -/* Greater than the length of any function name. */ -#define MAXFUNCTIONLEN 11 - -/* The function names and lengths of names, for looking them up. */ - -static struct - { - char *name; - unsigned int len; - enum function function; - } function_table[] = - { - { "subst", 5, function_subst }, - { "addsuffix", 9, function_addsuffix }, - { "addprefix", 9, function_addprefix }, - { "dir", 3, function_dir }, - { "notdir", 6, function_notdir }, - { "suffix", 6, function_suffix }, - { "basename", 8, function_basename }, - { "wildcard", 8, function_wildcard }, - { "firstword", 9, function_firstword }, - { "word", 4, function_word }, - { "words", 5, function_words }, - { "findstring", 10, function_findstring }, - { "strip", 5, function_strip }, - { "join", 4, function_join }, - { "patsubst", 8, function_patsubst }, - { "filter", 6, function_filter }, - { "filter-out", 10, function_filter_out }, - { "foreach", 7, function_foreach }, - { "sort", 4, function_sort }, - { "origin", 6, function_origin }, - { "shell", 5, function_shell }, - { 0, 0, function_invalid } - }; - -/* Return 1 if PATTERN matches WORD, 0 if not. */ - -int -pattern_matches (pattern, percent, word) - register char *pattern, *percent, *word; -{ - unsigned int sfxlen, wordlen; - - if (percent == 0) - { - unsigned int len = strlen (pattern) + 1; - char *new = (char *) alloca (len); - bcopy (pattern, new, len); - pattern = new; - percent = find_percent (pattern); - if (percent == 0) - return streq (pattern, word); - } - - sfxlen = strlen (percent + 1); - wordlen = strlen (word); - - if (wordlen < (percent - pattern) + sfxlen - || strncmp (pattern, word, percent - pattern)) - return 0; - - return !strcmp (percent + 1, word + (wordlen - sfxlen)); -} - -int shell_function_pid = 0, shell_function_completed; - -/* Perform the function specified by FUNCTION on the text at TEXT. - END is points to the end of the argument text (exclusive). - The output is written into VARIABLE_BUFFER starting at O. */ - -/* Note this absorbs a semicolon and is safe to use in conditionals. */ -#define BADARGS(func) \ - if (reading_filename != 0) \ - makefile_fatal (reading_filename, *reading_lineno_ptr, \ - "insufficient arguments to function `%s'", \ - func); \ - else \ - fatal ("insufficient arguments to function `%s'", func) - -static char * -expand_function (o, function, text, end) - char *o; - enum function function; - char *text; - char *end; -{ - char *p, *p2, *p3; - unsigned int i, len; - int doneany = 0; - int count; - char endparen = *end, startparen = *end == ')' ? '(' : '{'; - - switch (function) - { - default: - abort (); - break; - - case function_shell: - { - char **argv, **envp; - char *error_prefix; -// int pipedes[2]; -// int pid; - - /* Expand the command line. */ - text = expand_argument (text, end); - - /* Construct the argument list. */ - argv = construct_command_argv (text, (char *) NULL, (struct file *) 0); - if (argv == 0) - break; - - /* Using a target environment for `shell' loses in cases like: - export var = $(shell echo foobie) - because target_environment hits a loop trying to expand $(var) - to put it in the environment. This is even more confusing when - var was not explicitly exported, but just appeared in the - calling environment. */ -#if 1 - envp = environ; -#else - /* Construct the environment. */ - envp = target_environment ((struct file *) 0); -#endif - - /* For error messages. */ - if (reading_filename != 0) - { - error_prefix = (char *) alloca (strlen (reading_filename) + 100); - sprintf (error_prefix, - "%s:%u: ", reading_filename, *reading_lineno_ptr); - } - else - error_prefix = ""; - -#if !defined(__MSDOS__) && !defined(NETSCAPE) - if (pipe (pipedes) < 0) - { - perror_with_name (error_prefix, "pipe"); - break; - } - - pid = vfork (); - if (pid < 0) - perror_with_name (error_prefix, "fork"); - else if (pid == 0) - child_execute_job (0, pipedes[1], argv, envp); - else - { - /* We are the parent. */ - - char *buffer; - unsigned int maxlen; - int cc; - - /* Free the storage only the child needed. */ - free (argv[0]); - free ((char *) argv); -#if 0 - for (i = 0; envp[i] != 0; ++i) - free (envp[i]); - free ((char *) envp); -#endif - - /* Record the PID for reap_children. */ - shell_function_pid = pid; - shell_function_completed = 0; - - - /* Set up and read from the pipe. */ - - maxlen = 200; - buffer = (char *) xmalloc (maxlen + 1); - - /* Close the write side of the pipe. */ - (void) close (pipedes[1]); - - /* Read from the pipe until it gets EOF. */ - i = 0; - do - { - if (i == maxlen) - { - maxlen += 512; - buffer = (char *) xrealloc (buffer, maxlen + 1); - } - - errno = 0; - cc = read (pipedes[0], &buffer[i], maxlen - i); - if (cc > 0) - i += cc; - } -#ifdef EINTR - while (cc > 0 || errno == EINTR); -#else - while (cc > 0); -#endif - - /* Close the read side of the pipe. */ - (void) close (pipedes[0]); - - /* Loop until child_handler sets shell_function_completed - to the status of our child shell. */ - while (shell_function_completed == 0) - reap_children (1, 0); - - shell_function_pid = 0; - - /* The child_handler function will set shell_function_completed - to 1 when the child dies normally, or to -1 if it - dies with status 127, which is most likely an exec fail. */ - - if (shell_function_completed == -1) - { - /* This most likely means that the execvp failed, - so we should just write out the error message - that came in over the pipe from the child. */ - fputs (buffer, stderr); - fflush (stderr); - } - else - { - /* The child finished normally. Replace all - newlines in its output with spaces, and put - that in the variable output buffer. */ - if (i > 0) - { - if (buffer[i - 1] == '\n') - buffer[--i] = '\0'; - else - buffer[i] = '\0'; - p = buffer; - while ((p = index (p, '\n')) != 0) - *p++ = ' '; - o = variable_buffer_output (o, buffer, i); - } - } - - free (buffer); - } -#else /* MSDOS. */ - { - /* MS-DOS can't do fork, but it can do spawn. However, this - means that we don't have an opportunity to reopen stdout to - trap it. Thus, we save our own stdout onto a new descriptor - and dup a temp file's descriptor onto our stdout temporarily. - After we spawn the shell program, we dup our own stdout back - to the stdout descriptor. The buffer reading is the same as - above, except that we're now reading from a file. */ - - int save_stdout; - int child_stdout; - char tmp_output[FILENAME_MAX]; -// FILE *child_stream; - unsigned int maxlen = 200; - int cc; - char *buffer; - - strcpy (tmp_output, "shXXXXXX"); - mktemp (tmp_output); - child_stdout = open (tmp_output, - O_WRONLY|O_CREAT|O_TRUNC|O_TEXT, 0644); - save_stdout = dup (1); - dup2 (child_stdout, 1); -#ifdef NETSCAPE - if (ns_spawn (argv, NULL, NULL) == -1) - { - char errMsg[128]; - FormatMessage ( - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError (), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - errMsg, - sizeof (errMsg), - NULL - ); - error ("%s%s: %s", error_prefix, argv[0], errMsg); - } -#else - spawnvp (P_WAIT, argv[0], argv); -#endif - dup2 (save_stdout, 1); - close (child_stdout); - close (save_stdout); - - child_stdout = open (tmp_output, O_RDONLY|O_TEXT, 0644); - - buffer = xmalloc (maxlen); - i = 0; - do - { - if (i == maxlen) - { - maxlen += 512; - buffer = (char *) xrealloc (buffer, maxlen + 1); - } - - cc = read (child_stdout, &buffer[i], maxlen - i); - if (cc > 0) - i += cc; - } while (cc > 0); - - close (child_stdout); - unlink (tmp_output); - - if (i > 0) - { - if (buffer[i - 1] == '\n') - buffer[--i] = '\0'; - else - buffer[i] = '\0'; - p = buffer; - while ((p = index (p, '\n')) != 0) - *p++ = ' '; - o = variable_buffer_output (o, buffer, i); - } - free (buffer); - } -#endif /* Not MSDOS. */ - - free (text); - break; - } - - case function_origin: - /* Expand the argument. */ - text = expand_argument (text, end); - - { - register struct variable *v = lookup_variable (text, strlen (text)); - if (v == 0) - o = variable_buffer_output (o, "undefined", 9); - else - switch (v->origin) - { - default: - case o_invalid: - abort (); - break; - case o_default: - o = variable_buffer_output (o, "default", 7); - break; - case o_env: - o = variable_buffer_output (o, "environment", 11); - break; - case o_file: - o = variable_buffer_output (o, "file", 4); - break; - case o_env_override: - o = variable_buffer_output (o, "environment override", 20); - break; - case o_command: - o = variable_buffer_output (o, "command line", 12); - break; - case o_override: - o = variable_buffer_output (o, "override", 8); - break; - case o_automatic: - o = variable_buffer_output (o, "automatic", 9); - break; - } - } - - free (text); - break; - - case function_sort: - /* Expand the argument. */ - text = expand_argument (text, end); - - { - char **words = (char **) xmalloc (10 * sizeof (char *)); - unsigned int nwords = 10; - register unsigned int wordi = 0; - char *t; - - /* Chop TEXT into words and put them in WORDS. */ - t = text; - while ((p = find_next_token (&t, &len)) != 0) - { - if (wordi >= nwords - 1) - { - nwords *= 2; - words = (char **) xrealloc ((char *) words, - nwords * sizeof (char *)); - } - words[wordi++] = savestring (p, len); - } - - if (wordi > 0) - { - /* Now sort the list of words. */ - qsort ((char *) words, wordi, sizeof (char *), alpha_compare); - - /* Now write the sorted list. */ - for (i = 0; i < wordi; ++i) - { - len = strlen (words[i]); - if (i == wordi - 1 || strlen (words[i + 1]) != len - || strcmp (words[i], words[i + 1])) - { - o = variable_buffer_output (o, words[i], len); - o = variable_buffer_output (o, " ", 1); - } - free (words[i]); - } - /* Kill the last space. */ - --o; - } - - free ((char *) words); - } - - free (text); - break; - - case function_foreach: - { - /* Get three comma-separated arguments but - expand only the first two. */ - char *var, *list; - register struct variable *v; - - count = 0; - for (p = text; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS ("foreach"); - var = expand_argument (text, p); - - p2 = p + 1; - count = 0; - for (p = p2; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS ("foreach"); - list = expand_argument (p2, p); - - ++p; - text = savestring (p, end - p); - - push_new_variable_scope (); - v = define_variable (var, strlen (var), "", o_automatic, 0); - p3 = list; - while ((p = find_next_token (&p3, &len)) != 0) - { - char *result; - char save = p[len]; - p[len] = '\0'; - v->value = p; - result = allocated_variable_expand (text); - p[len] = save; - - o = variable_buffer_output (o, result, strlen (result)); - o = variable_buffer_output (o, " ", 1); - doneany = 1; - free (result); - } - if (doneany) - /* Kill the last space. */ - --o; - - pop_variable_scope (); - - free (var); - free (list); - free (text); - } - break; - - case function_filter: - case function_filter_out: - { - struct word - { - struct word *next; - char *word; - int matched; - } *words, *wordtail, *wp; - - /* Get two comma-separated arguments and expand each one. */ - count = 0; - for (p = text; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS (function == function_filter ? "filter" : "filter-out"); - p2 = expand_argument (text, p); - - text = expand_argument (p + 1, end); - - /* Chop TEXT up into words and then run each pattern through. */ - words = wordtail = 0; - p3 = text; - while ((p = find_next_token (&p3, &len)) != 0) - { - struct word *w = (struct word *) alloca (sizeof (struct word)); - if (words == 0) - words = w; - else - wordtail->next = w; - wordtail = w; - - if (*p3 != '\0') - ++p3; - p[len] = '\0'; - w->word = p; - w->matched = 0; - } - - if (words != 0) - { - wordtail->next = 0; - - /* Run each pattern through the words, killing words. */ - p3 = p2; - while ((p = find_next_token (&p3, &len)) != 0) - { - char *percent; - char save = p[len]; - p[len] = '\0'; - - percent = find_percent (p); - for (wp = words; wp != 0; wp = wp->next) - wp->matched |= (percent == 0 ? streq (p, wp->word) - : pattern_matches (p, percent, wp->word)); - - p[len] = save; - } - - /* Output the words that matched (or didn't, for filter-out). */ - for (wp = words; wp != 0; wp = wp->next) - if (function == function_filter ? wp->matched : !wp->matched) - { - o = variable_buffer_output (o, wp->word, strlen (wp->word)); - o = variable_buffer_output (o, " ", 1); - doneany = 1; - } - if (doneany) - /* Kill the last space. */ - --o; - } - - free (p2); - free (text); - } - break; - - case function_patsubst: - /* Get three comma-separated arguments and expand each one. */ - count = 0; - for (p = text; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS ("patsubst"); - - p2 = p; - count = 0; - for (++p; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS ("patsubst"); - - text = expand_argument (text, p2); - p3 = expand_argument (p2 + 1, p); - p2 = expand_argument (p + 1, end); - - o = patsubst_expand (o, p2, text, p3, (char *) 0, (char *) 0); - - free (text); - free (p3); - free (p2); - break; - - case function_join: - /* Get two comma-separated arguments and expand each one. */ - count = 0; - for (p = text; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS ("join"); - text = expand_argument (text, p); - - p = expand_argument (p + 1, end); - - { - /* Write each word of the first argument directly followed - by the corresponding word of the second argument. - If the two arguments have a different number of words, - the excess words are just output separated by blanks. */ - register char *tp, *pp; - p2 = text; - p3 = p; - do - { - unsigned int tlen, plen; - - tp = find_next_token (&p2, &tlen); - if (tp != 0) - o = variable_buffer_output (o, tp, tlen); - - pp = find_next_token (&p3, &plen); - if (pp != 0) - o = variable_buffer_output (o, pp, plen); - - if (tp != 0 || pp != 0) - { - o = variable_buffer_output (o, " ", 1); - doneany = 1; - } - } - while (tp != 0 || pp != 0); - if (doneany) - /* Kill the last blank. */ - --o; - } - - free (text); - free (p); - break; - - case function_strip: - /* Expand the argument. */ - text = expand_argument (text, end); - - p2 = text; - while ((p = find_next_token (&p2, &i)) != 0) - { - o = variable_buffer_output (o, p, i); - o = variable_buffer_output (o, " ", 1); - doneany = 1; - } - if (doneany) - /* Kill the last space. */ - --o; - - free (text); - break; - - case function_wildcard: - text = expand_argument (text, end); - - p = string_glob (text); - o = variable_buffer_output (o, p, strlen (p)); - - free (text); - break; - - case function_subst: - /* Get three comma-separated arguments and expand each one. */ - count = 0; - for (p = text; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS ("subst"); - - p2 = p; - count = 0; - for (++p; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS ("subst"); - - text = expand_argument (text, p2); - p3 = expand_argument (p2 + 1, p); - p2 = expand_argument (p + 1, end); - - o = subst_expand (o, p2, text, p3, strlen (text), strlen (p3), 0, 0); - - free (text); - free (p3); - free (p2); - break; - - case function_firstword: - /* Expand the argument. */ - text = expand_argument (text, end); - - /* Find the first word in TEXT. */ - p2 = text; - p = find_next_token (&p2, &i); - if (p != 0) - o = variable_buffer_output (o, p, i); - - free (text); - break; - - case function_word: - /* Get two comma-separated arguments and expand each one. */ - count = 0; - for (p = text; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS ("word"); - text = expand_argument (text, p); - - p3 = expand_argument (p + 1, end); - - /* Check the first argument. */ - for (p2 = text; *p2 != '\0'; ++p2) - if (*p2 < '0' || *p2 > '9') - { - if (reading_filename != 0) - makefile_fatal (reading_filename, *reading_lineno_ptr, - "non-numeric first argument to `word' function"); - else - fatal ("non-numeric first argument to `word' function"); - } - - i = (unsigned int) atoi (text); - if (i == 0) - { - if (reading_filename != 0) - makefile_fatal (reading_filename, *reading_lineno_ptr, - "the `word' function takes a one-origin \ -index argument"); - else - fatal ("the `word' function takes a one-origin index argument"); - } - - p2 = p3; - while ((p = find_next_token (&p2, &len)) != 0) - if (--i == 0) - break; - if (i == 0) - o = variable_buffer_output (o, p, len); - - free (text); - free (p3); - break; - - case function_words: - /* Expand the argument. */ - text = expand_argument (text, end); - - i = 0; - p2 = text; - while (find_next_token (&p2, (unsigned int *) 0) != 0) - ++i; - - { - char buf[20]; - sprintf (buf, "%d", i); - o = variable_buffer_output (o, buf, strlen (buf)); - } - - free (text); - break; - - case function_findstring: - /* Get two comma-separated arguments and expand each one. */ - count = 0; - for (p = text; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS ("findstring"); - text = expand_argument (text, p); - - p = expand_argument (p + 1, end); - - /* Find the first occurrence of the first string in the second. */ - i = strlen (text); - if (sindex (p, 0, text, i) != 0) - o = variable_buffer_output (o, text, i); - - free (p); - free (text); - break; - - case function_addsuffix: - case function_addprefix: - /* Get two comma-separated arguments and expand each one. */ - count = 0; - for (p = text; p < end; ++p) - { - if (*p == startparen) - ++count; - else if (*p == endparen) - --count; - else if (*p == ',' && count <= 0) - break; - } - if (p == end) - BADARGS (function == function_addsuffix ? "addsuffix" : "addprefix"); - text = expand_argument (text, p); - i = strlen (text); - - p2 = expand_argument (p + 1, end); - - p3 = p2; - while ((p = find_next_token (&p3, &len)) != 0) - { - if (function == function_addprefix) - o = variable_buffer_output (o, text, i); - o = variable_buffer_output (o, p, len); - if (function == function_addsuffix) - o = variable_buffer_output (o, text, i); - o = variable_buffer_output (o, " ", 1); - doneany = 1; - } - if (doneany) - /* Kill last space. */ - --o; - - free (p2); - free (text); - break; - - case function_dir: - case function_basename: - /* Expand the argument. */ - text = expand_argument (text, end); - - p3 = text; - while ((p2 = find_next_token (&p3, &len)) != 0) - { - p = p2 + len; - while (p >= p2 && *p != (function == function_dir ? '/' : '.')) - --p; - if (p >= p2) - { - if (function == function_dir) - ++p; - o = variable_buffer_output (o, p2, p - p2); - } - else if (function == function_dir) - o = variable_buffer_output (o, "./", 2); - else - /* The entire name is the basename. */ - o = variable_buffer_output (o, p2, len); - - o = variable_buffer_output (o, " ", 1); - doneany = 1; - } - if (doneany) - /* Kill last space. */ - --o; - - free (text); - break; - - case function_notdir: - case function_suffix: - /* Expand the argument. */ - text = expand_argument (text, end); - - p3 = text; - while ((p2 = find_next_token (&p3, &len)) != 0) - { - p = p2 + len; - while (p >= p2 && *p != (function == function_notdir ? '/' : '.')) - --p; - if (p >= p2) - { - if (function == function_notdir) - ++p; - o = variable_buffer_output (o, p, len - (p - p2)); - } - else if (function == function_notdir) - o = variable_buffer_output (o, p2, len); - - if (function == function_notdir || p >= p2) - { - o = variable_buffer_output (o, " ", 1); - doneany = 1; - } - } - if (doneany) - /* Kill last space. */ - --o; - - free (text); - break; - } - - return o; -} - -/* Check for a function invocation in *STRINGP. *STRINGP points at the - opening ( or { and is not null-terminated. If a function invocation - is found, expand it into the buffer at *OP, updating *OP, incrementing - *STRINGP past the reference and returning nonzero. If not, return zero. */ - -int -handle_function (op, stringp) - char **op; - char **stringp; - -{ - register unsigned int code; - unsigned int maxlen; - char *beg = *stringp + 1; - char *endref; - - endref = lindex (beg, beg + MAXFUNCTIONLEN, '\0'); - maxlen = endref != 0 ? endref - beg : MAXFUNCTIONLEN; - - for (code = 0; function_table[code].name != 0; ++code) - { - if (maxlen < function_table[code].len) - continue; - endref = beg + function_table[code].len; - if (isblank (*endref) - && !strncmp (function_table[code].name, beg, - function_table[code].len)) - break; - } - if (function_table[code].name != 0) - { - /* We have found a call to an expansion-time function. - Find the end of the arguments, and do the function. */ - - char openparen = beg[-1], closeparen = openparen == '(' ? ')' : '}'; - int count = 0; - char *argbeg; - register char *p; - - /* Space after function name isn't part of the args. */ - p = next_token (endref); - argbeg = p; - - /* Count nested use of whichever kind of parens we use, - so that nested calls and variable refs work. */ - - for (; *p != '\0'; ++p) - { - if (*p == openparen) - ++count; - else if (*p == closeparen && --count < 0) - break; - } - - if (count >= 0) - { - static const char errmsg[] - = "unterminated call to function `%s': missing `%c'"; - if (reading_filename == 0) - fatal (errmsg, function_table[code].name, closeparen); - else - makefile_fatal (reading_filename, *reading_lineno_ptr, errmsg, - function_table[code].name, closeparen); - } - - /* We found the end; expand the function call. */ - - *op = expand_function (*op, function_table[code].function, argbeg, p); - *stringp = p; - return 1; - } - - return 0; -} - -/* Glob-expand LINE. The returned pointer is - only good until the next call to string_glob. */ - -static char * -string_glob (line) - char *line; -{ - static char *result = 0; - static unsigned int length; - register struct nameseq *chain; - register unsigned int idx; - - chain = multi_glob (parse_file_seq - (&line, '\0', sizeof (struct nameseq), - /* We do not want parse_file_seq to strip `./'s. - That would break examples like: - $(patsubst ./%.c,obj/%.o,$(wildcard ./*.c)). */ - 0), - sizeof (struct nameseq)); - - if (result == 0) - { - length = 100; - result = (char *) xmalloc (100); - } - - idx = 0; - while (chain != 0) - { - register char *name = chain->name; - unsigned int len = strlen (name); - - struct nameseq *next = chain->next; - free ((char *) chain); - chain = next; - - /* multi_glob will pass names without globbing metacharacters - through as is, but we want only files that actually exist. */ - if (file_exists_p (name)) - { - if (idx + len + 1 > length) - { - length += (len + 1) * 2; - result = (char *) xrealloc (result, length); - } - bcopy (name, &result[idx], len); - idx += len; - result[idx++] = ' '; - } - - free (name); - } - - /* Kill the last space and terminate the string. */ - if (idx == 0) - result[0] = '\0'; - else - result[idx - 1] = '\0'; - - return result; -} diff --git a/buildtools/windows/source/make/getloadavg.c b/buildtools/windows/source/make/getloadavg.c deleted file mode 100644 index 3d805ab52f0..00000000000 --- a/buildtools/windows/source/make/getloadavg.c +++ /dev/null @@ -1,938 +0,0 @@ -/* Get the system load averages. - Copyright (C) 1985, 86, 87, 88, 89, 91, 92, 93, 1994, 1995 - 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* Compile-time symbols that this file uses: - - FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist. - KERNEL_FILE Pathname of the kernel to nlist. - LDAV_CVT() Scale the load average from the kernel. - Returns a double. - LDAV_SYMBOL Name of kernel symbol giving load average. - LOAD_AVE_TYPE Type of the load average array in the kernel. - Must be defined unless one of - apollo, DGUX, NeXT, or UMAX is defined; - otherwise, no load average is available. - NLIST_STRUCT Include nlist.h, not a.out.h, and - the nlist n_name element is a pointer, - not an array. - NLIST_NAME_UNION struct nlist has an n_un member, not n_name. - LINUX_LDAV_FILE [__linux__]: File containing load averages. - - Specific system predefines this file uses, aside from setting - default values if not emacs: - - apollo - BSD Real BSD, not just BSD-like. - DGUX - eunice UNIX emulator under VMS. - hpux - NeXT - sgi - sequent Sequent Dynix 3.x.x (BSD) - _SEQUENT_ Sequent DYNIX/ptx 1.x.x (SYSV) - sony_news NEWS-OS (works at least for 4.1C) - UMAX - UMAX4_3 - VMS - __linux__ Linux: assumes /proc filesystem mounted. - Support from Michael K. Johnson. - __NetBSD__ NetBSD: assumes /kern filesystem mounted. - - In addition, to avoid nesting many #ifdefs, we internally set - LDAV_DONE to indicate that the load average has been computed. - - We also #define LDAV_PRIVILEGED if a program will require - special installation to be able to call getloadavg. */ - -/* This should always be first. */ -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -/* Both the Emacs and non-Emacs sections want this. Some - configuration files' definitions for the LOAD_AVE_CVT macro (like - sparc.h's) use macros like FSCALE, defined here. */ -#ifdef unix -#include -#endif - - -/* Exclude all the code except the test program at the end - if the system has its own `getloadavg' function. - - The declaration of `errno' is needed by the test program - as well as the function itself, so it comes first. */ - -#include - -#ifndef errno -extern int errno; -#endif - -#ifndef HAVE_GETLOADAVG - - -/* The existing Emacs configuration files define a macro called - LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and - returns the load average multiplied by 100. What we actually want - is a macro called LDAV_CVT, which returns the load average as an - unmultiplied double. - - For backwards compatibility, we'll define LDAV_CVT in terms of - LOAD_AVE_CVT, but future machine config files should just define - LDAV_CVT directly. */ - -#if !defined(LDAV_CVT) && defined(LOAD_AVE_CVT) -#define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0) -#endif - -#if !defined (BSD) && defined (ultrix) -/* Ultrix behaves like BSD on Vaxen. */ -#define BSD -#endif - -#ifdef NeXT -/* NeXT in the 2.{0,1,2} releases defines BSD in , which - conflicts with the definition understood in this file, that this - really is BSD. */ -#undef BSD - -/* NeXT defines FSCALE in . However, we take FSCALE being - defined to mean that the nlist method should be used, which is not true. */ -#undef FSCALE -#endif - -/* Set values that are different from the defaults, which are - set a little farther down with #ifndef. */ - - -/* Some shorthands. */ - -#if defined (HPUX) && !defined (hpux) -#define hpux -#endif - -#if defined(hp300) && !defined(hpux) -#define MORE_BSD -#endif - -#if defined(ultrix) && defined(mips) -#define decstation -#endif - -#if defined(sun) && defined(SVR4) -#define SUNOS_5 -#endif - -#if defined (__osf__) && (defined (__alpha) || defined (__alpha__)) -#define OSF_ALPHA -#include -#endif - -#if defined (__osf__) && (defined (mips) || defined (__mips__)) -#define OSF_MIPS -#include -#endif - -/* UTek's /bin/cc on the 4300 has no architecture specific cpp define by - default, but _MACH_IND_SYS_TYPES is defined in . Combine - that with a couple of other things and we'll have a unique match. */ -#if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES) -#define tek4300 /* Define by emacs, but not by other users. */ -#endif - - -/* VAX C can't handle multi-line #ifs, or lines longer than 256 chars. */ -#ifndef LOAD_AVE_TYPE - -#ifdef MORE_BSD -#define LOAD_AVE_TYPE long -#endif - -#ifdef sun -#define LOAD_AVE_TYPE long -#endif - -#ifdef decstation -#define LOAD_AVE_TYPE long -#endif - -#ifdef _SEQUENT_ -#define LOAD_AVE_TYPE long -#endif - -#ifdef sgi -#define LOAD_AVE_TYPE long -#endif - -#ifdef SVR4 -#define LOAD_AVE_TYPE long -#endif - -#ifdef sony_news -#define LOAD_AVE_TYPE long -#endif - -#ifdef sequent -#define LOAD_AVE_TYPE long -#endif - -#ifdef OSF_ALPHA -#define LOAD_AVE_TYPE long -#endif - -#if defined (ardent) && defined (titan) -#define LOAD_AVE_TYPE long -#endif - -#ifdef tek4300 -#define LOAD_AVE_TYPE long -#endif - -#if defined(alliant) && defined(i860) /* Alliant FX/2800 */ -#define LOAD_AVE_TYPE long -#endif - -#ifdef _AIX -#define LOAD_AVE_TYPE long -#endif - -#endif /* No LOAD_AVE_TYPE. */ - -#ifdef OSF_ALPHA -/* defines an incorrect value for FSCALE on Alpha OSF/1, - according to ghazi@noc.rutgers.edu. */ -#undef FSCALE -#define FSCALE 1024.0 -#endif - -#if defined(alliant) && defined(i860) /* Alliant FX/2800 */ -/* defines an incorrect value for FSCALE on an - Alliant FX/2800 Concentrix 2.2, according to ghazi@noc.rutgers.edu. */ -#undef FSCALE -#define FSCALE 100.0 -#endif - - -#ifndef FSCALE - -/* SunOS and some others define FSCALE in sys/param.h. */ - -#ifdef MORE_BSD -#define FSCALE 2048.0 -#endif - -#if defined(MIPS) || defined(SVR4) || defined(decstation) -#define FSCALE 256 -#endif - -#if defined (sgi) || defined (sequent) -/* Sometimes both MIPS and sgi are defined, so FSCALE was just defined - above under #ifdef MIPS. But we want the sgi value. */ -#undef FSCALE -#define FSCALE 1000.0 -#endif - -#if defined (ardent) && defined (titan) -#define FSCALE 65536.0 -#endif - -#ifdef tek4300 -#define FSCALE 100.0 -#endif - -#ifdef _AIX -#define FSCALE 65536.0 -#endif - -#endif /* Not FSCALE. */ - -#if !defined (LDAV_CVT) && defined (FSCALE) -#define LDAV_CVT(n) (((double) (n)) / FSCALE) -#endif - -/* VAX C can't handle multi-line #ifs, or lines longer that 256 characters. */ -#ifndef NLIST_STRUCT - -#ifdef MORE_BSD -#define NLIST_STRUCT -#endif - -#ifdef sun -#define NLIST_STRUCT -#endif - -#ifdef decstation -#define NLIST_STRUCT -#endif - -#ifdef hpux -#define NLIST_STRUCT -#endif - -#if defined (_SEQUENT_) || defined (sequent) -#define NLIST_STRUCT -#endif - -#ifdef sgi -#define NLIST_STRUCT -#endif - -#ifdef SVR4 -#define NLIST_STRUCT -#endif - -#ifdef sony_news -#define NLIST_STRUCT -#endif - -#ifdef OSF_ALPHA -#define NLIST_STRUCT -#endif - -#if defined (ardent) && defined (titan) -#define NLIST_STRUCT -#endif - -#ifdef tek4300 -#define NLIST_STRUCT -#endif - -#ifdef butterfly -#define NLIST_STRUCT -#endif - -#if defined(alliant) && defined(i860) /* Alliant FX/2800 */ -#define NLIST_STRUCT -#endif - -#ifdef _AIX -#define NLIST_STRUCT -#endif - -#endif /* defined (NLIST_STRUCT) */ - - -#if defined(sgi) || (defined(mips) && !defined(BSD)) -#define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31)) -#endif - - -#if !defined (KERNEL_FILE) && defined (sequent) -#define KERNEL_FILE "/dynix" -#endif - -#if !defined (KERNEL_FILE) && defined (hpux) -#define KERNEL_FILE "/hp-ux" -#endif - -#if !defined(KERNEL_FILE) && (defined(_SEQUENT_) || defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || defined(SVR4) || (defined (ardent) && defined (titan))) -#define KERNEL_FILE "/unix" -#endif - - -#if !defined (LDAV_SYMBOL) && defined (alliant) -#define LDAV_SYMBOL "_Loadavg" -#endif - -#if !defined(LDAV_SYMBOL) && ((defined(hpux) && !defined(hp9000s300)) || defined(_SEQUENT_) || defined(SVR4) || defined(ISC) || defined(sgi) || (defined (ardent) && defined (titan)) || defined (_AIX)) -#define LDAV_SYMBOL "avenrun" -#endif - -#ifdef HAVE_UNISTD_H -#include -#endif - -#include - -/* LOAD_AVE_TYPE should only get defined if we're going to use the - nlist method. */ -#if !defined(LOAD_AVE_TYPE) && (defined(BSD) || defined(LDAV_CVT) || defined(KERNEL_FILE) || defined(LDAV_SYMBOL)) -#define LOAD_AVE_TYPE double -#endif - -#ifdef LOAD_AVE_TYPE - -#ifndef VMS -#ifndef NLIST_STRUCT -#include -#else /* NLIST_STRUCT */ -#include -#endif /* NLIST_STRUCT */ - -#ifdef SUNOS_5 -#include -#include -#endif - -#ifndef KERNEL_FILE -#define KERNEL_FILE "/vmunix" -#endif /* KERNEL_FILE */ - -#ifndef LDAV_SYMBOL -#define LDAV_SYMBOL "_avenrun" -#endif /* LDAV_SYMBOL */ - -#else /* VMS */ - -#ifndef eunice -#include -#include -#else /* eunice */ -#include -#endif /* eunice */ -#endif /* VMS */ - -#ifndef LDAV_CVT -#define LDAV_CVT(n) ((double) (n)) -#endif /* !LDAV_CVT */ - -#endif /* LOAD_AVE_TYPE */ - -#ifdef NeXT -#ifdef HAVE_MACH_MACH_H -#include -#else -#include -#endif -#endif /* NeXT */ - -#ifdef sgi -#include -#endif /* sgi */ - -#ifdef UMAX -#include -#include -#include -#include -#include - -#ifdef UMAX_43 -#include -#include -#include -#include -#include -#else /* Not UMAX_43. */ -#include -#include -#include -#include -#include -#include -#endif /* Not UMAX_43. */ -#endif /* UMAX */ - -#ifdef DGUX -#include -#endif - -#if defined(HAVE_FCNTL_H) || defined(_POSIX_VERSION) -#include -#else -#include -#endif - -/* Avoid static vars inside a function since in HPUX they dump as pure. */ - -#ifdef NeXT -static processor_set_t default_set; -static int getloadavg_initialized; -#endif /* NeXT */ - -#ifdef UMAX -static unsigned int cpus = 0; -static unsigned int samples; -#endif /* UMAX */ - -#ifdef DGUX -static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */ -#endif /* DGUX */ - -#ifdef LOAD_AVE_TYPE -/* File descriptor open to /dev/kmem or VMS load ave driver. */ -static int channel; -/* Nonzero iff channel is valid. */ -static int getloadavg_initialized; -/* Offset in kmem to seek to read load average, or 0 means invalid. */ -static long offset; - -#if !defined(VMS) && !defined(sgi) -static struct nlist nl[2]; -#endif /* Not VMS or sgi */ - -#ifdef SUNOS_5 -static kvm_t *kd; -#endif /* SUNOS_5 */ - -#endif /* LOAD_AVE_TYPE */ - -/* Put the 1 minute, 5 minute and 15 minute load averages - into the first NELEM elements of LOADAVG. - Return the number written (never more than 3, but may be less than NELEM), - or -1 if an error occurred. */ - -int -getloadavg (loadavg, nelem) - double loadavg[]; - int nelem; -{ - int elem = 0; /* Return value. */ - -#ifdef NO_GET_LOAD_AVG -#define LDAV_DONE - /* Set errno to zero to indicate that there was no particular error; - this function just can't work at all on this system. */ - errno = 0; - elem = -1; -#endif - -#if !defined (LDAV_DONE) && defined (__linux__) -#define LDAV_DONE -#undef LOAD_AVE_TYPE - -#ifndef LINUX_LDAV_FILE -#define LINUX_LDAV_FILE "/proc/loadavg" -#endif - - char ldavgbuf[40]; - double load_ave[3]; - int fd, count; - - fd = open (LINUX_LDAV_FILE, O_RDONLY); - if (fd == -1) - return -1; - count = read (fd, ldavgbuf, 40); - (void) close (fd); - if (count <= 0) - return -1; - - count = sscanf (ldavgbuf, "%lf %lf %lf", - &load_ave[0], &load_ave[1], &load_ave[2]); - if (count < 1) - return -1; - - for (elem = 0; elem < nelem && elem < count; elem++) - loadavg[elem] = load_ave[elem]; - - return elem; - -#endif /* __linux__ */ - -#if !defined (LDAV_DONE) && defined (__NetBSD__) -#define LDAV_DONE -#undef LOAD_AVE_TYPE - -#ifndef NETBSD_LDAV_FILE -#define NETBSD_LDAV_FILE "/kern/loadavg" -#endif - - unsigned long int load_ave[3], scale; - int count; - FILE *fp; - - fp = fopen (NETBSD_LDAV_FILE, "r"); - if (fp == NULL) - return -1; - count = fscanf (fp, "%lu %lu %lu %lu\n", - &load_ave[0], &load_ave[1], &load_ave[2], - &scale); - (void) fclose (fp); - if (count != 4) - return -1; - - for (elem = 0; elem < nelem; elem++) - loadavg[elem] = (double) load_ave[elem] / (double) scale; - - return elem; - -#endif /* __NetBSD__ */ - -#if !defined (LDAV_DONE) && defined (NeXT) -#define LDAV_DONE - /* The NeXT code was adapted from iscreen 3.2. */ - - host_t host; - struct processor_set_basic_info info; - unsigned info_count; - - /* We only know how to get the 1-minute average for this system, - so even if the caller asks for more than 1, we only return 1. */ - - if (!getloadavg_initialized) - { - if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS) - getloadavg_initialized = 1; - } - - if (getloadavg_initialized) - { - info_count = PROCESSOR_SET_BASIC_INFO_COUNT; - if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host, - (processor_set_info_t) &info, &info_count) - != KERN_SUCCESS) - getloadavg_initialized = 0; - else - { - if (nelem > 0) - loadavg[elem++] = (double) info.load_average / LOAD_SCALE; - } - } - - if (!getloadavg_initialized) - return -1; -#endif /* NeXT */ - -#if !defined (LDAV_DONE) && defined (UMAX) -#define LDAV_DONE -/* UMAX 4.2, which runs on the Encore Multimax multiprocessor, does not - have a /dev/kmem. Information about the workings of the running kernel - can be gathered with inq_stats system calls. - We only know how to get the 1-minute average for this system. */ - - struct proc_summary proc_sum_data; - struct stat_descr proc_info; - double load; - register unsigned int i, j; - - if (cpus == 0) - { - register unsigned int c, i; - struct cpu_config conf; - struct stat_descr desc; - - desc.sd_next = 0; - desc.sd_subsys = SUBSYS_CPU; - desc.sd_type = CPUTYPE_CONFIG; - desc.sd_addr = (char *) &conf; - desc.sd_size = sizeof conf; - - if (inq_stats (1, &desc)) - return -1; - - c = 0; - for (i = 0; i < conf.config_maxclass; ++i) - { - struct class_stats stats; - bzero ((char *) &stats, sizeof stats); - - desc.sd_type = CPUTYPE_CLASS; - desc.sd_objid = i; - desc.sd_addr = (char *) &stats; - desc.sd_size = sizeof stats; - - if (inq_stats (1, &desc)) - return -1; - - c += stats.class_numcpus; - } - cpus = c; - samples = cpus < 2 ? 3 : (2 * cpus / 3); - } - - proc_info.sd_next = 0; - proc_info.sd_subsys = SUBSYS_PROC; - proc_info.sd_type = PROCTYPE_SUMMARY; - proc_info.sd_addr = (char *) &proc_sum_data; - proc_info.sd_size = sizeof (struct proc_summary); - proc_info.sd_sizeused = 0; - - if (inq_stats (1, &proc_info) != 0) - return -1; - - load = proc_sum_data.ps_nrunnable; - j = 0; - for (i = samples - 1; i > 0; --i) - { - load += proc_sum_data.ps_nrun[j]; - if (j++ == PS_NRUNSIZE) - j = 0; - } - - if (nelem > 0) - loadavg[elem++] = load / samples / cpus; -#endif /* UMAX */ - -#if !defined (LDAV_DONE) && defined (DGUX) -#define LDAV_DONE - /* This call can return -1 for an error, but with good args - it's not supposed to fail. The first argument is for no - apparent reason of type `long int *'. */ - dg_sys_info ((long int *) &load_info, - DG_SYS_INFO_LOAD_INFO_TYPE, - DG_SYS_INFO_LOAD_VERSION_0); - - if (nelem > 0) - loadavg[elem++] = load_info.one_minute; - if (nelem > 1) - loadavg[elem++] = load_info.five_minute; - if (nelem > 2) - loadavg[elem++] = load_info.fifteen_minute; -#endif /* DGUX */ - -#if !defined (LDAV_DONE) && defined (apollo) -#define LDAV_DONE -/* Apollo code from lisch@mentorg.com (Ray Lischner). - - This system call is not documented. The load average is obtained as - three long integers, for the load average over the past minute, - five minutes, and fifteen minutes. Each value is a scaled integer, - with 16 bits of integer part and 16 bits of fraction part. - - I'm not sure which operating system first supported this system call, - but I know that SR10.2 supports it. */ - - extern void proc1_$get_loadav (); - unsigned long load_ave[3]; - - proc1_$get_loadav (load_ave); - - if (nelem > 0) - loadavg[elem++] = load_ave[0] / 65536.0; - if (nelem > 1) - loadavg[elem++] = load_ave[1] / 65536.0; - if (nelem > 2) - loadavg[elem++] = load_ave[2] / 65536.0; -#endif /* apollo */ - -#if !defined (LDAV_DONE) && defined (OSF_MIPS) -#define LDAV_DONE - - struct tbl_loadavg load_ave; - table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave)); - loadavg[elem++] - = (load_ave.tl_lscale == 0 - ? load_ave.tl_avenrun.d[0] - : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale)); -#endif /* OSF_MIPS */ - -#if !defined (LDAV_DONE) && defined (OSF_ALPHA) -#define LDAV_DONE - - struct tbl_loadavg load_ave; - table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave)); - for (elem = 0; elem < nelem; elem++) - loadavg[elem] - = (load_ave.tl_lscale == 0 - ? load_ave.tl_avenrun.d[elem] - : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale)); -#endif /* OSF_ALPHA */ - -#if !defined (LDAV_DONE) && defined (VMS) - /* VMS specific code -- read from the Load Ave driver. */ - - LOAD_AVE_TYPE load_ave[3]; - static int getloadavg_initialized = 0; -#ifdef eunice - struct - { - int dsc$w_length; - char *dsc$a_pointer; - } descriptor; -#endif - - /* Ensure that there is a channel open to the load ave device. */ - if (!getloadavg_initialized) - { - /* Attempt to open the channel. */ -#ifdef eunice - descriptor.dsc$w_length = 18; - descriptor.dsc$a_pointer = "$$VMS_LOAD_AVERAGE"; -#else - $DESCRIPTOR (descriptor, "LAV0:"); -#endif - if (sys$assign (&descriptor, &channel, 0, 0) & 1) - getloadavg_initialized = 1; - } - - /* Read the load average vector. */ - if (getloadavg_initialized - && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0, - load_ave, 12, 0, 0, 0, 0) & 1)) - { - sys$dassgn (channel); - getloadavg_initialized = 0; - } - - if (!getloadavg_initialized) - return -1; -#endif /* VMS */ - -#if !defined (LDAV_DONE) && defined(LOAD_AVE_TYPE) && !defined(VMS) - - /* UNIX-specific code -- read the average from /dev/kmem. */ - -#define LDAV_PRIVILEGED /* This code requires special installation. */ - - LOAD_AVE_TYPE load_ave[3]; - - /* Get the address of LDAV_SYMBOL. */ - if (offset == 0) - { -#ifndef sgi -#ifndef NLIST_STRUCT - strcpy (nl[0].n_name, LDAV_SYMBOL); - strcpy (nl[1].n_name, ""); -#else /* NLIST_STRUCT */ -#ifdef NLIST_NAME_UNION - nl[0].n_un.n_name = LDAV_SYMBOL; - nl[1].n_un.n_name = 0; -#else /* not NLIST_NAME_UNION */ - nl[0].n_name = LDAV_SYMBOL; - nl[1].n_name = 0; -#endif /* not NLIST_NAME_UNION */ -#endif /* NLIST_STRUCT */ - -#ifndef SUNOS_5 - if ( -#ifndef _AIX - nlist (KERNEL_FILE, nl) -#else /* _AIX */ - knlist (nl, 1, sizeof (nl[0])) -#endif - >= 0) - /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i. */ - { -#ifdef FIXUP_KERNEL_SYMBOL_ADDR - FIXUP_KERNEL_SYMBOL_ADDR (nl); -#endif - offset = nl[0].n_value; - } -#endif /* !SUNOS_5 */ -#else /* sgi */ - int ldav_off; - - ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN); - if (ldav_off != -1) - offset = (long) ldav_off & 0x7fffffff; -#endif /* sgi */ - } - - /* Make sure we have /dev/kmem open. */ - if (!getloadavg_initialized) - { -#ifndef SUNOS_5 - channel = open ("/dev/kmem", 0); - if (channel >= 0) - getloadavg_initialized = 1; -#else /* SUNOS_5 */ - /* We pass 0 for the kernel, corefile, and swapfile names - to use the currently running kernel. */ - kd = kvm_open (0, 0, 0, O_RDONLY, 0); - if (kd != 0) - { - /* nlist the currently running kernel. */ - kvm_nlist (kd, nl); - offset = nl[0].n_value; - getloadavg_initialized = 1; - } -#endif /* SUNOS_5 */ - } - - /* If we can, get the load average values. */ - if (offset && getloadavg_initialized) - { - /* Try to read the load. */ -#ifndef SUNOS_5 - if (lseek (channel, offset, 0) == -1L - || read (channel, (char *) load_ave, sizeof (load_ave)) - != sizeof (load_ave)) - { - close (channel); - getloadavg_initialized = 0; - } -#else /* SUNOS_5 */ - if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave)) - != sizeof (load_ave)) - { - kvm_close (kd); - getloadavg_initialized = 0; - } -#endif /* SUNOS_5 */ - } - - if (offset == 0 || !getloadavg_initialized) - return -1; -#endif /* LOAD_AVE_TYPE and not VMS */ - -#if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE) /* Including VMS. */ - if (nelem > 0) - loadavg[elem++] = LDAV_CVT (load_ave[0]); - if (nelem > 1) - loadavg[elem++] = LDAV_CVT (load_ave[1]); - if (nelem > 2) - loadavg[elem++] = LDAV_CVT (load_ave[2]); - -#define LDAV_DONE -#endif /* !LDAV_DONE && LOAD_AVE_TYPE */ - -#ifdef LDAV_DONE - return elem; -#else - /* Set errno to zero to indicate that there was no particular error; - this function just can't work at all on this system. */ - errno = 0; - return -1; -#endif -} - -#endif /* ! HAVE_GETLOADAVG */ - -#ifdef TEST -void -main (argc, argv) - int argc; - char **argv; -{ - int naptime = 0; - - if (argc > 1) - naptime = atoi (argv[1]); - - while (1) - { - double avg[3]; - int loads; - - errno = 0; /* Don't be misled if it doesn't set errno. */ - loads = getloadavg (avg, 3); - if (loads == -1) - { - perror ("Error getting load average"); - exit (1); - } - if (loads > 0) - printf ("1-minute: %f ", avg[0]); - if (loads > 1) - printf ("5-minute: %f ", avg[1]); - if (loads > 2) - printf ("15-minute: %f ", avg[2]); - if (loads > 0) - putchar ('\n'); - - if (naptime == 0) - break; - sleep (naptime); - } - - exit (0); -} -#endif /* TEST */ diff --git a/buildtools/windows/source/make/getopt.c b/buildtools/windows/source/make/getopt.c deleted file mode 100644 index 077b02c8464..00000000000 --- a/buildtools/windows/source/make/getopt.c +++ /dev/null @@ -1,763 +0,0 @@ -/* Getopt for GNU. - NOTE: getopt is now part of the C library, so if you don't know what - "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu - before changing it! - - Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95 - 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* This tells Alpha OSF/1 not to define a getopt prototype in . - Ditto for AIX 3.2 and . */ -#ifndef _NO_PROTO -#define _NO_PROTO -#endif - -#ifdef HAVE_CONFIG_H -#include -#endif - -#if !defined (__STDC__) || !__STDC__ -/* This is a separate conditional since some stdc systems - reject `defined (const)'. */ -#ifndef const -#define const -#endif -#endif - -#include -#include - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) - - -/* This needs to come after some library #include - to get __GNU_LIBRARY__ defined. */ -#ifdef __GNU_LIBRARY__ -/* Don't include stdlib.h for non-GNU C libraries because some of them - contain conflicting prototypes for getopt. */ -#include -#endif /* GNU C library. */ - -/* This is for other GNU distributions with internationalized messages. - The GNU C Library itself does not yet support such messages. */ -#if HAVE_LIBINTL_H -# include -#else -# define gettext(msgid) (msgid) -#endif - -/* This version of `getopt' appears to the caller like standard Unix `getopt' - but it behaves differently for the user, since it allows the user - to intersperse the options with the other arguments. - - As `getopt' works, it permutes the elements of ARGV so that, - when it is done, all the options precede everything else. Thus - all application programs are extended to handle flexible argument order. - - Setting the environment variable POSIXLY_CORRECT disables permutation. - Then the behavior is completely standard. - - GNU application programs can use a third alternative mode in which - they can distinguish the relative order of options and other arguments. */ - -#include "getopt.h" - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -char *optarg = NULL; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -/* XXX 1003.2 says this must be 1 before any call. */ -int optind = 0; - -/* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - -static char *nextchar; - -/* Callers store zero here to inhibit the error message - for unrecognized options. */ - -int opterr = 1; - -/* Set to an option character which was unrecognized. - This must be initialized on some systems to avoid linking in the - system's own getopt implementation. */ - -int optopt = '?'; - -/* Describe how to deal with options that follow non-option ARGV-elements. - - If the caller did not specify anything, - the default is REQUIRE_ORDER if the environment variable - POSIXLY_CORRECT is defined, PERMUTE otherwise. - - REQUIRE_ORDER means don't recognize them as options; - stop option processing when the first non-option is seen. - This is what Unix does. - This mode of operation is selected by either setting the environment - variable POSIXLY_CORRECT, or using `+' as the first character - of the list of option characters. - - PERMUTE is the default. We permute the contents of ARGV as we scan, - so that eventually all the non-options are at the end. This allows options - to be given in any order, even with programs that were not written to - expect this. - - RETURN_IN_ORDER is an option available to programs that were written - to expect options and other ARGV-elements in any order and that care about - the ordering of the two. We describe each non-option ARGV-element - as if it were the argument of an option with character code 1. - Using `-' as the first character of the list of option characters - selects this mode of operation. - - The special argument `--' forces an end of option-scanning regardless - of the value of `ordering'. In the case of RETURN_IN_ORDER, only - `--' can cause `getopt' to return EOF with `optind' != ARGC. */ - -static enum -{ - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -} ordering; - -/* Value of POSIXLY_CORRECT environment variable. */ -static char *posixly_correct; - -#ifdef __GNU_LIBRARY__ -/* We want to avoid inclusion of string.h with non-GNU libraries - because there are many ways it can cause trouble. - On some systems, it contains special magic macros that don't work - in GCC. */ -#include -#define my_index strchr -#else - -/* Avoid depending on library functions or files - whose names are inconsistent. */ - -char *getenv (); - -static char * -my_index (str, chr) - const char *str; - int chr; -{ - while (*str) - { - if (*str == chr) - return (char *) str; - str++; - } - return 0; -} - -/* If using GCC, we can safely declare strlen this way. - If not using GCC, it is ok not to declare it. */ -#ifdef __GNUC__ -/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. - That was relevant to code that was here before. */ -#if !defined (__STDC__) || !__STDC__ -/* gcc with -traditional declares the built-in strlen to return int, - and has done so at least since version 2.4.5. -- rms. */ -extern int strlen (const char *); -#endif /* not __STDC__ */ -#endif /* __GNUC__ */ - -#endif /* not __GNU_LIBRARY__ */ - -/* Handle permutation of arguments. */ - -/* Describe the part of ARGV that contains non-options that have - been skipped. `first_nonopt' is the index in ARGV of the first of them; - `last_nonopt' is the index after the last of them. */ - -static int first_nonopt; -static int last_nonopt; - -/* Exchange two adjacent subsequences of ARGV. - One subsequence is elements [first_nonopt,last_nonopt) - which contains all the non-options that have been skipped so far. - The other is elements [last_nonopt,optind), which contains all - the options processed since those non-options were skipped. - - `first_nonopt' and `last_nonopt' are relocated so that they describe - the new indices of the non-options in ARGV after they are moved. */ - -static void -exchange (argv) - char **argv; -{ - int bottom = first_nonopt; - int middle = last_nonopt; - int top = optind; - char *tem; - - /* Exchange the shorter segment with the far end of the longer segment. - That puts the shorter segment into the right place. - It leaves the longer segment in the right place overall, - but it consists of two parts that need to be swapped next. */ - - while (top > middle && middle > bottom) - { - if (top - middle > middle - bottom) - { - /* Bottom segment is the short one. */ - int len = middle - bottom; - register int i; - - /* Swap it with the top part of the top segment. */ - for (i = 0; i < len; i++) - { - tem = argv[bottom + i]; - argv[bottom + i] = argv[top - (middle - bottom) + i]; - argv[top - (middle - bottom) + i] = tem; - } - /* Exclude the moved bottom segment from further swapping. */ - top -= len; - } - else - { - /* Top segment is the short one. */ - int len = top - middle; - register int i; - - /* Swap it with the bottom part of the bottom segment. */ - for (i = 0; i < len; i++) - { - tem = argv[bottom + i]; - argv[bottom + i] = argv[middle + i]; - argv[middle + i] = tem; - } - /* Exclude the moved top segment from further swapping. */ - bottom += len; - } - } - - /* Update records for the slots the non-options now occupy. */ - - first_nonopt += (optind - last_nonopt); - last_nonopt = optind; -} - -/* Initialize the internal data when the first call is made. */ - -static const char * -_getopt_initialize (optstring) - const char *optstring; -{ - /* Start processing options with ARGV-element 1 (since ARGV-element 0 - is the program name); the sequence of previously skipped - non-option ARGV-elements is empty. */ - - first_nonopt = last_nonopt = optind = 1; - - nextchar = NULL; - - posixly_correct = getenv ("POSIXLY_CORRECT"); - - /* Determine how to handle the ordering of options and nonoptions. */ - - if (optstring[0] == '-') - { - ordering = RETURN_IN_ORDER; - ++optstring; - } - else if (optstring[0] == '+') - { - ordering = REQUIRE_ORDER; - ++optstring; - } - else if (posixly_correct != NULL) - ordering = REQUIRE_ORDER; - else - ordering = PERMUTE; - - return optstring; -} - -/* Scan elements of ARGV (whose length is ARGC) for option characters - given in OPTSTRING. - - If an element of ARGV starts with '-', and is not exactly "-" or "--", - then it is an option element. The characters of this element - (aside from the initial '-') are option characters. If `getopt' - is called repeatedly, it returns successively each of the option characters - from each of the option elements. - - If `getopt' finds another option character, it returns that character, - updating `optind' and `nextchar' so that the next call to `getopt' can - resume the scan with the following option character or ARGV-element. - - If there are no more option characters, `getopt' returns `EOF'. - Then `optind' is the index in ARGV of the first ARGV-element - that is not an option. (The ARGV-elements have been permuted - so that those that are not options now come last.) - - OPTSTRING is a string containing the legitimate option characters. - If an option character is seen that is not listed in OPTSTRING, - return '?' after printing an error message. If you set `opterr' to - zero, the error message is suppressed but we still return '?'. - - If a char in OPTSTRING is followed by a colon, that means it wants an arg, - so the following text in the same ARGV-element, or the text of the following - ARGV-element, is returned in `optarg'. Two colons mean an option that - wants an optional arg; if there is text in the current ARGV-element, - it is returned in `optarg', otherwise `optarg' is set to zero. - - If OPTSTRING starts with `-' or `+', it requests different methods of - handling the non-option ARGV-elements. - See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. - - Long-named options begin with `--' instead of `-'. - Their names may be abbreviated as long as the abbreviation is unique - or is an exact match for some defined option. If they have an - argument, it follows the option name in the same ARGV-element, separated - from the option name by a `=', or else the in next ARGV-element. - When `getopt' finds a long-named option, it returns 0 if that option's - `flag' field is nonzero, the value of the option's `val' field - if the `flag' field is zero. - - The elements of ARGV aren't really const, because we permute them. - But we pretend they're const in the prototype to be compatible - with other systems. - - LONGOPTS is a vector of `struct option' terminated by an - element containing a name which is zero. - - LONGIND returns the index in LONGOPT of the long-named option found. - It is only valid when a long-named option has been found by the most - recent call. - - If LONG_ONLY is nonzero, '-' as well as '--' can introduce - long-named options. */ - -int -_getopt_internal (argc, argv, optstring, longopts, longind, long_only) - int argc; - char *const *argv; - const char *optstring; - const struct option *longopts; - int *longind; - int long_only; -{ - optarg = NULL; - - if (optind == 0) - { - optstring = _getopt_initialize (optstring); - optind = 1; /* Don't scan ARGV[0], the program name. */ - } - - if (nextchar == NULL || *nextchar == '\0') - { - /* Advance to the next ARGV-element. */ - - if (ordering == PERMUTE) - { - /* If we have just processed some options following some non-options, - exchange them so that the options come first. */ - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (last_nonopt != optind) - first_nonopt = optind; - - /* Skip any additional non-options - and extend the range of non-options previously skipped. */ - - while (optind < argc - && (argv[optind][0] != '-' || argv[optind][1] == '\0')) - optind++; - last_nonopt = optind; - } - - /* The special ARGV-element `--' means premature end of options. - Skip it like a null option, - then exchange with previous non-options as if it were an option, - then skip everything else like a non-option. */ - - if (optind != argc && !strcmp (argv[optind], "--")) - { - optind++; - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (first_nonopt == last_nonopt) - first_nonopt = optind; - last_nonopt = argc; - - optind = argc; - } - - /* If we have done all the ARGV-elements, stop the scan - and back over any non-options that we skipped and permuted. */ - - if (optind == argc) - { - /* Set the next-arg-index to point at the non-options - that we previously skipped, so the caller will digest them. */ - if (first_nonopt != last_nonopt) - optind = first_nonopt; - return EOF; - } - - /* If we have come to a non-option and did not permute it, - either stop the scan or describe it to the caller and pass it by. */ - - if ((argv[optind][0] != '-' || argv[optind][1] == '\0')) - { - if (ordering == REQUIRE_ORDER) - return EOF; - optarg = argv[optind++]; - return 1; - } - - /* We have found another option-ARGV-element. - Skip the initial punctuation. */ - - nextchar = (argv[optind] + 1 - + (longopts != NULL && argv[optind][1] == '-')); - } - - /* Decode the current option-ARGV-element. */ - - /* Check whether the ARGV-element is a long option. - - If long_only and the ARGV-element has the form "-f", where f is - a valid short option, don't consider it an abbreviated form of - a long option that starts with f. Otherwise there would be no - way to give the -f short option. - - On the other hand, if there's a long option "fubar" and - the ARGV-element is "-fu", do consider that an abbreviation of - the long option, just like "--fu", and not "-f" with arg "u". - - This distinction seems to be the most useful approach. */ - - if (longopts != NULL - && (argv[optind][1] == '-' - || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) - { - char *nameend; - const struct option *p; - const struct option *pfound = NULL; - int exact = 0; - int ambig = 0; - int indfound; - int option_index; - - for (nameend = nextchar; *nameend && *nameend != '='; nameend++) - /* Do nothing. */ ; - - /* Test all long options for either exact match - or abbreviated matches. */ - for (p = longopts, option_index = 0; p->name; p++, option_index++) - if (!strncmp (p->name, nextchar, nameend - nextchar)) - { - if ((size_t)(nameend - nextchar) == strlen (p->name)) - { - /* Exact match found. */ - pfound = p; - indfound = option_index; - exact = 1; - break; - } - else if (pfound == NULL) - { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } - else - /* Second or later nonexact match found. */ - ambig = 1; - } - - if (ambig && !exact) - { - if (opterr) - fprintf (stderr, gettext ("%s: option `%s' is ambiguous\n"), - argv[0], argv[optind]); - nextchar += strlen (nextchar); - optind++; - return '?'; - } - - if (pfound != NULL) - { - option_index = indfound; - optind++; - if (*nameend) - { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ - if (pfound->has_arg) - optarg = nameend + 1; - else - { - if (opterr) - if (argv[optind - 1][1] == '-') - /* --option */ - fprintf (stderr, - gettext ("%s: option `--%s' doesn't allow an argument\n"), - argv[0], pfound->name); - else - /* +option or -option */ - fprintf (stderr, - gettext ("%s: option `%c%s' doesn't allow an argument\n"), - argv[0], argv[optind - 1][0], pfound->name); - - nextchar += strlen (nextchar); - return '?'; - } - } - else if (pfound->has_arg == 1) - { - if (optind < argc) - optarg = argv[optind++]; - else - { - if (opterr) - fprintf (stderr, - gettext ("%s: option `%s' requires an argument\n"), - argv[0], argv[optind - 1]); - nextchar += strlen (nextchar); - return optstring[0] == ':' ? ':' : '?'; - } - } - nextchar += strlen (nextchar); - if (longind != NULL) - *longind = option_index; - if (pfound->flag) - { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; - } - - /* Can't find it as a long option. If this is not getopt_long_only, - or the option starts with '--' or is not a valid short - option, then it's an error. - Otherwise interpret it as a short option. */ - if (!long_only || argv[optind][1] == '-' - || my_index (optstring, *nextchar) == NULL) - { - if (opterr) - { - if (argv[optind][1] == '-') - /* --option */ - fprintf (stderr, gettext ("%s: unrecognized option `--%s'\n"), - argv[0], nextchar); - else - /* +option or -option */ - fprintf (stderr, gettext ("%s: unrecognized option `%c%s'\n"), - argv[0], argv[optind][0], nextchar); - } - nextchar = (char *) ""; - optind++; - return '?'; - } - } - - /* Look at and handle the next short option-character. */ - - { - char c = *nextchar++; - char *temp = my_index (optstring, c); - - /* Increment `optind' when we start to process its last character. */ - if (*nextchar == '\0') - ++optind; - - if (temp == NULL || c == ':') - { - if (opterr) - { - if (posixly_correct) - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, gettext ("%s: illegal option -- %c\n"), - argv[0], c); - else - fprintf (stderr, gettext ("%s: invalid option -- %c\n"), - argv[0], c); - } - optopt = c; - return '?'; - } - if (temp[1] == ':') - { - if (temp[2] == ':') - { - /* This is an option that accepts an argument optionally. */ - if (*nextchar != '\0') - { - optarg = nextchar; - optind++; - } - else - optarg = NULL; - nextchar = NULL; - } - else - { - /* This is an option that requires an argument. */ - if (*nextchar != '\0') - { - optarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - optind++; - } - else if (optind == argc) - { - if (opterr) - { - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, - gettext ("%s: option requires an argument -- %c\n"), - argv[0], c); - } - optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = '?'; - } - else - /* We already incremented `optind' once; - increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; - nextchar = NULL; - } - } - return c; - } -} - -int -getopt (argc, argv, optstring) - int argc; - char *const *argv; - const char *optstring; -{ - return _getopt_internal (argc, argv, optstring, - (const struct option *) 0, - (int *) 0, - 0); -} - -#endif /* _LIBC or not __GNU_LIBRARY__. */ - -#ifdef TEST - -/* Compile with -DTEST to make an executable for use in testing - the above definition of `getopt'. */ - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - - c = getopt (argc, argv, "abc:d:0123456789"); - if (c == EOF) - break; - - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value `%s'\n", optarg); - break; - - case '?': - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ diff --git a/buildtools/windows/source/make/getopt.h b/buildtools/windows/source/make/getopt.h deleted file mode 100644 index 4ac33b71824..00000000000 --- a/buildtools/windows/source/make/getopt.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Declarations for getopt. - Copyright (C) 1989, 90, 91, 92, 93, 94 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef _GETOPT_H -#define _GETOPT_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -#if defined (__STDC__) && __STDC__ - const char *name; -#else - char *name; -#endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#if defined (__STDC__) && __STDC__ -#ifdef __GNU_LIBRARY__ -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -#else /* not __GNU_LIBRARY__ */ -extern int getopt (); -#endif /* __GNU_LIBRARY__ */ -extern int getopt_long (int argc, char *const *argv, const char *shortopts, - const struct option *longopts, int *longind); -extern int getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int _getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind, - int long_only); -#else /* not __STDC__ */ -extern int getopt (); -extern int getopt_long (); -extern int getopt_long_only (); - -extern int _getopt_internal (); -#endif /* __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* _GETOPT_H */ diff --git a/buildtools/windows/source/make/getopt1.c b/buildtools/windows/source/make/getopt1.c deleted file mode 100644 index 4580211cfac..00000000000 --- a/buildtools/windows/source/make/getopt1.c +++ /dev/null @@ -1,180 +0,0 @@ -/* getopt_long and getopt_long_only entry points for GNU getopt. - Copyright (C) 1987, 88, 89, 90, 91, 92, 1993, 1994 - 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "getopt.h" - -#if !defined (__STDC__) || !__STDC__ -/* This is a separate conditional since some stdc systems - reject `defined (const)'. */ -#ifndef const -#define const -#endif -#endif - -#include - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) - - -/* This needs to come after some library #include - to get __GNU_LIBRARY__ defined. */ -#ifdef __GNU_LIBRARY__ -#include -#else -char *getenv (); -#endif - -#ifndef NULL -#define NULL 0 -#endif - -int -getopt_long (argc, argv, options, long_options, opt_index) - int argc; - char *const *argv; - const char *options; - const struct option *long_options; - int *opt_index; -{ - return _getopt_internal (argc, argv, options, long_options, opt_index, 0); -} - -/* Like getopt_long, but '-' as well as '--' can indicate a long option. - If an option that starts with '-' (not '--') doesn't match a long option, - but does match a short option, it is parsed as a short option - instead. */ - -int -getopt_long_only (argc, argv, options, long_options, opt_index) - int argc; - char *const *argv; - const char *options; - const struct option *long_options; - int *opt_index; -{ - return _getopt_internal (argc, argv, options, long_options, opt_index, 1); -} - - -#endif /* _LIBC or not __GNU_LIBRARY__. */ - -#ifdef TEST - -#include - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - int option_index = 0; - static struct option long_options[] = - { - {"add", 1, 0, 0}, - {"append", 0, 0, 0}, - {"delete", 1, 0, 0}, - {"verbose", 0, 0, 0}, - {"create", 0, 0, 0}, - {"file", 1, 0, 0}, - {0, 0, 0, 0} - }; - - c = getopt_long (argc, argv, "abc:d:0123456789", - long_options, &option_index); - if (c == EOF) - break; - - switch (c) - { - case 0: - printf ("option %s", long_options[option_index].name); - if (optarg) - printf (" with arg %s", optarg); - printf ("\n"); - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value `%s'\n", optarg); - break; - - case 'd': - printf ("option d with value `%s'\n", optarg); - break; - - case '?': - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ diff --git a/buildtools/windows/source/make/glob.c b/buildtools/windows/source/make/glob.c deleted file mode 100644 index c90a40672b9..00000000000 --- a/buildtools/windows/source/make/glob.c +++ /dev/null @@ -1,705 +0,0 @@ -/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -/* AIX requires this to be the first thing in the file. */ -#if defined (_AIX) && !defined (__GNUC__) - #pragma alloca -#endif - -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifdef NETSCAPE -#include "windir.h" -#endif - -#include -#include -#include - - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) - - -#ifdef STDC_HEADERS -#include -#endif - -#ifdef HAVE_UNISTD_H -#include -#ifndef POSIX -#ifdef _POSIX_VERSION -#define POSIX -#endif -#endif -#endif - -#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS) -extern int errno; -#endif - -#ifndef NULL -#define NULL 0 -#endif - - -#if defined (POSIX) || defined (HAVE_DIRENT_H) || defined (__GNU_LIBRARY__) -#include -#ifndef __GNU_LIBRARY__ -#define D_NAMLEN(d) strlen((d)->d_name) -#else /* GNU C library. */ -#define D_NAMLEN(d) ((d)->d_namlen) -#endif /* Not GNU C library. */ -#else /* Not POSIX or HAVE_DIRENT_H. */ -#define direct dirent -#define D_NAMLEN(d) ((d)->d_namlen) -#ifdef HAVE_SYS_NDIR_H -#include -#endif /* HAVE_SYS_NDIR_H */ -#ifdef HAVE_SYS_DIR_H -#include -#endif /* HAVE_SYS_DIR_H */ -#ifdef HAVE_NDIR_H -#include -#endif /* HAVE_NDIR_H */ -#endif /* POSIX or HAVE_DIRENT_H or __GNU_LIBRARY__. */ - -#if defined(NETSCAPE) || defined (POSIX) && !defined (__GNU_LIBRARY__) -/* Posix does not require that the d_ino field be present, and some - systems do not provide it. */ -#define REAL_DIR_ENTRY(dp) 1 -#else -#define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) -#endif /* POSIX */ - -#if (defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)) -#include -#include -#define ANSI_STRING -#else /* No standard headers. */ - -#ifdef HAVE_STRING_H -#include -#define ANSI_STRING -#else -#include -#endif -#ifdef HAVE_MEMORY_H -#include -#endif - -extern char *malloc (), *realloc (); -extern void free (); - -extern void qsort (); -extern void abort (), exit (); - -#endif /* Standard headers. */ - -#ifndef ANSI_STRING - -#ifndef bzero -extern void bzero (); -#endif -#ifndef bcopy -extern void bcopy (); -#endif - -#define memcpy(d, s, n) bcopy ((s), (d), (n)) -#define strrchr rindex -/* memset is only used for zero here, but let's be paranoid. */ -#define memset(s, better_be_zero, n) \ - ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0))) -#endif /* Not ANSI_STRING. */ - -#ifndef HAVE_STRCOLL -#define strcoll strcmp -#endif - - -#if !defined(__GNU_LIBRARY__) && !defined(NETSCAPE) -#ifdef __GNUC__ -__inline -#endif -static char * -my_realloc (p, n) - char *p; - unsigned int n; -{ - /* These casts are the for sake of the broken Ultrix compiler, - which warns of illegal pointer combinations otherwise. */ - if (p == NULL) - return (char *) malloc (n); - return (char *) realloc (p, n); -} -#define realloc my_realloc -#endif - - -#if !defined(__alloca) && !defined(__GNU_LIBRARY__) - -#ifdef __GNUC__ -#undef alloca -#define alloca(n) __builtin_alloca (n) -#else /* Not GCC. */ -#if defined (sparc) || defined (HAVE_ALLOCA_H) -#include -#elif defined(NETSCAPE) -#include -#else /* Not sparc or HAVE_ALLOCA_H. */ -#ifndef _AIX -extern char *alloca (); -#endif /* Not _AIX. */ -#endif /* sparc or HAVE_ALLOCA_H. */ -#endif /* GCC. */ - -#define __alloca alloca - -#endif - -#ifndef __GNU_LIBRARY__ -#define __lstat lstat -#ifndef HAVE_LSTAT -#define lstat stat -#endif -#ifdef STAT_MACROS_BROKEN -#undef S_ISDIR -#endif -#ifndef S_ISDIR -#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) -#endif -#endif - -#ifndef STDC_HEADERS -#undef size_t -#define size_t unsigned int -#endif - -/* Some system header files erroneously define these. - We want our own definitions from to take precedence. */ -#undef FNM_PATHNAME -#undef FNM_NOESCAPE -#undef FNM_PERIOD -#include - -/* Some system header files erroneously define these. - We want our own definitions from to take precedence. */ -#undef GLOB_ERR -#undef GLOB_MARK -#undef GLOB_NOSORT -#undef GLOB_DOOFFS -#undef GLOB_NOCHECK -#undef GLOB_APPEND -#undef GLOB_NOESCAPE -#undef GLOB_PERIOD -#include - -__ptr_t (*__glob_opendir_hook) __P ((const char *directory)); -const char *(*__glob_readdir_hook) __P ((__ptr_t stream)); -void (*__glob_closedir_hook) __P ((__ptr_t stream)); - -static int glob_pattern_p __P ((const char *pattern, int quote)); -static int glob_in_dir __P ((const char *pattern, const char *directory, - int flags, - int (*errfunc) __P ((const char *, int)), - glob_t *pglob)); -static int prefix_array __P ((const char *prefix, char **array, size_t n)); -int collated_compare __P ((const void *elem1, const void *elem2)); - -/* Do glob searching for PATTERN, placing results in PGLOB. - The bits defined above may be set in FLAGS. - If a directory cannot be opened or read and ERRFUNC is not nil, - it is called with the pathname that caused the error, and the - `errno' value from the failing call; if it returns non-zero - `glob' returns GLOB_ABEND; if it returns zero, the error is ignored. - If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned. - Otherwise, `glob' returns zero. */ -int -glob (pattern, flags, errfunc, pglob) - const char *pattern; - int flags; - int (*errfunc) __P ((const char *, int)); - glob_t *pglob; -{ - const char *filename; - char *dirname; - size_t dirlen; - int status; - int oldcount; - - if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) - { - errno = EINVAL; - return -1; - } - - /* Find the filename. */ - filename = strrchr (pattern, '/'); - if (filename == NULL) - { - filename = pattern; - dirname = (char *) "."; - dirlen = 0; - } - else if (filename == pattern) - { - /* "/pattern". */ - dirname = (char *) "/"; - dirlen = 1; - ++filename; - } - else - { - dirlen = filename - pattern; - dirname = (char *) __alloca (dirlen + 1); - memcpy (dirname, pattern, dirlen); - dirname[dirlen] = '\0'; - ++filename; - } - - if (filename[0] == '\0' && dirlen > 1) - /* "pattern/". Expand "pattern", appending slashes. */ - { - int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob); - if (val == 0) - pglob->gl_flags = (pglob->gl_flags & ~GLOB_MARK) | (flags & GLOB_MARK); - return val; - } - - if (!(flags & GLOB_APPEND)) - { - pglob->gl_pathc = 0; - pglob->gl_pathv = NULL; - } - - oldcount = pglob->gl_pathc; - - if (glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE))) - { - /* The directory name contains metacharacters, so we - have to glob for the directory, and then glob for - the pattern in each directory found. */ - glob_t dirs; - register int i; - - status = glob (dirname, - ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE)) | - GLOB_NOSORT), - errfunc, &dirs); - if (status != 0) - return status; - - /* We have successfully globbed the preceding directory name. - For each name we found, call glob_in_dir on it and FILENAME, - appending the results to PGLOB. */ - for (i = 0; i < dirs.gl_pathc; ++i) - { - int oldcount; - -#ifdef SHELL - { - /* Make globbing interruptible in the bash shell. */ - extern int interrupt_state; - - if (interrupt_state) - { - globfree (&dirs); - globfree (&files); - return GLOB_ABEND; - } - } -#endif /* SHELL. */ - - oldcount = pglob->gl_pathc; - status = glob_in_dir (filename, dirs.gl_pathv[i], - (flags | GLOB_APPEND) & ~GLOB_NOCHECK, - errfunc, pglob); - if (status == GLOB_NOMATCH) - /* No matches in this directory. Try the next. */ - continue; - - if (status != 0) - { - globfree (&dirs); - globfree (pglob); - return status; - } - - /* Stick the directory on the front of each name. */ - if (prefix_array (dirs.gl_pathv[i], - &pglob->gl_pathv[oldcount], - pglob->gl_pathc - oldcount)) - { - globfree (&dirs); - globfree (pglob); - return GLOB_NOSPACE; - } - } - - flags |= GLOB_MAGCHAR; - - if (pglob->gl_pathc == oldcount) - /* No matches. */ - if (flags & GLOB_NOCHECK) - { - size_t len = strlen (pattern) + 1; - char *patcopy = (char *) malloc (len); - if (patcopy == NULL) - return GLOB_NOSPACE; - memcpy (patcopy, pattern, len); - - pglob->gl_pathv - = (char **) realloc (pglob->gl_pathv, - (pglob->gl_pathc + - ((flags & GLOB_DOOFFS) ? - pglob->gl_offs : 0) + - 1 + 1) * - sizeof (char *)); - if (pglob->gl_pathv == NULL) - { - free (patcopy); - return GLOB_NOSPACE; - } - - if (flags & GLOB_DOOFFS) - while (pglob->gl_pathc < pglob->gl_offs) - pglob->gl_pathv[pglob->gl_pathc++] = NULL; - - pglob->gl_pathv[pglob->gl_pathc++] = patcopy; - pglob->gl_pathv[pglob->gl_pathc] = NULL; - pglob->gl_flags = flags; - } - else - return GLOB_NOMATCH; - } - else - { - status = glob_in_dir (filename, dirname, flags, errfunc, pglob); - if (status != 0) - return status; - - if (dirlen > 0) - { - /* Stick the directory on the front of each name. */ - if (prefix_array (dirname, - &pglob->gl_pathv[oldcount], - pglob->gl_pathc - oldcount)) - { - globfree (pglob); - return GLOB_NOSPACE; - } - } - } - - if (flags & GLOB_MARK) - { - /* Append slashes to directory names. glob_in_dir has already - allocated the extra character for us. */ - int i; - struct stat st; - for (i = oldcount; i < pglob->gl_pathc; ++i) - if (__lstat (pglob->gl_pathv[i], &st) == 0 && - S_ISDIR (st.st_mode)) - strcat (pglob->gl_pathv[i], "/"); - } - - if (!(flags & GLOB_NOSORT)) - /* Sort the vector. */ -#if 0 - qsort ((__ptr_t) &pglob->gl_pathv[oldcount], - pglob->gl_pathc - oldcount, - sizeof (char *), collated_compare); -#else - qsort ( &pglob->gl_pathv[oldcount], - (size_t)(pglob->gl_pathc - oldcount), - sizeof (char *), collated_compare); -#endif - - return 0; -} - - -/* Free storage allocated in PGLOB by a previous `glob' call. */ -void -globfree (pglob) - register glob_t *pglob; -{ - if (pglob->gl_pathv != NULL) - { - register int i; - for (i = 0; i < pglob->gl_pathc; ++i) - if (pglob->gl_pathv[i] != NULL) - free ((__ptr_t) pglob->gl_pathv[i]); - free ((__ptr_t) pglob->gl_pathv); - } -} - - -/* Do a collated comparison of A and B. */ -int -collated_compare (const void *elem1, const void *elem2) -{ - const __ptr_t a = (const __ptr_t)elem1; - const __ptr_t b = (const __ptr_t)elem1; - const char *const s1 = *(const char *const * const) a; - const char *const s2 = *(const char *const * const) b; - - if (s1 == s2) - return 0; - if (s1 == NULL) - return 1; - if (s2 == NULL) - return -1; - return strcoll (s1, s2); -} - - -/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's - elements in place. Return nonzero if out of memory, zero if successful. - A slash is inserted between DIRNAME and each elt of ARRAY, - unless DIRNAME is just "/". Each old element of ARRAY is freed. */ -static int -prefix_array (dirname, array, n) - const char *dirname; - char **array; - size_t n; -{ - register size_t i; - size_t dirlen = strlen (dirname); - - if (dirlen == 1 && dirname[0] == '/') - /* DIRNAME is just "/", so normal prepending would get us "//foo". - We want "/foo" instead, so don't prepend any chars from DIRNAME. */ - dirlen = 0; - - for (i = 0; i < n; ++i) - { - size_t eltlen = strlen (array[i]) + 1; - char *new = (char *) malloc (dirlen + 1 + eltlen); - if (new == NULL) - { - while (i > 0) - free ((__ptr_t) array[--i]); - return 1; - } - - memcpy (new, dirname, dirlen); - new[dirlen] = '/'; - memcpy (&new[dirlen + 1], array[i], eltlen); - free ((__ptr_t) array[i]); - array[i] = new; - } - - return 0; -} - - -/* Return nonzero if PATTERN contains any metacharacters. - Metacharacters can be quoted with backslashes if QUOTE is nonzero. */ -static int -glob_pattern_p (pattern, quote) - const char *pattern; - int quote; -{ - register const char *p; - int open = 0; - - for (p = pattern; *p != '\0'; ++p) - switch (*p) - { - case '?': - case '*': - return 1; - - case '\\': - if (quote) - ++p; - break; - - case '[': - open = 1; - break; - - case ']': - if (open) - return 1; - break; - } - - return 0; -} - - -/* Like `glob', but PATTERN is a final pathname component, - and matches are searched for in DIRECTORY. - The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done. - The GLOB_APPEND flag is assumed to be set (always appends). */ -static int -glob_in_dir (pattern, directory, flags, errfunc, pglob) - const char *pattern; - const char *directory; - int flags; - int (*errfunc) __P ((const char *, int)); - glob_t *pglob; -{ - __ptr_t stream; - - struct globlink - { - struct globlink *next; - char *name; - }; - struct globlink *names = NULL; - size_t nfound = 0; - - if (!glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE))) - { - stream = NULL; - flags |= GLOB_NOCHECK; - } - else - { - flags |= GLOB_MAGCHAR; - - stream = (__glob_opendir_hook ? (*__glob_opendir_hook) (directory) - : (__ptr_t) opendir (directory)); - if (stream == NULL) - { - if ((errfunc != NULL && (*errfunc) (directory, errno)) || - (flags & GLOB_ERR)) - return GLOB_ABEND; - } - else - while (1) - { - const char *name; - size_t len; - - if (__glob_readdir_hook) - { - name = (*__glob_readdir_hook) (stream); - if (name == NULL) - break; - len = 0; - } - else - { - struct dirent *d = readdir ((DIR *) stream); - if (d == NULL) - break; - if (! REAL_DIR_ENTRY (d)) - continue; - name = d->d_name; -#ifdef HAVE_D_NAMLEN - len = d->d_namlen; -#else - len = 0; -#endif - } - - if (fnmatch (pattern, name, - (!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) | - ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)) == 0) - { - struct globlink *new - = (struct globlink *) __alloca (sizeof (struct globlink)); - if (len == 0) - len = strlen (name); - new->name - = (char *) malloc (len + ((flags & GLOB_MARK) ? 1 : 0) + 1); - if (new->name == NULL) - goto memory_error; - memcpy ((__ptr_t) new->name, name, len); - new->name[len] = '\0'; - new->next = names; - names = new; - ++nfound; - } - } - } - - if (nfound == 0 && (flags & GLOB_NOCHECK)) - { - size_t len = strlen (pattern); - nfound = 1; - names = (struct globlink *) __alloca (sizeof (struct globlink)); - names->next = NULL; - names->name = (char *) malloc (len + 1); - if (names->name == NULL) - goto memory_error; - memcpy (names->name, pattern, len); - names->name[len] = '\0'; - } - - pglob->gl_pathv - = (char **) realloc (pglob->gl_pathv, - (pglob->gl_pathc + - ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) + - nfound + 1) * - sizeof (char *)); - if (pglob->gl_pathv == NULL) - goto memory_error; - - if (flags & GLOB_DOOFFS) - while (pglob->gl_pathc < pglob->gl_offs) - pglob->gl_pathv[pglob->gl_pathc++] = NULL; - - for (; names != NULL; names = names->next) - pglob->gl_pathv[pglob->gl_pathc++] = names->name; - pglob->gl_pathv[pglob->gl_pathc] = NULL; - - pglob->gl_flags = flags; - - if (stream != NULL) - { - int save = errno; - if (__glob_closedir_hook) - (*__glob_closedir_hook) (stream); - else - (void) closedir ((DIR *) stream); - errno = save; - } - return nfound == 0 ? GLOB_NOMATCH : 0; - - memory_error: - { - int save = errno; - if (__glob_closedir_hook) - (*__glob_closedir_hook) (stream); - else - (void) closedir ((DIR *) stream); - errno = save; - } - while (names != NULL) - { - if (names->name != NULL) - free ((__ptr_t) names->name); - names = names->next; - } - return GLOB_NOSPACE; -} - -#endif /* _LIBC or not __GNU_LIBRARY__. */ diff --git a/buildtools/windows/source/make/glob/COPYING.LIB b/buildtools/windows/source/make/glob/COPYING.LIB deleted file mode 100644 index eb685a5ec98..00000000000 --- a/buildtools/windows/source/make/glob/COPYING.LIB +++ /dev/null @@ -1,481 +0,0 @@ - GNU LIBRARY GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, 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 library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.] - - 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 Library General Public License, applies to some -specially designated Free Software Foundation software, and to any -other libraries whose authors decide to use it. You can use it for -your libraries, too. - - When we speak of free software, we are referring to freedom, 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 or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the 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 a program 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. - - Our method of protecting your rights has two steps: (1) copyright -the library, and (2) offer you this license which gives you legal -permission to copy, distribute and/or modify the library. - - Also, for each distributor's protection, we want to make certain -that everyone understands that there is no warranty for this free -library. If the library is modified by someone else and passed on, we -want its recipients to know that what they have is not the original -version, so that any problems introduced by others will not reflect on -the original authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that companies distributing free -software will individually obtain patent licenses, thus in effect -transforming the program into proprietary software. To prevent this, -we have made it clear that any patent must be licensed for everyone's -free use or not licensed at all. - - Most GNU software, including some libraries, is covered by the ordinary -GNU General Public License, which was designed for utility programs. This -license, the GNU Library General Public License, applies to certain -designated libraries. This license is quite different from the ordinary -one; be sure to read it in full, and don't assume that anything in it is -the same as in the ordinary license. - - The reason we have a separate public license for some libraries is that -they blur the distinction we usually make between modifying or adding to a -program and simply using it. Linking a program with a library, without -changing the library, is in some sense simply using the library, and is -analogous to running a utility program or application program. However, in -a textual and legal sense, the linked executable is a combined work, a -derivative of the original library, and the ordinary General Public License -treats it as such. - - Because of this blurred distinction, using the ordinary General -Public License for libraries did not effectively promote software -sharing, because most developers did not use the libraries. We -concluded that weaker conditions might promote sharing better. - - However, unrestricted linking of non-free programs would deprive the -users of those programs of all benefit from the free status of the -libraries themselves. This Library General Public License is intended to -permit developers of non-free programs to use free libraries, while -preserving your freedom as a user of such programs to change the free -libraries that are incorporated in them. (We have not seen how to achieve -this as regards changes in header files, but we have achieved it as regards -changes in the actual functions of the Library.) The hope is that this -will lead to faster development of free libraries. - - 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, while the latter only -works together with the library. - - Note that it is possible for a library to be covered by the ordinary -General Public License rather than by this special one. - - GNU LIBRARY GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library which -contains a notice placed by the copyright holder or other authorized -party saying it may be distributed under the terms of this Library -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 compile 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) 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. - - c) 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. - - d) 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 source code 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 to -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 Library 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 - - Appendix: 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 Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 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/buildtools/windows/source/make/glob/Makefile b/buildtools/windows/source/make/glob/Makefile deleted file mode 100644 index eb8ac56dd96..00000000000 --- a/buildtools/windows/source/make/glob/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -# -# GNU Makefile for building gmake.exe on WIN32 -# This makefile compiles the files in the glob subdirectory. -# - -CSRCS = fnmatch.c glob.c - -OBJS = $(CSRCS:.c=.obj) - -CC = cl - -CFLAGS = $(CC_SWITCHES) $(INCLUDES) $(DEFINES) $(CC_OUTPUTS) - -CC_SWITCHES = -nologo -ML -W3 -O2 - -INCLUDES = -I. -I.. - -DEFINES = -DWIN32 -DNDEBUG -D_CONSOLE -DNETSCAPE -DHAVE_CONFIG_H - -CC_OUTPUTS = -Fpglob.pch -YX -c - -all: $(OBJS) - -%.obj: %.c - $(CC) $(CFLAGS) $< - -clean: - rm -rf $(OBJS) glob.pch diff --git a/buildtools/windows/source/make/glob/Makefile.in b/buildtools/windows/source/make/glob/Makefile.in deleted file mode 100644 index 8c091b33ac9..00000000000 --- a/buildtools/windows/source/make/glob/Makefile.in +++ /dev/null @@ -1,66 +0,0 @@ -# Makefile for standalone distribution of libglob.a (fnmatch, glob). - -# Copyright (C) 1991, 92, 93, 94, 95 Free Software Foundation, Inc. -# This file is part of the GNU C Library. - -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public License -# as published by the Free Software Foundation; either version 2 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 -# Library General Public License for more details. - -# You should have received a copy of the GNU Library General Public -# License along with this library; see the file COPYING.LIB. If -# not, write to the Free Software Foundation, Inc., 675 Mass Ave, -# Cambridge, MA 02139, USA. - -# Ultrix 2.2 make doesn't expand the value of VPATH. -VPATH = @srcdir@ -# This must repeat the value, because configure will remove `VPATH = .'. -srcdir = @srcdir@ - -CC = @CC@ -CPPFLAGS = @CPPFLAGS@ -CFLAGS = @CFLAGS@ - -# Information determined by configure. -DEFS = @DEFS@ - -# How to invoke ar. -AR = @AR@ -ARFLAGS = rv - -# How to invoke ranlib. -RANLIB = @RANLIB@ - -.PHONY: all -all: libglob.a - -libglob.a: glob.o fnmatch.o - $(AR) $(ARFLAGS) $@ glob.o fnmatch.o - $(RANLIB) $@ - -# For some reason, Unix make wants the dependencies on the source files. -# Otherwise it refuses to use an implicit rule! -# And, get this: it doesn't work to use $(srcdir)/foo.c!! -glob.o: $(srcdir)/glob.h $(srcdir)/fnmatch.h glob.c -fnmatch.o: $(srcdir)/fnmatch.h fnmatch.c - -.c.o: - $(CC) -I. -I$(srcdir) -c \ - $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) - -.PHONY: clean realclean glob-clean glob-realclean distclean -clean glob-clean: - -rm -f libglob.a *.o core -distclean glob-realclean: clean - -rm -f TAGS tags Makefile config.status config.h config.log -realcean: distclean - -# For inside the C library. -glob.tar glob.tar.Z: - $(MAKE) -C .. $@ diff --git a/buildtools/windows/source/make/glob/configure b/buildtools/windows/source/make/glob/configure deleted file mode 100644 index d82e6dd9096..00000000000 --- a/buildtools/windows/source/make/glob/configure +++ /dev/null @@ -1,1547 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.1.2 -# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE - -# Initialize some other variables. -subdirs= - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -build | --build | --buil | --bui | --bu | --b) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=PREFIX install architecture-dependent files in PREFIX - [same as prefix] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR ---enable and --with options recognized:$ac_help -EOF - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.1.2" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# 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 -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# 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 "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LANG+set}" = set; then LANG=C; export LANG; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=fnmatch.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} conftest.$ac_ext $CFLAGS $CPPFLAGS -c 1>&5 2>&5' -ac_link='${CC-cc} conftest.$ac_ext $CFLAGS $CPPFLAGS $LDFLAGS -o conftest $LIBS 1>&5 2>&5' - -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 - - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="cc" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5 | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 -if test $ac_cv_prog_gcc = yes; then - GCC=yes - if test "${CFLAGS+set}" != set; then - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_gcc_g=yes -else - ac_cv_prog_gcc_g=no -fi -rm -f conftest* - -fi - echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 - if test $ac_cv_prog_gcc_g = yes; then - CFLAGS="-g -O" - else - CFLAGS="-O" - fi - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - -# Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AR="ar" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" -fi -fi -AR="$ac_cv_prog_AR" -if test -n "$AR"; then - echo "$ac_t""$AR" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi -fi -CPP="$ac_cv_prog_CPP" -echo "$ac_t""$CPP" 1>&6 - echo $ac_n "checking for AIX""... $ac_c" 1>&6 -cat > conftest.$ac_ext <&5 | - egrep "yes" >/dev/null 2>&1; then - rm -rf conftest* - echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF -#define _ALL_SOURCE 1 -EOF - -else - rm -rf conftest* - echo "$ac_t""no" 1>&6 -fi -rm -f conftest* - - -ac_safe=`echo "minix/config.h" | tr './\055' '___'` -echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - MINIX=yes -else - echo "$ac_t""no" 1>&6 -MINIX= -fi - -if test "$MINIX" = yes; then - cat >> confdefs.h <<\EOF -#define _POSIX_SOURCE 1 -EOF - - cat >> confdefs.h <<\EOF -#define _POSIX_1_SOURCE 2 -EOF - - cat >> confdefs.h <<\EOF -#define _MINIX 1 -EOF - -fi - -echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 -if test -d /etc/conf/kconfig.d && - grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 -then - echo "$ac_t""yes" 1>&6 - ISC=yes # If later tests want to check for ISC. - cat >> confdefs.h <<\EOF -#define _POSIX_SOURCE 1 -EOF - - if test "$GCC" = yes; then - CC="$CC -posix" - else - CC="$CC -Xp" - fi -else - echo "$ac_t""no" 1>&6 - ISC= -fi - -echo $ac_n "checking for working const""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <j = 5; -} -{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -} - -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - ac_cv_c_const=yes -else - rm -rf conftest* - ac_cv_c_const=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_c_const" 1>&6 -if test $ac_cv_c_const = no; then - cat >> confdefs.h <<\EOF -#define const -EOF - -fi - -# If we cannot run a trivial program, we must be cross compiling. -echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_cross=yes -else -cat > conftest.$ac_ext </dev/null; then - ac_cv_c_cross=no -else - ac_cv_c_cross=yes -fi -fi -rm -fr conftest* -fi -cross_compiling=$ac_cv_c_cross -echo "$ac_t""$ac_cv_c_cross" 1>&6 - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -#include -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - ac_cv_header_stdc=no -else -cat > conftest.$ac_ext < -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - : -else - ac_cv_header_stdc=no -fi -fi -rm -fr conftest* -fi -fi -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -for ac_hdr in memory.h unistd.h string.h -do -ac_safe=`echo "$ac_hdr" | tr './\055' '___'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -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 < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&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 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'` - cat >> confdefs.h <&6 -fi -done - -ac_header_dirent=no -for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h -do -ac_safe=`echo "$ac_hdr" | tr './\055' '___'` -echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include <$ac_hdr> -int main() { return 0; } -int t() { -DIR *dirp = 0; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - eval "ac_cv_header_dirent_$ac_safe=yes" -else - rm -rf conftest* - eval "ac_cv_header_dirent_$ac_safe=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'` - cat >> confdefs.h <&6 -fi -done -# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. -if test $ac_header_dirent = dirent.h; then -echo $ac_n "checking for -ldir""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_dir'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldir $LIBS" -cat > conftest.$ac_ext <&6 - LIBS="$LIBS -ldir" -else - echo "$ac_t""no" 1>&6 -fi - -else -echo $ac_n "checking for -lx""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_x'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lx $LIBS" -cat > conftest.$ac_ext <&6 - LIBS="$LIBS -lx" -else - echo "$ac_t""no" 1>&6 -fi - -fi - -echo $ac_n "checking whether closedir returns void""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_closedir_void'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext < -#include <$ac_header_dirent> -int closedir(); main() { exit(closedir(opendir(".")) != 0); } -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_func_closedir_void=no -else - ac_cv_func_closedir_void=yes -fi -fi -rm -fr conftest* -fi -echo "$ac_t""$ac_cv_func_closedir_void" 1>&6 -if test $ac_cv_func_closedir_void = yes; then - cat >> confdefs.h <<\EOF -#define CLOSEDIR_VOID 1 -EOF - -fi - -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -char *p = alloca(2 * sizeof(int)); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - ac_cv_header_alloca_h=yes -else - rm -rf conftest* - ac_cv_header_alloca_h=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 -if test $ac_cv_header_alloca_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA_H 1 -EOF - -fi - -echo $ac_n "checking for alloca""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_alloca'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -#endif - -int main() { return 0; } -int t() { -char *p = (char *) alloca(1); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - ac_cv_func_alloca=yes -else - rm -rf conftest* - ac_cv_func_alloca=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_func_alloca" 1>&6 -if test $ac_cv_func_alloca = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA 1 -EOF - -fi - -if test $ac_cv_func_alloca = no; then - # The SVR3 libPW and SVR4 libucb both contain incompatible functions - # that cause trouble. Some versions do not even contain alloca or - # contain a buggy version. If you still want to use their alloca, - # use ar to extract alloca.o from them instead of compiling alloca.c. - ALLOCA=alloca.o - cat >> confdefs.h <<\EOF -#define C_ALLOCA 1 -EOF - - -echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5 | - egrep "webecray" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_os_cray=yes -else - rm -rf conftest* - ac_cv_os_cray=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_os_cray" 1>&6 -if test $ac_cv_os_cray = yes; then -echo $ac_n "checking for _getb67""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func__getb67'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < /* Arbitrary system header to define __stub macros. */ -/* Override any gcc2 internal prototype to avoid an error. */ -char _getb67(); - -int main() { return 0; } -int t() { - -/* 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__getb67) || defined (__stub____getb67) -choke me -#else -_getb67(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func__getb67=yes" -else - rm -rf conftest* - eval "ac_cv_func__getb67=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'_getb67`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define CRAY_STACKSEG_END _getb67 -EOF - -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for GETB67""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_GETB67'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < /* Arbitrary system header to define __stub macros. */ -/* Override any gcc2 internal prototype to avoid an error. */ -char GETB67(); - -int main() { return 0; } -int t() { - -/* 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_GETB67) || defined (__stub___GETB67) -choke me -#else -GETB67(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_GETB67=yes" -else - rm -rf conftest* - eval "ac_cv_func_GETB67=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'GETB67`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define CRAY_STACKSEG_END GETB67 -EOF - -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for getb67""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_getb67'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < /* Arbitrary system header to define __stub macros. */ -/* Override any gcc2 internal prototype to avoid an error. */ -char getb67(); - -int main() { return 0; } -int t() { - -/* 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_getb67) || defined (__stub___getb67) -choke me -#else -getb67(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_getb67=yes" -else - rm -rf conftest* - eval "ac_cv_func_getb67=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'getb67`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define CRAY_STACKSEG_END getb67 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -fi - -fi - -fi - -echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_stack_direction=0 -else -cat > conftest.$ac_ext < addr) ? 1 : -1; -} -main () -{ - exit (find_stack_direction() < 0); -} -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_c_stack_direction=1 -else - ac_cv_c_stack_direction=-1 -fi -fi -rm -fr conftest* -fi -echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 -cat >> confdefs.h <&6 -if eval "test \"`echo '$''{'ac_cv_func_strcoll'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_strcoll=no -else -cat > conftest.$ac_ext < -main () -{ - exit (strcoll ("abc", "def") >= 0 || - strcoll ("ABC", "DEF") >= 0 || - strcoll ("123", "456") >= 0); -} -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_func_strcoll=yes -else - ac_cv_func_strcoll=no -fi -fi -rm -fr conftest* -fi -echo "$ac_t""$ac_cv_func_strcoll" 1>&6 -if test $ac_cv_func_strcoll = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_STRCOLL 1 -EOF - -fi - -trap '' 1 2 15 -if test -w $cache_file; then -echo "updating cache $cache_file" -cat > $cache_file <<\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 -# 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 | - sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ - >> $cache_file -else -echo "not updating unwritable cache $cache_file" -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -cat > conftest.defs <<\EOF -s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%-D\1=\2%g -s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g -s%\[%\\&%g -s%\]%\\&%g -s%\$%$$%g -EOF -DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` -rm -f conftest.defs - - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.1.2" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir - -trap 'rm -f Makefile; exit 1' 1 2 15 - -# Protect against being on the right side of a sed subst in config.status. -sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; - s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF -$ac_vpsub -$extrasub -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@CC@%$CC%g -s%@AR@%$AR%g -s%@RANLIB@%$RANLIB%g -s%@CPP@%$CPP%g -s%@ALLOCA@%$ALLOCA%g - -CEOF -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust relative srcdir, etc. for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file -fi; done -rm -f conftest.subs - - - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/buildtools/windows/source/make/glob/configure.bat b/buildtools/windows/source/make/glob/configure.bat deleted file mode 100755 index 45fcd63f71f..00000000000 --- a/buildtools/windows/source/make/glob/configure.bat +++ /dev/null @@ -1,52 +0,0 @@ -@echo off - -echo Configuring glob for GO32 - -rem This batch file assumes a unix-type "sed" program - - - -echo # Makefile generated by "configure.bat"> Makefile - - - -if exist config.sed del config.sed - - - -echo "s/@srcdir@/./ ">> config.sed - -echo "s/@CC@/gcc/ ">> config.sed - -echo "s/@CFLAGS@/-O2 -g/ ">> config.sed - -echo "s/@CPPFLAGS@/-DHAVE_CONFIG_H -I../ ">> config.sed - -echo "s/@AR@/ar/ ">> config.sed - -echo "s/@RANLIB@/ranlib/ ">> config.sed - -echo "s/@LDFLAGS@// ">> config.sed - -echo "s/@DEFS@// ">> config.sed - -echo "s/@ALLOCA@// ">> config.sed - -echo "s/@LIBS@// ">> config.sed - -echo "s/@LIBOBJS@// ">> config.sed - -echo "s/^Makefile *:/_Makefile:/ ">> config.sed - -echo "s/^config.h *:/_config.h:/ ">> config.sed - - - -sed -e "s/^\"//" -e "s/\"$//" -e "s/[ ]*$//" config.sed > config2.sed - -sed -f config2.sed Makefile.in >> Makefile - -del config.sed - -del config2.sed - diff --git a/buildtools/windows/source/make/glob/configure.in b/buildtools/windows/source/make/glob/configure.in deleted file mode 100644 index 8dc68e42483..00000000000 --- a/buildtools/windows/source/make/glob/configure.in +++ /dev/null @@ -1,19 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(fnmatch.c) dnl A distinctive file to look for in srcdir. -AC_PREREQ(2.1) dnl Minimum Autoconf version required. -AC_PROG_CC -AC_CHECK_PROG(AR, ar, ar, ar) -AC_PROG_RANLIB -AC_PROG_CPP dnl Later checks need this. -dnl These two want to come early. -AC_AIX -AC_MINIX -AC_ISC_POSIX -AC_CONST -AC_HEADER_STDC -AC_CHECK_HEADERS(memory.h unistd.h string.h) -AC_HEADER_DIRENT -AC_FUNC_CLOSEDIR_VOID -AC_FUNC_ALLOCA -AC_FUNC_STRCOLL -AC_OUTPUT(Makefile) diff --git a/buildtools/windows/source/make/glob/fnmatch.c b/buildtools/windows/source/make/glob/fnmatch.c deleted file mode 100644 index 1ef5599e234..00000000000 --- a/buildtools/windows/source/make/glob/fnmatch.c +++ /dev/null @@ -1,200 +0,0 @@ -/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include - - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) - - -#ifndef errno -extern int errno; -#endif - -/* Match STRING against the filename pattern PATTERN, returning zero if - it matches, nonzero if not. */ -int -fnmatch (pattern, string, flags) - const char *pattern; - const char *string; - int flags; -{ - register const char *p = pattern, *n = string; - register char c; - -/* Note that this evalutes C many times. */ -#define FOLD(c) ((flags & FNM_CASEFOLD) && isupper (c) ? tolower (c) : (c)) - - while ((c = *p++) != '\0') - { - c = FOLD (c); - - switch (c) - { - case '?': - if (*n == '\0') - return FNM_NOMATCH; - else if ((flags & FNM_FILE_NAME) && *n == '/') - return FNM_NOMATCH; - else if ((flags & FNM_PERIOD) && *n == '.' && - (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) - return FNM_NOMATCH; - break; - - case '\\': - if (!(flags & FNM_NOESCAPE)) - { - c = *p++; - c = FOLD (c); - } - if (FOLD (*n) != c) - return FNM_NOMATCH; - break; - - case '*': - if ((flags & FNM_PERIOD) && *n == '.' && - (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) - return FNM_NOMATCH; - - for (c = *p++; c == '?' || c == '*'; c = *p++, ++n) - if (((flags & FNM_FILE_NAME) && *n == '/') || - (c == '?' && *n == '\0')) - return FNM_NOMATCH; - - if (c == '\0') - return 0; - - { - char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c; - c1 = FOLD (c1); - for (--p; *n != '\0'; ++n) - if ((c == '[' || FOLD (*n) == c1) && - fnmatch (p, n, flags & ~FNM_PERIOD) == 0) - return 0; - return FNM_NOMATCH; - } - - case '[': - { - /* Nonzero if the sense of the character class is inverted. */ - register int not; - - if (*n == '\0') - return FNM_NOMATCH; - - if ((flags & FNM_PERIOD) && *n == '.' && - (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) - return FNM_NOMATCH; - - not = (*p == '!' || *p == '^'); - if (not) - ++p; - - c = *p++; - for (;;) - { - register char cstart = c, cend = c; - - if (!(flags & FNM_NOESCAPE) && c == '\\') - cstart = cend = *p++; - - cstart = cend = FOLD (cstart); - - if (c == '\0') - /* [ (unterminated) loses. */ - return FNM_NOMATCH; - - c = *p++; - c = FOLD (c); - - if ((flags & FNM_FILE_NAME) && c == '/') - /* [/] can never match. */ - return FNM_NOMATCH; - - if (c == '-' && *p != ']') - { - cend = *p++; - if (!(flags & FNM_NOESCAPE) && cend == '\\') - cend = *p++; - if (cend == '\0') - return FNM_NOMATCH; - cend = FOLD (cend); - - c = *p++; - } - - if (FOLD (*n) >= cstart && FOLD (*n) <= cend) - goto matched; - - if (c == ']') - break; - } - if (!not) - return FNM_NOMATCH; - break; - - matched:; - /* Skip the rest of the [...] that already matched. */ - while (c != ']') - { - if (c == '\0') - /* [... (unterminated) loses. */ - return FNM_NOMATCH; - - c = *p++; - if (!(flags & FNM_NOESCAPE) && c == '\\') - /* XXX 1003.2d11 is unclear if this is right. */ - ++p; - } - if (not) - return FNM_NOMATCH; - } - break; - - default: - if (c != FOLD (*n)) - return FNM_NOMATCH; - } - - ++n; - } - - if (*n == '\0') - return 0; - - if ((flags & FNM_LEADING_DIR) && *n == '/') - /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ - return 0; - - return FNM_NOMATCH; -} - -#endif /* _LIBC or not __GNU_LIBRARY__. */ diff --git a/buildtools/windows/source/make/glob/fnmatch.h b/buildtools/windows/source/make/glob/fnmatch.h deleted file mode 100644 index d9d73b3d86c..00000000000 --- a/buildtools/windows/source/make/glob/fnmatch.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -#ifndef _FNMATCH_H - -#define _FNMATCH_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) -#undef __P -#define __P(protos) protos -#else /* Not C++ or ANSI C. */ -#undef __P -#define __P(protos) () -/* We can get away without defining `const' here only because in this file - it is used only inside the prototype for `fnmatch', which is elided in - non-ANSI C where `const' is problematical. */ -#endif /* C++ or ANSI C. */ - - -/* We #undef these before defining them because some losing systems - (HP-UX A.08.07 for example) define these in . */ -#undef FNM_PATHNAME -#undef FNM_NOESCAPE -#undef FNM_PERIOD - -/* Bits set in the FLAGS argument to `fnmatch'. */ -#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ -#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ -#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ - -#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE) -#define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ -#define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ -#define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */ -#endif - -/* Value returned by `fnmatch' if STRING does not match PATTERN. */ -#define FNM_NOMATCH 1 - -/* Match STRING against the filename pattern PATTERN, - returning zero if it matches, FNM_NOMATCH if not. */ -extern int fnmatch __P ((const char *__pattern, const char *__string, - int __flags)); - -#ifdef __cplusplus -} -#endif - -#endif /* fnmatch.h */ diff --git a/buildtools/windows/source/make/glob/glob.c b/buildtools/windows/source/make/glob/glob.c deleted file mode 100644 index c90a40672b9..00000000000 --- a/buildtools/windows/source/make/glob/glob.c +++ /dev/null @@ -1,705 +0,0 @@ -/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -/* AIX requires this to be the first thing in the file. */ -#if defined (_AIX) && !defined (__GNUC__) - #pragma alloca -#endif - -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifdef NETSCAPE -#include "windir.h" -#endif - -#include -#include -#include - - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) - - -#ifdef STDC_HEADERS -#include -#endif - -#ifdef HAVE_UNISTD_H -#include -#ifndef POSIX -#ifdef _POSIX_VERSION -#define POSIX -#endif -#endif -#endif - -#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS) -extern int errno; -#endif - -#ifndef NULL -#define NULL 0 -#endif - - -#if defined (POSIX) || defined (HAVE_DIRENT_H) || defined (__GNU_LIBRARY__) -#include -#ifndef __GNU_LIBRARY__ -#define D_NAMLEN(d) strlen((d)->d_name) -#else /* GNU C library. */ -#define D_NAMLEN(d) ((d)->d_namlen) -#endif /* Not GNU C library. */ -#else /* Not POSIX or HAVE_DIRENT_H. */ -#define direct dirent -#define D_NAMLEN(d) ((d)->d_namlen) -#ifdef HAVE_SYS_NDIR_H -#include -#endif /* HAVE_SYS_NDIR_H */ -#ifdef HAVE_SYS_DIR_H -#include -#endif /* HAVE_SYS_DIR_H */ -#ifdef HAVE_NDIR_H -#include -#endif /* HAVE_NDIR_H */ -#endif /* POSIX or HAVE_DIRENT_H or __GNU_LIBRARY__. */ - -#if defined(NETSCAPE) || defined (POSIX) && !defined (__GNU_LIBRARY__) -/* Posix does not require that the d_ino field be present, and some - systems do not provide it. */ -#define REAL_DIR_ENTRY(dp) 1 -#else -#define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) -#endif /* POSIX */ - -#if (defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)) -#include -#include -#define ANSI_STRING -#else /* No standard headers. */ - -#ifdef HAVE_STRING_H -#include -#define ANSI_STRING -#else -#include -#endif -#ifdef HAVE_MEMORY_H -#include -#endif - -extern char *malloc (), *realloc (); -extern void free (); - -extern void qsort (); -extern void abort (), exit (); - -#endif /* Standard headers. */ - -#ifndef ANSI_STRING - -#ifndef bzero -extern void bzero (); -#endif -#ifndef bcopy -extern void bcopy (); -#endif - -#define memcpy(d, s, n) bcopy ((s), (d), (n)) -#define strrchr rindex -/* memset is only used for zero here, but let's be paranoid. */ -#define memset(s, better_be_zero, n) \ - ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0))) -#endif /* Not ANSI_STRING. */ - -#ifndef HAVE_STRCOLL -#define strcoll strcmp -#endif - - -#if !defined(__GNU_LIBRARY__) && !defined(NETSCAPE) -#ifdef __GNUC__ -__inline -#endif -static char * -my_realloc (p, n) - char *p; - unsigned int n; -{ - /* These casts are the for sake of the broken Ultrix compiler, - which warns of illegal pointer combinations otherwise. */ - if (p == NULL) - return (char *) malloc (n); - return (char *) realloc (p, n); -} -#define realloc my_realloc -#endif - - -#if !defined(__alloca) && !defined(__GNU_LIBRARY__) - -#ifdef __GNUC__ -#undef alloca -#define alloca(n) __builtin_alloca (n) -#else /* Not GCC. */ -#if defined (sparc) || defined (HAVE_ALLOCA_H) -#include -#elif defined(NETSCAPE) -#include -#else /* Not sparc or HAVE_ALLOCA_H. */ -#ifndef _AIX -extern char *alloca (); -#endif /* Not _AIX. */ -#endif /* sparc or HAVE_ALLOCA_H. */ -#endif /* GCC. */ - -#define __alloca alloca - -#endif - -#ifndef __GNU_LIBRARY__ -#define __lstat lstat -#ifndef HAVE_LSTAT -#define lstat stat -#endif -#ifdef STAT_MACROS_BROKEN -#undef S_ISDIR -#endif -#ifndef S_ISDIR -#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) -#endif -#endif - -#ifndef STDC_HEADERS -#undef size_t -#define size_t unsigned int -#endif - -/* Some system header files erroneously define these. - We want our own definitions from to take precedence. */ -#undef FNM_PATHNAME -#undef FNM_NOESCAPE -#undef FNM_PERIOD -#include - -/* Some system header files erroneously define these. - We want our own definitions from to take precedence. */ -#undef GLOB_ERR -#undef GLOB_MARK -#undef GLOB_NOSORT -#undef GLOB_DOOFFS -#undef GLOB_NOCHECK -#undef GLOB_APPEND -#undef GLOB_NOESCAPE -#undef GLOB_PERIOD -#include - -__ptr_t (*__glob_opendir_hook) __P ((const char *directory)); -const char *(*__glob_readdir_hook) __P ((__ptr_t stream)); -void (*__glob_closedir_hook) __P ((__ptr_t stream)); - -static int glob_pattern_p __P ((const char *pattern, int quote)); -static int glob_in_dir __P ((const char *pattern, const char *directory, - int flags, - int (*errfunc) __P ((const char *, int)), - glob_t *pglob)); -static int prefix_array __P ((const char *prefix, char **array, size_t n)); -int collated_compare __P ((const void *elem1, const void *elem2)); - -/* Do glob searching for PATTERN, placing results in PGLOB. - The bits defined above may be set in FLAGS. - If a directory cannot be opened or read and ERRFUNC is not nil, - it is called with the pathname that caused the error, and the - `errno' value from the failing call; if it returns non-zero - `glob' returns GLOB_ABEND; if it returns zero, the error is ignored. - If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned. - Otherwise, `glob' returns zero. */ -int -glob (pattern, flags, errfunc, pglob) - const char *pattern; - int flags; - int (*errfunc) __P ((const char *, int)); - glob_t *pglob; -{ - const char *filename; - char *dirname; - size_t dirlen; - int status; - int oldcount; - - if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) - { - errno = EINVAL; - return -1; - } - - /* Find the filename. */ - filename = strrchr (pattern, '/'); - if (filename == NULL) - { - filename = pattern; - dirname = (char *) "."; - dirlen = 0; - } - else if (filename == pattern) - { - /* "/pattern". */ - dirname = (char *) "/"; - dirlen = 1; - ++filename; - } - else - { - dirlen = filename - pattern; - dirname = (char *) __alloca (dirlen + 1); - memcpy (dirname, pattern, dirlen); - dirname[dirlen] = '\0'; - ++filename; - } - - if (filename[0] == '\0' && dirlen > 1) - /* "pattern/". Expand "pattern", appending slashes. */ - { - int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob); - if (val == 0) - pglob->gl_flags = (pglob->gl_flags & ~GLOB_MARK) | (flags & GLOB_MARK); - return val; - } - - if (!(flags & GLOB_APPEND)) - { - pglob->gl_pathc = 0; - pglob->gl_pathv = NULL; - } - - oldcount = pglob->gl_pathc; - - if (glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE))) - { - /* The directory name contains metacharacters, so we - have to glob for the directory, and then glob for - the pattern in each directory found. */ - glob_t dirs; - register int i; - - status = glob (dirname, - ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE)) | - GLOB_NOSORT), - errfunc, &dirs); - if (status != 0) - return status; - - /* We have successfully globbed the preceding directory name. - For each name we found, call glob_in_dir on it and FILENAME, - appending the results to PGLOB. */ - for (i = 0; i < dirs.gl_pathc; ++i) - { - int oldcount; - -#ifdef SHELL - { - /* Make globbing interruptible in the bash shell. */ - extern int interrupt_state; - - if (interrupt_state) - { - globfree (&dirs); - globfree (&files); - return GLOB_ABEND; - } - } -#endif /* SHELL. */ - - oldcount = pglob->gl_pathc; - status = glob_in_dir (filename, dirs.gl_pathv[i], - (flags | GLOB_APPEND) & ~GLOB_NOCHECK, - errfunc, pglob); - if (status == GLOB_NOMATCH) - /* No matches in this directory. Try the next. */ - continue; - - if (status != 0) - { - globfree (&dirs); - globfree (pglob); - return status; - } - - /* Stick the directory on the front of each name. */ - if (prefix_array (dirs.gl_pathv[i], - &pglob->gl_pathv[oldcount], - pglob->gl_pathc - oldcount)) - { - globfree (&dirs); - globfree (pglob); - return GLOB_NOSPACE; - } - } - - flags |= GLOB_MAGCHAR; - - if (pglob->gl_pathc == oldcount) - /* No matches. */ - if (flags & GLOB_NOCHECK) - { - size_t len = strlen (pattern) + 1; - char *patcopy = (char *) malloc (len); - if (patcopy == NULL) - return GLOB_NOSPACE; - memcpy (patcopy, pattern, len); - - pglob->gl_pathv - = (char **) realloc (pglob->gl_pathv, - (pglob->gl_pathc + - ((flags & GLOB_DOOFFS) ? - pglob->gl_offs : 0) + - 1 + 1) * - sizeof (char *)); - if (pglob->gl_pathv == NULL) - { - free (patcopy); - return GLOB_NOSPACE; - } - - if (flags & GLOB_DOOFFS) - while (pglob->gl_pathc < pglob->gl_offs) - pglob->gl_pathv[pglob->gl_pathc++] = NULL; - - pglob->gl_pathv[pglob->gl_pathc++] = patcopy; - pglob->gl_pathv[pglob->gl_pathc] = NULL; - pglob->gl_flags = flags; - } - else - return GLOB_NOMATCH; - } - else - { - status = glob_in_dir (filename, dirname, flags, errfunc, pglob); - if (status != 0) - return status; - - if (dirlen > 0) - { - /* Stick the directory on the front of each name. */ - if (prefix_array (dirname, - &pglob->gl_pathv[oldcount], - pglob->gl_pathc - oldcount)) - { - globfree (pglob); - return GLOB_NOSPACE; - } - } - } - - if (flags & GLOB_MARK) - { - /* Append slashes to directory names. glob_in_dir has already - allocated the extra character for us. */ - int i; - struct stat st; - for (i = oldcount; i < pglob->gl_pathc; ++i) - if (__lstat (pglob->gl_pathv[i], &st) == 0 && - S_ISDIR (st.st_mode)) - strcat (pglob->gl_pathv[i], "/"); - } - - if (!(flags & GLOB_NOSORT)) - /* Sort the vector. */ -#if 0 - qsort ((__ptr_t) &pglob->gl_pathv[oldcount], - pglob->gl_pathc - oldcount, - sizeof (char *), collated_compare); -#else - qsort ( &pglob->gl_pathv[oldcount], - (size_t)(pglob->gl_pathc - oldcount), - sizeof (char *), collated_compare); -#endif - - return 0; -} - - -/* Free storage allocated in PGLOB by a previous `glob' call. */ -void -globfree (pglob) - register glob_t *pglob; -{ - if (pglob->gl_pathv != NULL) - { - register int i; - for (i = 0; i < pglob->gl_pathc; ++i) - if (pglob->gl_pathv[i] != NULL) - free ((__ptr_t) pglob->gl_pathv[i]); - free ((__ptr_t) pglob->gl_pathv); - } -} - - -/* Do a collated comparison of A and B. */ -int -collated_compare (const void *elem1, const void *elem2) -{ - const __ptr_t a = (const __ptr_t)elem1; - const __ptr_t b = (const __ptr_t)elem1; - const char *const s1 = *(const char *const * const) a; - const char *const s2 = *(const char *const * const) b; - - if (s1 == s2) - return 0; - if (s1 == NULL) - return 1; - if (s2 == NULL) - return -1; - return strcoll (s1, s2); -} - - -/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's - elements in place. Return nonzero if out of memory, zero if successful. - A slash is inserted between DIRNAME and each elt of ARRAY, - unless DIRNAME is just "/". Each old element of ARRAY is freed. */ -static int -prefix_array (dirname, array, n) - const char *dirname; - char **array; - size_t n; -{ - register size_t i; - size_t dirlen = strlen (dirname); - - if (dirlen == 1 && dirname[0] == '/') - /* DIRNAME is just "/", so normal prepending would get us "//foo". - We want "/foo" instead, so don't prepend any chars from DIRNAME. */ - dirlen = 0; - - for (i = 0; i < n; ++i) - { - size_t eltlen = strlen (array[i]) + 1; - char *new = (char *) malloc (dirlen + 1 + eltlen); - if (new == NULL) - { - while (i > 0) - free ((__ptr_t) array[--i]); - return 1; - } - - memcpy (new, dirname, dirlen); - new[dirlen] = '/'; - memcpy (&new[dirlen + 1], array[i], eltlen); - free ((__ptr_t) array[i]); - array[i] = new; - } - - return 0; -} - - -/* Return nonzero if PATTERN contains any metacharacters. - Metacharacters can be quoted with backslashes if QUOTE is nonzero. */ -static int -glob_pattern_p (pattern, quote) - const char *pattern; - int quote; -{ - register const char *p; - int open = 0; - - for (p = pattern; *p != '\0'; ++p) - switch (*p) - { - case '?': - case '*': - return 1; - - case '\\': - if (quote) - ++p; - break; - - case '[': - open = 1; - break; - - case ']': - if (open) - return 1; - break; - } - - return 0; -} - - -/* Like `glob', but PATTERN is a final pathname component, - and matches are searched for in DIRECTORY. - The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done. - The GLOB_APPEND flag is assumed to be set (always appends). */ -static int -glob_in_dir (pattern, directory, flags, errfunc, pglob) - const char *pattern; - const char *directory; - int flags; - int (*errfunc) __P ((const char *, int)); - glob_t *pglob; -{ - __ptr_t stream; - - struct globlink - { - struct globlink *next; - char *name; - }; - struct globlink *names = NULL; - size_t nfound = 0; - - if (!glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE))) - { - stream = NULL; - flags |= GLOB_NOCHECK; - } - else - { - flags |= GLOB_MAGCHAR; - - stream = (__glob_opendir_hook ? (*__glob_opendir_hook) (directory) - : (__ptr_t) opendir (directory)); - if (stream == NULL) - { - if ((errfunc != NULL && (*errfunc) (directory, errno)) || - (flags & GLOB_ERR)) - return GLOB_ABEND; - } - else - while (1) - { - const char *name; - size_t len; - - if (__glob_readdir_hook) - { - name = (*__glob_readdir_hook) (stream); - if (name == NULL) - break; - len = 0; - } - else - { - struct dirent *d = readdir ((DIR *) stream); - if (d == NULL) - break; - if (! REAL_DIR_ENTRY (d)) - continue; - name = d->d_name; -#ifdef HAVE_D_NAMLEN - len = d->d_namlen; -#else - len = 0; -#endif - } - - if (fnmatch (pattern, name, - (!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) | - ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)) == 0) - { - struct globlink *new - = (struct globlink *) __alloca (sizeof (struct globlink)); - if (len == 0) - len = strlen (name); - new->name - = (char *) malloc (len + ((flags & GLOB_MARK) ? 1 : 0) + 1); - if (new->name == NULL) - goto memory_error; - memcpy ((__ptr_t) new->name, name, len); - new->name[len] = '\0'; - new->next = names; - names = new; - ++nfound; - } - } - } - - if (nfound == 0 && (flags & GLOB_NOCHECK)) - { - size_t len = strlen (pattern); - nfound = 1; - names = (struct globlink *) __alloca (sizeof (struct globlink)); - names->next = NULL; - names->name = (char *) malloc (len + 1); - if (names->name == NULL) - goto memory_error; - memcpy (names->name, pattern, len); - names->name[len] = '\0'; - } - - pglob->gl_pathv - = (char **) realloc (pglob->gl_pathv, - (pglob->gl_pathc + - ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) + - nfound + 1) * - sizeof (char *)); - if (pglob->gl_pathv == NULL) - goto memory_error; - - if (flags & GLOB_DOOFFS) - while (pglob->gl_pathc < pglob->gl_offs) - pglob->gl_pathv[pglob->gl_pathc++] = NULL; - - for (; names != NULL; names = names->next) - pglob->gl_pathv[pglob->gl_pathc++] = names->name; - pglob->gl_pathv[pglob->gl_pathc] = NULL; - - pglob->gl_flags = flags; - - if (stream != NULL) - { - int save = errno; - if (__glob_closedir_hook) - (*__glob_closedir_hook) (stream); - else - (void) closedir ((DIR *) stream); - errno = save; - } - return nfound == 0 ? GLOB_NOMATCH : 0; - - memory_error: - { - int save = errno; - if (__glob_closedir_hook) - (*__glob_closedir_hook) (stream); - else - (void) closedir ((DIR *) stream); - errno = save; - } - while (names != NULL) - { - if (names->name != NULL) - free ((__ptr_t) names->name); - names = names->next; - } - return GLOB_NOSPACE; -} - -#endif /* _LIBC or not __GNU_LIBRARY__. */ diff --git a/buildtools/windows/source/make/glob/glob.h b/buildtools/windows/source/make/glob/glob.h deleted file mode 100644 index 05ad47f05d9..00000000000 --- a/buildtools/windows/source/make/glob/glob.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -#ifndef _GLOB_H - -#define _GLOB_H 1 - -#ifdef __cplusplus -extern "C" -{ -#endif - -#undef __ptr_t -#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) -#undef __P -#define __P(protos) protos -#define __ptr_t void * -#else /* Not C++ or ANSI C. */ -#undef __P -#define __P(protos) () -#undef const -#define const -#define __ptr_t char * -#endif /* C++ or ANSI C. */ - -/* Bits set in the FLAGS argument to `glob'. */ -#define GLOB_ERR (1 << 0)/* Return on read errors. */ -#define GLOB_MARK (1 << 1)/* Append a slash to each name. */ -#define GLOB_NOSORT (1 << 2)/* Don't sort the names. */ -#define GLOB_DOOFFS (1 << 3)/* Insert PGLOB->gl_offs NULLs. */ -#define GLOB_NOCHECK (1 << 4)/* If nothing matches, return the pattern. */ -#define GLOB_APPEND (1 << 5)/* Append to results of a previous call. */ -#define GLOB_NOESCAPE (1 << 6)/* Backslashes don't quote metacharacters. */ -#define GLOB_PERIOD (1 << 7)/* Leading `.' can be matched by metachars. */ -#define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \ - GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|GLOB_PERIOD) - -#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_BSD_SOURCE) -#define GLOB_MAGCHAR (1 << 8)/* Set in gl_flags if any metachars seen. */ -#endif - -/* Error returns from `glob'. */ -#define GLOB_NOSPACE 1 /* Ran out of memory. */ -#define GLOB_ABEND 2 /* Read error. */ -#define GLOB_NOMATCH 3 /* No matches found. */ - -/* Structure describing a globbing run. */ -typedef struct - { - int gl_pathc; /* Count of paths matched by the pattern. */ - char **gl_pathv; /* List of matched pathnames. */ - int gl_offs; /* Slots to reserve in `gl_pathv'. */ - int gl_flags; /* Set to FLAGS, maybe | GLOB_MAGCHAR. */ - } glob_t; - -/* Do glob searching for PATTERN, placing results in PGLOB. - The bits defined above may be set in FLAGS. - If a directory cannot be opened or read and ERRFUNC is not nil, - it is called with the pathname that caused the error, and the - `errno' value from the failing call; if it returns non-zero - `glob' returns GLOB_ABEND; if it returns zero, the error is ignored. - If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned. - Otherwise, `glob' returns zero. */ -extern int glob __P ((const char *__pattern, int __flags, - int (*__errfunc) __P ((const char *, int)), - glob_t *__pglob)); - -/* Free storage allocated in PGLOB by a previous `glob' call. */ -extern void globfree __P ((glob_t *__pglob)); - - -#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE) -/* If they are not NULL, `glob' uses these functions to read directories. */ -extern __ptr_t (*__glob_opendir_hook) __P ((const char *__directory)); -extern const char *(*__glob_readdir_hook) __P ((__ptr_t __stream)); -extern void (*__glob_closedir_hook) __P ((__ptr_t __stream)); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* glob.h */ diff --git a/buildtools/windows/source/make/implicit.c b/buildtools/windows/source/make/implicit.c deleted file mode 100644 index 1fef4f5909b..00000000000 --- a/buildtools/windows/source/make/implicit.c +++ /dev/null @@ -1,590 +0,0 @@ -/* Implicit rule searching for GNU Make. -Copyright (C) 1988, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "rule.h" -#include "dep.h" -#include "file.h" - -static int pattern_search (); - -/* For a FILE which has no commands specified, try to figure out some - from the implicit pattern rules. - Returns 1 if a suitable implicit rule was found, - after modifying FILE to contain the appropriate commands and deps, - or returns 0 if no implicit rule was found. */ - -int -try_implicit_rule (file, depth) - struct file *file; - unsigned int depth; -{ - DEBUGPR ("Looking for an implicit rule for `%s'.\n"); - - /* The order of these searches was previously reversed. My logic now is - that since the non-archive search uses more information in the target - (the archive search omits the archive name), it is more specific and - should come first. */ - - if (pattern_search (file, 0, depth, 0)) - return 1; - -#ifndef NO_ARCHIVES - /* If this is an archive member reference, use just the - archive member name to search for implicit rules. */ - if (ar_name (file->name)) - { - DEBUGPR ("Looking for archive-member implicit rule for `%s'.\n"); - if (pattern_search (file, 1, depth, 0)) - return 1; - } -#endif - - return 0; -} - -#define DEBUGP2(msg, a1, a2) \ - do { \ - if (debug_flag) \ - { print_spaces (depth); printf (msg, a1, a2); fflush (stdout); } \ - } while (0) - -/* Search the pattern rules for a rule with an existing dependency to make - FILE. If a rule is found, the appropriate commands and deps are put in FILE - and 1 is returned. If not, 0 is returned. - - If ARCHIVE is nonzero, FILE->name is of the form "LIB(MEMBER)". A rule for - "(MEMBER)" will be searched for, and "(MEMBER)" will not be chopped up into - directory and filename parts. - - If an intermediate file is found by pattern search, the intermediate file - is set up as a target by the recursive call and is also made a dependency - of FILE. - - DEPTH is used for debugging messages. */ - -static int -pattern_search (file, archive, depth, recursions) - struct file *file; - int archive; - unsigned int depth; - unsigned int recursions; -{ - /* Filename we are searching for a rule for. */ - char *filename = archive ? index (file->name, '(') : file->name; - - /* Length of FILENAME. */ - unsigned int namelen = strlen (filename); - - /* The last slash in FILENAME (or nil if there is none). */ - char *lastslash; - - /* This is a file-object used as an argument in - recursive calls. It never contains any data - except during a recursive call. */ - struct file *intermediate_file = 0; - - /* List of dependencies found recursively. */ - struct file **intermediate_files - = (struct file **) alloca (max_pattern_deps * sizeof (struct file *)); - - /* List of the patterns used to find intermediate files. */ - char **intermediate_patterns - = (char **) alloca (max_pattern_deps * sizeof (char *)); - - /* This buffer records all the dependencies actually found for a rule. */ - char **found_files = (char **) alloca (max_pattern_deps * sizeof (char *)); - /* Number of dep names now in FOUND_FILES. */ - unsigned int deps_found; - - /* Names of possible dependencies are constructed in this buffer. */ - register char *depname = (char *) alloca (namelen + max_pattern_dep_length); - - /* The start and length of the stem of FILENAME for the current rule. */ - register char *stem; - register unsigned int stemlen; - - /* Buffer in which we store all the rules that are possibly applicable. */ - struct rule **tryrules - = (struct rule **) alloca (num_pattern_rules * max_pattern_targets - * sizeof (struct rule *)); - - /* Number of valid elements in TRYRULES. */ - unsigned int nrules; - - /* The numbers of the rule targets of each rule - in TRYRULES that matched the target file. */ - unsigned int *matches - = (unsigned int *) alloca (num_pattern_rules * sizeof (unsigned int)); - - /* Each element is nonzero if LASTSLASH was used in - matching the corresponding element of TRYRULES. */ - char *checked_lastslash - = (char *) alloca (num_pattern_rules * sizeof (char)); - - /* The index in TRYRULES of the rule we found. */ - unsigned int foundrule; - - /* Nonzero if should consider intermediate files as dependencies. */ - int intermed_ok; - - /* Nonzero if we have matched a pattern-rule target - that is not just `%'. */ - int specific_rule_matched = 0; - - register unsigned int i; - register struct rule *rule; - register struct dep *dep; - - char *p; - -#ifndef NO_ARCHIVES - if (archive || ar_name (filename)) - lastslash = 0; - else -#endif - { - /* Set LASTSLASH to point at the last slash in FILENAME - but not counting any slash at the end. (foo/bar/ counts as - bar/ in directory foo/, not empty in directory foo/bar/.) */ - lastslash = rindex (filename, '/'); - if (lastslash != 0 && lastslash[1] == '\0') - lastslash = 0; - } - - /* First see which pattern rules match this target - and may be considered. Put them in TRYRULES. */ - - nrules = 0; - for (rule = pattern_rules; rule != 0; rule = rule->next) - { - /* If the pattern rule has deps but no commands, ignore it. - Users cancel built-in rules by redefining them without commands. */ - if (rule->deps != 0 && rule->cmds == 0) - continue; - - /* If this rule is in use by a parent pattern_search, - don't use it here. */ - if (rule->in_use) - { - DEBUGP2 ("Avoiding implicit rule recursion.%s%s\n", "", ""); - continue; - } - - for (i = 0; rule->targets[i] != 0; ++i) - { - char *target = rule->targets[i]; - char *suffix = rule->suffixes[i]; - int check_lastslash; - - /* Rules that can match any filename and are not terminal - are ignored if we're recursing, so that they cannot be - intermediate files. */ - if (recursions > 0 && target[1] == '\0' && !rule->terminal) - continue; - - if (rule->lens[i] > namelen) - /* It can't possibly match. */ - continue; - - /* From the lengths of the filename and the pattern parts, - find the stem: the part of the filename that matches the %. */ - stem = filename + (suffix - target - 1); - stemlen = namelen - rule->lens[i] + 1; - - /* Set CHECK_LASTSLASH if FILENAME contains a directory - prefix and the target pattern does not contain a slash. */ - - check_lastslash = lastslash != 0 && index (target, '/') == 0; - if (check_lastslash) - { - /* In that case, don't include the - directory prefix in STEM here. */ - unsigned int difference = lastslash - filename + 1; - if (difference > stemlen) - continue; - stemlen -= difference; - stem += difference; - } - - /* Check that the rule pattern matches the text before the stem. */ - if (check_lastslash) - { - if (stem > (lastslash + 1) - && strncmp (target, lastslash + 1, stem - lastslash - 1)) - continue; - } - else if (stem > filename - && strncmp (target, filename, stem - filename)) - continue; - - /* Check that the rule pattern matches the text after the stem. - We could test simply use streq, but this way we compare the - first two characters immediately. This saves time in the very - common case where the first character matches because it is a - period. */ - if (*suffix != stem[stemlen] - || (*suffix != '\0' && !streq (&suffix[1], &stem[(int)stemlen + 1]))) - continue; - - /* Record if we match a rule that not all filenames will match. */ - if (target[1] != '\0') - specific_rule_matched = 1; - - /* A rule with no dependencies and no commands exists solely to set - specific_rule_matched when it matches. Don't try to use it. */ - if (rule->deps == 0 && rule->cmds == 0) - continue; - - /* Record this rule in TRYRULES and the index of the matching - target in MATCHES. If several targets of the same rule match, - that rule will be in TRYRULES more than once. */ - tryrules[nrules] = rule; - matches[nrules] = i; - checked_lastslash[nrules] = check_lastslash; - ++nrules; - } - } - - /* If we have found a matching rule that won't match all filenames, - retroactively reject any non-"terminal" rules that do always match. */ - if (specific_rule_matched) - for (i = 0; i < nrules; ++i) - if (!tryrules[i]->terminal) - { - register unsigned int j; - for (j = 0; tryrules[i]->targets[j] != 0; ++j) - if (tryrules[i]->targets[j][1] == '\0') - break; - if (tryrules[i]->targets[j] != 0) - tryrules[i] = 0; - } - - /* Try each rule once without intermediate files, then once with them. */ - for (intermed_ok = 0; intermed_ok == !!intermed_ok; ++intermed_ok) - { - /* Try each pattern rule till we find one that applies. - If it does, copy the names of its dependencies (as substituted) - and store them in FOUND_FILES. DEPS_FOUND is the number of them. */ - - for (i = 0; i < nrules; i++) - { - int check_lastslash; - - rule = tryrules[i]; - - /* RULE is nil when we discover that a rule, - already placed in TRYRULES, should not be applied. */ - if (rule == 0) - continue; - - /* Reject any terminal rules if we're - looking to make intermediate files. */ - if (intermed_ok && rule->terminal) - continue; - - /* Mark this rule as in use so a recursive - pattern_search won't try to use it. */ - rule->in_use = 1; - - /* From the lengths of the filename and the matching pattern parts, - find the stem: the part of the filename that matches the %. */ - stem = filename - + (rule->suffixes[matches[i]] - rule->targets[matches[i]]) - 1; - stemlen = namelen - rule->lens[matches[i]] + 1; - check_lastslash = checked_lastslash[i]; - if (check_lastslash) - { - stem += lastslash - filename + 1; - stemlen -= (lastslash - filename) + 1; - } - - DEBUGP2 ("Trying pattern rule with stem `%.*s'.\n", - (int) stemlen, stem); - - /* Try each dependency; see if it "exists". */ - - deps_found = 0; - for (dep = rule->deps; dep != 0; dep = dep->next) - { - /* If the dependency name has a %, substitute the stem. */ - p = index (dep_name (dep), '%'); - if (p != 0) - { - register unsigned int i; - if (check_lastslash) - { - /* Copy directory name from the original FILENAME. */ - i = lastslash - filename + 1; - bcopy (filename, depname, i); - } - else - i = 0; - bcopy (dep_name (dep), depname + i, p - dep_name (dep)); - i += p - dep_name (dep); - bcopy (stem, depname + i, stemlen); - i += stemlen; - strcpy (depname + i, p + 1); - p = depname; - } - else - p = dep_name (dep); - - /* P is now the actual dependency name as substituted. */ - - if (file_impossible_p (p)) - { - /* If this dependency has already been ruled - "impossible", then the rule fails and don't - bother trying it on the second pass either - since we know that will fail too. */ - DEBUGP2 ("Rejecting impossible %s dependency `%s'.\n", - p == depname ? "implicit" : "rule", p); - tryrules[i] = 0; - break; - } - - intermediate_files[deps_found] = 0; - - DEBUGP2 ("Trying %s dependency `%s'.\n", - p == depname ? "implicit" : "rule", p); - - /* The DEP->changed flag says that this dependency resides in a - nonexistent directory. So we normally can skip looking for - the file. However, if CHECK_LASTSLASH is set, then the - dependency file we are actually looking for is in a different - directory (the one gotten by prepending FILENAME's directory), - so it might actually exist. */ - - if ((!dep->changed || check_lastslash) - && (lookup_file (p) != 0 || file_exists_p (p))) - { - found_files[deps_found++] = savestring (p, strlen (p)); - continue; - } - /* This code, given FILENAME = "lib/foo.o", dependency name - "lib/foo.c", and VPATH=src, searches for "src/lib/foo.c". */ - if (vpath_search (&p, (time_t *) 0)) - { - DEBUGP2 ("Found dependency as `%s'.%s\n", p, ""); - found_files[deps_found++] = p; - continue; - } - - /* We could not find the file in any place we should look. - Try to make this dependency as an intermediate file, - but only on the second pass. */ - - if (intermed_ok) - { - if (intermediate_file == 0) - intermediate_file - = (struct file *) alloca (sizeof (struct file)); - - DEBUGP2 ("Looking for a rule with %s file `%s'.\n", - "intermediate", p); - - bzero ((char *) intermediate_file, sizeof (struct file)); - intermediate_file->name = p; - if (pattern_search (intermediate_file, 0, depth + 1, - recursions + 1)) - { - p = savestring (p, strlen (p)); - intermediate_patterns[deps_found] - = intermediate_file->name; - intermediate_file->name = p; - intermediate_files[deps_found] = intermediate_file; - intermediate_file = 0; - /* Allocate an extra copy to go in FOUND_FILES, - because every elt of FOUND_FILES is consumed - or freed later. */ - found_files[deps_found] = savestring (p, strlen (p)); - ++deps_found; - continue; - } - - /* If we have tried to find P as an intermediate - file and failed, mark that name as impossible - so we won't go through the search again later. */ - file_impossible (p); - } - - /* A dependency of this rule does not exist. - Therefore, this rule fails. */ - break; - } - - /* This rule is no longer `in use' for recursive searches. */ - rule->in_use = 0; - - if (dep != 0) - { - /* This pattern rule does not apply. - If some of its dependencies succeeded, - free the data structure describing them. */ - while (deps_found-- > 0) - { - register struct file *f = intermediate_files[deps_found]; - free (found_files[deps_found]); - if (f != 0 - && (f->stem < f->name - || f->stem > f->name + strlen (f->name))) - free (f->stem); - } - } - else - /* This pattern rule does apply. Stop looking for one. */ - break; - } - - /* If we found an applicable rule without - intermediate files, don't try with them. */ - if (i < nrules) - break; - - rule = 0; - } - - /* RULE is nil if the loop went all the way - through the list and everything failed. */ - if (rule == 0) - return 0; - - foundrule = i; - - /* If we are recursing, store the pattern that matched - FILENAME in FILE->name for use in upper levels. */ - - if (recursions > 0) - /* Kludge-o-matic */ - file->name = rule->targets[matches[foundrule]]; - - /* FOUND_FILES lists the dependencies for the rule we found. - This includes the intermediate files, if any. - Convert them into entries on the deps-chain of FILE. */ - - while (deps_found-- > 0) - { - register char *s; - - if (intermediate_files[deps_found] != 0) - { - /* If we need to use an intermediate file, - make sure it is entered as a target, with the info that was - found for it in the recursive pattern_search call. - We know that the intermediate file did not already exist as - a target; therefore we can assume that the deps and cmds - of F below are null before we change them. */ - - struct file *imf = intermediate_files[deps_found]; - register struct file *f = enter_file (imf->name); - f->deps = imf->deps; - f->cmds = imf->cmds; - f->stem = imf->stem; - imf = lookup_file (intermediate_patterns[deps_found]); - if (imf != 0 && imf->precious) - f->precious = 1; - f->intermediate = 1; - f->tried_implicit = 1; - for (dep = f->deps; dep != 0; dep = dep->next) - { - dep->file = enter_file (dep->name); - dep->name = 0; - dep->file->tried_implicit |= dep->changed; - } - num_intermediates++; - } - - dep = (struct dep *) xmalloc (sizeof (struct dep)); - s = found_files[deps_found]; - if (recursions == 0) - { - dep->name = 0; - dep->file = lookup_file (s); - if (dep->file == 0) - /* enter_file consumes S's storage. */ - dep->file = enter_file (s); - else - /* A copy of S is already allocated in DEP->file->name. - So we can free S. */ - free (s); - } - else - { - dep->name = s; - dep->file = 0; - dep->changed = 0; - } - if (intermediate_files[deps_found] == 0 && tryrules[foundrule]->terminal) - { - /* If the file actually existed (was not an intermediate file), - and the rule that found it was a terminal one, then we want - to mark the found file so that it will not have implicit rule - search done for it. If we are not entering a `struct file' for - it now, we indicate this with the `changed' flag. */ - if (dep->file == 0) - dep->changed = 1; - else - dep->file->tried_implicit = 1; - } - dep->next = file->deps; - file->deps = dep; - } - - if (!checked_lastslash[foundrule]) - /* Always allocate new storage, since STEM might be - on the stack for an intermediate file. */ - file->stem = savestring (stem, stemlen); - else - { - /* We want to prepend the directory from - the original FILENAME onto the stem. */ - file->stem = (char *) xmalloc (((lastslash + 1) - filename) - + stemlen + 1); - bcopy (filename, file->stem, (lastslash + 1) - filename); - bcopy (stem, file->stem + ((lastslash + 1) - filename), stemlen); - file->stem[((lastslash + 1) - filename) + stemlen] = '\0'; - } - - file->cmds = rule->cmds; - - /* Put the targets other than the one that - matched into FILE's `also_make' member. */ - - /* If there was only one target, there is nothing to do. */ - if (rule->targets[1] != 0) - for (i = 0; rule->targets[i] != 0; ++i) - if (i != matches[foundrule]) - { - struct dep *new = (struct dep *) xmalloc (sizeof (struct dep)); - new->name = p = (char *) xmalloc (rule->lens[i] + stemlen + 1); - bcopy (rule->targets[i], p, - rule->suffixes[i] - rule->targets[i] - 1); - p += rule->suffixes[i] - rule->targets[i] - 1; - bcopy (stem, p, stemlen); - p += stemlen; - bcopy (rule->suffixes[i], p, - rule->lens[i] - (rule->suffixes[i] - rule->targets[i]) + 1); - new->file = enter_file (new->name); - new->next = file->also_make; - file->also_make = new; - } - - - return 1; -} diff --git a/buildtools/windows/source/make/install-sh b/buildtools/windows/source/make/install-sh deleted file mode 100644 index 89fc9b098b8..00000000000 --- a/buildtools/windows/source/make/install-sh +++ /dev/null @@ -1,238 +0,0 @@ -#! /bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5. -# -# 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. -# - - -# 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}" - -tranformbasename="" -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=: - 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/buildtools/windows/source/make/job.c b/buildtools/windows/source/make/job.c deleted file mode 100644 index 5d8cc42c6e8..00000000000 --- a/buildtools/windows/source/make/job.c +++ /dev/null @@ -1,1852 +0,0 @@ -/* Job execution and handling for GNU Make. -Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "commands.h" -#include "job.h" -#include "file.h" -#include "variable.h" -#include -#if defined(NETSCAPE) -#include "direct.h" -#include -#endif - - -/* Default shell to use. */ -#if defined(NETSCAPE) -char default_shell[] = "shmsdos"; -#else -char default_shell[] = "/bin/sh"; -#endif - -#if defined(__MSDOS__) || defined(NETSCAPE) -#include -#include -static int dos_pid = 123; -static int dos_status; -static char *dos_bname; -static char *dos_bename; -static int dos_batch_file; -#endif /* MSDOS. */ - - -/* If NGROUPS_MAX == 0 then try other methods for finding a real value. */ -#if defined (NGROUPS_MAX) && NGROUPS_MAX == 0 -#undef NGROUPS_MAX -#endif /* NGROUPS_MAX == 0 */ - -#ifndef NGROUPS_MAX -#ifdef POSIX -#define GET_NGROUPS_MAX sysconf (_SC_NGROUPS_MAX) -#else /* Not POSIX. */ -#define NGROUPS_MAX NGROUPS -#endif /* POSIX. */ -#endif - -#ifdef HAVE_SYS_WAIT_H -#include -#endif - -#ifdef HAVE_WAITPID -#define WAIT_NOHANG(status) waitpid (-1, (status), WNOHANG) -#else /* Don't have waitpid. */ -#ifdef HAVE_WAIT3 -#ifndef wait3 -extern int wait3 (); -#endif -#define WAIT_NOHANG(status) wait3 ((status), WNOHANG, (struct rusage *) 0) -#endif /* Have wait3. */ -#endif /* Have waitpid. */ - -#if !defined (wait) && !defined (POSIX) -extern int wait (); -#endif - -#ifndef HAVE_UNION_WAIT - -#define WAIT_T int - -#ifndef WTERMSIG -#define WTERMSIG(x) ((x) & 0x7f) -#endif -#ifndef WCOREDUMP -#define WCOREDUMP(x) ((x) & 0x80) -#endif -#ifndef WEXITSTATUS -#define WEXITSTATUS(x) (((x) >> 8) & 0xff) -#endif -#ifndef WIFSIGNALED -#define WIFSIGNALED(x) (WTERMSIG (x) != 0) -#endif -#ifndef WIFEXITED -#define WIFEXITED(x) (WTERMSIG (x) == 0) -#endif - -#else /* Have `union wait'. */ - -#define WAIT_T union wait -#ifndef WTERMSIG -#define WTERMSIG(x) ((x).w_termsig) -#endif -#ifndef WCOREDUMP -#define WCOREDUMP(x) ((x).w_coredump) -#endif -#ifndef WEXITSTATUS -#define WEXITSTATUS(x) ((x).w_retcode) -#endif -#ifndef WIFSIGNALED -#define WIFSIGNALED(x) (WTERMSIG(x) != 0) -#endif -#ifndef WIFEXITED -#define WIFEXITED(x) (WTERMSIG(x) == 0) -#endif - -#endif /* Don't have `union wait'. */ - - -#ifndef HAVE_UNISTD_H -extern int dup2 (); -extern int execve (); -extern void _exit (); -extern int geteuid (), getegid (); -extern int setgid (), getgid (); -#endif - -#define getdtablesize() 256 - -#ifndef getdtablesize -#ifdef HAVE_GETDTABLESIZE -extern int getdtablesize (); -#else -#ifdef HAVE_SYSCONF_OPEN_MAX -#define getdtablesize() ((int) sysconf (_SC_OPEN_MAX)) -#else -#include -#define getdtablesize() NOFILE -#if !defined (NOFILE) && defined (NOFILES_MAX) -/* SCO 3.2 "devsys 4.2" defines NOFILES_{MIN,MAX} in lieu of NOFILE. */ -#define NOFILE NOFILES_MAX -#endif -#endif -#endif -#endif - -extern int getloadavg (); -extern int start_remote_job_p (); -extern int start_remote_job (), remote_status (); - -RETSIGTYPE child_handler (); -static void free_child (), start_job_command (); -static int load_too_high (), job_next_command (); - -/* Chain of all live (or recently deceased) children. */ - -struct child *children = 0; - -/* Number of children currently running. */ - -unsigned int job_slots_used = 0; - -/* Nonzero if the `good' standard input is in use. */ - -static int good_stdin_used = 0; - -/* Chain of children waiting to run until the load average goes down. */ - -static struct child *waiting_jobs = 0; - -/* Write an error message describing the exit status given in - EXIT_CODE, EXIT_SIG, and COREDUMP, for the target TARGET_NAME. - Append "(ignored)" if IGNORED is nonzero. */ - -static void -child_error (target_name, exit_code, exit_sig, coredump, ignored) - char *target_name; - int exit_code, exit_sig, coredump; - int ignored; -{ - if (exit_sig == 0) - error (ignored ? "[%s] Error %d (ignored)" : - "*** [%s] Error %d", - target_name, exit_code); - else - error ("*** [%s] %s%s", - target_name, strsignal (exit_sig), - coredump ? " (core dumped)" : ""); -} - -static unsigned int dead_children = 0; - -/* Notice that a child died. - reap_children should be called when convenient. */ -RETSIGTYPE -child_handler (sig) - int sig; -{ - ++dead_children; - - if (debug_flag) - printf ("Got a SIGCHLD; %d unreaped children.\n", dead_children); -} - -extern int shell_function_pid, shell_function_completed; - -/* Reap dead children, storing the returned status and the new command - state (`cs_finished') in the `file' member of the `struct child' for the - dead child, and removing the child from the chain. If BLOCK nonzero, - reap at least one child, waiting for it to die if necessary. If ERR is - nonzero, print an error message first. */ - -void -reap_children (block, err) - int block, err; -{ - WAIT_T status; - - while ((children != 0 || shell_function_pid != 0) && - (block || dead_children > 0)) - { - int remote = 0; - register int pid; - int exit_code, exit_sig, coredump; - register struct child *lastc, *c; - int child_failed; - int any_remote, any_local; - - if (err && dead_children == 0) - { - /* We might block for a while, so let the user know why. */ - fflush (stdout); - error ("*** Waiting for unfinished jobs...."); - } - - /* We have one less dead child to reap. - The test and decrement are not atomic; if it is compiled into: - register = dead_children - 1; - dead_children = register; - a SIGCHLD could come between the two instructions. - child_handler increments dead_children. - The second instruction here would lose that increment. But the - only effect of dead_children being wrong is that we might wait - longer than necessary to reap a child, and lose some parallelism; - and we might print the "Waiting for unfinished jobs" message above - when not necessary. */ - - if (dead_children != 0) - --dead_children; - - any_remote = 0; - any_local = shell_function_pid != -1; - for (c = children; c != 0; c = c->next) - { - any_remote |= c->remote; - any_local |= ! c->remote; - if (debug_flag) - printf ("Live child 0x%08lx PID %d%s\n", - (unsigned long int) c, - c->pid, c->remote ? " (remote)" : ""); - } - - /* First, check for remote children. */ - if (any_remote) - pid = remote_status (&exit_code, &exit_sig, &coredump, 0); - else - pid = 0; - if (pid < 0) - { -#if !defined(__MSDOS__) && !defined(NETSCAPE) - remote_status_lose: -#endif -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - pfatal_with_name ("remote_status"); - } - else if (pid == 0) - { -#if !defined(__MSDOS__) && !defined(NETSCAPE) - /* No remote children. Check for local children. */ - - if (any_local) - { -#ifdef WAIT_NOHANG - if (!block) - pid = WAIT_NOHANG (&status); - else -#endif - pid = wait (&status); - } - else - pid = 0; - - if (pid < 0) - { -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - pfatal_with_name ("wait"); - } - else if (pid == 0) - { - /* No local children. */ - if (block && any_remote) - { - /* Now try a blocking wait for a remote child. */ - pid = remote_status (&exit_code, &exit_sig, &coredump, 1); - if (pid < 0) - goto remote_status_lose; - else if (pid == 0) - /* No remote children either. Finally give up. */ - break; - else - /* We got a remote child. */ - remote = 1; - } - else - break; - } - else - { - /* Chop the status word up. */ - exit_code = WEXITSTATUS (status); - exit_sig = WIFSIGNALED (status) ? WTERMSIG (status) : 0; - coredump = WCOREDUMP (status); - } -#else /* MSDOS. */ - /* Life is very different on MSDOS. */ - pid = dos_pid - 1; - status = dos_status; - exit_code = dos_status; - exit_sig = 0; - coredump = 0; -#endif /* Not MSDOS. */ - } - else - /* We got a remote child. */ - remote = 1; - - /* Check if this is the child of the `shell' function. */ - if (!remote && pid == shell_function_pid) - { - /* It is. Leave an indicator for the `shell' function. */ - if (exit_sig == 0 && exit_code == 127) - shell_function_completed = -1; - else - shell_function_completed = 1; - break; - } - - child_failed = exit_sig != 0 || exit_code != 0; - - /* Search for a child matching the deceased one. */ - lastc = 0; - for (c = children; c != 0; lastc = c, c = c->next) - if ((int)c->remote == remote && (int)c->pid == pid) - break; - - if (c == 0) - { - /* An unknown child died. */ - char buf[100]; - sprintf (buf, "Unknown%s job %d", remote ? " remote" : "", pid); - if (child_failed) - child_error (buf, exit_code, exit_sig, coredump, - ignore_errors_flag); - else - error ("%s finished.", buf); - } - else - { - if (debug_flag) - printf ("Reaping %s child 0x%08lx PID %d%s\n", - child_failed ? "losing" : "winning", - (unsigned long int) c, - c->pid, c->remote ? " (remote)" : ""); - - /* If this child had the good stdin, say it is now free. */ - if (c->good_stdin) - good_stdin_used = 0; - - if (child_failed && !c->noerror && !ignore_errors_flag) - { - /* The commands failed. Write an error message, - delete non-precious targets, and abort. */ - static int delete_on_error = -1; - child_error (c->file->name, exit_code, exit_sig, coredump, 0); - c->file->update_status = 2; - if (delete_on_error == -1) - { - struct file *f = lookup_file (".DELETE_ON_ERROR"); - delete_on_error = f != 0 && f->is_target; - } - if (exit_sig != 0 || delete_on_error) - delete_child_targets (c); - } - else - { - if (child_failed) - { - /* The commands failed, but we don't care. */ - child_error (c->file->name, - exit_code, exit_sig, coredump, 1); - child_failed = 0; - } - - /* If there are more commands to run, try to start them. */ - if (job_next_command (c)) - { - if (handling_fatal_signal) - { - /* Never start new commands while we are dying. - Since there are more commands that wanted to be run, - the target was not completely remade. So we treat - this as if a command had failed. */ - c->file->update_status = 2; - } - else - { - /* Check again whether to start remotely. - Whether or not we want to changes over time. - Also, start_remote_job may need state set up - by start_remote_job_p. */ - c->remote = start_remote_job_p (); - start_job_command (c); - if (c->file->command_state == cs_running) - /* We successfully started the new command. - Loop to reap more children. */ - continue; - } - - if (c->file->update_status != 0) - /* We failed to start the commands. */ - delete_child_targets (c); - } - else - /* There are no more commands. We got through them all - without an unignored error. Now the target has been - successfully updated. */ - c->file->update_status = 0; - } - - /* When we get here, all the commands for C->file are finished - (or aborted) and C->file->update_status contains 0 or 2. But - C->file->command_state is still cs_running if all the commands - ran; notice_finish_file looks for cs_running to tell it that - it's interesting to check the file's modtime again now. */ - - if (! handling_fatal_signal) - /* Notice if the target of the commands has been changed. - This also propagates its values for command_state and - update_status to its also_make files. */ - notice_finished_file (c->file); - - if (debug_flag) - printf ("Removing child 0x%08lx PID %d%s from chain.\n", - (unsigned long int) c, - c->pid, c->remote ? " (remote)" : ""); - - /* Remove the child from the chain and free it. */ - if (lastc == 0) - children = c->next; - else - lastc->next = c->next; - if (! handling_fatal_signal) /* Avoid nonreentrancy. */ - free_child (c); - - /* There is now another slot open. */ - --job_slots_used; - - /* If the job failed, and the -k flag was not given, die, - unless we are already in the process of dying. */ - if (!err && child_failed && !keep_going_flag) - die (2); - } - - /* Only block for one child. */ - block = 0; - } -} - -/* Free the storage allocated for CHILD. */ - -static void -free_child (child) - register struct child *child; -{ - if (child->command_lines != 0) - { - register unsigned int i; - for (i = 0; i < child->file->cmds->ncommand_lines; ++i) - free (child->command_lines[i]); - free ((char *) child->command_lines); - } - - if (child->environment != 0) - { - register char **ep = child->environment; - while (*ep != 0) - free (*ep++); - free ((char *) child->environment); - } - - free ((char *) child); -} - -#if defined(POSIX) -#if defined(__MSDOS__) -void -unblock_sigs (void) -{ - return; -} -#else -extern sigset_t fatal_signal_set; - -void -unblock_sigs () -{ - sigset_t empty; - sigemptyset (&empty); - sigprocmask (SIG_SETMASK, &empty, (sigset_t *) 0); -} -#endif -#endif - -#ifdef NETSCAPE -/* - * The various spawn functions in Microsoft's runtime library - * may fail if the Path environment variable contains nonexistent - * directories. The spawn functions expect to get ENOENT in - * this situation, but on some Compaq PCs I've seen EACCES - * ("Permission denied") being returned. So I wrote our own - * process-spawning function ns_spawn(). My code is inspired - * by Microsoft's implementation of spawnvpe(). - */ - -/* - * Assemble the command line by concatenating the argv array. - * On success, this function returns 0 and the resulting command - * line is returned in *cmdLine. On failure, it returns -1. - */ -static int assembleCmdLine(char **argv, char **cmdLine) -{ - char **arg; - char *p, *q; - int cmdLineSize; - int numBackslashes; - int i; - int argNeedQuotes; - - /* - * Find out how large the command line buffer should be. - */ - cmdLineSize = 0; - for (arg = argv; *arg; arg++) { - /* - * \ and " need to be escaped by a \. In the worst case, - * every character is a \ or ", so the string of length - * may double. If we quote an argument, that needs two ". - * Finally, we need a space between arguments, and - * a null byte at the end of command line. - */ - cmdLineSize += 2 * strlen(*arg) /* \ and " need to be escaped */ - + 2 /* we quote every argument */ - + 1; /* space in between, or final null */ - } - p = *cmdLine = malloc(cmdLineSize); - if (p == NULL) { - return -1; - } - - for (arg = argv; *arg; arg++) { - /* Add a space to separates the arguments */ - if (arg != argv) { - *p++ = ' '; - } - q = *arg; - numBackslashes = 0; - argNeedQuotes = 0; - - /* If the argument contains white space, it needs to be quoted. */ - if (strpbrk(*arg, " \f\n\r\t\v")) { - argNeedQuotes = 1; - } - - if (argNeedQuotes) { - *p++ = '"'; - } - while (*q) { - if (*q == '\\') { - numBackslashes++; - q++; - } else if (*q == '"') { - if (numBackslashes) { - /* - * Double the backslashes since they are followed - * by a quote - */ - for (i = 0; i < 2 * numBackslashes; i++) { - *p++ = '\\'; - } - numBackslashes = 0; - } - /* To escape the quote */ - *p++ = '\\'; - *p++ = *q++; - } else { - if (numBackslashes) { - /* - * Backslashes are not followed by a quote, so - * don't need to double the backslashes. - */ - for (i = 0; i < numBackslashes; i++) { - *p++ = '\\'; - } - numBackslashes = 0; - } - *p++ = *q++; - } - } - - /* Now we are at the end of this argument */ - if (numBackslashes) { - /* - * Double the backslashes if we have a quote string - * delimiter at the end. - */ - if (argNeedQuotes) { - numBackslashes *= 2; - } - for (i = 0; i < numBackslashes; i++) { - *p++ = '\\'; - } - } - if (argNeedQuotes) { - *p++ = '"'; - } - } - - *p = '\0'; - return 0; -} - -/* - * Assemble the environment block by concatenating the envp array - * (preserving the terminating null byte in each array element) - * and adding a null byte at the end. - * - * Returns 0 on success. The resulting environment block is returned - * in *envBlock. Note that if envp is NULL, a NULL pointer is returned - * in *envBlock. Returns -1 on failure. - */ -static int assembleEnvBlock(char **envp, char **envBlock) -{ - char *p; - char *q; - char **env; - char *curEnv; - char *cwdStart, *cwdEnd; - int envBlockSize; - - if (envp == NULL) { - *envBlock = NULL; - return 0; - } - - curEnv = GetEnvironmentStrings(); - - cwdStart = curEnv; - while (*cwdStart) { - if (cwdStart[0] == '=' && cwdStart[1] != '\0' - && cwdStart[2] == ':' && cwdStart[3] == '=') { - break; - } - cwdStart += strlen(cwdStart) + 1; - } - cwdEnd = cwdStart; - if (*cwdEnd) { - cwdEnd += strlen(cwdEnd) + 1; - while (*cwdEnd) { - if (cwdEnd[0] != '=' || cwdEnd[1] == '\0' - || cwdEnd[2] != ':' || cwdEnd[3] != '=') { - break; - } - cwdEnd += strlen(cwdEnd) + 1; - } - } - envBlockSize = cwdEnd - cwdStart; - - for (env = envp; *env; env++) { - envBlockSize += strlen(*env) + 1; - } - envBlockSize++; - - p = *envBlock = malloc(envBlockSize); - if (p == NULL) { - FreeEnvironmentStrings(curEnv); - return -1; - } - - q = cwdStart; - while (q < cwdEnd) { - *p++ = *q++; - } - FreeEnvironmentStrings(curEnv); - - for (env = envp; *env; env++) { - q = *env; - while (*q) { - *p++ = *q++; - } - *p++ = '\0'; - } - *p = '\0'; - return 0; -} - -/* - * For qsort. We sort (case-insensitive) the environment strings - * before generating the environment block. - */ -static int compare(const void *arg1, const void *arg2) -{ - return _stricmp(* (char**)arg1, * (char**)arg2); -} - -/* - * Spawn a new process with arguments argv and environment envp, - * wait until it terminates, and return its exit code in *exitCode. - * Return 0 on success. Return -1 on error. Call GetLastError() - * (note: not errno) to get the error code. - */ -int ns_spawn(char **argv, char **envp, int *exitCode) -{ - char *p; - char *cmdLine; - char *envBlock; - char **newEnvp; - BOOL rv; - STARTUPINFO si; - PROCESS_INFORMATION pi; - - /* - * Before invoking the command, change forward slashes - * in argv[0] to backslashes. - */ - for (p = argv[0]; *p; p++) { - if (*p == '/') { - *p = '\\'; - } - } - - if (assembleCmdLine(argv, &cmdLine) == -1) { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return -1; - } - - if (envp == NULL) { - newEnvp = NULL; - } else { - int i; - int numEnv = 0; - while (envp[numEnv]) { - numEnv++; - } - newEnvp = (char **) malloc((numEnv+1) * sizeof(char *)); - for (i = 0; i <= numEnv; i++) { - newEnvp[i] = envp[i]; - } - qsort((void *) newEnvp, (size_t) numEnv, sizeof(char *), compare); - } - if (assembleEnvBlock(newEnvp, &envBlock) == -1) { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - free(cmdLine); - return -1; - } - - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - - rv = CreateProcess( - NULL, - cmdLine, - NULL, - NULL, - TRUE, - 0, - envBlock, - NULL, - &si, - &pi); - free(cmdLine); - free(envBlock); - if (!rv) { - return -1; - } - CloseHandle(pi.hThread); - WaitForSingleObject(pi.hProcess, INFINITE); - if (exitCode) { - GetExitCodeProcess(pi.hProcess, exitCode); - } - CloseHandle(pi.hProcess); - return 0; -} -#endif /* NETSCAPE */ - -/* Start a job to run the commands specified in CHILD. - CHILD is updated to reflect the commands and ID of the child process. */ - -static void -start_job_command (child) - register struct child *child; -{ -#ifndef NETSCAPE - static int bad_stdin = -1; -#endif - register char *p; - int flags; - char **argv; - - /* Combine the flags parsed for the line itself with - the flags specified globally for this target. */ - flags = (child->file->command_flags - | child->file->cmds->lines_flags[child->command_line - 1]); - - p = child->command_ptr; - child->noerror = flags & COMMANDS_NOERROR; - while (*p != '\0') - { - if (*p == '@') - flags |= COMMANDS_SILENT; - else if (*p == '+') - flags |= COMMANDS_RECURSE; - else if (*p == '-') - child->noerror = 1; - else if (!isblank (*p) && *p != '+') - break; - ++p; - } - - /* If -q was given, just say that updating `failed'. The exit status of - 1 tells the user that -q is saying `something to do'; the exit status - for a random error is 2. */ - if (question_flag && !(flags & COMMANDS_RECURSE)) - { - child->file->update_status = 1; - notice_finished_file (child->file); - return; - } - - /* There may be some preceding whitespace left if there - was nothing but a backslash on the first line. */ - p = next_token (p); - - /* Figure out an argument list from this command line. */ - - { - char *end; - argv = construct_command_argv (p, &end, child->file); - if (end == NULL) - child->command_ptr = NULL; - else - { - *end++ = '\0'; - child->command_ptr = end; - } - } - - if (touch_flag && !(flags & COMMANDS_RECURSE)) - { - /* Go on to the next command. It might be the recursive one. - We construct ARGV only to find the end of the command line. */ - free (argv[0]); - free ((char *) argv); - argv = 0; - } - - if (argv == 0) - { - next_command: - /* This line has no commands. Go to the next. */ - if (job_next_command (child)) - start_job_command (child); - else - { - /* No more commands. All done. */ - child->file->update_status = 0; - notice_finished_file (child->file); - } - return; - } - - /* Print out the command. */ - - if (just_print_flag || (!(flags & COMMANDS_SILENT) && !silent_flag)) - puts (p); - - /* Tell update_goal_chain that a command has been started on behalf of - this target. It is important that this happens here and not in - reap_children (where we used to do it), because reap_children might be - reaping children from a different target. We want this increment to - guaranteedly indicate that a command was started for the dependency - chain (i.e., update_file recursion chain) we are processing. */ - - ++commands_started; - - /* If -n was given, recurse to get the next line in the sequence. */ - - if (just_print_flag && !(flags & COMMANDS_RECURSE)) - { - free (argv[0]); - free ((char *) argv); - goto next_command; - } - - /* Flush the output streams so they won't have things written twice. */ - - fflush (stdout); - fflush (stderr); - -#ifndef NETSCAPE - /* Set up a bad standard input that reads from a broken pipe. */ - - if (bad_stdin == -1) - { - /* Make a file descriptor that is the read end of a broken pipe. - This will be used for some children's standard inputs. */ - int pd[2]; - if (pipe (pd) == 0) - { - /* Close the write side. */ - (void) close (pd[1]); - /* Save the read side. */ - bad_stdin = pd[0]; - } - } -#endif - - /* Decide whether to give this child the `good' standard input - (one that points to the terminal or whatever), or the `bad' one - that points to the read side of a broken pipe. */ - - child->good_stdin = !good_stdin_used; - if (child->good_stdin) - good_stdin_used = 1; - - child->deleted = 0; - - /* Set up the environment for the child. */ - if (child->environment == 0) - child->environment = target_environment (child->file); - -#if !defined(__MSDOS__) && !defined(NETSCAPE) - - /* start_waiting_job has set CHILD->remote if we can start a remote job. */ - if (child->remote) - { - int is_remote, id, used_stdin; - if (start_remote_job (argv, child->environment, - child->good_stdin ? 0 : bad_stdin, - &is_remote, &id, &used_stdin)) - goto error; - else - { - if (child->good_stdin && !used_stdin) - { - child->good_stdin = 0; - good_stdin_used = 0; - } - child->remote = is_remote; - child->pid = id; - } - } - else - { - /* Fork the child process. */ - - char **parent_environ; - -#ifdef POSIX - (void) sigprocmask (SIG_BLOCK, &fatal_signal_set, (sigset_t *) 0); -#else -#ifdef HAVE_SIGSETMASK - (void) sigblock (fatal_signal_mask); -#endif -#endif - - child->remote = 0; - parent_environ = environ; - child->pid = vfork (); - environ = parent_environ; /* Restore value child may have clobbered. */ - if (child->pid == 0) - { - /* We are the child side. */ - unblock_sigs (); - child_execute_job (child->good_stdin ? 0 : bad_stdin, 1, - argv, child->environment); - } - else if (child->pid < 0) - { - /* Fork failed! */ - unblock_sigs (); - perror_with_name ("vfork", ""); - goto error; - } - } - -#else /* MSDOS. */ -#ifdef NETSCAPE - if (ns_spawn (argv, child->environment, &dos_status) == -1) - { - char errMsg[128]; - FormatMessage ( - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError (), - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* default language */ - errMsg, - sizeof (errMsg), - NULL - ); - error ("%s: %s", argv[0], errMsg); - dos_status = -1; - } -#else - dos_status = spawnvpe (P_WAIT, argv[0], argv, child->environment); -#endif - ++dead_children; - child->pid = dos_pid++; - if (dos_batch_file) - { - dos_batch_file = 0; - remove (dos_bname); /* Ignore errors. */ - if (access (dos_bename, 0)) - dos_status = 1; - else - dos_status = 0; - remove (dos_bename); - } -#endif /* Not MSDOS. */ - - /* We are the parent side. Set the state to - say the commands are running and return. */ - - set_command_state (child->file, cs_running); - - /* Free the storage used by the child's argument list. */ - - free (argv[0]); - free ((char *) argv); - - return; - -#if !defined(__MSDOS__) && !defined(NETSCAPE) - error: - child->file->update_status = 2; - notice_finished_file (child->file); -#endif -} - -/* Try to start a child running. - Returns nonzero if the child was started (and maybe finished), or zero if - the load was too high and the child was put on the `waiting_jobs' chain. */ - -static int -start_waiting_job (c) - struct child *c; -{ - /* If we can start a job remotely, we always want to, and don't care about - the local load average. We record that the job should be started - remotely in C->remote for start_job_command to test. */ - - c->remote = start_remote_job_p (); - - /* If this job is to be started locally, and we are already running - some jobs, make this one wait if the load average is too high. */ - if (!c->remote && job_slots_used > 0 && load_too_high ()) - { - /* Put this child on the chain of children waiting - for the load average to go down. */ - set_command_state (c->file, cs_running); - c->next = waiting_jobs; - waiting_jobs = c; - return 0; - } - - /* Start the first command; reap_children will run later command lines. */ - start_job_command (c); - - switch (c->file->command_state) - { - case cs_running: - c->next = children; - if (debug_flag) - printf ("Putting child 0x%08lx PID %05d%s on the chain.\n", - (unsigned long int) c, - c->pid, c->remote ? " (remote)" : ""); - children = c; - /* One more job slot is in use. */ - ++job_slots_used; - unblock_sigs (); - break; - - case cs_not_started: - /* All the command lines turned out to be empty. */ - c->file->update_status = 0; - /* FALLTHROUGH */ - - case cs_finished: - notice_finished_file (c->file); - free_child (c); - break; - - default: - assert (c->file->command_state == cs_finished); - break; - } - - return 1; -} - -/* Create a `struct child' for FILE and start its commands running. */ - -void -new_job (file) - register struct file *file; -{ - register struct commands *cmds = file->cmds; - register struct child *c; - char **lines; - register unsigned int i; - - /* Let any previously decided-upon jobs that are waiting - for the load to go down start before this new one. */ - start_waiting_jobs (); - - /* Reap any children that might have finished recently. */ - reap_children (0, 0); - - /* Chop the commands up into lines if they aren't already. */ - chop_commands (cmds); - - if (job_slots != 0) - /* Wait for a job slot to be freed up. */ - while (job_slots_used == job_slots) - reap_children (1, 0); - - /* Expand the command lines and store the results in LINES. */ - lines = (char **) xmalloc (cmds->ncommand_lines * sizeof (char *)); - for (i = 0; i < cmds->ncommand_lines; ++i) - { - /* Collapse backslash-newline combinations that are inside variable - or function references. These are left alone by the parser so - that they will appear in the echoing of commands (where they look - nice); and collapsed by construct_command_argv when it tokenizes. - But letting them survive inside function invocations loses because - we don't want the functions to see them as part of the text. */ - - char *in, *out, *ref; - - /* IN points to where in the line we are scanning. - OUT points to where in the line we are writing. - When we collapse a backslash-newline combination, - IN gets ahead out OUT. */ - - in = out = cmds->command_lines[i]; - while ((ref = index (in, '$')) != 0) - { - ++ref; /* Move past the $. */ - - if (out != in) - /* Copy the text between the end of the last chunk - we processed (where IN points) and the new chunk - we are about to process (where REF points). */ - bcopy (in, out, ref - in); - - /* Move both pointers past the boring stuff. */ - out += ref - in; - in = ref; - - if (*ref == '(' || *ref == '{') - { - char openparen = *ref; - char closeparen = openparen == '(' ? ')' : '}'; - int count; - char *p; - - *out++ = *in++; /* Copy OPENPAREN. */ - /* IN now points past the opening paren or brace. - Count parens or braces until it is matched. */ - count = 0; - while (*in != '\0') - { - if (*in == closeparen && --count < 0) - break; - else if (*in == '\\' && in[1] == '\n') - { - /* We have found a backslash-newline inside a - variable or function reference. Eat it and - any following whitespace. */ - - int quoted = 0; - for (p = in - 1; p > ref && *p == '\\'; --p) - quoted = !quoted; - - if (quoted) - /* There were two or more backslashes, so this is - not really a continuation line. We don't collapse - the quoting backslashes here as is done in - collapse_continuations, because the line will - be collapsed again after expansion. */ - *out++ = *in++; - else - { - /* Skip the backslash, newline and - any following whitespace. */ - in = next_token (in + 2); - - /* Discard any preceding whitespace that has - already been written to the output. */ - while (out > ref && isblank (out[-1])) - --out; - - /* Replace it all with a single space. */ - *out++ = ' '; - } - } - else - { - if (*in == openparen) - ++count; - - *out++ = *in++; - } - } - } - } - - /* There are no more references in this line to worry about. - Copy the remaining uninteresting text to the output. */ - if (out != in) - strcpy (out, in); - - /* Finally, expand the line. */ - lines[i] = allocated_variable_expand_for_file (cmds->command_lines[i], - file); - } - - /* Start the command sequence, record it in a new - `struct child', and add that to the chain. */ - - c = (struct child *) xmalloc (sizeof (struct child)); - c->file = file; - c->command_lines = lines; - c->command_line = 0; - c->command_ptr = 0; - c->environment = 0; - - /* Fetch the first command line to be run. */ - job_next_command (c); - - /* The job is now primed. Start it running. - (This will notice if there are in fact no commands.) */ - start_waiting_job (c); - - if (job_slots == 1) - /* Since there is only one job slot, make things run linearly. - Wait for the child to die, setting the state to `cs_finished'. */ - while (file->command_state == cs_running) - reap_children (1, 0); -} - -/* Move CHILD's pointers to the next command for it to execute. - Returns nonzero if there is another command. */ - -static int -job_next_command (child) - struct child *child; -{ - while (child->command_ptr == 0 || *child->command_ptr == '\0') - { - /* There are no more lines in the expansion of this line. */ - if (child->command_line == child->file->cmds->ncommand_lines) - { - /* There are no more lines to be expanded. */ - child->command_ptr = 0; - return 0; - } - else - /* Get the next line to run. */ - child->command_ptr = child->command_lines[child->command_line++]; - } - return 1; -} - -static int -load_too_high () -{ -#ifdef __MSDOS__ - return 1; -#else - extern int getloadavg (); - double load; - - if (max_load_average < 0) - return 0; - - make_access (); - if (getloadavg (&load, 1) != 1) - { - static int lossage = -1; - /* Complain only once for the same error. */ - if (lossage == -1 || errno != lossage) - { - if (errno == 0) - /* An errno value of zero means getloadavg is just unsupported. */ - error ("cannot enforce load limits on this operating system"); - else - perror_with_name ("cannot enforce load limit: ", "getloadavg"); - } - lossage = errno; - load = 0; - } - user_access (); - - return load >= max_load_average; -#endif -} - -/* Start jobs that are waiting for the load to be lower. */ - -void -start_waiting_jobs () -{ - struct child *job; - - if (waiting_jobs == 0) - return; - - do - { - /* Check for recently deceased descendants. */ - reap_children (0, 0); - - /* Take a job off the waiting list. */ - job = waiting_jobs; - waiting_jobs = job->next; - - /* Try to start that job. We break out of the loop as soon - as start_waiting_job puts one back on the waiting list. */ - } while (start_waiting_job (job) && waiting_jobs != 0); -} - -/* Replace the current process with one executing the command in ARGV. - STDIN_FD and STDOUT_FD are used as the process's stdin and stdout; ENVP is - the environment of the new program. This function does not return. */ - -void -child_execute_job (stdin_fd, stdout_fd, argv, envp) - int stdin_fd, stdout_fd; - char **argv, **envp; -{ - if (stdin_fd != 0) - (void) dup2 (stdin_fd, 0); - if (stdout_fd != 1) - (void) dup2 (stdout_fd, 1); - - /* Free up file descriptors. */ - { - register int d; - int max = getdtablesize (); - for (d = 3; d < max; ++d) - (void) close (d); - } - - /* Run the command. */ - exec_command (argv, envp); -} - -/* Replace the current process with one running the command in ARGV, - with environment ENVP. This function does not return. */ - -void -exec_command (argv, envp) - char **argv, **envp; -{ - /* Be the user, permanently. */ - child_access (); - - /* Run the program. */ - environ = envp; - execvp (argv[0], argv); - - switch (errno) - { - case ENOENT: - error ("%s: Command not found", argv[0]); - break; - case ENOEXEC: - { - /* The file is not executable. Try it as a shell script. */ - extern char *getenv (); - char *shell; - char **new_argv; - int argc; - - shell = getenv ("SHELL"); - if (shell == 0) - shell = default_shell; - - argc = 1; - while (argv[argc] != 0) - ++argc; - - new_argv = (char **) alloca ((1 + argc + 1) * sizeof (char *)); - new_argv[0] = shell; - new_argv[1] = program; - while (argc > 0) - { - new_argv[1 + argc] = argv[argc]; - --argc; - } - - execvp (shell, new_argv); - if (errno == ENOENT) - error ("%s: Shell program not found", shell); - else - perror_with_name ("execvp: ", shell); - break; - } - - default: - perror_with_name ("execvp: ", argv[0]); - break; - } - - _exit (127); -} - -/* Figure out the argument list necessary to run LINE as a command. Try to - avoid using a shell. This routine handles only ' quoting, and " quoting - when no backslash, $ or ` characters are seen in the quotes. Starting - quotes may be escaped with a backslash. If any of the characters in - sh_chars[] is seen, or any of the builtin commands listed in sh_cmds[] - is the first word of a line, the shell is used. - - If RESTP is not NULL, *RESTP is set to point to the first newline in LINE. - If *RESTP is NULL, newlines will be ignored. - - SHELL is the shell to use, or nil to use the default shell. - IFS is the value of $IFS, or nil (meaning the default). */ - -#ifdef __MSDOS__ - static char sh_chars[] = "\"|<>"; - static char *sh_cmds[] = { "break", "call", "cd", "chcp", "chdir", "cls", - "copy", "ctty", "date", "del", "dir", "echo", - "erase", "exit", "for", "goto", "if", "if", "md", - "mkdir", "path", "pause", "prompt", "rem", "ren", - "rename", "set", "shift", "time", "type", - "ver", "verify", "vol", ":", 0 }; -#elif defined(NETSCAPE) - static char sh_chars[] = "#;\"*?[]&|<>(){}$`^"; - static char *sh_cmds[] = { "cd", "eval", "exec", "exit", "login", - "logout", "set", "umask", "wait", "while", "for", - "case", "if", ":", ".", "break", "continue", - "export", "read", "readonly", "shift", "times", - "trap", "switch", "mkdir", "echo", "cp", "rm", - "touch", "nsinstall", "test", "mv", 0 }; -#else - static char sh_chars[] = "#;\"*?[]&|<>(){}$`^"; - static char *sh_cmds[] = { "cd", "eval", "exec", "exit", "login", - "logout", "set", "umask", "wait", "while", "for", - "case", "if", ":", ".", "break", "continue", - "export", "read", "readonly", "shift", "times", - "trap", "switch", 0 }; -#endif - -static char ** -construct_command_argv_internal (line, restp, shell, ifs) - char *line, **restp; - char *shell, *ifs; -{ - register int i; - register char *p; - register char *ap; - char *end; - int instring, word_has_equals, seen_nonequals; - char **new_argv = 0; - - if (restp != NULL) - *restp = NULL; - - /* Make sure not to bother processing an empty line. */ - while (isblank (*line)) - ++line; - if (*line == '\0') - return 0; - - /* See if it is safe to parse commands internally. */ - if (shell == 0) - shell = default_shell; - else if (strcmp (shell, default_shell)) - goto slow; - - if (ifs != 0) - for (ap = ifs; *ap != '\0'; ++ap) - if (*ap != ' ' && *ap != '\t' && *ap != '\n') - goto slow; - - i = strlen (line) + 1; - - /* More than 1 arg per character is impossible. */ - new_argv = (char **) xmalloc (i * sizeof (char *)); - - /* All the args can fit in a buffer as big as LINE is. */ - ap = new_argv[0] = (char *) xmalloc (i); - end = ap + i; - - /* I is how many complete arguments have been found. */ - i = 0; - instring = word_has_equals = seen_nonequals = 0; - for (p = line; *p != '\0'; ++p) - { - if (ap > end) - abort (); - - if (instring) - { - string_char: - /* Inside a string, just copy any char except a closing quote - or a backslash-newline combination. */ - if (*p == instring) - instring = 0; - else if (*p == '\\' && p[1] == '\n') - goto swallow_escaped_newline; - else if (*p == '\n' && restp != NULL) - { - /* End of the command line. */ - *restp = p; - goto end_of_line; - } - /* Backslash, $, and ` are special inside double quotes. - If we see any of those, punt. */ - else if (instring == '"' && index ("\\$`", *p) != 0) - goto slow; - else - *ap++ = *p; - } - else if (index (sh_chars, *p) != 0) - /* Not inside a string, but it's a special char. */ - goto slow; - else - /* Not a special char. */ - switch (*p) - { - case '=': - /* Equals is a special character in leading words before the - first word with no equals sign in it. This is not the case - with sh -k, but we never get here when using nonstandard - shell flags. */ - if (! seen_nonequals) - goto slow; - word_has_equals = 1; - *ap++ = '='; - break; - - case '\\': - /* Backslash-newline combinations are eaten. */ - if (p[1] == '\n') - { - swallow_escaped_newline: - - /* Eat the backslash, the newline, and following whitespace, - replacing it all with a single space. */ - p += 2; - - /* If there is a tab after a backslash-newline, - remove it from the source line which will be echoed, - since it was most likely used to line - up the continued line with the previous one. */ - if (*p == '\t') - strcpy (p, p + 1); - - if (instring) - goto string_char; - else - { - if (ap != new_argv[i]) - /* Treat this as a space, ending the arg. - But if it's at the beginning of the arg, it should - just get eaten, rather than becoming an empty arg. */ - goto end_of_arg; - else - p = next_token (p) - 1; - } - } - else if (p[1] != '\0') - /* Copy and skip the following char. */ - *ap++ = *++p; - break; - - case '\'': - case '"': - instring = *p; - break; - - case '\n': - if (restp != NULL) - { - /* End of the command line. */ - *restp = p; - goto end_of_line; - } - else - /* Newlines are not special. */ - *ap++ = '\n'; - break; - - case ' ': - case '\t': - end_of_arg: - /* We have the end of an argument. - Terminate the text of the argument. */ - *ap++ = '\0'; - new_argv[++i] = ap; - - /* Update SEEN_NONEQUALS, which tells us if every word - heretofore has contained an `='. */ - seen_nonequals |= ! word_has_equals; - if (word_has_equals && ! seen_nonequals) - /* An `=' in a word before the first - word without one is magical. */ - goto slow; - word_has_equals = 0; /* Prepare for the next word. */ - - /* If this argument is the command name, - see if it is a built-in shell command. - If so, have the shell handle it. */ - if (i == 1) - { - register int j; - for (j = 0; sh_cmds[j] != 0; ++j) - if (streq (sh_cmds[j], new_argv[0])) - goto slow; - } - - /* Ignore multiple whitespace chars. */ - p = next_token (p); - /* Next iteration should examine the first nonwhite char. */ - --p; - break; - - default: - *ap++ = *p; - break; - } - } - end_of_line: - - if (instring) - /* Let the shell deal with an unterminated quote. */ - goto slow; - - /* Terminate the last argument and the argument list. */ - - *ap = '\0'; - if (new_argv[i][0] != '\0') - ++i; - new_argv[i] = 0; - - if (i == 1) - { - register int j; - for (j = 0; sh_cmds[j] != 0; ++j) - if (streq (sh_cmds[j], new_argv[0])) - goto slow; - } - - if (new_argv[0] == 0) - /* Line was empty. */ - return 0; - else - return new_argv; - - slow:; -// return new_argv; - - /* We must use the shell. */ - - if (new_argv != 0) - { - /* Free the old argument list we were working on. */ - free (new_argv[0]); - free (new_argv); - } - -#if defined(__MSDOS__) - { - FILE *batch; - dos_batch_file = 1; - if (dos_bname == 0) - { - dos_bname = tempnam (".", "mk"); - for (i = 0; dos_bname[i] != '\0'; ++i) - if (dos_bname[i] == '/') - dos_bname[i] = '\\'; - dos_bename = (char *) xmalloc (strlen (dos_bname) + 5); - strcpy (dos_bename, dos_bname); - strcat (dos_bname, ".bat"); - strcat (dos_bename, ".err"); - } - batch = fopen (dos_bename, "w"); /* Create a file. */ - if (batch != NULL) - fclose (batch); - batch = fopen (dos_bname, "w"); - fputs ("@echo off\n", batch); - fputs (line, batch); - fprintf (batch, "\nif errorlevel 1 del %s\n", dos_bename); - fclose (batch); - new_argv = (char **) xmalloc(2 * sizeof(char *)); - new_argv[0] = strdup (dos_bname); - new_argv[1] = 0; - } -#else /* Not MSDOS. */ - { - /* SHELL may be a multi-word command. Construct a command line - "SHELL -c LINE", with all special chars in LINE escaped. - Then recurse, expanding this command line to get the final - argument list. */ - - unsigned int shell_len = strlen (shell); - static char minus_c[] = " -c "; - unsigned int line_len = strlen (line); - - char *new_line = (char *) alloca (shell_len + (sizeof (minus_c) - 1) - + (line_len * 2) + 1); - - ap = new_line; - bcopy (shell, ap, shell_len); - ap += shell_len; - bcopy (minus_c, ap, sizeof (minus_c) - 1); - ap += sizeof (minus_c) - 1; - for (p = line; *p != '\0'; ++p) - { - if (restp != NULL && *p == '\n') - { - *restp = p; - break; - } - else if (*p == '\\' && p[1] == '\n') - { - /* Eat the backslash, the newline, and following whitespace, - replacing it all with a single space (which is escaped - from the shell). */ - p += 2; - - /* If there is a tab after a backslash-newline, - remove it from the source line which will be echoed, - since it was most likely used to line - up the continued line with the previous one. */ - if (*p == '\t') - strcpy (p, p + 1); - - p = next_token (p); - --p; - *ap++ = '\\'; - *ap++ = ' '; - continue; - } - - if (*p == '\\' || *p == '\'' || *p == '"' - || isspace (*p) - || index (sh_chars, *p) != 0) - *ap++ = '\\'; - *ap++ = *p; - } - *ap = '\0'; - - new_argv = construct_command_argv_internal (new_line, (char **) NULL, - (char *) 0, (char *) 0); - } -#endif /* MSDOS. */ - - return new_argv; -} - -/* Figure out the argument list necessary to run LINE as a command. Try to - avoid using a shell. This routine handles only ' quoting, and " quoting - when no backslash, $ or ` characters are seen in the quotes. Starting - quotes may be escaped with a backslash. If any of the characters in - sh_chars[] is seen, or any of the builtin commands listed in sh_cmds[] - is the first word of a line, the shell is used. - - If RESTP is not NULL, *RESTP is set to point to the first newline in LINE. - If *RESTP is NULL, newlines will be ignored. - - FILE is the target whose commands these are. It is used for - variable expansion for $(SHELL) and $(IFS). */ - -char ** -construct_command_argv (line, restp, file) - char *line, **restp; - struct file *file; -{ - char *shell, *ifs; - char **argv; - - { - /* Turn off --warn-undefined-variables while we expand SHELL and IFS. */ - int save = warn_undefined_variables_flag; - warn_undefined_variables_flag = 0; - - shell = allocated_variable_expand_for_file ("$(SHELL)", file); - ifs = allocated_variable_expand_for_file ("$(IFS)", file); - - warn_undefined_variables_flag = save; - } - - argv = construct_command_argv_internal (line, restp, shell, ifs); - - free (shell); - free (ifs); - - return argv; -} - -#ifndef HAVE_DUP2 -int -dup2 (old, new) - int old, new; -{ - int fd; - - (void) close (new); - fd = dup (old); - if (fd != new) - { - (void) close (fd); - errno = EMFILE; - return -1; - } - - return fd; -} -#endif diff --git a/buildtools/windows/source/make/job.h b/buildtools/windows/source/make/job.h deleted file mode 100644 index 79832212b1b..00000000000 --- a/buildtools/windows/source/make/job.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Definitions for managing subprocesses in GNU Make. -Copyright (C) 1992, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* Structure describing a running or dead child process. */ - -struct child - { - struct child *next; /* Link in the chain. */ - - struct file *file; /* File being remade. */ - - char **environment; /* Environment for commands. */ - - char **command_lines; /* Array of variable-expanded cmd lines. */ - unsigned int command_line; /* Index into above. */ - char *command_ptr; /* Ptr into command_lines[command_line]. */ - - pid_t pid; /* Child process's ID number. */ - unsigned int remote:1; /* Nonzero if executing remotely. */ - - unsigned int noerror:1; /* Nonzero if commands contained a `-'. */ - - unsigned int good_stdin:1; /* Nonzero if this child has a good stdin. */ - unsigned int deleted:1; /* Nonzero if targets have been deleted. */ - }; - -extern struct child *children; - -extern void new_job (); -extern void reap_children (); -extern void start_waiting_jobs (); - -extern char **construct_command_argv (); -extern void child_execute_job (); -extern void exec_command (); - -extern unsigned int job_slots_used; - -#ifdef POSIX -extern void unblock_sigs (); -#else -#ifdef HAVE_SIGSETMASK -extern int fatal_signal_mask; -#define unblock_sigs() sigsetmask (0) -#else -#define unblock_sigs() -#endif -#endif - -#ifdef NETSCAPE -extern int ns_spawn (char **argv, char **envp, int *exitCode); -#endif diff --git a/buildtools/windows/source/make/main.c b/buildtools/windows/source/make/main.c deleted file mode 100644 index 3e3ab5943a7..00000000000 --- a/buildtools/windows/source/make/main.c +++ /dev/null @@ -1,2035 +0,0 @@ -/* Argument parsing and main program of GNU Make. -Copyright (C) 1988, 89, 90, 91, 94, 1995 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "commands.h" -#include "dep.h" -#include "file.h" -#include "variable.h" -#include "job.h" -#include "getopt.h" -#include - - -extern void print_variable_data_base (); -extern void print_dir_data_base (); -extern void print_rule_data_base (); -extern void print_file_data_base (); -extern void print_vpath_data_base (); - -#ifndef HAVE_UNISTD_H -extern int chdir (); -#endif -#ifndef STDC_HEADERS -#ifndef sun /* Sun has an incorrect decl in a header. */ -extern void exit (); -#endif -extern double atof (); -#endif -extern char *mktemp (); - -static void log_working_directory (); -static void print_data_base (), print_version (); -static void decode_switches (), decode_env_switches (); -static void define_makeflags (); -static char *quote_as_word (); - -/* The structure that describes an accepted command switch. */ - -struct command_switch - { - char c; /* The switch character. */ - - enum /* Type of the value. */ - { - flag, /* Turn int flag on. */ - flag_off, /* Turn int flag off. */ - string, /* One string per switch. */ - positive_int, /* A positive integer. */ - floating, /* A floating-point number (double). */ - ignore /* Ignored. */ - } type; - - char *value_ptr; /* Pointer to the value-holding variable. */ - - unsigned int env:1; /* Can come from MAKEFLAGS. */ - unsigned int toenv:1; /* Should be put in MAKEFLAGS. */ - unsigned int no_makefile:1; /* Don't propagate when remaking makefiles. */ - - char *noarg_value; /* Pointer to value used if no argument is given. */ - char *default_value;/* Pointer to default value. */ - - char *long_name; /* Long option name. */ - char *argdesc; /* Descriptive word for argument. */ - char *description; /* Description for usage message. */ - }; - - -/* The structure used to hold the list of strings given - in command switches of a type that takes string arguments. */ - -struct stringlist - { - char **list; /* Nil-terminated list of strings. */ - unsigned int idx; /* Index into above. */ - unsigned int max; /* Number of pointers allocated. */ - }; - - -/* The recognized command switches. */ - -/* Nonzero means do not print commands to be executed (-s). */ - -int silent_flag; - -/* Nonzero means just touch the files - that would appear to need remaking (-t) */ - -int touch_flag; - -/* Nonzero means just print what commands would need to be executed, - don't actually execute them (-n). */ - -int just_print_flag; - -/* Print debugging trace info (-d). */ - -int debug_flag = 0; - -/* Environment variables override makefile definitions. */ - -int env_overrides = 0; - -/* Nonzero means ignore status codes returned by commands - executed to remake files. Just treat them all as successful (-i). */ - -int ignore_errors_flag = 0; - -/* Nonzero means don't remake anything, just print the data base - that results from reading the makefile (-p). */ - -int print_data_base_flag = 0; - -/* Nonzero means don't remake anything; just return a nonzero status - if the specified targets are not up to date (-q). */ - -int question_flag = 0; - -/* Nonzero means do not use any of the builtin rules (-r). */ - -int no_builtin_rules_flag = 0; - -/* Nonzero means keep going even if remaking some file fails (-k). */ - -int keep_going_flag; -int default_keep_going_flag = 0; - -/* Nonzero means print directory before starting and when done (-w). */ - -int print_directory_flag = 0; - -/* Nonzero means ignore print_directory_flag and never print the directory. - This is necessary because print_directory_flag is set implicitly. */ - -int inhibit_print_directory_flag = 0; - -/* Nonzero means print version information. */ - -int print_version_flag = 0; - -/* List of makefiles given with -f switches. */ - -static struct stringlist *makefiles = 0; - - -/* Number of job slots (commands that can be run at once). */ - -unsigned int job_slots = 1; -unsigned int default_job_slots = 1; - -/* Value of job_slots that means no limit. */ - -static unsigned int inf_jobs = 0; - -/* Maximum load average at which multiple jobs will be run. - Negative values mean unlimited, while zero means limit to - zero load (which could be useful to start infinite jobs remotely - but one at a time locally). */ - -double max_load_average = -1.0; -double default_load_average = -1.0; - -/* List of directories given with -C switches. */ - -static struct stringlist *directories = 0; - -/* List of include directories given with -I switches. */ - -static struct stringlist *include_directories = 0; - -/* List of files given with -o switches. */ - -static struct stringlist *old_files = 0; - -/* List of files given with -W switches. */ - -static struct stringlist *new_files = 0; - -/* If nonzero, we should just print usage and exit. */ - -static int print_usage_flag = 0; - -/* If nonzero, we should print a warning message - for each reference to an undefined variable. */ - -int warn_undefined_variables_flag; - -/* The table of command switches. */ - -static const struct command_switch switches[] = - { - { 'b', ignore, 0, 0, 0, 0, 0, 0, - 0, 0, - "Ignored for compatibility" }, - { 'C', string, (char *) &directories, 0, 0, 0, 0, 0, - "directory", "DIRECTORY", - "Change to DIRECTORY before doing anything" }, - { 'd', flag, (char *) &debug_flag, 1, 1, 0, 0, 0, - "debug", 0, - "Print lots of debugging information" }, - { 'e', flag, (char *) &env_overrides, 1, 1, 0, 0, 0, - "environment-overrides", 0, - "Environment variables override makefiles" }, - { 'f', string, (char *) &makefiles, 0, 0, 0, 0, 0, - "file", "FILE", - "Read FILE as a makefile" }, - { 'h', flag, (char *) &print_usage_flag, 0, 0, 0, 0, 0, - "help", 0, - "Print this message and exit" }, - { 'i', flag, (char *) &ignore_errors_flag, 1, 1, 0, 0, 0, - "ignore-errors", 0, - "Ignore errors from commands" }, - { 'I', string, (char *) &include_directories, 1, 1, 0, 0, 0, - "include-dir", "DIRECTORY", - "Search DIRECTORY for included makefiles" }, - { 'j', positive_int, (char *) &job_slots, 1, 1, 0, - (char *) &inf_jobs, (char *) &default_job_slots, - "jobs", "N", - "Allow N jobs at once; infinite jobs with no arg" }, - { 'k', flag, (char *) &keep_going_flag, 1, 1, 0, - 0, (char *) &default_keep_going_flag, - "keep-going", 0, - "Keep going when some targets can't be made" }, - { 'l', floating, (char *) &max_load_average, 1, 1, 0, - (char *) &default_load_average, (char *) &default_load_average, - "load-average", "N", - "Don't start multiple jobs unless load is below N" }, - { 'm', ignore, 0, 0, 0, 0, 0, 0, - 0, 0, - "-b" }, - { 'n', flag, (char *) &just_print_flag, 1, 1, 1, 0, 0, - "just-print", 0, - "Don't actually run any commands; just print them" }, - { 'o', string, (char *) &old_files, 0, 0, 0, 0, 0, - "old-file", "FILE", - "Consider FILE to be very old and don't remake it" }, - { 'p', flag, (char *) &print_data_base_flag, 1, 1, 0, 0, 0, - "print-data-base", 0, - "Print make's internal database" }, - { 'q', flag, (char *) &question_flag, 1, 1, 1, 0, 0, - "question", 0, - "Run no commands; exit status says if up to date" }, - { 'r', flag, (char *) &no_builtin_rules_flag, 1, 1, 0, 0, 0, - "no-builtin-rules", 0, - "Disable the built-in implicit rules" }, - { 's', flag, (char *) &silent_flag, 1, 1, 0, 0, 0, - "silent", 0, - "Don't echo commands" }, - { 'S', flag_off, (char *) &keep_going_flag, 1, 1, 0, - 0, (char *) &default_keep_going_flag, - "no-keep-going", 0, - "Turns off -k" }, - { 't', flag, (char *) &touch_flag, 1, 1, 1, 0, 0, - "touch", 0, - "Touch targets instead of remaking them" }, - { 'v', flag, (char *) &print_version_flag, 1, 1, 0, 0, 0, - "version", 0, - "Print the version number of make and exit" }, - { 'w', flag, (char *) &print_directory_flag, 1, 1, 0, 0, 0, - "print-directory", 0, - "Print the current directory" }, - { 2, flag, (char *) &inhibit_print_directory_flag, 1, 1, 0, 0, 0, - "no-print-directory", 0, - "Turn off -w, even if it was turned on implicitly" }, - { 'W', string, (char *) &new_files, 0, 0, 0, 0, 0, - "what-if", "FILE", - "Consider FILE to be infinitely new" }, - { 3, flag, (char *) &warn_undefined_variables_flag, 1, 1, 0, 0, 0, - "warn-undefined-variables", 0, - "Warn when an undefined variable is referenced" }, - { '\0', } - }; - -/* Secondary long names for options. */ - -static struct option long_option_aliases[] = - { - { "quiet", no_argument, 0, 's' }, - { "stop", no_argument, 0, 'S' }, - { "new-file", required_argument, 0, 'W' }, - { "assume-new", required_argument, 0, 'W' }, - { "assume-old", required_argument, 0, 'o' }, - { "max-load", optional_argument, 0, 'l' }, - { "dry-run", no_argument, 0, 'n' }, - { "recon", no_argument, 0, 'n' }, - { "makefile", required_argument, 0, 'f' }, - }; - -/* The usage message prints the descriptions of options starting in - this column. Make sure it leaves enough room for the longest - description to fit in less than 80 characters. */ - -#define DESCRIPTION_COLUMN 30 - -/* List of goal targets. */ - -static struct dep *goals, *lastgoal; - -/* List of variables which were defined on the command line - (or, equivalently, in MAKEFLAGS). */ - -struct command_variable - { - struct command_variable *next; - struct variable *variable; - }; -static struct command_variable *command_variables; - -/* The name we were invoked with. */ - -char *program; - -/* Our current directory before processing any -C options. */ - -char *directory_before_chdir; - -/* Our current directory after processing all -C options. */ - -char *starting_directory; - -/* Value of the MAKELEVEL variable at startup (or 0). */ - -unsigned int makelevel; - -/* First file defined in the makefile whose name does not - start with `.'. This is the default to remake if the - command line does not specify. */ - -struct file *default_goal_file; - -/* Pointer to structure for the file .DEFAULT - whose commands are used for any file that has none of its own. - This is zero if the makefiles do not define .DEFAULT. */ - -struct file *default_file; - -/* Nonzero if we have seen the magic `.POSIX' target. - This turns on pedantic compliance with POSIX.2. */ - -int posix_pedantic; - -/* Mask of signals that are being caught with fatal_error_signal. */ - -#ifdef POSIX -sigset_t fatal_signal_set; -#else -#ifdef HAVE_SIGSETMASK -int fatal_signal_mask; -#endif -#endif - -static struct file * -enter_command_line_file (name) - char *name; -{ - if (name[0] == '~') - { - char *expanded = tilde_expand (name); - if (expanded != 0) - name = expanded; /* Memory leak; I don't care. */ - } - - /* This is also done in parse_file_seq, so this is redundant - for names read from makefiles. It is here for names passed - on the command line. */ - while (name[0] == '.' && name[1] == '/' && name[2] != '\0') - { - name += 2; - while (*name == '/') - /* Skip following slashes: ".//foo" is "foo", not "/foo". */ - ++name; - } - - if (*name == '\0') - { - /* It was all slashes! Move back to the dot and truncate - it after the first slash, so it becomes just "./". */ - do - --name; - while (name[0] != '.'); - name[2] = '\0'; - } - - return enter_file (savestring (name, strlen (name))); -} - -/* Toggle -d on receipt of SIGUSR1. */ - -static RETSIGTYPE -debug_signal_handler (sig) - int sig; -{ - debug_flag = ! debug_flag; -} - -int -main (argc, argv, envp) - int argc; - char **argv; - char **envp; -{ - extern void init_dir (); - extern RETSIGTYPE fatal_error_signal (), child_handler (); - register struct file *f; - register unsigned int i; - char **p; - struct dep *read_makefiles; - PATH_VAR (current_directory); - - default_goal_file = 0; - reading_filename = 0; - reading_lineno_ptr = 0; - -#if !defined (HAVE_STRSIGNAL) && !defined (HAVE_SYS_SIGLIST) - signame_init (); -#endif - -#ifdef POSIX - sigemptyset (&fatal_signal_set); -#define ADD_SIG(sig) sigaddset (&fatal_signal_set, sig) -#else -#ifdef HAVE_SIGSETMASK - fatal_signal_mask = 0; -#define ADD_SIG(sig) fatal_signal_mask |= sigmask (sig) -#else -#define ADD_SIG(sig) -#endif -#endif - -#define FATAL_SIG(sig) \ - if (signal ((sig), fatal_error_signal) == SIG_IGN) \ - (void) signal ((sig), SIG_IGN); \ - else \ - ADD_SIG (sig); -#ifndef NETSCAPE - FATAL_SIG (SIGHUP); - FATAL_SIG (SIGQUIT); - FATAL_SIG (SIGINT); - FATAL_SIG (SIGTERM); -#endif -#ifdef SIGDANGER - FATAL_SIG (SIGDANGER); -#endif -#ifdef SIGXCPU - FATAL_SIG (SIGXCPU); -#endif -#ifdef SIGXFSZ - FATAL_SIG (SIGXFSZ); -#endif - -#undef FATAL_SIG - - /* Make sure stdout is line-buffered. */ - -#ifdef HAVE_SETLINEBUF - setlinebuf (stdout); -#else -#ifndef SETVBUF_REVERSED - setvbuf (stdout, (char *) 0, _IOLBF, BUFSIZ); -#else /* setvbuf not reversed. */ - /* Some buggy systems lose if we pass 0 instead of allocating ourselves. */ - setvbuf (stdout, _IOLBF, xmalloc (BUFSIZ), BUFSIZ); -#endif /* setvbuf reversed. */ -#endif /* setlinebuf missing. */ - - /* Initialize the directory hashing code. */ - init_dir (); - - /* Figure out where this program lives. */ - - if (argv[0] == 0) - argv[0] = ""; - if (argv[0][0] == '\0') - program = "make"; - else - { - program = rindex (argv[0], '/'); -#if defined(__MSDOS__) || defined(NETSCAPE) - if (program == 0) - program = rindex (argv[0], '\\'); - if (program == 0) - program = rindex (argv[0], ':'); -#endif - if (program == 0) - program = argv[0]; - else - ++program; - } - - /* Set up to access user data (files). */ - user_access (); - - /* Figure out where we are. */ - - if (getcwd (current_directory, GET_PATH_MAX) == 0) - { -#ifdef HAVE_GETCWD - perror_with_name ("getcwd: ", ""); -#else - error ("getwd: %s", current_directory); -#endif - current_directory[0] = '\0'; - directory_before_chdir = 0; - } - else - directory_before_chdir = savestring (current_directory, - strlen (current_directory)); - - /* Read in variables from the environment. It is important that this be - done before $(MAKE) is are figured out so its definitions will not be - one from the environment. */ - - for (i = 0; envp[i] != 0; ++i) - { - register char *ep = envp[i]; - while (*ep != '=') - ++ep; - /* The result of pointer arithmetic is cast to unsigned int for - machines where ptrdiff_t is a different size that doesn't widen - the same. */ - define_variable (envp[i], (unsigned int) (ep - envp[i]), - ep + 1, o_env, 1) - /* Force exportation of every variable culled from the environment. - We used to rely on target_environment's v_default code to do this. - But that does not work for the case where an environment variable - is redefined in a makefile with `override'; it should then still - be exported, because it was originally in the environment. */ - ->export = v_export; - } - - /* Decode the switches. */ - - decode_env_switches ("MAKEFLAGS", 9); -#if 0 - /* People write things like: - MFLAGS="CC=gcc -pipe" "CFLAGS=-g" - and we set the -p, -i and -e switches. Doesn't seem quite right. */ - decode_env_switches ("MFLAGS", 6); -#endif - decode_switches (argc, argv, 0); - - /* Print version information. */ - - if (print_version_flag || print_data_base_flag || debug_flag) - print_version (); - - /* `make --version' is supposed to just print the version and exit. */ - if (print_version_flag) - die (0); - -#if !defined(__MSDOS__) - /* Set the "MAKE_COMMAND" variable to the name we were invoked with. - (If it is a relative pathname with a slash, prepend our directory name - so the result will run the same program regardless of the current dir. - If it is a name with no slash, we can only hope that PATH did not - find it in the current directory.) */ - -#if !defined(NETSCAPE) - - if (current_directory[0] != '\0' - && argv[0] != 0 && argv[0][0] != '/' && index (argv[0], '/') != 0) - argv[0] = concat (current_directory, "/", argv[0]); - -#else /* NETSCAPE */ - - /* - * All the comments above apply, plus the following. - * - * Windows NT seems to allow both '/' and '\' as directory separator. - * Moreover, an absolute pathname on Windows does not always start with - * a slash or backslash. It may start with a drive letter and a colon, - * followed by a slash or a backslash. We use the rule that - * if the pathname contains a colon, then it is an absolute path. - */ - - if (current_directory[0] != '\0' - && argv[0] != 0 && argv[0][0] != '/' && argv[0][0] != '\\' - && index (argv[0], '/') != 0 && index (argv[0], '\\') != 0 - && index (argv[0], ':') == 0) - argv[0] = concat (current_directory, "/", argv[0]); - -#endif /* NETSCAPE */ -#endif - -#if defined(NETSCAPE) - /* - * Before setting the "MAKE" variable, change backslashes (directory - * separators on Windows) to forward slashes, otherwise GNU Make will - * interpret backslashes as escape characters. - */ - - { - char *p; - - for (p = argv[0]; *p; p++) { - if (*p == '\\') { - *p = '/'; - } - } - } -#endif /* NETSCAPE */ - - /* The extra indirection through $(MAKE_COMMAND) is done - for hysterical raisins. */ - (void) define_variable ("MAKE_COMMAND", 12, argv[0], o_default, 0); - (void) define_variable ("MAKE", 4, "$(MAKE_COMMAND)", o_default, 1); - - if (command_variables != 0) - { - struct command_variable *cv; - struct variable *v; - unsigned int len = 0; - char *value, *p; - - /* Figure out how much space will be taken up by the command-line - variable definitions. */ - for (cv = command_variables; cv != 0; cv = cv->next) - { - v = cv->variable; - len += 2 * strlen (v->name); - if (! v->recursive) - ++len; - ++len; - len += 2 * strlen (v->value); - } - - /* Now allocate a buffer big enough and fill it. */ - p = value = (char *) alloca (len); - for (cv = command_variables; cv != 0; cv = cv->next) - { - v = cv->variable; - p = quote_as_word (p, v->name, 0); - if (! v->recursive) - *p++ = ':'; - *p++ = '='; - p = quote_as_word (p, v->value, 0); - *p++ = ' '; - } - p[-1] = '\0'; /* Kill the final space and terminate. */ - - /* Define an unchangeable variable with a name that no POSIX.2 - makefile could validly use for its own variable. */ - (void) define_variable ("-*-command-variables-*-", 23, - value, o_automatic, 0); - - /* Define the variable; this will not override any user definition. - Normally a reference to this variable is written into the value of - MAKEFLAGS, allowing the user to override this value to affect the - exported value of MAKEFLAGS. In POSIX-pedantic mode, we cannot - allow the user's setting of MAKEOVERRIDES to affect MAKEFLAGS, so - a reference to this hidden variable is written instead. */ - (void) define_variable ("MAKEOVERRIDES", 13, - "${-*-command-variables-*-}", o_env, 1); - } - - /* If there were -C flags, move ourselves about. */ - if (directories != 0) - for (i = 0; directories->list[i] != 0; ++i) - { - char *dir = directories->list[i]; - if (dir[0] == '~') - { - char *expanded = tilde_expand (dir); - if (expanded != 0) - dir = expanded; - } - if (chdir (dir) < 0) - pfatal_with_name (dir); - if (dir != directories->list[i]) - free (dir); - } - - /* Figure out the level of recursion. */ - { - struct variable *v = lookup_variable ("MAKELEVEL", 9); - if (v != 0 && *v->value != '\0' && *v->value != '-') - makelevel = (unsigned int) atoi (v->value); - else - makelevel = 0; - } - - /* Except under -s, always do -w in sub-makes and under -C. */ - if (!silent_flag && (directories != 0 || makelevel > 0)) - print_directory_flag = 1; - - /* Let the user disable that with --no-print-directory. */ - if (inhibit_print_directory_flag) - print_directory_flag = 0; - - /* Construct the list of include directories to search. */ - - construct_include_path (include_directories == 0 ? (char **) 0 - : include_directories->list); - - /* Figure out where we are now, after chdir'ing. */ - if (directories == 0) - /* We didn't move, so we're still in the same place. */ - starting_directory = current_directory; - else - { - if (getcwd (current_directory, GET_PATH_MAX) == 0) - { -#ifdef HAVE_GETCWD - perror_with_name ("getcwd: ", ""); -#else - error ("getwd: %s", current_directory); -#endif - starting_directory = 0; - } - else - starting_directory = current_directory; - } - - /* Tell the user where he is. */ - - if (print_directory_flag) - log_working_directory (1); - - /* Read any stdin makefiles into temporary files. */ - - if (makefiles != 0) - { - register unsigned int i; - for (i = 0; i < makefiles->idx; ++i) - if (makefiles->list[i][0] == '-' && makefiles->list[i][1] == '\0') - { - /* This makefile is standard input. Since we may re-exec - and thus re-read the makefiles, we read standard input - into a temporary file and read from that. */ - FILE *outfile; - - /* Make a unique filename. */ -#ifdef HAVE_MKTEMP - static char name[] = "/tmp/GmXXXXXX"; - (void) mktemp (name); -#else - static char name[L_tmpnam]; - (void) tmpnam (name); -#endif - - outfile = fopen (name, "w"); - if (outfile == 0) - pfatal_with_name ("fopen (temporary file)"); - while (!feof (stdin)) - { - char buf[2048]; - int n = fread (buf, 1, sizeof(buf), stdin); - if (n > 0 && fwrite (buf, 1, n, outfile) != (size_t)n) - pfatal_with_name ("fwrite (temporary file)"); - } - /* Try to make sure we won't remake the temporary - file when we are re-exec'd. Kludge-o-matic! */ - fprintf (outfile, "%s:;\n", name); - (void) fclose (outfile); - - /* Replace the name that read_all_makefiles will - see with the name of the temporary file. */ - { - char *temp; - /* SGI compiler requires alloca's result be assigned simply. */ - temp = (char *) alloca (sizeof (name)); - bcopy (name, temp, sizeof (name)); - makefiles->list[i] = temp; - } - - /* Make sure the temporary file will not be remade. */ - f = enter_file (savestring (name, sizeof name - 1)); - f->updated = 1; - f->update_status = 0; - f->command_state = cs_finished; - /* Let it be removed when we're done. */ - f->intermediate = 1; - /* But don't mention it. */ - f->dontcare = 1; - } - } - - /* Set up to handle children dying. This must be done before - reading in the makefiles so that `shell' function calls will work. */ - -#ifdef SIGCHLD - (void) signal (SIGCHLD, child_handler); -#endif -#ifdef SIGCLD - (void) signal (SIGCLD, child_handler); -#endif - - /* Let the user send us SIGUSR1 to toggle the -d flag during the run. */ -#ifdef SIGUSR1 - (void) signal (SIGUSR1, debug_signal_handler); -#endif - - /* Define the initial list of suffixes for old-style rules. */ - - set_default_suffixes (); - - /* Define the file rules for the built-in suffix rules. These will later - be converted into pattern rules. We used to do this in - install_default_implicit_rules, but since that happens after reading - makefiles, it results in the built-in pattern rules taking precedence - over makefile-specified suffix rules, which is wrong. */ - - install_default_suffix_rules (); - - /* Define some internal and special variables. */ - - define_automatic_variables (); - - /* Set up the MAKEFLAGS and MFLAGS variables - so makefiles can look at them. */ - - define_makeflags (0, 0); - - /* Define the default variables. */ - define_default_variables (); - - /* Read all the makefiles. */ - - default_file = enter_file (".DEFAULT"); - - read_makefiles - = read_all_makefiles (makefiles == 0 ? (char **) 0 : makefiles->list); - - /* Decode switches again, in case the variables were set by the makefile. */ - decode_env_switches ("MAKEFLAGS", 9); -#if 0 - decode_env_switches ("MFLAGS", 6); -#endif - - /* Set up MAKEFLAGS and MFLAGS again, so they will be right. */ - - define_makeflags (1, 0); - - /* Make each `struct dep' point at the `struct file' for the file - depended on. Also do magic for special targets. */ - - snap_deps (); - - /* Convert old-style suffix rules to pattern rules. It is important to - do this before installing the built-in pattern rules below, so that - makefile-specified suffix rules take precedence over built-in pattern - rules. */ - - convert_to_pattern (); - - /* Install the default implicit pattern rules. - This used to be done before reading the makefiles. - But in that case, built-in pattern rules were in the chain - before user-defined ones, so they matched first. */ - - install_default_implicit_rules (); - - /* Compute implicit rule limits. */ - - count_implicit_rule_limits (); - - /* Construct the listings of directories in VPATH lists. */ - - build_vpath_lists (); - - /* Mark files given with -o flags as very old (00:00:01.00 Jan 1, 1970) - and as having been updated already, and files given with -W flags as - brand new (time-stamp as far as possible into the future). */ - - if (old_files != 0) - for (p = old_files->list; *p != 0; ++p) - { - f = enter_command_line_file (*p); - f->last_mtime = (time_t) 1; - f->updated = 1; - f->update_status = 0; - f->command_state = cs_finished; - } - - if (new_files != 0) - { - for (p = new_files->list; *p != 0; ++p) - { - f = enter_command_line_file (*p); - f->last_mtime = NEW_MTIME; - } - } - - if (read_makefiles != 0) - { - /* Update any makefiles if necessary. */ - - time_t *makefile_mtimes = 0; - unsigned int mm_idx = 0; - - if (debug_flag) - puts ("Updating makefiles...."); - - /* Remove any makefiles we don't want to try to update. - Also record the current modtimes so we can compare them later. */ - { - register struct dep *d, *last; - last = 0; - d = read_makefiles; - while (d != 0) - { - register struct file *f = d->file; - if (f->double_colon) - for (f = f->double_colon; f != NULL; f = f->prev) - { - if (f->deps == 0 && f->cmds != 0) - { - /* This makefile is a :: target with commands, but - no dependencies. So, it will always be remade. - This might well cause an infinite loop, so don't - try to remake it. (This will only happen if - your makefiles are written exceptionally - stupidly; but if you work for Athena, that's how - you write your makefiles.) */ - - if (debug_flag) - printf ("Makefile `%s' might loop; not remaking it.\n", - f->name); - - if (last == 0) - read_makefiles = d->next; - else - last->next = d->next; - - /* Free the storage. */ - free ((char *) d); - - d = last == 0 ? 0 : last->next; - - break; - } - } - if (f == NULL || !f->double_colon) - { - if (makefile_mtimes == 0) - makefile_mtimes = (time_t *) xmalloc (sizeof (time_t)); - else - makefile_mtimes = (time_t *) - xrealloc ((char *) makefile_mtimes, - (mm_idx + 1) * sizeof (time_t)); - makefile_mtimes[mm_idx++] = file_mtime_no_search (d->file); - last = d; - d = d->next; - } - } - } - - /* Set up `MAKEFLAGS' specially while remaking makefiles. */ - define_makeflags (1, 1); - - switch (update_goal_chain (read_makefiles, 1)) - { - case 1: - default: -#define BOGUS_UPDATE_STATUS 0 - assert (BOGUS_UPDATE_STATUS); - break; - - case -1: - /* Did nothing. */ - break; - - case 2: - /* Failed to update. Figure out if we care. */ - { - /* Nonzero if any makefile was successfully remade. */ - int any_remade = 0; - /* Nonzero if any makefile we care about failed - in updating or could not be found at all. */ - int any_failed = 0; - register unsigned int i; - - for (i = 0; read_makefiles != 0; ++i) - { - struct dep *d = read_makefiles; - read_makefiles = d->next; - if (d->file->updated) - { - /* This makefile was updated. */ - if (d->file->update_status == 0) - { - /* It was successfully updated. */ - any_remade |= (file_mtime_no_search (d->file) - != makefile_mtimes[i]); - } - else if (! (d->changed & RM_DONTCARE)) - { - time_t mtime; - /* The update failed and this makefile was not - from the MAKEFILES variable, so we care. */ - error ("Failed to remake makefile `%s'.", - d->file->name); - mtime = file_mtime_no_search (d->file); - any_remade |= (mtime != (time_t) -1 - && mtime != makefile_mtimes[i]); - } - } - else - /* This makefile was not found at all. */ - if (! (d->changed & RM_DONTCARE)) - { - /* This is a makefile we care about. See how much. */ - if (d->changed & RM_INCLUDED) - /* An included makefile. We don't need - to die, but we do want to complain. */ - error ("Included makefile `%s' was not found.", - dep_name (d)); - else - { - /* A normal makefile. We must die later. */ - error ("Makefile `%s' was not found", dep_name (d)); - any_failed = 1; - } - } - - free ((char *) d); - } - - if (any_remade) - goto re_exec; - else if (any_failed) - die (2); - else - break; - } - - case 0: - re_exec: - /* Updated successfully. Re-exec ourselves. */ - - remove_intermediates (0); - - if (print_data_base_flag) - print_data_base (); - - if (print_directory_flag) - log_working_directory (0); - - if (makefiles != 0) - { - /* These names might have changed. */ - register unsigned int i, j = 0; - for (i = 1; i < (unsigned int)argc; ++i) - if (!strcmp (argv[i], "-f")) /* XXX */ - { - char *p = &argv[i][2]; - if (*p == '\0') - argv[++i] = makefiles->list[j]; - else - argv[i] = concat ("-f", makefiles->list[j], ""); - ++j; - } - } - - if (directories != 0 && directories->idx > 0) - { - char bad; - if (directory_before_chdir != 0) - { - if (chdir (directory_before_chdir) < 0) - { - perror_with_name ("chdir", ""); - bad = 1; - } - else - bad = 0; - } - else - bad = 1; - if (bad) - fatal ("Couldn't change back to original directory."); - } - - for (p = environ; *p != 0; ++p) - if (!strncmp (*p, "MAKELEVEL=", 10)) - { - /* The SGI compiler apparently can't understand - the concept of storing the result of a function - in something other than a local variable. */ - char *sgi_loses; - sgi_loses = (char *) alloca (40); - *p = sgi_loses; - sprintf (*p, "MAKELEVEL=%u", makelevel); - break; - } - - if (debug_flag) - { - char **p; - fputs ("Re-executing:", stdout); - for (p = argv; *p != 0; ++p) - printf (" %s", *p); - puts (""); - } - - fflush (stdout); - fflush (stderr); - - exec_command (argv, environ); - /* NOTREACHED */ - } - } - - /* Set up `MAKEFLAGS' again for the normal targets. */ - define_makeflags (1, 0); - - { - int status; - - /* If there were no command-line goals, use the default. */ - if (goals == 0) - { - if (default_goal_file != 0) - { - goals = (struct dep *) xmalloc (sizeof (struct dep)); - goals->next = 0; - goals->name = 0; - goals->file = default_goal_file; - } - } - else - lastgoal->next = 0; - - if (goals != 0) - { - /* Update the goals. */ - - if (debug_flag) - puts ("Updating goal targets...."); - - switch (update_goal_chain (goals, 0)) - { - case -1: - /* Nothing happened. */ - case 0: - /* Updated successfully. */ - status = 0; - break; - case 2: - /* Updating failed. */ - status = 2; - break; - case 1: - /* We are under -q and would run some commands. */ - status = 1; - break; - default: - abort (); - } - } - else - { - if (read_makefiles == 0) - fatal ("No targets specified and no makefile found"); - else - fatal ("No targets"); - } - - /* Exit. */ - die (status); - } - - return 0; -} - -/* Parsing of arguments, decoding of switches. */ - -static char options[1 + sizeof (switches) / sizeof (switches[0]) * 3]; -static struct option long_options[(sizeof (switches) / sizeof (switches[0])) + - (sizeof (long_option_aliases) / - sizeof (long_option_aliases[0]))]; - -/* Fill in the string and vector for getopt. */ -static void -init_switches () -{ - register char *p; - register int c; - register unsigned int i; - - if (options[0] != '\0') - /* Already done. */ - return; - - p = options; - - /* Return switch and non-switch args in order, regardless of - POSIXLY_CORRECT. Non-switch args are returned as option 1. */ - *p++ = '-'; - - for (i = 0; switches[i].c != '\0'; ++i) - { - long_options[i].name = (switches[i].long_name == 0 ? "" : - switches[i].long_name); - long_options[i].flag = 0; - long_options[i].val = switches[i].c; - if (isalnum (switches[i].c)) - *p++ = switches[i].c; - switch (switches[i].type) - { - case flag: - case flag_off: - case ignore: - long_options[i].has_arg = no_argument; - break; - - case string: - case positive_int: - case floating: - if (isalnum (switches[i].c)) - *p++ = ':'; - if (switches[i].noarg_value != 0) - { - if (isalnum (switches[i].c)) - *p++ = ':'; - long_options[i].has_arg = optional_argument; - } - else - long_options[i].has_arg = required_argument; - break; - } - } - *p = '\0'; - for (c = 0; c < (sizeof (long_option_aliases) / - sizeof (long_option_aliases[0])); - ++c) - long_options[i++] = long_option_aliases[c]; - long_options[i].name = 0; -} - -static void -handle_non_switch_argument (arg, env) - char *arg; - int env; -{ - /* Non-option argument. It might be a variable definition. */ - struct variable *v; - if (arg[0] == '-' && arg[1] == '\0') - /* Ignore plain `-' for compatibility. */ - return; - v = try_variable_definition ((char *) 0, 0, arg, o_command); - if (v != 0) - { - /* It is indeed a variable definition. Record a pointer to - the variable for later use in define_makeflags. */ - struct command_variable *cv - = (struct command_variable *) xmalloc (sizeof (*cv)); - cv->variable = v; - cv->next = command_variables; - command_variables = cv; - } - else if (! env) - { - /* Not an option or variable definition; it must be a goal - target! Enter it as a file and add it to the dep chain of - goals. */ - struct file *f = enter_command_line_file (arg); - f->cmd_target = 1; - - if (goals == 0) - { - goals = (struct dep *) xmalloc (sizeof (struct dep)); - lastgoal = goals; - } - else - { - lastgoal->next - = (struct dep *) xmalloc (sizeof (struct dep)); - lastgoal = lastgoal->next; - } - lastgoal->name = 0; - lastgoal->file = f; - } -} - -/* Decode switches from ARGC and ARGV. - They came from the environment if ENV is nonzero. */ - -static void -decode_switches (argc, argv, env) - int argc; - char **argv; - int env; -{ - int bad = 0; - register const struct command_switch *cs; - register struct stringlist *sl; - register int c; - - /* getopt does most of the parsing for us. - First, get its vectors set up. */ - - init_switches (); - - /* Let getopt produce error messages for the command line, - but not for options from the environment. */ - opterr = !env; - /* Reset getopt's state. */ - optind = 0; - - while (optind < argc) - { - /* Parse the next argument. */ - c = getopt_long (argc, argv, options, long_options, (int *) 0); - if (c == EOF) - /* End of arguments, or "--" marker seen. */ - break; - else if (c == 1) - /* An argument not starting with a dash. */ - handle_non_switch_argument (optarg, env); - else if (c == '?') - /* Bad option. We will print a usage message and die later. - But continue to parse the other options so the user can - see all he did wrong. */ - bad = 1; - else - for (cs = switches; cs->c != '\0'; ++cs) - if (cs->c == c) - { - /* Whether or not we will actually do anything with - this switch. We test this individually inside the - switch below rather than just once outside it, so that - options which are to be ignored still consume args. */ - int doit = !env || cs->env; - - switch (cs->type) - { - default: - abort (); - - case ignore: - break; - - case flag: - case flag_off: - if (doit) - *(int *) cs->value_ptr = cs->type == flag; - break; - - case string: - if (!doit) - break; - - if (optarg == 0) - optarg = cs->noarg_value; - - sl = *(struct stringlist **) cs->value_ptr; - if (sl == 0) - { - sl = (struct stringlist *) - xmalloc (sizeof (struct stringlist)); - sl->max = 5; - sl->idx = 0; - sl->list = (char **) xmalloc (5 * sizeof (char *)); - *(struct stringlist **) cs->value_ptr = sl; - } - else if (sl->idx == sl->max - 1) - { - sl->max += 5; - sl->list = (char **) - xrealloc ((char *) sl->list, - sl->max * sizeof (char *)); - } - sl->list[sl->idx++] = optarg; - sl->list[sl->idx] = 0; - break; - - case positive_int: - if (optarg == 0 && argc > optind - && isdigit (argv[optind][0])) - optarg = argv[optind++]; - - if (!doit) - break; - - if (optarg != 0) - { - int i = atoi (optarg); - if (i < 1) - { - if (doit) - error ("the `-%c' option requires a \ -positive integral argument", - cs->c); - bad = 1; - } - else - *(unsigned int *) cs->value_ptr = i; - } - else - *(unsigned int *) cs->value_ptr - = *(unsigned int *) cs->noarg_value; - break; - - case floating: - if (optarg == 0 && optind < argc - && (isdigit (argv[optind][0]) || argv[optind][0] == '.')) - optarg = argv[optind++]; - - if (doit) - *(double *) cs->value_ptr - = (optarg != 0 ? atof (optarg) - : *(double *) cs->noarg_value); - - break; - } - - /* We've found the switch. Stop looking. */ - break; - } - } - - /* There are no more options according to getting getopt, but there may - be some arguments left. Since we have asked for non-option arguments - to be returned in order, this only happens when there is a "--" - argument to prevent later arguments from being options. */ - while (optind < argc) - handle_non_switch_argument (argv[optind++], env); - - - if (!env && (bad || print_usage_flag)) - { - /* Print a nice usage message. */ - FILE *usageto; - - if (print_version_flag) - print_version (); - - usageto = bad ? stderr : stdout; - - fprintf (usageto, "Usage: %s [options] [target] ...\n", program); - - fputs ("Options:\n", usageto); - for (cs = switches; cs->c != '\0'; ++cs) - { - char buf[1024], shortarg[50], longarg[50], *p; - - if (cs->description[0] == '-') - continue; - - switch (long_options[cs - switches].has_arg) - { - case no_argument: - shortarg[0] = longarg[0] = '\0'; - break; - case required_argument: - sprintf (longarg, "=%s", cs->argdesc); - sprintf (shortarg, " %s", cs->argdesc); - break; - case optional_argument: - sprintf (longarg, "[=%s]", cs->argdesc); - sprintf (shortarg, " [%s]", cs->argdesc); - break; - } - - p = buf; - - if (isalnum (cs->c)) - { - sprintf (buf, " -%c%s", cs->c, shortarg); - p += strlen (p); - } - if (cs->long_name != 0) - { - unsigned int i; - sprintf (p, "%s--%s%s", - !isalnum (cs->c) ? " " : ", ", - cs->long_name, longarg); - p += strlen (p); - for (i = 0; i < (sizeof (long_option_aliases) / - sizeof (long_option_aliases[0])); - ++i) - if (long_option_aliases[i].val == cs->c) - { - sprintf (p, ", --%s%s", - long_option_aliases[i].name, longarg); - p += strlen (p); - } - } - { - const struct command_switch *ncs = cs; - while ((++ncs)->c != '\0') - if (ncs->description[0] == '-' && - ncs->description[1] == cs->c) - { - /* This is another switch that does the same - one as the one we are processing. We want - to list them all together on one line. */ - sprintf (p, ", -%c%s", ncs->c, shortarg); - p += strlen (p); - if (ncs->long_name != 0) - { - sprintf (p, ", --%s%s", ncs->long_name, longarg); - p += strlen (p); - } - } - } - - if (p - buf > DESCRIPTION_COLUMN - 2) - /* The list of option names is too long to fit on the same - line with the description, leaving at least two spaces. - Print it on its own line instead. */ - { - fprintf (usageto, "%s\n", buf); - buf[0] = '\0'; - } - - fprintf (usageto, "%*s%s.\n", - - DESCRIPTION_COLUMN, - buf, cs->description); - } - - die (bad ? 2 : 0); - } -} - -/* Decode switches from environment variable ENVAR (which is LEN chars long). - We do this by chopping the value into a vector of words, prepending a - dash to the first word if it lacks one, and passing the vector to - decode_switches. */ - -static void -decode_env_switches (envar, len) - char *envar; - unsigned int len; -{ - char *varref = (char *) alloca (2 + len + 2); - char *value, *p; - int argc; - char **argv; - - /* Get the variable's value. */ - varref[0] = '$'; - varref[1] = '('; - bcopy (envar, &varref[2], len); - varref[2 + len] = ')'; - varref[2 + len + 1] = '\0'; - value = variable_expand (varref); - - /* Skip whitespace, and check for an empty value. */ - value = next_token (value); - len = strlen (value); - if (len == 0) - return; - - /* Allocate a vector that is definitely big enough. */ - argv = (char **) alloca ((1 + len + 1) * sizeof (char *)); - - /* Allocate a buffer to copy the value into while we split it into words - and unquote it. We must use permanent storage for this because - decode_switches may store pointers into the passed argument words. */ - p = (char *) xmalloc (2 * len); - - /* getopt will look at the arguments starting at ARGV[1]. - Prepend a spacer word. */ - argv[0] = 0; - argc = 1; - argv[argc] = p; - while (*value != '\0') - { - if (*value == '\\') - ++value; /* Skip the backslash. */ - else if (isblank (*value)) - { - /* End of the word. */ - *p++ = '\0'; - argv[++argc] = p; - do - ++value; - while (isblank (*value)); - continue; - } - *p++ = *value++; - } - *p = '\0'; - argv[++argc] = 0; - - if (argc == 2 && argv[1][0] != '-') - { - /* There is just one word in the value, and it is not a switch. - Either this is the single-word form and we should prepend a dash - before calling decode_switches, or this is the multi-word form and - there is no dash because it is a variable definition. */ - struct variable *v; - v = try_variable_definition ((char *) 0, 0, argv[1], o_command); - if (v != 0) - { - /* It was indeed a variable definition, and now it has been - processed. There is nothing for decode_switches to do. - Record a pointer to the variable for later use in - define_makeflags. */ - struct command_variable *cv - = (struct command_variable *) xmalloc (sizeof (*cv)); - cv->variable = v; - cv->next = command_variables; - command_variables = cv; - return; - } - - /* It wasn't a variable definition, so it's some switches without a - leading dash. Add one and pass it along to decode_switches. We - need permanent storage for this in case decode_switches saves - pointers into the value. */ - argv[1] = concat ("-", argv[1], ""); - } - - /* Parse those words. */ - decode_switches (argc, argv, 1); -} - -/* Quote the string IN so that it will be interpreted as a single word with - no magic by the shell; if DOUBLE_DOLLARS is nonzero, also double dollar - signs to avoid variable expansion in make itself. Write the result into - OUT, returning the address of the next character to be written. - Allocating space for OUT twice the length of IN (thrice if - DOUBLE_DOLLARS is nonzero) is always sufficient. */ - -static char * -quote_as_word (out, in, double_dollars) - char *out, *in; - int double_dollars; -{ - while (*in != '\0') - { - if (index ("^;'\"*?[]$<>(){}|&~`\\ \t\r\n\f\v", *in) != 0) - *out++ = '\\'; - if (double_dollars && *in == '$') - *out++ = '$'; - *out++ = *in++; - } - - return out; -} - -/* Define the MAKEFLAGS and MFLAGS variables to reflect the settings of the - command switches. Include options with args if ALL is nonzero. - Don't include options with the `no_makefile' flag set if MAKEFILE. */ - -static void -define_makeflags (all, makefile) - int all, makefile; -{ - static const char ref[] = "$(MAKEOVERRIDES)"; - static const char posixref[] = "$(-*-command-variables-*-)"; - register const struct command_switch *cs; - char *flagstring; - register char *p; - unsigned int words; - struct variable *v; - - /* We will construct a linked list of `struct flag's describing - all the flags which need to go in MAKEFLAGS. Then, once we - know how many there are and their lengths, we can put them all - together in a string. */ - - struct flag - { - struct flag *next; - const struct command_switch *cs; - char *arg; - }; - struct flag *flags = 0; - unsigned int flagslen = 0; -#define ADD_FLAG(ARG, LEN) \ - do { \ - struct flag *new = (struct flag *) alloca (sizeof (struct flag)); \ - new->cs = cs; \ - new->arg = (ARG); \ - new->next = flags; \ - flags = new; \ - if (new->arg == 0) \ - ++flagslen; /* Just a single flag letter. */ \ - else \ - flagslen += 1 + 1 + 1 + 1 + 3 * (LEN); /* " -x foo" */ \ - if (!isalnum (cs->c)) \ - /* This switch has no single-letter version, so we use the long. */ \ - flagslen += 2 + strlen (cs->long_name); \ - } while (0) - - for (cs = switches; cs->c != '\0'; ++cs) - if (cs->toenv && (!makefile || !cs->no_makefile)) - switch (cs->type) - { - default: - abort (); - - case ignore: - break; - - case flag: - case flag_off: - if (!*(int *) cs->value_ptr == (cs->type == flag_off) - && (cs->default_value == 0 - || *(int *) cs->value_ptr != *(int *) cs->default_value)) - ADD_FLAG (0, 0); - break; - - case positive_int: - if (all) - { - if ((cs->default_value != 0 - && (*(unsigned int *) cs->value_ptr - == *(unsigned int *) cs->default_value))) - break; - else if (cs->noarg_value != 0 - && (*(unsigned int *) cs->value_ptr == - *(unsigned int *) cs->noarg_value)) - ADD_FLAG ("", 0); /* Optional value omitted; see below. */ - else if (cs->c == 'j') - /* Special case for `-j'. */ - ADD_FLAG ("1", 1); - else - { - char *buf = (char *) alloca (30); - sprintf (buf, "%u", *(unsigned int *) cs->value_ptr); - ADD_FLAG (buf, strlen (buf)); - } - } - break; - - case floating: - if (all) - { - if (cs->default_value != 0 - && (*(double *) cs->value_ptr - == *(double *) cs->default_value)) - break; - else if (cs->noarg_value != 0 - && (*(double *) cs->value_ptr - == *(double *) cs->noarg_value)) - ADD_FLAG ("", 0); /* Optional value omitted; see below. */ - else - { - char *buf = (char *) alloca (100); - sprintf (buf, "%g", *(double *) cs->value_ptr); - ADD_FLAG (buf, strlen (buf)); - } - } - break; - - case string: - if (all) - { - struct stringlist *sl = *(struct stringlist **) cs->value_ptr; - if (sl != 0) - { - /* Add the elements in reverse order, because - all the flags get reversed below; and the order - matters for some switches (like -I). */ - register unsigned int i = sl->idx; - while (i-- > 0) - ADD_FLAG (sl->list[i], strlen (sl->list[i])); - } - } - break; - } - - flagslen += 4 + sizeof posixref; /* Four more for the possible " -- ". */ - -#undef ADD_FLAG - - /* Construct the value in FLAGSTRING. - We allocate enough space for a preceding dash and trailing null. */ - flagstring = (char *) alloca (1 + flagslen + 1); - p = flagstring; - words = 1; - *p++ = '-'; - while (flags != 0) - { - /* Add the flag letter or name to the string. */ - if (!isalnum (flags->cs->c)) - { - *p++ = '-'; - strcpy (p, flags->cs->long_name); - p += strlen (p); - } - else - *p++ = flags->cs->c; - if (flags->arg != 0) - { - /* A flag that takes an optional argument which in this case is - omitted is specified by ARG being "". We must distinguish - because a following flag appended without an intervening " -" - is considered the arg for the first. */ - if (flags->arg[0] != '\0') - { - /* Add its argument too. */ - *p++ = !isalnum (flags->cs->c) ? '=' : ' '; - p = quote_as_word (p, flags->arg, 1); - } - ++words; - /* Write a following space and dash, for the next flag. */ - *p++ = ' '; - *p++ = '-'; - } - else if (!isalnum (flags->cs->c)) - { - ++words; - /* Long options must each go in their own word, - so we write the following space and dash. */ - *p++ = ' '; - *p++ = '-'; - } - flags = flags->next; - } - - if (all && command_variables != 0) - { - /* Now write a reference to $(MAKEOVERRIDES), which contains all the - command-line variable definitions. */ - - if (p == &flagstring[1]) - /* No flags written, so elide the leading dash already written. */ - p = flagstring; - else - { - /* Separate the variables from the switches with a "--" arg. */ - if (p[-1] != '-') - { - /* We did not already write a trailing " -". */ - *p++ = ' '; - *p++ = '-'; - } - /* There is a trailing " -"; fill it out to " -- ". */ - *p++ = '-'; - *p++ = ' '; - } - - /* Copy in the string. */ - if (posix_pedantic) - { - bcopy (posixref, p, sizeof posixref - 1); - p += sizeof posixref - 1; - } - else - { - bcopy (ref, p, sizeof ref - 1); - p += sizeof ref - 1; - } - } - else if (p == &flagstring[1]) - { - words = 0; - --p; - } - else if (p[-1] == '-') - /* Kill the final space and dash. */ - p -= 2; - /* Terminate the string. */ - *p = '\0'; - - v = define_variable ("MAKEFLAGS", 9, - /* If there is just a single word of switches, - omit the leading dash unless it is a single - long option with two leading dashes. */ - &flagstring[(words == 1 && command_variables == 0 - && flagstring[1] != '-') - ? 1 : 0], - /* This used to use o_env, but that lost when a - makefile defined MAKEFLAGS. Makefiles set - MAKEFLAGS to add switches, but we still want - to redefine its value with the full set of - switches. Of course, an override or command - definition will still take precedence. */ - o_file, 1); - if (! all) - /* The first time we are called, set MAKEFLAGS to always be exported. - We should not do this again on the second call, because that is - after reading makefiles which might have done `unexport MAKEFLAGS'. */ - v->export = v_export; - /* Since MFLAGS is not parsed for flags, there is no reason to - override any makefile redefinition. */ - (void) define_variable ("MFLAGS", 6, flagstring, o_env, 1); -} - -/* Print version information. */ - -static void -print_version () -{ - static int printed_version = 0; - - char *precede = print_data_base_flag ? "# " : ""; - - if (printed_version) - /* Do it only once. */ - return; - - printf ("%sGNU Make version %s", precede, version_string); - if (remote_description != 0 && *remote_description != '\0') - printf ("-%s", remote_description); - - printf (", by Richard Stallman and Roland McGrath.\n\ -%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95 Free Software Foundation, Inc.\n\ -%sThis is free software; see the source for copying conditions.\n\ -%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\ -%sPARTICULAR PURPOSE.\n\n", precede, precede, precede, precede); - -#ifdef NETSCAPE -/* - * When you do a release build, you can define the macros - * DEFAULT_SHELL and BUILD_NUMBER to make the following message - * appear in the version information. - * - * For example, you can say: - * #define DEFAULT_SHELL "shmsdos" - * #define BUILD_NUMBER 19970918 - */ - -#define DEFAULT_SHELL "shmsdos" -#define BUILD_NUMBER 19980324 - -#if defined(DEFAULT_SHELL) && defined(BUILD_NUMBER) - - printf ("\ -%sThis version was ported to Win32 by Netscape Communications Corp.\n\ -%sDefault shell: %s. Build number: %d.\n\n", precede, precede, -DEFAULT_SHELL, BUILD_NUMBER); - -#endif /* DEFAULT_SHELL, BUILD_NUMBER */ -#endif /* NETSCAPE */ - - printed_version = 1; - - /* Flush stdout so the user doesn't have to wait to see the - version information while things are thought about. */ - fflush (stdout); -} - -/* Print a bunch of information about this and that. */ - -static void -print_data_base () -{ - extern char *ctime (); - time_t when; - - when = time ((time_t *) 0); - printf ("\n# Make data base, printed on %s", ctime (&when)); - - print_variable_data_base (); - print_dir_data_base (); - print_rule_data_base (); - print_file_data_base (); - print_vpath_data_base (); - - when = time ((time_t *) 0); - printf ("\n# Finished Make data base on %s\n", ctime (&when)); -} - -/* Exit with STATUS, cleaning up as necessary. */ - -void -die (status) - int status; -{ - static char dying = 0; - - if (!dying) - { - int err; - - dying = 1; - - /* Try to move back to the original directory. This is essential on - MS-DOS (where there is really only one process), and on Unix it - puts core files in the original directory instead of the -C - directory. */ - if (directory_before_chdir != 0) - chdir (directory_before_chdir); - - if (print_version_flag) - print_version (); - - /* Wait for children to die. */ - for (err = status != 0; job_slots_used > 0; err = 0) - reap_children (1, err); - - /* Remove the intermediate files. */ - remove_intermediates (0); - - if (print_data_base_flag) - print_data_base (); - - if (print_directory_flag) - log_working_directory (0); - } - - exit (status); -} - -/* Write a message indicating that we've just entered or - left (according to ENTERING) the current directory. */ - -static void -log_working_directory (entering) - int entering; -{ - static int entered = 0; - char *message = entering ? "Entering" : "Leaving"; - - if (entering) - entered = 1; - else if (!entered) - /* Don't print the leaving message if we - haven't printed the entering message. */ - return; - - if (print_data_base_flag) - fputs ("# ", stdout); - - if (makelevel == 0) - printf ("%s: %s ", program, message); - else - printf ("%s[%u]: %s ", program, makelevel, message); - - if (starting_directory == 0) - puts ("an unknown directory"); - else - printf ("directory `%s'\n", starting_directory); -} diff --git a/buildtools/windows/source/make/make-stds.texi b/buildtools/windows/source/make/make-stds.texi deleted file mode 100644 index 887b7ade207..00000000000 --- a/buildtools/windows/source/make/make-stds.texi +++ /dev/null @@ -1,656 +0,0 @@ -@comment This file is included by both standards.texi and make.texinfo. -@comment It was broken out of standards.texi on 1/6/93 by roland. - -@node Makefile Conventions -@chapter Makefile Conventions -@comment standards.texi does not print an index, but make.texinfo does. -@cindex makefile, conventions for -@cindex conventions for makefiles -@cindex standards for makefiles - -This chapter describes conventions for writing the Makefiles for GNU programs. - -@menu -* Makefile Basics:: -* Utilities in Makefiles:: -* Standard Targets:: -* Command Variables:: -* Directory Variables:: -@end menu - -@node Makefile Basics -@section General Conventions for Makefiles - -Every Makefile should contain this line: - -@example -SHELL = /bin/sh -@end example - -@noindent -to avoid trouble on systems where the @code{SHELL} variable might be -inherited from the environment. (This is never a problem with GNU -@code{make}.) - -Different @code{make} programs have incompatible suffix lists and -implicit rules, and this sometimes creates confusion or misbehavior. So -it is a good idea to set the suffix list explicitly using only the -suffixes you need in the particular Makefile, like this: - -@example -.SUFFIXES: -.SUFFIXES: .c .o -@end example - -@noindent -The first line clears out the suffix list, the second introduces all -suffixes which may be subject to implicit rules in this Makefile. - -Don't assume that @file{.} is in the path for command execution. When -you need to run programs that are a part of your package during the -make, please make sure that it uses @file{./} if the program is built as -part of the make or @file{$(srcdir)/} if the file is an unchanging part -of the source code. Without one of these prefixes, the current search -path is used. - -The distinction between @file{./} and @file{$(srcdir)/} is important -when using the @samp{--srcdir} option to @file{configure}. A rule of -the form: - -@smallexample -foo.1 : foo.man sedscript - sed -e sedscript foo.man > foo.1 -@end smallexample - -@noindent -will fail when the current directory is not the source directory, -because @file{foo.man} and @file{sedscript} are not in the current -directory. - -When using GNU @code{make}, relying on @samp{VPATH} to find the source -file will work in the case where there is a single dependency file, -since the @file{make} automatic variable @samp{$<} will represent the -source file wherever it is. (Many versions of @code{make} set @samp{$<} -only in implicit rules.) A makefile target like - -@smallexample -foo.o : bar.c - $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o -@end smallexample - -@noindent -should instead be written as - -@smallexample -foo.o : bar.c - $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@@ -@end smallexample - -@noindent -in order to allow @samp{VPATH} to work correctly. When the target has -multiple dependencies, using an explicit @samp{$(srcdir)} is the easiest -way to make the rule work well. For example, the target above for -@file{foo.1} is best written as: - -@smallexample -foo.1 : foo.man sedscript - sed -e $(srcdir)/sedscript $(srcdir)/foo.man > $@@ -@end smallexample - -@node Utilities in Makefiles -@section Utilities in Makefiles - -Write the Makefile commands (and any shell scripts, such as -@code{configure}) to run in @code{sh}, not in @code{csh}. Don't use any -special features of @code{ksh} or @code{bash}. - -The @code{configure} script and the Makefile rules for building and -installation should not use any utilities directly except these: - -@example -cat cmp cp echo egrep expr grep -ln mkdir mv pwd rm rmdir sed test touch -@end example - -Stick to the generally supported options for these programs. For -example, don't use @samp{mkdir -p}, convenient as it may be, because -most systems don't support it. - -The Makefile rules for building and installation can also use compilers -and related programs, but should do so via @code{make} variables so that the -user can substitute alternatives. Here are some of the programs we -mean: - -@example -ar bison cc flex install ld lex -make makeinfo ranlib texi2dvi yacc -@end example - -Use the following @code{make} variables: - -@example -$(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LEX) -$(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC) -@end example - -When you use @code{ranlib}, you should make sure nothing bad happens if -the system does not have @code{ranlib}. Arrange to ignore an error -from that command, and print a message before the command to tell the -user that failure of the @code{ranlib} command does not mean a problem. - -If you use symbolic links, you should implement a fallback for systems -that don't have symbolic links. - -It is ok to use other utilities in Makefile portions (or scripts) -intended only for particular systems where you know those utilities to -exist. - -@node Standard Targets -@section Standard Targets for Users - -All GNU programs should have the following targets in their Makefiles: - -@table @samp -@item all -Compile the entire program. This should be the default target. This -target need not rebuild any documentation files; Info files should -normally be included in the distribution, and DVI files should be made -only when explicitly asked for. - -@item install -Compile the program and copy the executables, libraries, and so on to -the file names where they should reside for actual use. If there is a -simple test to verify that a program is properly installed, this target -should run that test. - -If possible, write the @code{install} target rule so that it does not -modify anything in the directory where the program was built, provided -@samp{make all} has just been done. This is convenient for building the -program under one user name and installing it under another. - -The commands should create all the directories in which files are to be -installed, if they don't already exist. This includes the directories -specified as the values of the variables @code{prefix} and -@code{exec_prefix}, as well as all subdirectories that are needed. -One way to do this is by means of an @code{installdirs} target -as described below. - -Use @samp{-} before any command for installing a man page, so that -@code{make} will ignore any errors. This is in case there are systems -that don't have the Unix man page documentation system installed. - -The way to install Info files is to copy them into @file{$(infodir)} -with @code{$(INSTALL_DATA)} (@pxref{Command Variables}), and then run -the @code{install-info} program if it is present. @code{install-info} -is a script that edits the Info @file{dir} file to add or update the -menu entry for the given Info file; it will be part of the Texinfo package. -Here is a sample rule to install an Info file: - -@comment This example has been carefully formatted for the Make manual. -@comment Please do not reformat it without talking to roland@gnu.ai.mit.edu. -@smallexample -$(infodir)/foo.info: foo.info -# There may be a newer info file in . than in srcdir. - -if test -f foo.info; then d=.; \ - else d=$(srcdir); fi; \ - $(INSTALL_DATA) $$d/foo.info $@@; \ -# Run install-info only if it exists. -# Use `if' instead of just prepending `-' to the -# line so we notice real errors from install-info. -# We use `$(SHELL) -c' because some shells do not -# fail gracefully when there is an unknown command. - if $(SHELL) -c 'install-info --version' \ - >/dev/null 2>&1; then \ - install-info --infodir=$(infodir) $$d/foo.info; \ - else true; fi -@end smallexample - -@item uninstall -Delete all the installed files that the @samp{install} target would -create (but not the noninstalled files such as @samp{make all} would -create). - -This rule should not modify the directories where compilation is done, -only the directories where files are installed. - -@comment The gratuitous blank line here is to make the table look better -@comment in the printed Make manual. Please leave it in. -@item clean - -Delete all files from the current directory that are normally created by -building the program. Don't delete the files that record the -configuration. Also preserve files that could be made by building, but -normally aren't because the distribution comes with them. - -Delete @file{.dvi} files here if they are not part of the distribution. - -@item distclean -Delete all files from the current directory that are created by -configuring or building the program. If you have unpacked the source -and built the program without creating any other files, @samp{make -distclean} should leave only the files that were in the distribution. - -@item mostlyclean -Like @samp{clean}, but may refrain from deleting a few files that people -normally don't want to recompile. For example, the @samp{mostlyclean} -target for GCC does not delete @file{libgcc.a}, because recompiling it -is rarely necessary and takes a lot of time. - -@item maintainer-clean -Delete almost everything from the current directory that can be -reconstructed with this Makefile. This typically includes everything -deleted by @code{distclean}, plus more: C source files produced by -Bison, tags tables, Info files, and so on. - -The reason we say ``almost everything'' is that @samp{make -maintainer-clean} should not delete @file{configure} even if -@file{configure} can be remade using a rule in the Makefile. More -generally, @samp{make maintainer-clean} should not delete anything that -needs to exist in order to run @file{configure} and then begin to build -the program. This is the only exception; @code{maintainer-clean} should -delete everything else that can be rebuilt. - -The @samp{maintainer-clean} is intended to be used by a maintainer of -the package, not by ordinary users. You may need special tools to -reconstruct some of the files that @samp{make maintainer-clean} deletes. -Since these files are normally included in the distribution, we don't -take care to make them easy to reconstruct. If you find you need to -unpack the full distribution again, don't blame us. - -To help make users aware of this, the commands for -@code{maintainer-clean} should start with these two: - -@example -@@echo "This command is intended for maintainers to use;" -@@echo "it deletes files that may require special tools to rebuild." -@end example - -@item TAGS -Update a tags table for this program. - -@item info -Generate any Info files needed. The best way to write the rules is as -follows: - -@smallexample -info: foo.info - -foo.info: foo.texi chap1.texi chap2.texi - $(MAKEINFO) $(srcdir)/foo.texi -@end smallexample - -@noindent -You must define the variable @code{MAKEINFO} in the Makefile. It should -run the @code{makeinfo} program, which is part of the Texinfo -distribution. - -@item dvi -Generate DVI files for all TeXinfo documentation. -For example: - -@smallexample -dvi: foo.dvi - -foo.dvi: foo.texi chap1.texi chap2.texi - $(TEXI2DVI) $(srcdir)/foo.texi -@end smallexample - -@noindent -You must define the variable @code{TEXI2DVI} in the Makefile. It should -run the program @code{texi2dvi}, which is part of the Texinfo -distribution. Alternatively, write just the dependencies, and allow GNU -Make to provide the command. - -@item dist -Create a distribution tar file for this program. The tar file should be -set up so that the file names in the tar file start with a subdirectory -name which is the name of the package it is a distribution for. This -name can include the version number. - -For example, the distribution tar file of GCC version 1.40 unpacks into -a subdirectory named @file{gcc-1.40}. - -The easiest way to do this is to create a subdirectory appropriately -named, use @code{ln} or @code{cp} to install the proper files in it, and -then @code{tar} that subdirectory. - -The @code{dist} target should explicitly depend on all non-source files -that are in the distribution, to make sure they are up to date in the -distribution. -@xref{Releases, , Making Releases, standards, GNU Coding Standards}. - -@item check -Perform self-tests (if any). The user must build the program before -running the tests, but need not install the program; you should write -the self-tests so that they work when the program is built but not -installed. -@end table - -The following targets are suggested as conventional names, for programs -in which they are useful. - -@table @code -@item installcheck -Perform installation tests (if any). The user must build and install -the program before running the tests. You should not assume that -@file{$(bindir)} is in the search path. - -@item installdirs -It's useful to add a target named @samp{installdirs} to create the -directories where files are installed, and their parent directories. -There is a script called @file{mkinstalldirs} which is convenient for -this; find it in the Texinfo package.@c It's in /gd/gnu/lib/mkinstalldirs. -You can use a rule like this: - -@comment This has been carefully formatted to look decent in the Make manual. -@comment Please be sure not to make it extend any further to the right.--roland -@smallexample -# Make sure all installation directories (e.g. $(bindir)) -# actually exist by making them if necessary. -installdirs: mkinstalldirs - $(srcdir)/mkinstalldirs $(bindir) $(datadir) \ - $(libdir) $(infodir) \ - $(mandir) -@end smallexample - -This rule should not modify the directories where compilation is done. -It should do nothing but create installation directories. -@end table - -@node Command Variables -@section Variables for Specifying Commands - -Makefiles should provide variables for overriding certain commands, options, -and so on. - -In particular, you should run most utility programs via variables. -Thus, if you use Bison, have a variable named @code{BISON} whose default -value is set with @samp{BISON = bison}, and refer to it with -@code{$(BISON)} whenever you need to use Bison. - -File management utilities such as @code{ln}, @code{rm}, @code{mv}, and -so on, need not be referred to through variables in this way, since users -don't need to replace them with other programs. - -Each program-name variable should come with an options variable that is -used to supply options to the program. Append @samp{FLAGS} to the -program-name variable name to get the options variable name---for -example, @code{BISONFLAGS}. (The name @code{CFLAGS} is an exception to -this rule, but we keep it because it is standard.) Use @code{CPPFLAGS} -in any compilation command that runs the preprocessor, and use -@code{LDFLAGS} in any compilation command that does linking as well as -in any direct use of @code{ld}. - -If there are C compiler options that @emph{must} be used for proper -compilation of certain files, do not include them in @code{CFLAGS}. -Users expect to be able to specify @code{CFLAGS} freely themselves. -Instead, arrange to pass the necessary options to the C compiler -independently of @code{CFLAGS}, by writing them explicitly in the -compilation commands or by defining an implicit rule, like this: - -@smallexample -CFLAGS = -g -ALL_CFLAGS = -I. $(CFLAGS) -.c.o: - $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< -@end smallexample - -Do include the @samp{-g} option in @code{CFLAGS}, because that is not -@emph{required} for proper compilation. You can consider it a default -that is only recommended. If the package is set up so that it is -compiled with GCC by default, then you might as well include @samp{-O} -in the default value of @code{CFLAGS} as well. - -Put @code{CFLAGS} last in the compilation command, after other variables -containing compiler options, so the user can use @code{CFLAGS} to -override the others. - -Every Makefile should define the variable @code{INSTALL}, which is the -basic command for installing a file into the system. - -Every Makefile should also define the variables @code{INSTALL_PROGRAM} -and @code{INSTALL_DATA}. (The default for each of these should be -@code{$(INSTALL)}.) Then it should use those variables as the commands -for actual installation, for executables and nonexecutables -respectively. Use these variables as follows: - -@example -$(INSTALL_PROGRAM) foo $(bindir)/foo -$(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a -@end example - -@noindent -Always use a file name, not a directory name, as the second argument of -the installation commands. Use a separate command for each file to be -installed. - -@node Directory Variables -@section Variables for Installation Directories - -Installation directories should always be named by variables, so it is -easy to install in a nonstandard place. The standard names for these -variables are described below. They are based on a standard filesystem -layout; variants of it are used in SVR4, 4.4BSD, Linux, Ultrix v4, and -other modern operating systems. - -These two variables set the root for the installation. All the other -installation directories should be subdirectories of one of these two, -and nothing should be directly installed into these two directories. - -@table @samp -@item prefix -A prefix used in constructing the default values of the variables listed -below. The default value of @code{prefix} should be @file{/usr/local} -When building the complete GNU system, the prefix will be empty and -@file{/usr} will be a symbolic link to @file{/}. - -@item exec_prefix -A prefix used in constructing the default values of some of the -variables listed below. The default value of @code{exec_prefix} should -be @code{$(prefix)}. - -Generally, @code{$(exec_prefix)} is used for directories that contain -machine-specific files (such as executables and subroutine libraries), -while @code{$(prefix)} is used directly for other directories. -@end table - -Executable programs are installed in one of the following directories. - -@table @samp -@item bindir -The directory for installing executable programs that users can run. -This should normally be @file{/usr/local/bin}, but write it as -@file{$(exec_prefix)/bin}. - -@item sbindir -The directory for installing executable programs that can be run from -the shell, but are only generally useful to system administrators. This -should normally be @file{/usr/local/sbin}, but write it as -@file{$(exec_prefix)/sbin}. - -@item libexecdir -@comment This paragraph adjusted to avoid overfull hbox --roland 5jul94 -The directory for installing executable programs to be run by other -programs rather than by users. This directory should normally be -@file{/usr/local/libexec}, but write it as @file{$(exec_prefix)/libexec}. -@end table - -Data files used by the program during its execution are divided into -categories in two ways. - -@itemize @bullet -@item -Some files are normally modified by programs; others are never normally -modified (though users may edit some of these). - -@item -Some files are architecture-independent and can be shared by all -machines at a site; some are architecture-dependent and can be shared -only by machines of the same kind and operating system; others may never -be shared between two machines. -@end itemize - -This makes for six different possibilities. However, we want to -discourage the use of architecture-dependent files, aside from of object -files and libraries. It is much cleaner to make other data files -architecture-independent, and it is generally not hard. - -Therefore, here are the variables makefiles should use to specify -directories: - -@table @samp -@item datadir -The directory for installing read-only architecture independent data -files. This should normally be @file{/usr/local/share}, but write it as -@file{$(prefix)/share}. As a special exception, see @file{$(infodir)} -and @file{$(includedir)} below. - -@item sysconfdir -The directory for installing read-only data files that pertain to a -single machine--that is to say, files for configuring a host. Mailer -and network configuration files, @file{/etc/passwd}, and so forth belong -here. All the files in this directory should be ordinary ASCII text -files. This directory should normally be @file{/usr/local/etc}, but -write it as @file{$(prefix)/etc}. - -@c rewritten to avoid overfull hbox --tower -Do not install executables -@c here -in this directory (they probably -belong in @file{$(libexecdir)} or @file{$(sbindir))}. Also do not -install files that are modified in the normal course of their use -(programs whose purpose is to change the configuration of the system -excluded). Those probably belong in @file{$(localstatedir)}. - -@item sharedstatedir -The directory for installing architecture-independent data files which -the programs modify while they run. This should normally be -@file{/usr/local/com}, but write it as @file{$(prefix)/com}. - -@item localstatedir -The directory for installing data files which the programs modify while -they run, and that pertain to one specific machine. Users should never -need to modify files in this directory to configure the package's -operation; put such configuration information in separate files that go -in @file{datadir} or @file{$(sysconfdir)}. @file{$(localstatedir)} -should normally be @file{/usr/local/var}, but write it as -@file{$(prefix)/var}. - -@item libdir -The directory for object files and libraries of object code. Do not -install executables here, they probably belong in @file{$(libexecdir)} -instead. The value of @code{libdir} should normally be -@file{/usr/local/lib}, but write it as @file{$(exec_prefix)/lib}. - -@item infodir -The directory for installing the Info files for this package. By -default, it should be @file{/usr/local/info}, but it should be written -as @file{$(prefix)/info}. - -@item includedir -@c rewritten to avoid overfull hbox --roland -The directory for installing header files to be included by user -programs with the C @samp{#include} preprocessor directive. This -should normally be @file{/usr/local/include}, but write it as -@file{$(prefix)/include}. - -Most compilers other than GCC do not look for header files in -@file{/usr/local/include}. So installing the header files this way is -only useful with GCC. Sometimes this is not a problem because some -libraries are only really intended to work with GCC. But some libraries -are intended to work with other compilers. They should install their -header files in two places, one specified by @code{includedir} and one -specified by @code{oldincludedir}. - -@item oldincludedir -The directory for installing @samp{#include} header files for use with -compilers other than GCC. This should normally be @file{/usr/include}. - -The Makefile commands should check whether the value of -@code{oldincludedir} is empty. If it is, they should not try to use -it; they should cancel the second installation of the header files. - -A package should not replace an existing header in this directory unless -the header came from the same package. Thus, if your Foo package -provides a header file @file{foo.h}, then it should install the header -file in the @code{oldincludedir} directory if either (1) there is no -@file{foo.h} there or (2) the @file{foo.h} that exists came from the Foo -package. - -To tell whether @file{foo.h} came from the Foo package, put a magic -string in the file---part of a comment---and grep for that string. -@end table - -Unix-style man pages are installed in one of the following: - -@table @samp -@item mandir -The directory for installing the man pages (if any) for this package. -It should include the suffix for the proper section of the -manual---usually @samp{1} for a utility. It will normally be -@file{/usr/local/man/man1}, but you should write it as -@file{$(prefix)/man/man1}. - -@item man1dir -The directory for installing section 1 man pages. -@item man2dir -The directory for installing section 2 man pages. -@item @dots{} -Use these names instead of @samp{mandir} if the package needs to install man -pages in more than one section of the manual. - -@strong{Don't make the primary documentation for any GNU software be a -man page. Write a manual in Texinfo instead. Man pages are just for -the sake of people running GNU software on Unix, which is a secondary -application only.} - -@item manext -The file name extension for the installed man page. This should contain -a period followed by the appropriate digit; it should normally be @samp{.1}. - -@item man1ext -The file name extension for installed section 1 man pages. -@item man2ext -The file name extension for installed section 2 man pages. -@item @dots{} -Use these names instead of @samp{manext} if the package needs to install man -pages in more than one section of the manual. -@end table - -And finally, you should set the following variable: - -@table @samp -@item srcdir -The directory for the sources being compiled. The value of this -variable is normally inserted by the @code{configure} shell script. -@end table - -For example: - -@smallexample -@c I have changed some of the comments here slightly to fix an overfull -@c hbox, so the make manual can format correctly. --roland -# Common prefix for installation directories. -# NOTE: This directory must exist when you start the install. -prefix = /usr/local -exec_prefix = $(prefix) -# Where to put the executable for the command `gcc'. -bindir = $(exec_prefix)/bin -# Where to put the directories used by the compiler. -libexecdir = $(exec_prefix)/libexec -# Where to put the Info files. -infodir = $(prefix)/info -@end smallexample - -If your program installs a large number of files into one of the -standard user-specified directories, it might be useful to group them -into a subdirectory particular to that program. If you do this, you -should write the @code{install} rule to create these subdirectories. - -Do not expect the user to include the subdirectory name in the value of -any of the variables listed above. The idea of having a uniform set of -variable names for installation directories is to enable the user to -specify the exact same values for several different GNU packages. In -order for this to be useful, all the packages must be designed so that -they will work sensibly when the user does so. - diff --git a/buildtools/windows/source/make/make.aux b/buildtools/windows/source/make/make.aux deleted file mode 100644 index ea790c9f12b..00000000000 --- a/buildtools/windows/source/make/make.aux +++ /dev/null @@ -1,354 +0,0 @@ -'xrdef {Overview-title}{Overview of \code {make}} -'xrdef {Overview-pg}{1} -'xrdef {Overview-snt}{Chapter'tie1} -'xrdef {Reading-title}{How to Read This Manual} -'xrdef {Reading-pg}{1} -'xrdef {Reading-snt}{Section'tie1.1} -'xrdef {Bugs-title}{Problems and Bugs} -'xrdef {Bugs-pg}{2} -'xrdef {Bugs-snt}{Section'tie1.2} -'xrdef {Introduction-title}{An Introduction to Makefiles} -'xrdef {Introduction-pg}{5} -'xrdef {Introduction-snt}{Chapter'tie2} -'xrdef {Rule Introduction-title}{What a Rule Looks Like} -'xrdef {Rule Introduction-pg}{5} -'xrdef {Rule Introduction-snt}{Section'tie2.1} -'xrdef {Simple Makefile-title}{A Simple Makefile} -'xrdef {Simple Makefile-pg}{6} -'xrdef {Simple Makefile-snt}{Section'tie2.2} -'xrdef {How Make Works-title}{How \code {make} Processes a Makefile} -'xrdef {How Make Works-pg}{8} -'xrdef {How Make Works-snt}{Section'tie2.3} -'xrdef {Variables Simplify-title}{Variables Make Makefiles Simpler} -'xrdef {Variables Simplify-pg}{9} -'xrdef {Variables Simplify-snt}{Section'tie2.4} -'xrdef {make Deduces-title}{Letting \code {make} Deduce the Commands} -'xrdef {make Deduces-pg}{10} -'xrdef {make Deduces-snt}{Section'tie2.5} -'xrdef {Combine By Dependency-title}{Another Style of Makefile} -'xrdef {Combine By Dependency-pg}{11} -'xrdef {Combine By Dependency-snt}{Section'tie2.6} -'xrdef {Cleanup-title}{Rules for Cleaning the Directory} -'xrdef {Cleanup-pg}{12} -'xrdef {Cleanup-snt}{Section'tie2.7} -'xrdef {Makefiles-title}{Writing Makefiles} -'xrdef {Makefiles-pg}{13} -'xrdef {Makefiles-snt}{Chapter'tie3} -'xrdef {Makefile Contents-title}{What Makefiles Contain} -'xrdef {Makefile Contents-pg}{13} -'xrdef {Makefile Contents-snt}{Section'tie3.1} -'xrdef {Makefile Names-title}{What Name to Give Your Makefile} -'xrdef {Makefile Names-pg}{14} -'xrdef {Makefile Names-snt}{Section'tie3.2} -'xrdef {Include-title}{Including Other Makefiles} -'xrdef {Include-pg}{14} -'xrdef {Include-snt}{Section'tie3.3} -'xrdef {MAKEFILES Variable-title}{The Variable \code {MAKEFILES}} -'xrdef {MAKEFILES Variable-pg}{16} -'xrdef {MAKEFILES Variable-snt}{Section'tie3.4} -'xrdef {Remaking Makefiles-title}{How Makefiles Are Remade} -'xrdef {Remaking Makefiles-pg}{16} -'xrdef {Remaking Makefiles-snt}{Section'tie3.5} -'xrdef {Overriding Makefiles-title}{Overriding Part of Another Makefile} -'xrdef {Overriding Makefiles-pg}{18} -'xrdef {Overriding Makefiles-snt}{Section'tie3.6} -'xrdef {Rules-title}{Writing Rules} -'xrdef {Rules-pg}{19} -'xrdef {Rules-snt}{Chapter'tie4} -'xrdef {Rule Syntax-title}{Rule Syntax} -'xrdef {Rule Syntax-pg}{19} -'xrdef {Rule Syntax-snt}{Section'tie4.1} -'xrdef {Wildcards-title}{Using Wildcard Characters in File Names} -'xrdef {Wildcards-pg}{20} -'xrdef {Wildcards-snt}{Section'tie4.2} -'xrdef {Wildcard Examples-title}{Wildcard Examples} -'xrdef {Wildcard Examples-pg}{21} -'xrdef {Wildcard Examples-snt}{Section'tie4.2.1} -'xrdef {Wildcard Pitfall-title}{Pitfalls of Using Wildcards} -'xrdef {Wildcard Pitfall-pg}{22} -'xrdef {Wildcard Pitfall-snt}{Section'tie4.2.2} -'xrdef {Wildcard Function-title}{The Function \code {wildcard}} -'xrdef {Wildcard Function-pg}{22} -'xrdef {Wildcard Function-snt}{Section'tie4.2.3} -'xrdef {Directory Search-title}{Searching Directories for Dependencies} -'xrdef {Directory Search-pg}{23} -'xrdef {Directory Search-snt}{Section'tie4.3} -'xrdef {General Search-title}{\code {VPATH}: Search Path for All Dependencies} -'xrdef {General Search-pg}{23} -'xrdef {General Search-snt}{Section'tie4.3.1} -'xrdef {Selective Search-title}{The \code {vpath} Directive} -'xrdef {Selective Search-pg}{24} -'xrdef {Selective Search-snt}{Section'tie4.3.2} -'xrdef {Commands/Search-title}{Writing Shell Commands with Directory Search} -'xrdef {Commands/Search-pg}{26} -'xrdef {Commands/Search-snt}{Section'tie4.3.3} -'xrdef {Implicit/Search-title}{Directory Search and Implicit Rules} -'xrdef {Implicit/Search-pg}{27} -'xrdef {Implicit/Search-snt}{Section'tie4.3.4} -'xrdef {Libraries/Search-title}{Directory Search for Link Libraries} -'xrdef {Libraries/Search-pg}{27} -'xrdef {Libraries/Search-snt}{Section'tie4.3.5} -'xrdef {Phony Targets-title}{Phony Targets} -'xrdef {Phony Targets-pg}{28} -'xrdef {Phony Targets-snt}{Section'tie4.4} -'xrdef {Force Targets-title}{Rules without Commands or Dependencies} -'xrdef {Force Targets-pg}{30} -'xrdef {Force Targets-snt}{Section'tie4.5} -'xrdef {Empty Targets-title}{Empty Target Files to Record Events} -'xrdef {Empty Targets-pg}{30} -'xrdef {Empty Targets-snt}{Section'tie4.6} -'xrdef {Special Targets-title}{Special Built-in Target Names} -'xrdef {Special Targets-pg}{31} -'xrdef {Special Targets-snt}{Section'tie4.7} -'xrdef {Multiple Targets-title}{Multiple Targets in a Rule} -'xrdef {Multiple Targets-pg}{32} -'xrdef {Multiple Targets-snt}{Section'tie4.8} -'xrdef {Multiple Rules-title}{Multiple Rules for One Target} -'xrdef {Multiple Rules-pg}{33} -'xrdef {Multiple Rules-snt}{Section'tie4.9} -'xrdef {Static Pattern-title}{Static Pattern Rules} -'xrdef {Static Pattern-pg}{34} -'xrdef {Static Pattern-snt}{Section'tie4.10} -'xrdef {Static Usage-title}{Syntax of Static Pattern Rules} -'xrdef {Static Usage-pg}{34} -'xrdef {Static Usage-snt}{Section'tie4.10.1} -'xrdef {Static versus Implicit-title}{Static Pattern Rules versus Implicit Rules} -'xrdef {Static versus Implicit-pg}{36} -'xrdef {Static versus Implicit-snt}{Section'tie4.10.2} -'xrdef {Double-Colon-title}{Double-Colon Rules} -'xrdef {Double-Colon-pg}{37} -'xrdef {Double-Colon-snt}{Section'tie4.11} -'xrdef {Automatic Dependencies-title}{Generating Dependencies Automatically} -'xrdef {Automatic Dependencies-pg}{37} -'xrdef {Automatic Dependencies-snt}{Section'tie4.12} -'xrdef {Commands-title}{Writing the Commands in Rules} -'xrdef {Commands-pg}{41} -'xrdef {Commands-snt}{Chapter'tie5} -'xrdef {Echoing-title}{Command Echoing} -'xrdef {Echoing-pg}{41} -'xrdef {Echoing-snt}{Section'tie5.1} -'xrdef {Execution-title}{Command Execution} -'xrdef {Execution-pg}{42} -'xrdef {Execution-snt}{Section'tie5.2} -'xrdef {Parallel-title}{Parallel Execution} -'xrdef {Parallel-pg}{42} -'xrdef {Parallel-snt}{Section'tie5.3} -'xrdef {Errors-title}{Errors in Commands} -'xrdef {Errors-pg}{44} -'xrdef {Errors-snt}{Section'tie5.4} -'xrdef {Interrupts-title}{Interrupting or Killing \code {make}} -'xrdef {Interrupts-pg}{45} -'xrdef {Interrupts-snt}{Section'tie5.5} -'xrdef {Recursion-title}{Recursive Use of \code {make}} -'xrdef {Recursion-pg}{46} -'xrdef {Recursion-snt}{Section'tie5.6} -'xrdef {MAKE Variable-title}{How the \code {MAKE} Variable Works} -'xrdef {MAKE Variable-pg}{46} -'xrdef {MAKE Variable-snt}{Section'tie5.6.1} -'xrdef {Variables/Recursion-title}{Communicating Variables to a Sub-\code {make}} -'xrdef {Variables/Recursion-pg}{47} -'xrdef {Variables/Recursion-snt}{Section'tie5.6.2} -'xrdef {Options/Recursion-title}{Communicating Options to a Sub-\code {make}} -'xrdef {Options/Recursion-pg}{50} -'xrdef {Options/Recursion-snt}{Section'tie5.6.3} -'xrdef {-w Option-title}{The \samp {--print-directory} Option} -'xrdef {-w Option-pg}{52} -'xrdef {-w Option-snt}{Section'tie5.6.4} -'xrdef {Sequences-title}{Defining Canned Command Sequences} -'xrdef {Sequences-pg}{52} -'xrdef {Sequences-snt}{Section'tie5.7} -'xrdef {Empty Commands-title}{Using Empty Commands} -'xrdef {Empty Commands-pg}{54} -'xrdef {Empty Commands-snt}{Section'tie5.8} -'xrdef {Using Variables-title}{How to Use Variables} -'xrdef {Using Variables-pg}{55} -'xrdef {Using Variables-snt}{Chapter'tie6} -'xrdef {Reference-title}{Basics of Variable References} -'xrdef {Reference-pg}{55} -'xrdef {Reference-snt}{Section'tie6.1} -'xrdef {Flavors-title}{The Two Flavors of Variables} -'xrdef {Flavors-pg}{56} -'xrdef {Flavors-snt}{Section'tie6.2} -'xrdef {Advanced-title}{Advanced Features for Reference to Variables} -'xrdef {Advanced-pg}{59} -'xrdef {Advanced-snt}{Section'tie6.3} -'xrdef {Substitution Refs-title}{Substitution References} -'xrdef {Substitution Refs-pg}{59} -'xrdef {Substitution Refs-snt}{Section'tie6.3.1} -'xrdef {Computed Names-title}{Computed Variable Names} -'xrdef {Computed Names-pg}{60} -'xrdef {Computed Names-snt}{Section'tie6.3.2} -'xrdef {Values-title}{How Variables Get Their Values} -'xrdef {Values-pg}{63} -'xrdef {Values-snt}{Section'tie6.4} -'xrdef {Setting-title}{Setting Variables} -'xrdef {Setting-pg}{63} -'xrdef {Setting-snt}{Section'tie6.5} -'xrdef {Appending-title}{Appending More Text to Variables} -'xrdef {Appending-pg}{64} -'xrdef {Appending-snt}{Section'tie6.6} -'xrdef {Override Directive-title}{The \code {override} Directive} -'xrdef {Override Directive-pg}{66} -'xrdef {Override Directive-snt}{Section'tie6.7} -'xrdef {Defining-title}{Defining Variables Verbatim} -'xrdef {Defining-pg}{67} -'xrdef {Defining-snt}{Section'tie6.8} -'xrdef {Environment-title}{Variables from the Environment} -'xrdef {Environment-pg}{68} -'xrdef {Environment-snt}{Section'tie6.9} -'xrdef {Conditionals-title}{Conditional Parts of Makefiles} -'xrdef {Conditionals-pg}{71} -'xrdef {Conditionals-snt}{Chapter'tie7} -'xrdef {Conditional Example-title}{Example of a Conditional} -'xrdef {Conditional Example-pg}{71} -'xrdef {Conditional Example-snt}{Section'tie7.1} -'xrdef {Conditional Syntax-title}{Syntax of Conditionals} -'xrdef {Conditional Syntax-pg}{72} -'xrdef {Conditional Syntax-snt}{Section'tie7.2} -'xrdef {Testing Flags-title}{Conditionals that Test Flags} -'xrdef {Testing Flags-pg}{75} -'xrdef {Testing Flags-snt}{Section'tie7.3} -'xrdef {Functions-title}{Functions for Transforming Text} -'xrdef {Functions-pg}{77} -'xrdef {Functions-snt}{Chapter'tie8} -'xrdef {Syntax of Functions-title}{Function Call Syntax} -'xrdef {Syntax of Functions-pg}{77} -'xrdef {Syntax of Functions-snt}{Section'tie8.1} -'xrdef {Text Functions-title}{Functions for String Substitution and Analysis} -'xrdef {Text Functions-pg}{78} -'xrdef {Text Functions-snt}{Section'tie8.2} -'xrdef {Filename Functions-title}{Functions for File Names} -'xrdef {Filename Functions-pg}{81} -'xrdef {Filename Functions-snt}{Section'tie8.3} -'xrdef {Foreach Function-title}{The \code {foreach} Function} -'xrdef {Foreach Function-pg}{83} -'xrdef {Foreach Function-snt}{Section'tie8.4} -'xrdef {Origin Function-title}{The \code {origin} Function} -'xrdef {Origin Function-pg}{85} -'xrdef {Origin Function-snt}{Section'tie8.5} -'xrdef {Shell Function-title}{The \code {shell} Function} -'xrdef {Shell Function-pg}{87} -'xrdef {Shell Function-snt}{Section'tie8.6} -'xrdef {Running-title}{How to Run \code {make}} -'xrdef {Running-pg}{89} -'xrdef {Running-snt}{Chapter'tie9} -'xrdef {Makefile Arguments-title}{Arguments to Specify the Makefile} -'xrdef {Makefile Arguments-pg}{89} -'xrdef {Makefile Arguments-snt}{Section'tie9.1} -'xrdef {Goals-title}{Arguments to Specify the Goals} -'xrdef {Goals-pg}{90} -'xrdef {Goals-snt}{Section'tie9.2} -'xrdef {Instead of Execution-title}{Instead of Executing the Commands} -'xrdef {Instead of Execution-pg}{91} -'xrdef {Instead of Execution-snt}{Section'tie9.3} -'xrdef {Avoiding Compilation-title}{Avoiding Recompilation of Some Files} -'xrdef {Avoiding Compilation-pg}{93} -'xrdef {Avoiding Compilation-snt}{Section'tie9.4} -'xrdef {Overriding-title}{Overriding Variables} -'xrdef {Overriding-pg}{94} -'xrdef {Overriding-snt}{Section'tie9.5} -'xrdef {Testing-title}{Testing the Compilation of a Program} -'xrdef {Testing-pg}{95} -'xrdef {Testing-snt}{Section'tie9.6} -'xrdef {Options Summary-title}{Summary of Options} -'xrdef {Options Summary-pg}{95} -'xrdef {Options Summary-snt}{Section'tie9.7} -'xrdef {Implicit Rules-title}{Using Implicit Rules} -'xrdef {Implicit Rules-pg}{101} -'xrdef {Implicit Rules-snt}{Chapter'tie10} -'xrdef {Using Implicit-title}{Using Implicit Rules} -'xrdef {Using Implicit-pg}{101} -'xrdef {Using Implicit-snt}{Section'tie10.1} -'xrdef {Catalogue of Rules-title}{Catalogue of Implicit Rules} -'xrdef {Catalogue of Rules-pg}{103} -'xrdef {Catalogue of Rules-snt}{Section'tie10.2} -'xrdef {Implicit Variables-title}{Variables Used by Implicit Rules} -'xrdef {Implicit Variables-pg}{106} -'xrdef {Implicit Variables-snt}{Section'tie10.3} -'xrdef {Chained Rules-title}{Chains of Implicit Rules} -'xrdef {Chained Rules-pg}{108} -'xrdef {Chained Rules-snt}{Section'tie10.4} -'xrdef {Pattern Rules-title}{Defining and Redefining Pattern Rules} -'xrdef {Pattern Rules-pg}{109} -'xrdef {Pattern Rules-snt}{Section'tie10.5} -'xrdef {Pattern Intro-title}{Introduction to Pattern Rules} -'xrdef {Pattern Intro-pg}{110} -'xrdef {Pattern Intro-snt}{Section'tie10.5.1} -'xrdef {Pattern Examples-title}{Pattern Rule Examples} -'xrdef {Pattern Examples-pg}{111} -'xrdef {Pattern Examples-snt}{Section'tie10.5.2} -'xrdef {Automatic-title}{Automatic Variables} -'xrdef {Automatic-pg}{112} -'xrdef {Automatic-snt}{Section'tie10.5.3} -'xrdef {Pattern Match-title}{How Patterns Match} -'xrdef {Pattern Match-pg}{114} -'xrdef {Pattern Match-snt}{Section'tie10.5.4} -'xrdef {Match-Anything Rules-title}{Match-Anything Pattern Rules} -'xrdef {Match-Anything Rules-pg}{115} -'xrdef {Match-Anything Rules-snt}{Section'tie10.5.5} -'xrdef {Canceling Rules-title}{Canceling Implicit Rules} -'xrdef {Canceling Rules-pg}{116} -'xrdef {Canceling Rules-snt}{Section'tie10.5.6} -'xrdef {Last Resort-title}{Defining Last-Resort Default Rules} -'xrdef {Last Resort-pg}{116} -'xrdef {Last Resort-snt}{Section'tie10.6} -'xrdef {Suffix Rules-title}{Old-Fashioned Suffix Rules} -'xrdef {Suffix Rules-pg}{117} -'xrdef {Suffix Rules-snt}{Section'tie10.7} -'xrdef {Search Algorithm-title}{Implicit Rule Search Algorithm} -'xrdef {Search Algorithm-pg}{119} -'xrdef {Search Algorithm-snt}{Section'tie10.8} -'xrdef {Archives-title}{Using \code {make} to Update Archive Files} -'xrdef {Archives-pg}{121} -'xrdef {Archives-snt}{Chapter'tie11} -'xrdef {Archive Members-title}{Archive Members as Targets} -'xrdef {Archive Members-pg}{121} -'xrdef {Archive Members-snt}{Section'tie11.1} -'xrdef {Archive Update-title}{Implicit Rule for Archive Member Targets} -'xrdef {Archive Update-pg}{122} -'xrdef {Archive Update-snt}{Section'tie11.2} -'xrdef {Archive Symbols-title}{Updating Archive Symbol Directories} -'xrdef {Archive Symbols-pg}{123} -'xrdef {Archive Symbols-snt}{Section'tie11.2.1} -'xrdef {Archive Pitfalls-title}{Dangers When Using Archives} -'xrdef {Archive Pitfalls-pg}{123} -'xrdef {Archive Pitfalls-snt}{Section'tie11.3} -'xrdef {Archive Suffix Rules-title}{Suffix Rules for Archive Files} -'xrdef {Archive Suffix Rules-pg}{124} -'xrdef {Archive Suffix Rules-snt}{Section'tie11.4} -'xrdef {Features-title}{Features of GNU \code {make}} -'xrdef {Features-pg}{125} -'xrdef {Features-snt}{Chapter'tie12} -'xrdef {Missing-title}{Incompatibilities and Missing Features} -'xrdef {Missing-pg}{129} -'xrdef {Missing-snt}{Chapter'tie13} -'xrdef {Makefile Conventions-title}{Makefile Conventions} -'xrdef {Makefile Conventions-pg}{131} -'xrdef {Makefile Conventions-snt}{Chapter'tie14} -'xrdef {Makefile Basics-title}{General Conventions for Makefiles} -'xrdef {Makefile Basics-pg}{131} -'xrdef {Makefile Basics-snt}{Section'tie14.1} -'xrdef {Utilities in Makefiles-title}{Utilities in Makefiles} -'xrdef {Utilities in Makefiles-pg}{132} -'xrdef {Utilities in Makefiles-snt}{Section'tie14.2} -'xrdef {Standard Targets-title}{Standard Targets for Users} -'xrdef {Standard Targets-pg}{133} -'xrdef {Standard Targets-snt}{Section'tie14.3} -'xrdef {Command Variables-title}{Variables for Specifying Commands} -'xrdef {Command Variables-pg}{136} -'xrdef {Command Variables-snt}{Section'tie14.4} -'xrdef {Directory Variables-title}{Variables for Installation Directories} -'xrdef {Directory Variables-pg}{138} -'xrdef {Directory Variables-snt}{Section'tie14.5} -'xrdef {Quick Reference-title}{Quick Reference} -'xrdef {Quick Reference-pg}{143} -'xrdef {Quick Reference-snt}{Appendix'tie'char65{}} -'xrdef {Complex Makefile-title}{Complex Makefile Example} -'xrdef {Complex Makefile-pg}{149} -'xrdef {Complex Makefile-snt}{Appendix'tie'char66{}} -'xrdef {Concept Index-title}{Index of Concepts} -'xrdef {Concept Index-pg}{155} -'xrdef {Concept Index-snt}{} -'xrdef {Name Index-title}{Index of Functions, Variables, & Directives} -'xrdef {Name Index-pg}{165} -'xrdef {Name Index-snt}{} diff --git a/buildtools/windows/source/make/make.cp b/buildtools/windows/source/make/make.cp deleted file mode 100644 index 04d05fb047e..00000000000 --- a/buildtools/windows/source/make/make.cp +++ /dev/null @@ -1,701 +0,0 @@ -\entry {POSIX}{1}{POSIX} -\entry {IEEE Standard 1003.2}{1}{IEEE Standard 1003.2} -\entry {standards conformance}{1}{standards conformance} -\entry {reporting bugs}{2}{reporting bugs} -\entry {bugs, reporting}{2}{bugs, reporting} -\entry {problems and bugs, reporting}{2}{problems and bugs, reporting} -\entry {makefile}{5}{makefile} -\entry {recompilation}{5}{recompilation} -\entry {editor}{5}{editor} -\entry {rule, introduction to}{5}{rule, introduction to} -\entry {makefile rule parts}{5}{makefile rule parts} -\entry {parts of makefile rule}{5}{parts of makefile rule} -\entry {targets, introduction to}{5}{targets, introduction to} -\entry {dependencies, introduction to}{5}{dependencies, introduction to} -\entry {commands, introduction to}{5}{commands, introduction to} -\entry {tabs in rules}{5}{tabs in rules} -\entry {simple makefile}{6}{simple makefile} -\entry {makefile, simple}{6}{makefile, simple} -\entry {continuation lines}{7}{continuation lines} -\entry {{\tt\indexbackslash } (backslash), for continuation lines}{7}{\code {{\tt\indexbackslash }} (backslash), for continuation lines} -\entry {backslash ({\tt\indexbackslash }), for continuation lines}{7}{backslash (\code {{\tt\indexbackslash }}), for continuation lines} -\entry {quoting newline, in makefile}{7}{quoting newline, in makefile} -\entry {newline, quoting, in makefile}{7}{newline, quoting, in makefile} -\entry {shell command}{8}{shell command} -\entry {clean target}{8}{\code {clean} target} -\entry {rm (shell command)}{8}{\code {rm} (shell command)} -\entry {processing a makefile}{8}{processing a makefile} -\entry {makefile, how make processes}{8}{makefile, how \code {make} processes} -\entry {default goal}{8}{default goal} -\entry {goal, default}{8}{goal, default} -\entry {goal}{8}{goal} -\entry {relinking}{9}{relinking} -\entry {variables}{9}{variables} -\entry {simplifying with variables}{9}{simplifying with variables} -\entry {objects}{9}{\code {objects}} -\entry {OBJECTS}{9}{\code {OBJECTS}} -\entry {objs}{9}{\code {objs}} -\entry {OBJS}{9}{\code {OBJS}} -\entry {obj}{9}{\code {obj}} -\entry {OBJ}{9}{\code {OBJ}} -\entry {deducing commands (implicit rules)}{10}{deducing commands (implicit rules)} -\entry {implicit rule, introduction to}{10}{implicit rule, introduction to} -\entry {rule, implicit, introduction to}{10}{rule, implicit, introduction to} -\entry {combining rules by dependency}{11}{combining rules by dependency} -\entry {cleaning up}{12}{cleaning up} -\entry {removing, to clean up}{12}{removing, to clean up} -\entry {clean target}{12}{\code {clean} target} -\entry {makefile, how to write}{13}{makefile, how to write} -\entry {rule, explicit, definition of}{13}{rule, explicit, definition of} -\entry {explicit rule, definition of}{13}{explicit rule, definition of} -\entry {rule, implicit, definition of}{13}{rule, implicit, definition of} -\entry {implicit rule, definition of}{13}{implicit rule, definition of} -\entry {variable definition}{13}{variable definition} -\entry {directive}{13}{directive} -\entry {comments, in makefile}{13}{comments, in makefile} -\entry {# (comments), in makefile}{13}{\code {#} (comments), in makefile} -\entry {makefile name}{14}{makefile name} -\entry {name of makefile}{14}{name of makefile} -\entry {default makefile name}{14}{default makefile name} -\entry {file name of makefile}{14}{file name of makefile} -\entry {README}{14}{\code {README}} -\entry {-f}{14}{\code {-f}} -\entry {--file}{14}{\code {--file}} -\entry {--makefile}{14}{\code {--makefile}} -\entry {specifying makefile name}{14}{specifying makefile name} -\entry {makefile name, how to specify}{14}{makefile name, how to specify} -\entry {name of makefile, how to specify}{14}{name of makefile, how to specify} -\entry {file name of makefile, how to specify}{14}{file name of makefile, how to specify} -\entry {including other makefiles}{14}{including other makefiles} -\entry {makefile, including}{14}{makefile, including} -\entry {shell file name pattern (in include)}{14}{shell file name pattern (in \code {include})} -\entry {shell wildcards (in include)}{14}{shell wildcards (in \code {include})} -\entry {wildcard, in include}{14}{wildcard, in \code {include}} -\entry {dependencies, automatic generation}{15}{dependencies, automatic generation} -\entry {automatic generation of dependencies}{15}{automatic generation of dependencies} -\entry {generating dependencies automatically}{15}{generating dependencies automatically} -\entry {-I}{15}{\code {-I}} -\entry {--include-dir}{15}{\code {--include-dir}} -\entry {makefile, and MAKEFILES variable}{16}{makefile, and \code {MAKEFILES} variable} -\entry {including (MAKEFILES variable)}{16}{including (\code {MAKEFILES} variable)} -\entry {recursion, and MAKEFILES variable}{16}{recursion, and \code {MAKEFILES} variable} -\entry {updating makefiles}{16}{updating makefiles} -\entry {remaking makefiles}{16}{remaking makefiles} -\entry {makefile, remaking of}{16}{makefile, remaking of} -\entry {overriding makefiles}{18}{overriding makefiles} -\entry {makefile, overriding}{18}{makefile, overriding} -\entry {match-anything rule, used to override}{18}{match-anything rule, used to override} -\entry {writing rules}{19}{writing rules} -\entry {rule, how to write}{19}{rule, how to write} -\entry {target}{19}{target} -\entry {dependency}{19}{dependency} -\entry {default goal}{19}{default goal} -\entry {goal, default}{19}{goal, default} -\entry {rule syntax}{19}{rule syntax} -\entry {syntax of rules}{19}{syntax of rules} -\entry {targets}{19}{targets} -\entry {rule targets}{19}{rule targets} -\entry {commands}{19}{commands} -\entry {tab character (in commands)}{19}{tab character (in commands)} -\entry {dollar sign ($), in rules}{20}{dollar sign (\code {$}), in rules} -\entry {$, in rules}{20}{\code {$}, in rules} -\entry {rule, and $}{20}{rule, and \code {$}} -\entry {dependencies}{20}{dependencies} -\entry {rule dependencies}{20}{rule dependencies} -\entry {wildcard}{20}{wildcard} -\entry {file name with wildcards}{20}{file name with wildcards} -\entry {globbing (wildcards)}{20}{globbing (wildcards)} -\entry {* (wildcard character)}{20}{\code {*} (wildcard character)} -\entry {? (wildcard character)}{20}{\code {?} (wildcard character)} -\entry {[...{}] (wildcard characters)}{20}{\code {[\dots {}]} (wildcard characters)} -\entry {{\tt\char'176} (tilde)}{20}{\code {{\tt\char'176}} (tilde)} -\entry {tilde ({\tt\char'176})}{20}{tilde (\code {{\tt\char'176}})} -\entry {home directory}{20}{home directory} -\entry {rm (shell command)}{21}{\code {rm} (shell command)} -\entry {print target}{21}{\code {print} target} -\entry {lpr (shell command)}{21}{\code {lpr} (shell command)} -\entry {touch (shell command)}{21}{\code {touch} (shell command)} -\entry {wildcard pitfalls}{22}{wildcard pitfalls} -\entry {pitfalls of wildcards}{22}{pitfalls of wildcards} -\entry {mistakes with wildcards}{22}{mistakes with wildcards} -\entry {errors with wildcards}{22}{errors with wildcards} -\entry {problems with wildcards}{22}{problems with wildcards} -\entry {vpath}{23}{vpath} -\entry {search path for dependencies (VPATH)}{23}{search path for dependencies (\code {VPATH})} -\entry {directory search (VPATH)}{23}{directory search (\code {VPATH})} -\entry {%, quoting in vpath}{25}{\code {%}, quoting in \code {vpath}} -\entry {%, quoting with {\tt\indexbackslash } (backslash)}{25}{\code {%}, quoting with \code {{\tt\indexbackslash }} (backslash)} -\entry {{\tt\indexbackslash } (backslash), to quote %}{25}{\code {{\tt\indexbackslash }} (backslash), to quote \code {%}} -\entry {backslash ({\tt\indexbackslash }), to quote %}{25}{backslash (\code {{\tt\indexbackslash }}), to quote \code {%}} -\entry {quoting %, in vpath}{25}{quoting \code {%}, in \code {vpath}} -\entry {shell command, and directory search}{26}{shell command, and directory search} -\entry {directory search (VPATH), and shell commands}{26}{directory search (\code {VPATH}), and shell commands} -\entry {VPATH, and implicit rules}{27}{\code {VPATH}, and implicit rules} -\entry {directory search (VPATH), and implicit rules}{27}{directory search (\code {VPATH}), and implicit rules} -\entry {search path for dependencies (VPATH), and implicit rules}{27}{search path for dependencies (\code {VPATH}), and implicit rules} -\entry {implicit rule, and directory search}{27}{implicit rule, and directory search} -\entry {implicit rule, and VPATH}{27}{implicit rule, and \code {VPATH}} -\entry {rule, implicit, and directory search}{27}{rule, implicit, and directory search} -\entry {rule, implicit, and VPATH}{27}{rule, implicit, and \code {VPATH}} -\entry {link libraries, and directory search}{27}{link libraries, and directory search} -\entry {libraries for linking, directory search}{27}{libraries for linking, directory search} -\entry {directory search (VPATH), and link libraries}{27}{directory search (\code {VPATH}), and link libraries} -\entry {VPATH, and link libraries}{27}{\code {VPATH}, and link libraries} -\entry {search path for dependencies (VPATH), and link libraries}{27}{search path for dependencies (\code {VPATH}), and link libraries} -\entry {-l (library search)}{27}{\code {-l} (library search)} -\entry {phony targets}{28}{phony targets} -\entry {targets, phony}{28}{targets, phony} -\entry {targets without a file}{28}{targets without a file} -\entry {rm (shell command)}{28}{\code {rm} (shell command)} -\entry {force targets}{30}{force targets} -\entry {targets, force}{30}{targets, force} -\entry {FORCE}{30}{\code {FORCE}} -\entry {rule, no commands or dependencies}{30}{rule, no commands or dependencies} -\entry {empty targets}{30}{empty targets} -\entry {targets, empty}{30}{targets, empty} -\entry {recording events with empty targets}{30}{recording events with empty targets} -\entry {print target}{30}{\code {print} target} -\entry {lpr (shell command)}{30}{\code {lpr} (shell command)} -\entry {touch (shell command)}{30}{\code {touch} (shell command)} -\entry {special targets}{31}{special targets} -\entry {built-in special targets}{31}{built-in special targets} -\entry {targets, built-in special}{31}{targets, built-in special} -\entry {precious targets}{31}{precious targets} -\entry {preserving with .PRECIOUS}{31}{preserving with \code {.PRECIOUS}} -\entry {multiple targets}{32}{multiple targets} -\entry {several targets in a rule}{32}{several targets in a rule} -\entry {targets, multiple}{32}{targets, multiple} -\entry {rule, with multiple targets}{32}{rule, with multiple targets} -\entry {multiple rules for one target}{33}{multiple rules for one target} -\entry {several rules for one target}{33}{several rules for one target} -\entry {rule, multiple for one target}{33}{rule, multiple for one target} -\entry {target, multiple rules for one}{33}{target, multiple rules for one} -\entry {static pattern rule}{34}{static pattern rule} -\entry {rule, static pattern}{34}{rule, static pattern} -\entry {pattern rules, static (not implicit)}{34}{pattern rules, static (not implicit)} -\entry {varying dependencies}{34}{varying dependencies} -\entry {dependencies, varying (static pattern)}{34}{dependencies, varying (static pattern)} -\entry {static pattern rule, syntax of}{34}{static pattern rule, syntax of} -\entry {pattern rules, static, syntax of}{34}{pattern rules, static, syntax of} -\entry {target pattern, static (not implicit)}{35}{target pattern, static (not implicit)} -\entry {stem}{35}{stem} -\entry {dependency pattern, static (not implicit)}{35}{dependency pattern, static (not implicit)} -\entry {%, quoting in static pattern}{35}{\code {%}, quoting in static pattern} -\entry {%, quoting with {\tt\indexbackslash } (backslash)}{35}{\code {%}, quoting with \code {{\tt\indexbackslash }} (backslash)} -\entry {{\tt\indexbackslash } (backslash), to quote %}{35}{\code {{\tt\indexbackslash }} (backslash), to quote \code {%}} -\entry {backslash ({\tt\indexbackslash }), to quote %}{35}{backslash (\code {{\tt\indexbackslash }}), to quote \code {%}} -\entry {quoting %, in static pattern}{35}{quoting \code {%}, in static pattern} -\entry {rule, static pattern versus implicit}{36}{rule, static pattern versus implicit} -\entry {static pattern rule, versus implicit}{36}{static pattern rule, versus implicit} -\entry {double-colon rules}{37}{double-colon rules} -\entry {rule, double-colon (::)}{37}{rule, double-colon (\code {::})} -\entry {multiple rules for one target (::)}{37}{multiple rules for one target (\code {::})} -\entry {:: rules (double-colon)}{37}{\code {::} rules (double-colon)} -\entry {dependencies, automatic generation}{37}{dependencies, automatic generation} -\entry {automatic generation of dependencies}{37}{automatic generation of dependencies} -\entry {generating dependencies automatically}{37}{generating dependencies automatically} -\entry {#include}{38}{\code {#include}} -\entry {-M (to compiler)}{38}{\code {-M} (to compiler)} -\entry {make depend}{38}{\code {make depend}} -\entry {-e (shell flag)}{39}{\code {-e} (shell flag)} -\entry {-MM (to GNU compiler)}{39}{\code {-MM} (to GNU compiler)} -\entry {sed (shell command)}{39}{\code {sed} (shell command)} -\entry {.d}{39}{\code {.d}} -\entry {commands, how to write}{41}{commands, how to write} -\entry {rule commands}{41}{rule commands} -\entry {writing rule commands}{41}{writing rule commands} -\entry {comments, in commands}{41}{comments, in commands} -\entry {commands, comments in}{41}{commands, comments in} -\entry {# (comments), in commands}{41}{\code {#} (comments), in commands} -\entry {echoing of commands}{41}{echoing of commands} -\entry {silent operation}{41}{silent operation} -\entry {{\tt\char'100} (in commands)}{41}{\code {{\tt\char'100}} (in commands)} -\entry {commands, echoing}{41}{commands, echoing} -\entry {printing of commands}{41}{printing of commands} -\entry {-n}{41}{\code {-n}} -\entry {--just-print}{41}{\code {--just-print}} -\entry {--dry-run}{41}{\code {--dry-run}} -\entry {--recon}{41}{\code {--recon}} -\entry {-s}{41}{\code {-s}} -\entry {--silent}{41}{\code {--silent}} -\entry {--quiet}{41}{\code {--quiet}} -\entry {commands, execution}{42}{commands, execution} -\entry {execution, of commands}{42}{execution, of commands} -\entry {shell command, execution}{42}{shell command, execution} -\entry {cd (shell command)}{42}{\code {cd} (shell command)} -\entry {commands, backslash ({\tt\indexbackslash }) in}{42}{commands, backslash (\code {{\tt\indexbackslash }}) in} -\entry {commands, quoting newlines in}{42}{commands, quoting newlines in} -\entry {backslash ({\tt\indexbackslash }), in commands}{42}{backslash (\code {{\tt\indexbackslash }}), in commands} -\entry {{\tt\indexbackslash } (backslash), in commands}{42}{\code {{\tt\indexbackslash }} (backslash), in commands} -\entry {quoting newline, in commands}{42}{quoting newline, in commands} -\entry {newline, quoting, in commands}{42}{newline, quoting, in commands} -\entry {environment, SHELL in}{42}{environment, \code {SHELL} in} -\entry {commands, execution in parallel}{42}{commands, execution in parallel} -\entry {parallel execution}{42}{parallel execution} -\entry {execution, in parallel}{42}{execution, in parallel} -\entry {job slots}{42}{job slots} -\entry {-j}{42}{\code {-j}} -\entry {--jobs}{42}{\code {--jobs}} -\entry {broken pipe}{43}{broken pipe} -\entry {standard input}{43}{standard input} -\entry {load average}{43}{load average} -\entry {limiting jobs based on load}{43}{limiting jobs based on load} -\entry {jobs, limiting based on load}{43}{jobs, limiting based on load} -\entry {-l (load average)}{43}{\code {-l} (load average)} -\entry {--max-load}{43}{\code {--max-load}} -\entry {--load-average}{43}{\code {--load-average}} -\entry {errors (in commands)}{44}{errors (in commands)} -\entry {commands, errors in}{44}{commands, errors in} -\entry {exit status (errors)}{44}{exit status (errors)} -\entry {- (in commands)}{44}{\code {-} (in commands)} -\entry {rm (shell command)}{44}{\code {rm} (shell command)} -\entry {-i}{44}{\code {-i}} -\entry {--ignore-errors}{44}{\code {--ignore-errors}} -\entry {-k}{45}{\code {-k}} -\entry {--keep-going}{45}{\code {--keep-going}} -\entry {Emacs (M-x compile)}{45}{Emacs (\code {M-x compile})} -\entry {deletion of target files}{45}{deletion of target files} -\entry {removal of target files}{45}{removal of target files} -\entry {target, deleting on error}{45}{target, deleting on error} -\entry {interrupt}{45}{interrupt} -\entry {signal}{45}{signal} -\entry {deletion of target files}{45}{deletion of target files} -\entry {removal of target files}{45}{removal of target files} -\entry {target, deleting on interrupt}{45}{target, deleting on interrupt} -\entry {killing (interruption)}{45}{killing (interruption)} -\entry {recursion}{46}{recursion} -\entry {subdirectories, recursion for}{46}{subdirectories, recursion for} -\entry {-C}{46}{\code {-C}} -\entry {--directory}{46}{\code {--directory}} -\entry {recursion, and MAKE variable}{46}{recursion, and \code {MAKE} variable} -\entry {cd (shell command)}{47}{\code {cd} (shell command)} -\entry {-t, and recursion}{47}{\code {-t}, and recursion} -\entry {recursion, and -t}{47}{recursion, and \code {-t}} -\entry {--touch, and recursion}{47}{\code {--touch}, and recursion} -\entry {sub-make}{47}{sub-\code {make}} -\entry {environment, and recursion}{47}{environment, and recursion} -\entry {exporting variables}{47}{exporting variables} -\entry {variables, environment}{47}{variables, environment} -\entry {variables, exporting}{47}{variables, exporting} -\entry {recursion, and environment}{47}{recursion, and environment} -\entry {recursion, and variables}{47}{recursion, and variables} -\entry {compatibility in exporting}{49}{compatibility in exporting} -\entry {recursion, level of}{49}{recursion, level of} -\entry {options, and recursion}{50}{options, and recursion} -\entry {recursion, and options}{50}{recursion, and options} -\entry {command line variable definitions, and recursion}{50}{command line variable definitions, and recursion} -\entry {variables, command line, and recursion}{50}{variables, command line, and recursion} -\entry {recursion, and command line variable definitions}{50}{recursion, and command line variable definitions} -\entry {-C, and recursion}{50}{\code {-C}, and recursion} -\entry {-f, and recursion}{50}{\code {-f}, and recursion} -\entry {-o, and recursion}{50}{\code {-o}, and recursion} -\entry {-W, and recursion}{50}{\code {-W}, and recursion} -\entry {--directory, and recursion}{50}{\code {--directory}, and recursion} -\entry {--file, and recursion}{50}{\code {--file}, and recursion} -\entry {--old-file, and recursion}{50}{\code {--old-file}, and recursion} -\entry {--assume-old, and recursion}{50}{\code {--assume-old}, and recursion} -\entry {--assume-new, and recursion}{50}{\code {--assume-new}, and recursion} -\entry {--new-file, and recursion}{50}{\code {--new-file}, and recursion} -\entry {recursion, and -C}{50}{recursion, and \code {-C}} -\entry {recursion, and -f}{50}{recursion, and \code {-f}} -\entry {recursion, and -o}{50}{recursion, and \code {-o}} -\entry {recursion, and -W}{50}{recursion, and \code {-W}} -\entry {-j, and recursion}{50}{\code {-j}, and recursion} -\entry {--jobs, and recursion}{50}{\code {--jobs}, and recursion} -\entry {recursion, and -j}{50}{recursion, and \code {-j}} -\entry {job slots, and recursion}{50}{job slots, and recursion} -\entry {Arg list too long}{51}{Arg list too long} -\entry {E2BIG}{51}{E2BIG} -\entry {POSIX.2}{51}{POSIX.2} -\entry {setting options from environment}{51}{setting options from environment} -\entry {options, setting from environment}{51}{options, setting from environment} -\entry {setting options in makefiles}{51}{setting options in makefiles} -\entry {options, setting in makefiles}{51}{options, setting in makefiles} -\entry {directories, printing them}{52}{directories, printing them} -\entry {printing directories}{52}{printing directories} -\entry {recursion, and printing directories}{52}{recursion, and printing directories} -\entry {-C, and -w}{52}{\code {-C}, and \code {-w}} -\entry {--directory, and --print-directory}{52}{\code {--directory}, and \code {--print-directory}} -\entry {recursion, and -w}{52}{recursion, and \code {-w}} -\entry {-w, and -C}{52}{\code {-w}, and \code {-C}} -\entry {-w, and recursion}{52}{\code {-w}, and recursion} -\entry {--print-directory, and --directory}{52}{\code {--print-directory}, and \code {--directory}} -\entry {--print-directory, and recursion}{52}{\code {--print-directory}, and recursion} -\entry {--no-print-directory}{52}{\code {--no-print-directory}} -\entry {--print-directory, disabling}{52}{\code {--print-directory}, disabling} -\entry {-w, disabling}{52}{\code {-w}, disabling} -\entry {sequences of commands}{52}{sequences of commands} -\entry {commands, sequences of}{52}{commands, sequences of} -\entry {yacc}{53}{\code {yacc}} -\entry {{\tt\char'100}, and define}{53}{{\tt\char'100}, and \code {define}} -\entry {-, and define}{53}{-, and \code {define}} -\entry {{\tt\char43}, and define}{53}{{\tt\char43}, and \code {define}} -\entry {empty commands}{54}{empty commands} -\entry {commands, empty}{54}{commands, empty} -\entry {variable}{55}{variable} -\entry {value}{55}{value} -\entry {recursive variable expansion}{55}{recursive variable expansion} -\entry {simple variable expansion}{55}{simple variable expansion} -\entry {macro}{55}{macro} -\entry {variables, how to reference}{55}{variables, how to reference} -\entry {reference to variables}{55}{reference to variables} -\entry {$, in variable reference}{55}{\code {$}, in variable reference} -\entry {dollar sign ($), in variable reference}{55}{dollar sign (\code {$}), in variable reference} -\entry {flavors of variables}{56}{flavors of variables} -\entry {recursive variable expansion}{56}{recursive variable expansion} -\entry {variables, flavors}{56}{variables, flavors} -\entry {recursively expanded variables}{56}{recursively expanded variables} -\entry {variables, recursively expanded}{56}{variables, recursively expanded} -\entry {=}{56}{=} -\entry {loops in variable expansion}{57}{loops in variable expansion} -\entry {variables, loops in expansion}{57}{variables, loops in expansion} -\entry {simply expanded variables}{57}{simply expanded variables} -\entry {variables, simply expanded}{57}{variables, simply expanded} -\entry {:=}{57}{:=} -\entry {spaces, in variable values}{58}{spaces, in variable values} -\entry {whitespace, in variable values}{58}{whitespace, in variable values} -\entry {variables, spaces in values}{58}{variables, spaces in values} -\entry {reference to variables}{59}{reference to variables} -\entry {modified variable reference}{59}{modified variable reference} -\entry {substitution variable reference}{59}{substitution variable reference} -\entry {variables, modified reference}{59}{variables, modified reference} -\entry {variables, substitution reference}{59}{variables, substitution reference} -\entry {variables, substituting suffix in}{59}{variables, substituting suffix in} -\entry {suffix, substituting in variables}{59}{suffix, substituting in variables} -\entry {nested variable reference}{60}{nested variable reference} -\entry {computed variable name}{60}{computed variable name} -\entry {variables, computed names}{60}{variables, computed names} -\entry {variables, nested references}{60}{variables, nested references} -\entry {variables, $ in name}{60}{variables, \samp {$} in name} -\entry {$, in variable name}{60}{\code {$}, in variable name} -\entry {dollar sign ($), in variable name}{60}{dollar sign (\code {$}), in variable name} -\entry {variables, how they get their values}{63}{variables, how they get their values} -\entry {value, how a variable gets it}{63}{value, how a variable gets it} -\entry {setting variables}{63}{setting variables} -\entry {variables, setting}{63}{variables, setting} -\entry {=}{63}{=} -\entry {:=}{63}{:=} -\entry {{\tt\char43}=}{64}{{\tt\char43}=} -\entry {appending to variables}{64}{appending to variables} -\entry {variables, appending to}{64}{variables, appending to} -\entry {overriding with override}{66}{overriding with \code {override}} -\entry {variables, overriding}{66}{variables, overriding} -\entry {verbatim variable definition}{67}{verbatim variable definition} -\entry {defining variables verbatim}{67}{defining variables verbatim} -\entry {variables, defining verbatim}{67}{variables, defining verbatim} -\entry {variables, environment}{68}{variables, environment} -\entry {environment}{68}{environment} -\entry {conditionals}{71}{conditionals} -\entry {functions}{77}{functions} -\entry {$, in function call}{77}{\code {$}, in function call} -\entry {dollar sign ($), in function call}{77}{dollar sign (\code {$}), in function call} -\entry {arguments of functions}{77}{arguments of functions} -\entry {functions, syntax of}{77}{functions, syntax of} -\entry {functions, for text}{78}{functions, for text} -\entry {%, quoting in patsubst}{78}{\code {%}, quoting in \code {patsubst}} -\entry {%, quoting with {\tt\indexbackslash } (backslash)}{78}{\code {%}, quoting with \code {{\tt\indexbackslash }} (backslash)} -\entry {{\tt\indexbackslash } (backslash), to quote %}{78}{\code {{\tt\indexbackslash }} (backslash), to quote \code {%}} -\entry {backslash ({\tt\indexbackslash }), to quote %}{78}{backslash (\code {{\tt\indexbackslash }}), to quote \code {%}} -\entry {quoting %, in patsubst}{78}{quoting \code {%}, in \code {patsubst}} -\entry {stripping whitespace}{79}{stripping whitespace} -\entry {whitespace, stripping}{79}{whitespace, stripping} -\entry {spaces, stripping}{79}{spaces, stripping} -\entry {searching for strings}{79}{searching for strings} -\entry {finding strings}{79}{finding strings} -\entry {strings, searching for}{79}{strings, searching for} -\entry {filtering words}{80}{filtering words} -\entry {words, filtering}{80}{words, filtering} -\entry {filtering out words}{80}{filtering out words} -\entry {words, filtering out}{80}{words, filtering out} -\entry {sorting words}{80}{sorting words} -\entry {removing duplicate words}{80}{removing duplicate words} -\entry {duplicate words, removing}{80}{duplicate words, removing} -\entry {words, removing duplicates}{80}{words, removing duplicates} -\entry {functions, for file names}{81}{functions, for file names} -\entry {file name functions}{81}{file name functions} -\entry {directory part}{81}{directory part} -\entry {file name, directory part}{81}{file name, directory part} -\entry {file name, nondirectory part}{81}{file name, nondirectory part} -\entry {nondirectory part}{81}{nondirectory part} -\entry {suffix, function to find}{82}{suffix, function to find} -\entry {file name suffix}{82}{file name suffix} -\entry {basename}{82}{basename} -\entry {file name, basename of}{82}{file name, basename of} -\entry {suffix, adding}{82}{suffix, adding} -\entry {file name suffix, adding}{82}{file name suffix, adding} -\entry {prefix, adding}{82}{prefix, adding} -\entry {file name prefix, adding}{82}{file name prefix, adding} -\entry {joining lists of words}{82}{joining lists of words} -\entry {words, joining lists}{82}{words, joining lists} -\entry {words, selecting}{83}{words, selecting} -\entry {selecting words}{83}{selecting words} -\entry {words, finding number}{83}{words, finding number} -\entry {words, extracting first}{83}{words, extracting first} -\entry {wildcard, function}{83}{wildcard, function} -\entry {words, iterating over}{83}{words, iterating over} -\entry {variables, origin of}{85}{variables, origin of} -\entry {origin of variable}{85}{origin of variable} -\entry {commands, expansion}{87}{commands, expansion} -\entry {backquotes}{87}{backquotes} -\entry {shell command, function for}{87}{shell command, function for} -\entry {--file}{89}{\code {--file}} -\entry {--makefile}{89}{\code {--makefile}} -\entry {-f}{89}{\code {-f}} -\entry {goal, how to specify}{90}{goal, how to specify} -\entry {all (standard target)}{91}{\code {all} \r {(standard target)}} -\entry {clean (standard target)}{91}{\code {clean} \r {(standard target)}} -\entry {mostlyclean (standard target)}{91}{\code {mostlyclean} \r {(standard target)}} -\entry {distclean (standard target)}{91}{\code {distclean} \r {(standard target)}} -\entry {realclean (standard target)}{91}{\code {realclean} \r {(standard target)}} -\entry {clobber (standard target)}{91}{\code {clobber} \r {(standard target)}} -\entry {install (standard target)}{91}{\code {install} \r {(standard target)}} -\entry {print (standard target)}{91}{\code {print} \r {(standard target)}} -\entry {tar (standard target)}{91}{\code {tar} \r {(standard target)}} -\entry {shar (standard target)}{91}{\code {shar} \r {(standard target)}} -\entry {dist (standard target)}{91}{\code {dist} \r {(standard target)}} -\entry {TAGS (standard target)}{91}{\code {TAGS} \r {(standard target)}} -\entry {check (standard target)}{91}{\code {check} \r {(standard target)}} -\entry {test (standard target)}{91}{\code {test} \r {(standard target)}} -\entry {execution, instead of}{91}{execution, instead of} -\entry {commands, instead of executing}{91}{commands, instead of executing} -\entry {--just-print}{91}{\code {--just-print}} -\entry {--dry-run}{91}{\code {--dry-run}} -\entry {--recon}{91}{\code {--recon}} -\entry {-n}{91}{\code {-n}} -\entry {--touch}{92}{\code {--touch}} -\entry {touching files}{92}{touching files} -\entry {target, touching}{92}{target, touching} -\entry {-t}{92}{\code {-t}} -\entry {--question}{92}{\code {--question}} -\entry {-q}{92}{\code {-q}} -\entry {question mode}{92}{question mode} -\entry {--what-if}{92}{\code {--what-if}} -\entry {-W}{92}{\code {-W}} -\entry {--assume-new}{92}{\code {--assume-new}} -\entry {--new-file}{92}{\code {--new-file}} -\entry {what if}{92}{what if} -\entry {files, assuming new}{92}{files, assuming new} -\entry {-o}{93}{\code {-o}} -\entry {--old-file}{93}{\code {--old-file}} -\entry {--assume-old}{93}{\code {--assume-old}} -\entry {files, assuming old}{93}{files, assuming old} -\entry {files, avoiding recompilation of}{93}{files, avoiding recompilation of} -\entry {recompilation, avoiding}{93}{recompilation, avoiding} -\entry {overriding variables with arguments}{94}{overriding variables with arguments} -\entry {variables, overriding with arguments}{94}{variables, overriding with arguments} -\entry {command line variables}{94}{command line variables} -\entry {variables, command line}{94}{variables, command line} -\entry {testing compilation}{95}{testing compilation} -\entry {compilation, testing}{95}{compilation, testing} -\entry {-k}{95}{\code {-k}} -\entry {--keep-going}{95}{\code {--keep-going}} -\entry {options}{95}{options} -\entry {flags}{95}{flags} -\entry {switches}{95}{switches} -\entry {-b}{95}{\code {-b}} -\entry {-m}{95}{\code {-m}} -\entry {-C}{95}{\code {-C}} -\entry {--directory}{95}{\code {--directory}} -\entry {-d}{96}{\code {-d}} -\entry {--debug}{96}{\code {--debug}} -\entry {-e}{96}{\code {-e}} -\entry {--environment-overrides}{96}{\code {--environment-overrides}} -\entry {-f}{96}{\code {-f}} -\entry {--file}{96}{\code {--file}} -\entry {--makefile}{96}{\code {--makefile}} -\entry {-h}{96}{\code {-h}} -\entry {--help}{96}{\code {--help}} -\entry {-i}{96}{\code {-i}} -\entry {--ignore-errors}{96}{\code {--ignore-errors}} -\entry {-I}{96}{\code {-I}} -\entry {--include-dir}{96}{\code {--include-dir}} -\entry {-j}{96}{\code {-j}} -\entry {--jobs}{96}{\code {--jobs}} -\entry {-k}{96}{\code {-k}} -\entry {--keep-going}{96}{\code {--keep-going}} -\entry {-l}{97}{\code {-l}} -\entry {--load-average}{97}{\code {--load-average}} -\entry {--max-load}{97}{\code {--max-load}} -\entry {-n}{97}{\code {-n}} -\entry {--just-print}{97}{\code {--just-print}} -\entry {--dry-run}{97}{\code {--dry-run}} -\entry {--recon}{97}{\code {--recon}} -\entry {-o}{97}{\code {-o}} -\entry {--old-file}{97}{\code {--old-file}} -\entry {--assume-old}{97}{\code {--assume-old}} -\entry {-p}{97}{\code {-p}} -\entry {--print-data-base}{97}{\code {--print-data-base}} -\entry {-q}{97}{\code {-q}} -\entry {--question}{97}{\code {--question}} -\entry {-r}{97}{\code {-r}} -\entry {--no-builtin-rules}{97}{\code {--no-builtin-rules}} -\entry {-s}{97}{\code {-s}} -\entry {--silent}{98}{\code {--silent}} -\entry {--quiet}{98}{\code {--quiet}} -\entry {-S}{98}{\code {-S}} -\entry {--no-keep-going}{98}{\code {--no-keep-going}} -\entry {--stop}{98}{\code {--stop}} -\entry {-t}{98}{\code {-t}} -\entry {--touch}{98}{\code {--touch}} -\entry {-v}{98}{\code {-v}} -\entry {--version}{98}{\code {--version}} -\entry {-w}{98}{\code {-w}} -\entry {--print-directory}{98}{\code {--print-directory}} -\entry {--no-print-directory}{98}{\code {--no-print-directory}} -\entry {-W}{98}{\code {-W}} -\entry {--what-if}{98}{\code {--what-if}} -\entry {--new-file}{98}{\code {--new-file}} -\entry {--assume-new}{98}{\code {--assume-new}} -\entry {--warn-undefined-variables}{99}{\code {--warn-undefined-variables}} -\entry {variables, warning for undefined}{99}{variables, warning for undefined} -\entry {undefined variables, warning message}{99}{undefined variables, warning message} -\entry {implicit rule}{101}{implicit rule} -\entry {rule, implicit}{101}{rule, implicit} -\entry {implicit rule, how to use}{101}{implicit rule, how to use} -\entry {rule, implicit, how to use}{101}{rule, implicit, how to use} -\entry {implicit rule, predefined}{103}{implicit rule, predefined} -\entry {rule, implicit, predefined}{103}{rule, implicit, predefined} -\entry {C, rule to compile}{103}{C, rule to compile} -\entry {cc}{103}{\code {cc}} -\entry {gcc}{103}{\code {gcc}} -\entry {.o}{103}{\code {.o}} -\entry {.c}{103}{\code {.c}} -\entry {C{\tt\char43}{\tt\char43}, rule to compile}{103}{C{\tt\char43}{\tt\char43}, rule to compile} -\entry {g{\tt\char43}{\tt\char43}}{103}{\code {g{\tt\char43}{\tt\char43}}} -\entry {.C}{103}{\code {.C}} -\entry {.cc}{103}{\code {.cc}} -\entry {Pascal, rule to compile}{103}{Pascal, rule to compile} -\entry {pc}{103}{\code {pc}} -\entry {.p}{103}{\code {.p}} -\entry {Fortran, rule to compile}{103}{Fortran, rule to compile} -\entry {Ratfor, rule to compile}{103}{Ratfor, rule to compile} -\entry {f77}{103}{\code {f77}} -\entry {.f}{103}{\code {.f}} -\entry {.r}{103}{\code {.r}} -\entry {.F}{103}{\code {.F}} -\entry {Modula-2, rule to compile}{104}{Modula-2, rule to compile} -\entry {m2c}{104}{\code {m2c}} -\entry {.sym}{104}{\code {.sym}} -\entry {.def}{104}{\code {.def}} -\entry {.mod}{104}{\code {.mod}} -\entry {assembly, rule to compile}{104}{assembly, rule to compile} -\entry {as}{104}{\code {as}} -\entry {.s}{104}{\code {.s}} -\entry {.S}{104}{\code {.S}} -\entry {linking, predefined rule for}{104}{linking, predefined rule for} -\entry {ld}{104}{\code {ld}} -\entry {.o}{104}{\code {.o}} -\entry {yacc}{105}{\code {yacc}} -\entry {Yacc, rule to run}{105}{Yacc, rule to run} -\entry {.y}{105}{\code {.y}} -\entry {lex}{105}{\code {lex}} -\entry {Lex, rule to run}{105}{Lex, rule to run} -\entry {.l}{105}{\code {.l}} -\entry {lint}{105}{\code {lint}} -\entry {lint, rule to run}{105}{\code {lint}, rule to run} -\entry {.ln}{105}{\code {.ln}} -\entry {TeX{}, rule to run}{105}{\TeX{}, rule to run} -\entry {Web, rule to run}{105}{Web, rule to run} -\entry {tex}{105}{\code {tex}} -\entry {cweave}{105}{\code {cweave}} -\entry {weave}{105}{\code {weave}} -\entry {tangle}{105}{\code {tangle}} -\entry {ctangle}{105}{\code {ctangle}} -\entry {.dvi}{105}{\code {.dvi}} -\entry {.tex}{105}{\code {.tex}} -\entry {.web}{105}{\code {.web}} -\entry {.w}{105}{\code {.w}} -\entry {.ch}{105}{\code {.ch}} -\entry {Texinfo, rule to format}{105}{Texinfo, rule to format} -\entry {Info, rule to format}{105}{Info, rule to format} -\entry {texi2dvi}{105}{\code {texi2dvi}} -\entry {makeinfo}{105}{\code {makeinfo}} -\entry {.texinfo}{105}{\code {.texinfo}} -\entry {.info}{105}{\code {.info}} -\entry {.texi}{105}{\code {.texi}} -\entry {.txinfo}{105}{\code {.txinfo}} -\entry {RCS, rule to extract from}{105}{RCS, rule to extract from} -\entry {co}{105}{\code {co}} -\entry {,v (RCS file extension)}{105}{\code {,v \r {(RCS file extension)}}} -\entry {SCCS, rule to extract from}{105}{SCCS, rule to extract from} -\entry {get}{105}{\code {get}} -\entry {s. (SCCS file prefix)}{105}{\code {s. \r {(SCCS file prefix)}}} -\entry {.sh}{105}{\code {.sh}} -\entry {flags for compilers}{106}{flags for compilers} -\entry {ar}{107}{\code {ar}} -\entry {as}{107}{\code {as}} -\entry {cc}{107}{\code {cc}} -\entry {g{\tt\char43}{\tt\char43}}{107}{\code {g{\tt\char43}{\tt\char43}}} -\entry {co}{107}{\code {co}} -\entry {f77}{107}{\code {f77}} -\entry {get}{107}{\code {get}} -\entry {lex}{107}{\code {lex}} -\entry {pc}{107}{\code {pc}} -\entry {yacc}{107}{\code {yacc}} -\entry {makeinfo}{107}{\code {makeinfo}} -\entry {tex}{107}{\code {tex}} -\entry {texi2dvi}{107}{\code {texi2dvi}} -\entry {weave}{107}{\code {weave}} -\entry {cweave}{107}{\code {cweave}} -\entry {tangle}{107}{\code {tangle}} -\entry {ctangle}{107}{\code {ctangle}} -\entry {rm}{107}{\code {rm}} -\entry {chains of rules}{108}{chains of rules} -\entry {rule, implicit, chains of}{108}{rule, implicit, chains of} -\entry {intermediate files}{108}{intermediate files} -\entry {files, intermediate}{108}{files, intermediate} -\entry {intermediate files, preserving}{109}{intermediate files, preserving} -\entry {preserving intermediate files}{109}{preserving intermediate files} -\entry {preserving with .PRECIOUS}{109}{preserving with \code {.PRECIOUS}} -\entry {.PRECIOUS intermediate files}{109}{\code {.PRECIOUS} intermediate files} -\entry {pattern rule}{110}{pattern rule} -\entry {rule, pattern}{110}{rule, pattern} -\entry {target pattern, implicit}{110}{target pattern, implicit} -\entry {%, in pattern rules}{110}{\code {%}, in pattern rules} -\entry {dependency pattern, implicit}{110}{dependency pattern, implicit} -\entry {multiple targets, in pattern rule}{110}{multiple targets, in pattern rule} -\entry {target, multiple in pattern rule}{110}{target, multiple in pattern rule} -\entry {pattern rules, order of}{111}{pattern rules, order of} -\entry {order of pattern rules}{111}{order of pattern rules} -\entry {automatic variables}{112}{automatic variables} -\entry {variables, automatic}{112}{variables, automatic} -\entry {variables, and implicit rule}{112}{variables, and implicit rule} -\entry {dependencies, list of changed}{112}{dependencies, list of changed} -\entry {list of changed dependencies}{112}{list of changed dependencies} -\entry {dependencies, list of all}{112}{dependencies, list of all} -\entry {list of all dependencies}{112}{list of all dependencies} -\entry {stem, variable for}{113}{stem, variable for} -\entry {stem}{114}{stem} -\entry {match-anything rule}{115}{match-anything rule} -\entry {terminal rule}{115}{terminal rule} -\entry {last-resort default rules}{116}{last-resort default rules} -\entry {default rules, last-resort}{116}{default rules, last-resort} -\entry {old-fashioned suffix rules}{117}{old-fashioned suffix rules} -\entry {suffix rule}{117}{suffix rule} -\entry {implicit rule, search algorithm}{119}{implicit rule, search algorithm} -\entry {search algorithm, implicit rule}{119}{search algorithm, implicit rule} -\entry {archive}{121}{archive} -\entry {archive member targets}{121}{archive member targets} -\entry {wildcard, in archive member}{121}{wildcard, in archive member} -\entry {{\_}{\_}.SYMDEF}{123}{\code {{\_}{\_}.SYMDEF}} -\entry {updating archive symbol directories}{123}{updating archive symbol directories} -\entry {archive symbol directory updating}{123}{archive symbol directory updating} -\entry {symbol directories, updating archive}{123}{symbol directories, updating archive} -\entry {directories, updating archive symbol}{123}{directories, updating archive symbol} -\entry {archive, and parallel execution}{123}{archive, and parallel execution} -\entry {parallel execution, and archive update}{123}{parallel execution, and archive update} -\entry {archive, and -j}{123}{archive, and \code {-j}} -\entry {-j, and archive update}{123}{\code {-j}, and archive update} -\entry {suffix rule, for archive}{124}{suffix rule, for archive} -\entry {archive, suffix rule for}{124}{archive, suffix rule for} -\entry {library archive, suffix rule for}{124}{library archive, suffix rule for} -\entry {.a (archives)}{124}{\code {.a} (archives)} -\entry {features of GNU make}{125}{features of GNU \code {make}} -\entry {portability}{125}{portability} -\entry {compatibility}{125}{compatibility} -\entry {incompatibilities}{129}{incompatibilities} -\entry {missing features}{129}{missing features} -\entry {features, missing}{129}{features, missing} -\entry {makefile, conventions for}{131}{makefile, conventions for} -\entry {conventions for makefiles}{131}{conventions for makefiles} -\entry {standards for makefiles}{131}{standards for makefiles} diff --git a/buildtools/windows/source/make/make.cps b/buildtools/windows/source/make/make.cps deleted file mode 100644 index 0b8cbac3bfa..00000000000 --- a/buildtools/windows/source/make/make.cps +++ /dev/null @@ -1,652 +0,0 @@ -\initial {#} -\entry {\code {#} (comments), in commands}{41} -\entry {\code {#} (comments), in makefile}{13} -\entry {\code {#include}}{38} -\initial {$} -\entry {\code {$}, in function call}{77} -\entry {\code {$}, in rules}{20} -\entry {\code {$}, in variable name}{60} -\entry {\code {$}, in variable reference}{55} -\initial {%} -\entry {\code {%}, in pattern rules}{110} -\entry {\code {%}, quoting in \code {patsubst}}{78} -\entry {\code {%}, quoting in static pattern}{35} -\entry {\code {%}, quoting in \code {vpath}}{25} -\entry {\code {%}, quoting with \code {{\tt\indexbackslash }} (backslash)}{25, 35, 78} -\initial {*} -\entry {\code {*} (wildcard character)}{20} -\initial {,} -\entry {\code {,v \r {(RCS file extension)}}}{105} -\initial {-} -\entry {\code {-} (in commands)}{44} -\entry {-, and \code {define}}{53} -\entry {\code {--assume-new}}{92, 98} -\entry {\code {--assume-new}, and recursion}{50} -\entry {\code {--assume-old}}{93, 97} -\entry {\code {--assume-old}, and recursion}{50} -\entry {\code {--debug}}{96} -\entry {\code {--directory}}{46, 95} -\entry {\code {--directory}, and \code {--print-directory}}{52} -\entry {\code {--directory}, and recursion}{50} -\entry {\code {--dry-run}}{41, 91, 97} -\entry {\code {--environment-overrides}}{96} -\entry {\code {--file}}{14, 89, 96} -\entry {\code {--file}, and recursion}{50} -\entry {\code {--help}}{96} -\entry {\code {--ignore-errors}}{44, 96} -\entry {\code {--include-dir}}{15, 96} -\entry {\code {--jobs}}{42, 96} -\entry {\code {--jobs}, and recursion}{50} -\entry {\code {--just-print}}{41, 91, 97} -\entry {\code {--keep-going}}{45, 95, 96} -\entry {\code {--load-average}}{43, 97} -\entry {\code {--makefile}}{14, 89, 96} -\entry {\code {--max-load}}{43, 97} -\entry {\code {--new-file}}{92, 98} -\entry {\code {--new-file}, and recursion}{50} -\entry {\code {--no-builtin-rules}}{97} -\entry {\code {--no-keep-going}}{98} -\entry {\code {--no-print-directory}}{52, 98} -\entry {\code {--old-file}}{93, 97} -\entry {\code {--old-file}, and recursion}{50} -\entry {\code {--print-data-base}}{97} -\entry {\code {--print-directory}}{98} -\entry {\code {--print-directory}, and \code {--directory}}{52} -\entry {\code {--print-directory}, and recursion}{52} -\entry {\code {--print-directory}, disabling}{52} -\entry {\code {--question}}{92, 97} -\entry {\code {--quiet}}{41, 98} -\entry {\code {--recon}}{41, 91, 97} -\entry {\code {--silent}}{41, 98} -\entry {\code {--stop}}{98} -\entry {\code {--touch}}{92, 98} -\entry {\code {--touch}, and recursion}{47} -\entry {\code {--version}}{98} -\entry {\code {--warn-undefined-variables}}{99} -\entry {\code {--what-if}}{92, 98} -\entry {\code {-b}}{95} -\entry {\code {-C}}{46, 95} -\entry {\code {-C}, and \code {-w}}{52} -\entry {\code {-C}, and recursion}{50} -\entry {\code {-d}}{96} -\entry {\code {-e}}{96} -\entry {\code {-e} (shell flag)}{39} -\entry {\code {-f}}{14, 89, 96} -\entry {\code {-f}, and recursion}{50} -\entry {\code {-h}}{96} -\entry {\code {-i}}{44, 96} -\entry {\code {-I}}{15, 96} -\entry {\code {-j}}{42, 96} -\entry {\code {-j}, and archive update}{123} -\entry {\code {-j}, and recursion}{50} -\entry {\code {-k}}{45, 95, 96} -\entry {\code {-l}}{97} -\entry {\code {-l} (library search)}{27} -\entry {\code {-l} (load average)}{43} -\entry {\code {-m}}{95} -\entry {\code {-M} (to compiler)}{38} -\entry {\code {-MM} (to GNU compiler)}{39} -\entry {\code {-n}}{41, 91, 97} -\entry {\code {-o}}{93, 97} -\entry {\code {-o}, and recursion}{50} -\entry {\code {-p}}{97} -\entry {\code {-q}}{92, 97} -\entry {\code {-r}}{97} -\entry {\code {-s}}{41, 97} -\entry {\code {-S}}{98} -\entry {\code {-t}}{92, 98} -\entry {\code {-t}, and recursion}{47} -\entry {\code {-v}}{98} -\entry {\code {-w}}{98} -\entry {\code {-W}}{92, 98} -\entry {\code {-w}, and \code {-C}}{52} -\entry {\code {-w}, and recursion}{52} -\entry {\code {-W}, and recursion}{50} -\entry {\code {-w}, disabling}{52} -\initial {.} -\entry {\code {.a} (archives)}{124} -\entry {\code {.c}}{103} -\entry {\code {.C}}{103} -\entry {\code {.cc}}{103} -\entry {\code {.ch}}{105} -\entry {\code {.d}}{39} -\entry {\code {.def}}{104} -\entry {\code {.dvi}}{105} -\entry {\code {.f}}{103} -\entry {\code {.F}}{103} -\entry {\code {.info}}{105} -\entry {\code {.l}}{105} -\entry {\code {.ln}}{105} -\entry {\code {.mod}}{104} -\entry {\code {.o}}{103, 104} -\entry {\code {.p}}{103} -\entry {\code {.PRECIOUS} intermediate files}{109} -\entry {\code {.r}}{103} -\entry {\code {.s}}{104} -\entry {\code {.S}}{104} -\entry {\code {.sh}}{105} -\entry {\code {.sym}}{104} -\entry {\code {.tex}}{105} -\entry {\code {.texi}}{105} -\entry {\code {.texinfo}}{105} -\entry {\code {.txinfo}}{105} -\entry {\code {.w}}{105} -\entry {\code {.web}}{105} -\entry {\code {.y}}{105} -\initial {:} -\entry {\code {::} rules (double-colon)}{37} -\entry {:=}{57, 63} -\initial {=} -\entry {=}{56, 63} -\initial {?} -\entry {\code {?} (wildcard character)}{20} -\initial {[} -\entry {\code {[\dots {}]} (wildcard characters)}{20} -\initial {{\_}} -\entry {\code {{\_}{\_}.SYMDEF}}{123} -\initial {{\tt\char'100}} -\entry {\code {{\tt\char'100}} (in commands)}{41} -\entry {{\tt\char'100}, and \code {define}}{53} -\initial {{\tt\char'176}} -\entry {\code {{\tt\char'176}} (tilde)}{20} -\initial {{\tt\char43}} -\entry {{\tt\char43}, and \code {define}}{53} -\entry {{\tt\char43}=}{64} -\initial {{\tt\indexbackslash }} -\entry {\code {{\tt\indexbackslash }} (backslash), for continuation lines}{7} -\entry {\code {{\tt\indexbackslash }} (backslash), in commands}{42} -\entry {\code {{\tt\indexbackslash }} (backslash), to quote \code {%}}{25, 35, 78} -\initial {A} -\entry {\code {all} \r {(standard target)}}{91} -\entry {appending to variables}{64} -\entry {\code {ar}}{107} -\entry {archive}{121} -\entry {archive member targets}{121} -\entry {archive symbol directory updating}{123} -\entry {archive, and \code {-j}}{123} -\entry {archive, and parallel execution}{123} -\entry {archive, suffix rule for}{124} -\entry {Arg list too long}{51} -\entry {arguments of functions}{77} -\entry {\code {as}}{104, 107} -\entry {assembly, rule to compile}{104} -\entry {automatic generation of dependencies}{15, 37} -\entry {automatic variables}{112} -\initial {B} -\entry {backquotes}{87} -\entry {backslash (\code {{\tt\indexbackslash }}), for continuation lines}{7} -\entry {backslash (\code {{\tt\indexbackslash }}), in commands}{42} -\entry {backslash (\code {{\tt\indexbackslash }}), to quote \code {%}}{25, 35, 78} -\entry {basename}{82} -\entry {broken pipe}{43} -\entry {bugs, reporting}{2} -\entry {built-in special targets}{31} -\initial {C} -\entry {C, rule to compile}{103} -\entry {C{\tt\char43}{\tt\char43}, rule to compile}{103} -\entry {\code {cc}}{103, 107} -\entry {\code {cd} (shell command)}{42, 47} -\entry {chains of rules}{108} -\entry {\code {check} \r {(standard target)}}{91} -\entry {\code {clean} \r {(standard target)}}{91} -\entry {\code {clean} target}{8, 12} -\entry {cleaning up}{12} -\entry {\code {clobber} \r {(standard target)}}{91} -\entry {\code {co}}{105, 107} -\entry {combining rules by dependency}{11} -\entry {command line variable definitions, and recursion}{50} -\entry {command line variables}{94} -\entry {commands}{19} -\entry {commands, backslash (\code {{\tt\indexbackslash }}) in}{42} -\entry {commands, comments in}{41} -\entry {commands, echoing}{41} -\entry {commands, empty}{54} -\entry {commands, errors in}{44} -\entry {commands, execution}{42} -\entry {commands, execution in parallel}{42} -\entry {commands, expansion}{87} -\entry {commands, how to write}{41} -\entry {commands, instead of executing}{91} -\entry {commands, introduction to}{5} -\entry {commands, quoting newlines in}{42} -\entry {commands, sequences of}{52} -\entry {comments, in commands}{41} -\entry {comments, in makefile}{13} -\entry {compatibility}{125} -\entry {compatibility in exporting}{49} -\entry {compilation, testing}{95} -\entry {computed variable name}{60} -\entry {conditionals}{71} -\entry {continuation lines}{7} -\entry {conventions for makefiles}{131} -\entry {\code {ctangle}}{105, 107} -\entry {\code {cweave}}{105, 107} -\initial {D} -\entry {deducing commands (implicit rules)}{10} -\entry {default goal}{8, 19} -\entry {default makefile name}{14} -\entry {default rules, last-resort}{116} -\entry {defining variables verbatim}{67} -\entry {deletion of target files}{45} -\entry {dependencies}{20} -\entry {dependencies, automatic generation}{15, 37} -\entry {dependencies, introduction to}{5} -\entry {dependencies, list of all}{112} -\entry {dependencies, list of changed}{112} -\entry {dependencies, varying (static pattern)}{34} -\entry {dependency}{19} -\entry {dependency pattern, implicit}{110} -\entry {dependency pattern, static (not implicit)}{35} -\entry {directive}{13} -\entry {directories, printing them}{52} -\entry {directories, updating archive symbol}{123} -\entry {directory part}{81} -\entry {directory search (\code {VPATH})}{23} -\entry {directory search (\code {VPATH}), and implicit rules}{27} -\entry {directory search (\code {VPATH}), and link libraries}{27} -\entry {directory search (\code {VPATH}), and shell commands}{26} -\entry {\code {dist} \r {(standard target)}}{91} -\entry {\code {distclean} \r {(standard target)}}{91} -\entry {dollar sign (\code {$}), in function call}{77} -\entry {dollar sign (\code {$}), in rules}{20} -\entry {dollar sign (\code {$}), in variable name}{60} -\entry {dollar sign (\code {$}), in variable reference}{55} -\entry {double-colon rules}{37} -\entry {duplicate words, removing}{80} -\initial {E} -\entry {E2BIG}{51} -\entry {echoing of commands}{41} -\entry {editor}{5} -\entry {Emacs (\code {M-x compile})}{45} -\entry {empty commands}{54} -\entry {empty targets}{30} -\entry {environment}{68} -\entry {environment, and recursion}{47} -\entry {environment, \code {SHELL} in}{42} -\entry {errors (in commands)}{44} -\entry {errors with wildcards}{22} -\entry {execution, in parallel}{42} -\entry {execution, instead of}{91} -\entry {execution, of commands}{42} -\entry {exit status (errors)}{44} -\entry {explicit rule, definition of}{13} -\entry {exporting variables}{47} -\initial {F} -\entry {\code {f77}}{103, 107} -\entry {features of GNU \code {make}}{125} -\entry {features, missing}{129} -\entry {file name functions}{81} -\entry {file name of makefile}{14} -\entry {file name of makefile, how to specify}{14} -\entry {file name prefix, adding}{82} -\entry {file name suffix}{82} -\entry {file name suffix, adding}{82} -\entry {file name with wildcards}{20} -\entry {file name, basename of}{82} -\entry {file name, directory part}{81} -\entry {file name, nondirectory part}{81} -\entry {files, assuming new}{92} -\entry {files, assuming old}{93} -\entry {files, avoiding recompilation of}{93} -\entry {files, intermediate}{108} -\entry {filtering out words}{80} -\entry {filtering words}{80} -\entry {finding strings}{79} -\entry {flags}{95} -\entry {flags for compilers}{106} -\entry {flavors of variables}{56} -\entry {\code {FORCE}}{30} -\entry {force targets}{30} -\entry {Fortran, rule to compile}{103} -\entry {functions}{77} -\entry {functions, for file names}{81} -\entry {functions, for text}{78} -\entry {functions, syntax of}{77} -\initial {G} -\entry {\code {g{\tt\char43}{\tt\char43}}}{103, 107} -\entry {\code {gcc}}{103} -\entry {generating dependencies automatically}{15, 37} -\entry {\code {get}}{105, 107} -\entry {globbing (wildcards)}{20} -\entry {goal}{8} -\entry {goal, default}{8, 19} -\entry {goal, how to specify}{90} -\initial {H} -\entry {home directory}{20} -\initial {I} -\entry {IEEE Standard 1003.2}{1} -\entry {implicit rule}{101} -\entry {implicit rule, and directory search}{27} -\entry {implicit rule, and \code {VPATH}}{27} -\entry {implicit rule, definition of}{13} -\entry {implicit rule, how to use}{101} -\entry {implicit rule, introduction to}{10} -\entry {implicit rule, predefined}{103} -\entry {implicit rule, search algorithm}{119} -\entry {including (\code {MAKEFILES} variable)}{16} -\entry {including other makefiles}{14} -\entry {incompatibilities}{129} -\entry {Info, rule to format}{105} -\entry {\code {install} \r {(standard target)}}{91} -\entry {intermediate files}{108} -\entry {intermediate files, preserving}{109} -\entry {interrupt}{45} -\initial {J} -\entry {job slots}{42} -\entry {job slots, and recursion}{50} -\entry {jobs, limiting based on load}{43} -\entry {joining lists of words}{82} -\initial {K} -\entry {killing (interruption)}{45} -\initial {L} -\entry {last-resort default rules}{116} -\entry {\code {ld}}{104} -\entry {\code {lex}}{105, 107} -\entry {Lex, rule to run}{105} -\entry {libraries for linking, directory search}{27} -\entry {library archive, suffix rule for}{124} -\entry {limiting jobs based on load}{43} -\entry {link libraries, and directory search}{27} -\entry {linking, predefined rule for}{104} -\entry {\code {lint}}{105} -\entry {\code {lint}, rule to run}{105} -\entry {list of all dependencies}{112} -\entry {list of changed dependencies}{112} -\entry {load average}{43} -\entry {loops in variable expansion}{57} -\entry {\code {lpr} (shell command)}{21, 30} -\initial {M} -\entry {\code {m2c}}{104} -\entry {macro}{55} -\entry {\code {make depend}}{38} -\entry {makefile}{5} -\entry {makefile name}{14} -\entry {makefile name, how to specify}{14} -\entry {makefile rule parts}{5} -\entry {makefile, and \code {MAKEFILES} variable}{16} -\entry {makefile, conventions for}{131} -\entry {makefile, how \code {make} processes}{8} -\entry {makefile, how to write}{13} -\entry {makefile, including}{14} -\entry {makefile, overriding}{18} -\entry {makefile, remaking of}{16} -\entry {makefile, simple}{6} -\entry {\code {makeinfo}}{105, 107} -\entry {match-anything rule}{115} -\entry {match-anything rule, used to override}{18} -\entry {missing features}{129} -\entry {mistakes with wildcards}{22} -\entry {modified variable reference}{59} -\entry {Modula-2, rule to compile}{104} -\entry {\code {mostlyclean} \r {(standard target)}}{91} -\entry {multiple rules for one target}{33} -\entry {multiple rules for one target (\code {::})}{37} -\entry {multiple targets}{32} -\entry {multiple targets, in pattern rule}{110} -\initial {N} -\entry {name of makefile}{14} -\entry {name of makefile, how to specify}{14} -\entry {nested variable reference}{60} -\entry {newline, quoting, in commands}{42} -\entry {newline, quoting, in makefile}{7} -\entry {nondirectory part}{81} -\initial {O} -\entry {\code {obj}}{9} -\entry {\code {OBJ}}{9} -\entry {\code {objects}}{9} -\entry {\code {OBJECTS}}{9} -\entry {\code {objs}}{9} -\entry {\code {OBJS}}{9} -\entry {old-fashioned suffix rules}{117} -\entry {options}{95} -\entry {options, and recursion}{50} -\entry {options, setting from environment}{51} -\entry {options, setting in makefiles}{51} -\entry {order of pattern rules}{111} -\entry {origin of variable}{85} -\entry {overriding makefiles}{18} -\entry {overriding variables with arguments}{94} -\entry {overriding with \code {override}}{66} -\initial {P} -\entry {parallel execution}{42} -\entry {parallel execution, and archive update}{123} -\entry {parts of makefile rule}{5} -\entry {Pascal, rule to compile}{103} -\entry {pattern rule}{110} -\entry {pattern rules, order of}{111} -\entry {pattern rules, static (not implicit)}{34} -\entry {pattern rules, static, syntax of}{34} -\entry {\code {pc}}{103, 107} -\entry {phony targets}{28} -\entry {pitfalls of wildcards}{22} -\entry {portability}{125} -\entry {POSIX}{1} -\entry {POSIX.2}{51} -\entry {precious targets}{31} -\entry {prefix, adding}{82} -\entry {preserving intermediate files}{109} -\entry {preserving with \code {.PRECIOUS}}{31, 109} -\entry {\code {print} \r {(standard target)}}{91} -\entry {\code {print} target}{21, 30} -\entry {printing directories}{52} -\entry {printing of commands}{41} -\entry {problems and bugs, reporting}{2} -\entry {problems with wildcards}{22} -\entry {processing a makefile}{8} -\initial {Q} -\entry {question mode}{92} -\entry {quoting \code {%}, in \code {patsubst}}{78} -\entry {quoting \code {%}, in static pattern}{35} -\entry {quoting \code {%}, in \code {vpath}}{25} -\entry {quoting newline, in commands}{42} -\entry {quoting newline, in makefile}{7} -\initial {R} -\entry {Ratfor, rule to compile}{103} -\entry {RCS, rule to extract from}{105} -\entry {\code {README}}{14} -\entry {\code {realclean} \r {(standard target)}}{91} -\entry {recompilation}{5} -\entry {recompilation, avoiding}{93} -\entry {recording events with empty targets}{30} -\entry {recursion}{46} -\entry {recursion, and \code {-C}}{50} -\entry {recursion, and \code {-f}}{50} -\entry {recursion, and \code {-j}}{50} -\entry {recursion, and \code {-o}}{50} -\entry {recursion, and \code {-t}}{47} -\entry {recursion, and \code {-w}}{52} -\entry {recursion, and \code {-W}}{50} -\entry {recursion, and command line variable definitions}{50} -\entry {recursion, and environment}{47} -\entry {recursion, and \code {MAKE} variable}{46} -\entry {recursion, and \code {MAKEFILES} variable}{16} -\entry {recursion, and options}{50} -\entry {recursion, and printing directories}{52} -\entry {recursion, and variables}{47} -\entry {recursion, level of}{49} -\entry {recursive variable expansion}{55, 56} -\entry {recursively expanded variables}{56} -\entry {reference to variables}{55, 59} -\entry {relinking}{9} -\entry {remaking makefiles}{16} -\entry {removal of target files}{45} -\entry {removing duplicate words}{80} -\entry {removing, to clean up}{12} -\entry {reporting bugs}{2} -\entry {\code {rm}}{107} -\entry {\code {rm} (shell command)}{8, 21, 28, 44} -\entry {rule commands}{41} -\entry {rule dependencies}{20} -\entry {rule syntax}{19} -\entry {rule targets}{19} -\entry {rule, and \code {$}}{20} -\entry {rule, double-colon (\code {::})}{37} -\entry {rule, explicit, definition of}{13} -\entry {rule, how to write}{19} -\entry {rule, implicit}{101} -\entry {rule, implicit, and directory search}{27} -\entry {rule, implicit, and \code {VPATH}}{27} -\entry {rule, implicit, chains of}{108} -\entry {rule, implicit, definition of}{13} -\entry {rule, implicit, how to use}{101} -\entry {rule, implicit, introduction to}{10} -\entry {rule, implicit, predefined}{103} -\entry {rule, introduction to}{5} -\entry {rule, multiple for one target}{33} -\entry {rule, no commands or dependencies}{30} -\entry {rule, pattern}{110} -\entry {rule, static pattern}{34} -\entry {rule, static pattern versus implicit}{36} -\entry {rule, with multiple targets}{32} -\initial {S} -\entry {\code {s. \r {(SCCS file prefix)}}}{105} -\entry {SCCS, rule to extract from}{105} -\entry {search algorithm, implicit rule}{119} -\entry {search path for dependencies (\code {VPATH})}{23} -\entry {search path for dependencies (\code {VPATH}), and implicit rules}{27} -\entry {search path for dependencies (\code {VPATH}), and link libraries}{27} -\entry {searching for strings}{79} -\entry {\code {sed} (shell command)}{39} -\entry {selecting words}{83} -\entry {sequences of commands}{52} -\entry {setting options from environment}{51} -\entry {setting options in makefiles}{51} -\entry {setting variables}{63} -\entry {several rules for one target}{33} -\entry {several targets in a rule}{32} -\entry {\code {shar} \r {(standard target)}}{91} -\entry {shell command}{8} -\entry {shell command, and directory search}{26} -\entry {shell command, execution}{42} -\entry {shell command, function for}{87} -\entry {shell file name pattern (in \code {include})}{14} -\entry {shell wildcards (in \code {include})}{14} -\entry {signal}{45} -\entry {silent operation}{41} -\entry {simple makefile}{6} -\entry {simple variable expansion}{55} -\entry {simplifying with variables}{9} -\entry {simply expanded variables}{57} -\entry {sorting words}{80} -\entry {spaces, in variable values}{58} -\entry {spaces, stripping}{79} -\entry {special targets}{31} -\entry {specifying makefile name}{14} -\entry {standard input}{43} -\entry {standards conformance}{1} -\entry {standards for makefiles}{131} -\entry {static pattern rule}{34} -\entry {static pattern rule, syntax of}{34} -\entry {static pattern rule, versus implicit}{36} -\entry {stem}{35, 114} -\entry {stem, variable for}{113} -\entry {strings, searching for}{79} -\entry {stripping whitespace}{79} -\entry {sub-\code {make}}{47} -\entry {subdirectories, recursion for}{46} -\entry {substitution variable reference}{59} -\entry {suffix rule}{117} -\entry {suffix rule, for archive}{124} -\entry {suffix, adding}{82} -\entry {suffix, function to find}{82} -\entry {suffix, substituting in variables}{59} -\entry {switches}{95} -\entry {symbol directories, updating archive}{123} -\entry {syntax of rules}{19} -\initial {T} -\entry {tab character (in commands)}{19} -\entry {tabs in rules}{5} -\entry {\code {TAGS} \r {(standard target)}}{91} -\entry {\code {tangle}}{105, 107} -\entry {\code {tar} \r {(standard target)}}{91} -\entry {target}{19} -\entry {target pattern, implicit}{110} -\entry {target pattern, static (not implicit)}{35} -\entry {target, deleting on error}{45} -\entry {target, deleting on interrupt}{45} -\entry {target, multiple in pattern rule}{110} -\entry {target, multiple rules for one}{33} -\entry {target, touching}{92} -\entry {targets}{19} -\entry {targets without a file}{28} -\entry {targets, built-in special}{31} -\entry {targets, empty}{30} -\entry {targets, force}{30} -\entry {targets, introduction to}{5} -\entry {targets, multiple}{32} -\entry {targets, phony}{28} -\entry {terminal rule}{115} -\entry {\code {test} \r {(standard target)}}{91} -\entry {testing compilation}{95} -\entry {\code {tex}}{105, 107} -\entry {\TeX{}, rule to run}{105} -\entry {\code {texi2dvi}}{105, 107} -\entry {Texinfo, rule to format}{105} -\entry {tilde (\code {{\tt\char'176}})}{20} -\entry {\code {touch} (shell command)}{21, 30} -\entry {touching files}{92} -\initial {U} -\entry {undefined variables, warning message}{99} -\entry {updating archive symbol directories}{123} -\entry {updating makefiles}{16} -\initial {V} -\entry {value}{55} -\entry {value, how a variable gets it}{63} -\entry {variable}{55} -\entry {variable definition}{13} -\entry {variables}{9} -\entry {variables, \samp {$} in name}{60} -\entry {variables, and implicit rule}{112} -\entry {variables, appending to}{64} -\entry {variables, automatic}{112} -\entry {variables, command line}{94} -\entry {variables, command line, and recursion}{50} -\entry {variables, computed names}{60} -\entry {variables, defining verbatim}{67} -\entry {variables, environment}{47, 68} -\entry {variables, exporting}{47} -\entry {variables, flavors}{56} -\entry {variables, how they get their values}{63} -\entry {variables, how to reference}{55} -\entry {variables, loops in expansion}{57} -\entry {variables, modified reference}{59} -\entry {variables, nested references}{60} -\entry {variables, origin of}{85} -\entry {variables, overriding}{66} -\entry {variables, overriding with arguments}{94} -\entry {variables, recursively expanded}{56} -\entry {variables, setting}{63} -\entry {variables, simply expanded}{57} -\entry {variables, spaces in values}{58} -\entry {variables, substituting suffix in}{59} -\entry {variables, substitution reference}{59} -\entry {variables, warning for undefined}{99} -\entry {varying dependencies}{34} -\entry {verbatim variable definition}{67} -\entry {vpath}{23} -\entry {\code {VPATH}, and implicit rules}{27} -\entry {\code {VPATH}, and link libraries}{27} -\initial {W} -\entry {\code {weave}}{105, 107} -\entry {Web, rule to run}{105} -\entry {what if}{92} -\entry {whitespace, in variable values}{58} -\entry {whitespace, stripping}{79} -\entry {wildcard}{20} -\entry {wildcard pitfalls}{22} -\entry {wildcard, function}{83} -\entry {wildcard, in archive member}{121} -\entry {wildcard, in \code {include}}{14} -\entry {words, extracting first}{83} -\entry {words, filtering}{80} -\entry {words, filtering out}{80} -\entry {words, finding number}{83} -\entry {words, iterating over}{83} -\entry {words, joining lists}{82} -\entry {words, removing duplicates}{80} -\entry {words, selecting}{83} -\entry {writing rule commands}{41} -\entry {writing rules}{19} -\initial {Y} -\entry {\code {yacc}}{53, 105, 107} -\entry {Yacc, rule to run}{105} diff --git a/buildtools/windows/source/make/make.fn b/buildtools/windows/source/make/make.fn deleted file mode 100644 index 6000f78fd6b..00000000000 --- a/buildtools/windows/source/make/make.fn +++ /dev/null @@ -1,149 +0,0 @@ -\entry {Makefile}{14}{\code {Makefile}} -\entry {GNUmakefile}{14}{\code {GNUmakefile}} -\entry {makefile}{14}{\code {makefile}} -\entry {include}{14}{\code {include}} -\entry {/usr/gnu/include}{15}{\code {/usr/gnu/include}} -\entry {/usr/local/include}{15}{\code {/usr/local/include}} -\entry {/usr/include}{15}{\code {/usr/include}} -\entry {MAKEFILES}{16}{\code {MAKEFILES}} -\entry {wildcard}{22}{\code {wildcard}} -\entry {VPATH}{23}{\code {VPATH}} -\entry {vpath}{23}{\code {vpath}} -\entry {VPATH}{23}{\code {VPATH}} -\entry {vpath}{24}{\code {vpath}} -\entry {.PHONY}{28}{\code {.PHONY}} -\entry {.PHONY}{31}{\code {.PHONY}} -\entry {.SUFFIXES}{31}{\code {.SUFFIXES}} -\entry {.DEFAULT}{31}{\code {.DEFAULT}} -\entry {.PRECIOUS}{31}{\code {.PRECIOUS}} -\entry {.IGNORE}{31}{\code {.IGNORE}} -\entry {.SILENT}{32}{\code {.SILENT}} -\entry {.EXPORT{\_}ALL{\_}VARIABLES}{32}{\code {.EXPORT{\_}ALL{\_}VARIABLES}} -\entry {subst}{33}{\code {subst}} -\entry {$*, and static pattern}{36}{\code {$*\r {, and static pattern}}} -\entry {.SILENT}{41}{\code {.SILENT}} -\entry {SHELL (command execution)}{42}{\code {SHELL \r {(command execution)}}} -\entry {SHELL}{42}{\code {SHELL}} -\entry {.IGNORE}{44}{\code {.IGNORE}} -\entry {.DELETE{\_}ON{\_}ERROR}{45}{\code {.DELETE{\_}ON{\_}ERROR}} -\entry {.PRECIOUS}{46}{\code {.PRECIOUS}} -\entry {MAKE}{46}{\code {MAKE}} -\entry {export}{48}{\code {export}} -\entry {unexport}{48}{\code {unexport}} -\entry {.EXPORT{\_}ALL{\_}VARIABLES}{49}{\code {.EXPORT{\_}ALL{\_}VARIABLES}} -\entry {MAKELEVEL}{49}{\code {MAKELEVEL}} -\entry {MAKEFILES}{50}{\code {MAKEFILES}} -\entry {MAKEFLAGS}{50}{\code {MAKEFLAGS}} -\entry {MAKEOVERRIDES}{51}{\code {MAKEOVERRIDES}} -\entry {.POSIX}{51}{\code {.POSIX}} -\entry {MFLAGS}{51}{\code {MFLAGS}} -\entry {.DEFAULT, and empty commands}{54}{\code {.DEFAULT\r {, and empty commands}}} -\entry {MAKELEVEL}{58}{\code {MAKELEVEL}} -\entry {MAKE}{58}{\code {MAKE}} -\entry {patsubst}{59}{\code {patsubst}} -\entry {override}{66}{\code {override}} -\entry {define}{67}{\code {define}} -\entry {endef}{67}{\code {endef}} -\entry {ifdef}{72}{\code {ifdef}} -\entry {ifeq}{72}{\code {ifeq}} -\entry {ifndef}{72}{\code {ifndef}} -\entry {ifneq}{72}{\code {ifneq}} -\entry {else}{72}{\code {else}} -\entry {endif}{72}{\code {endif}} -\entry {subst}{78}{\code {subst}} -\entry {patsubst}{78}{\code {patsubst}} -\entry {strip}{79}{\code {strip}} -\entry {findstring}{79}{\code {findstring}} -\entry {filter}{80}{\code {filter}} -\entry {filter-out}{80}{\code {filter-out}} -\entry {sort}{80}{\code {sort}} -\entry {dir}{81}{\code {dir}} -\entry {notdir}{81}{\code {notdir}} -\entry {suffix}{82}{\code {suffix}} -\entry {basename}{82}{\code {basename}} -\entry {addsuffix}{82}{\code {addsuffix}} -\entry {addprefix}{82}{\code {addprefix}} -\entry {join}{82}{\code {join}} -\entry {word}{83}{\code {word}} -\entry {words}{83}{\code {words}} -\entry {firstword}{83}{\code {firstword}} -\entry {wildcard}{83}{\code {wildcard}} -\entry {foreach}{83}{\code {foreach}} -\entry {origin}{85}{\code {origin}} -\entry {shell}{87}{\code {shell}} -\entry {OUTPUT{\_}OPTION}{106}{\code {OUTPUT{\_}OPTION}} -\entry {AR}{107}{\code {AR}} -\entry {AS}{107}{\code {AS}} -\entry {CC}{107}{\code {CC}} -\entry {CXX}{107}{\code {CXX}} -\entry {CO}{107}{\code {CO}} -\entry {CPP}{107}{\code {CPP}} -\entry {FC}{107}{\code {FC}} -\entry {GET}{107}{\code {GET}} -\entry {LEX}{107}{\code {LEX}} -\entry {PC}{107}{\code {PC}} -\entry {YACC}{107}{\code {YACC}} -\entry {YACCR}{107}{\code {YACCR}} -\entry {MAKEINFO}{107}{\code {MAKEINFO}} -\entry {TEX}{107}{\code {TEX}} -\entry {TEXI2DVI}{107}{\code {TEXI2DVI}} -\entry {WEAVE}{107}{\code {WEAVE}} -\entry {CWEAVE}{107}{\code {CWEAVE}} -\entry {TANGLE}{107}{\code {TANGLE}} -\entry {CTANGLE}{107}{\code {CTANGLE}} -\entry {RM}{107}{\code {RM}} -\entry {ARFLAGS}{108}{\code {ARFLAGS}} -\entry {ASFLAGS}{108}{\code {ASFLAGS}} -\entry {CFLAGS}{108}{\code {CFLAGS}} -\entry {CXXFLAGS}{108}{\code {CXXFLAGS}} -\entry {COFLAGS}{108}{\code {COFLAGS}} -\entry {CPPFLAGS}{108}{\code {CPPFLAGS}} -\entry {FFLAGS}{108}{\code {FFLAGS}} -\entry {GFLAGS}{108}{\code {GFLAGS}} -\entry {LDFLAGS}{108}{\code {LDFLAGS}} -\entry {LFLAGS}{108}{\code {LFLAGS}} -\entry {PFLAGS}{108}{\code {PFLAGS}} -\entry {RFLAGS}{108}{\code {RFLAGS}} -\entry {YFLAGS}{108}{\code {YFLAGS}} -\entry {${\tt\char'100}}{112}{\code {${\tt\char'100}}} -\entry {{\tt\char'100} (automatic variable)}{112}{\code {{\tt\char'100} \r {(automatic variable)}}} -\entry {$%}{112}{\code {$%}} -\entry {% (automatic variable)}{112}{\code {% \r {(automatic variable)}}} -\entry {${\tt\less}}{112}{\code {${\tt\less}}} -\entry {{\tt\less} (automatic variable)}{112}{\code {{\tt\less} \r {(automatic variable)}}} -\entry {$?}{112}{\code {$?}} -\entry {? (automatic variable)}{112}{\code {? \r {(automatic variable)}}} -\entry {${\tt\hat}}{112}{\code {${\tt\hat}}} -\entry {{\tt\hat} (automatic variable)}{112}{\code {{\tt\hat} \r {(automatic variable)}}} -\entry {${\tt\char43}}{112}{\code {${\tt\char43}}} -\entry {{\tt\char43} (automatic variable)}{112}{\code {{\tt\char43} \r {(automatic variable)}}} -\entry {$*}{112}{\code {$*}} -\entry {* (automatic variable)}{112}{\code {* \r {(automatic variable)}}} -\entry {$({\tt\char'100}D)}{113}{\code {$({\tt\char'100}D)}} -\entry {{\tt\char'100}D (automatic variable)}{113}{\code {{\tt\char'100}D \r {(automatic variable)}}} -\entry {$({\tt\char'100}F)}{113}{\code {$({\tt\char'100}F)}} -\entry {{\tt\char'100}F (automatic variable)}{113}{\code {{\tt\char'100}F \r {(automatic variable)}}} -\entry {$(*D)}{113}{\code {$(*D)}} -\entry {*D (automatic variable)}{113}{\code {*D \r {(automatic variable)}}} -\entry {$(*F)}{113}{\code {$(*F)}} -\entry {*F (automatic variable)}{113}{\code {*F \r {(automatic variable)}}} -\entry {$(%D)}{113}{\code {$(%D)}} -\entry {%D (automatic variable)}{113}{\code {%D \r {(automatic variable)}}} -\entry {$(%F)}{113}{\code {$(%F)}} -\entry {%F (automatic variable)}{113}{\code {%F \r {(automatic variable)}}} -\entry {$({\tt\less}D)}{114}{\code {$({\tt\less}D)}} -\entry {{\tt\less}D (automatic variable)}{114}{\code {{\tt\less}D \r {(automatic variable)}}} -\entry {$({\tt\less}F)}{114}{\code {$({\tt\less}F)}} -\entry {{\tt\less}F (automatic variable)}{114}{\code {{\tt\less}F \r {(automatic variable)}}} -\entry {$({\tt\hat}D)}{114}{\code {$({\tt\hat}D)}} -\entry {{\tt\hat}D (automatic variable)}{114}{\code {{\tt\hat}D \r {(automatic variable)}}} -\entry {$({\tt\hat}F)}{114}{\code {$({\tt\hat}F)}} -\entry {{\tt\hat}F (automatic variable)}{114}{\code {{\tt\hat}F \r {(automatic variable)}}} -\entry {$(?D)}{114}{\code {$(?D)}} -\entry {?D (automatic variable)}{114}{\code {?D \r {(automatic variable)}}} -\entry {$(?F)}{114}{\code {$(?F)}} -\entry {?F (automatic variable)}{114}{\code {?F \r {(automatic variable)}}} -\entry {.DEFAULT}{117}{\code {.DEFAULT}} -\entry {.SUFFIXES}{118}{\code {.SUFFIXES}} -\entry {SUFFIXES}{119}{\code {SUFFIXES}} -\entry {* (automatic variable), unsupported bizarre usage}{129}{\code {* \r {(automatic variable), unsupported bizarre usage}}} diff --git a/buildtools/windows/source/make/make.fns b/buildtools/windows/source/make/make.fns deleted file mode 100644 index e9fe5cd76de..00000000000 --- a/buildtools/windows/source/make/make.fns +++ /dev/null @@ -1,165 +0,0 @@ -\initial {$} -\entry {\code {$%}}{112} -\entry {\code {$(%D)}}{113} -\entry {\code {$(%F)}}{113} -\entry {\code {$(*D)}}{113} -\entry {\code {$(*F)}}{113} -\entry {\code {$(?D)}}{114} -\entry {\code {$(?F)}}{114} -\entry {\code {$({\tt\char'100}D)}}{113} -\entry {\code {$({\tt\char'100}F)}}{113} -\entry {\code {$({\tt\hat}D)}}{114} -\entry {\code {$({\tt\hat}F)}}{114} -\entry {\code {$({\tt\less}D)}}{114} -\entry {\code {$({\tt\less}F)}}{114} -\entry {\code {$*}}{112} -\entry {\code {$*\r {, and static pattern}}}{36} -\entry {\code {$?}}{112} -\entry {\code {${\tt\char'100}}}{112} -\entry {\code {${\tt\char43}}}{112} -\entry {\code {${\tt\hat}}}{112} -\entry {\code {${\tt\less}}}{112} -\initial {%} -\entry {\code {% \r {(automatic variable)}}}{112} -\entry {\code {%D \r {(automatic variable)}}}{113} -\entry {\code {%F \r {(automatic variable)}}}{113} -\initial {*} -\entry {\code {* \r {(automatic variable)}}}{112} -\entry {\code {* \r {(automatic variable), unsupported bizarre usage}}}{129} -\entry {\code {*D \r {(automatic variable)}}}{113} -\entry {\code {*F \r {(automatic variable)}}}{113} -\initial {.} -\entry {\code {.DEFAULT}}{31, 117} -\entry {\code {.DEFAULT\r {, and empty commands}}}{54} -\entry {\code {.DELETE{\_}ON{\_}ERROR}}{45} -\entry {\code {.EXPORT{\_}ALL{\_}VARIABLES}}{32, 49} -\entry {\code {.IGNORE}}{31, 44} -\entry {\code {.PHONY}}{28, 31} -\entry {\code {.POSIX}}{51} -\entry {\code {.PRECIOUS}}{31, 46} -\entry {\code {.SILENT}}{32, 41} -\entry {\code {.SUFFIXES}}{31, 118} -\initial {/} -\entry {\code {/usr/gnu/include}}{15} -\entry {\code {/usr/include}}{15} -\entry {\code {/usr/local/include}}{15} -\initial {?} -\entry {\code {? \r {(automatic variable)}}}{112} -\entry {\code {?D \r {(automatic variable)}}}{114} -\entry {\code {?F \r {(automatic variable)}}}{114} -\initial {{\tt\char'100}} -\entry {\code {{\tt\char'100} \r {(automatic variable)}}}{112} -\entry {\code {{\tt\char'100}D \r {(automatic variable)}}}{113} -\entry {\code {{\tt\char'100}F \r {(automatic variable)}}}{113} -\initial {{\tt\char43}} -\entry {\code {{\tt\char43} \r {(automatic variable)}}}{112} -\initial {{\tt\hat}} -\entry {\code {{\tt\hat} \r {(automatic variable)}}}{112} -\entry {\code {{\tt\hat}D \r {(automatic variable)}}}{114} -\entry {\code {{\tt\hat}F \r {(automatic variable)}}}{114} -\initial {{\tt\less}} -\entry {\code {{\tt\less} \r {(automatic variable)}}}{112} -\entry {\code {{\tt\less}D \r {(automatic variable)}}}{114} -\entry {\code {{\tt\less}F \r {(automatic variable)}}}{114} -\initial {A} -\entry {\code {addprefix}}{82} -\entry {\code {addsuffix}}{82} -\entry {\code {AR}}{107} -\entry {\code {ARFLAGS}}{108} -\entry {\code {AS}}{107} -\entry {\code {ASFLAGS}}{108} -\initial {B} -\entry {\code {basename}}{82} -\initial {C} -\entry {\code {CC}}{107} -\entry {\code {CFLAGS}}{108} -\entry {\code {CO}}{107} -\entry {\code {COFLAGS}}{108} -\entry {\code {CPP}}{107} -\entry {\code {CPPFLAGS}}{108} -\entry {\code {CTANGLE}}{107} -\entry {\code {CWEAVE}}{107} -\entry {\code {CXX}}{107} -\entry {\code {CXXFLAGS}}{108} -\initial {D} -\entry {\code {define}}{67} -\entry {\code {dir}}{81} -\initial {E} -\entry {\code {else}}{72} -\entry {\code {endef}}{67} -\entry {\code {endif}}{72} -\entry {\code {export}}{48} -\initial {F} -\entry {\code {FC}}{107} -\entry {\code {FFLAGS}}{108} -\entry {\code {filter}}{80} -\entry {\code {filter-out}}{80} -\entry {\code {findstring}}{79} -\entry {\code {firstword}}{83} -\entry {\code {foreach}}{83} -\initial {G} -\entry {\code {GET}}{107} -\entry {\code {GFLAGS}}{108} -\entry {\code {GNUmakefile}}{14} -\initial {I} -\entry {\code {ifdef}}{72} -\entry {\code {ifeq}}{72} -\entry {\code {ifndef}}{72} -\entry {\code {ifneq}}{72} -\entry {\code {include}}{14} -\initial {J} -\entry {\code {join}}{82} -\initial {L} -\entry {\code {LDFLAGS}}{108} -\entry {\code {LEX}}{107} -\entry {\code {LFLAGS}}{108} -\initial {M} -\entry {\code {MAKE}}{46, 58} -\entry {\code {makefile}}{14} -\entry {\code {Makefile}}{14} -\entry {\code {MAKEFILES}}{16, 50} -\entry {\code {MAKEFLAGS}}{50} -\entry {\code {MAKEINFO}}{107} -\entry {\code {MAKELEVEL}}{49, 58} -\entry {\code {MAKEOVERRIDES}}{51} -\entry {\code {MFLAGS}}{51} -\initial {N} -\entry {\code {notdir}}{81} -\initial {O} -\entry {\code {origin}}{85} -\entry {\code {OUTPUT{\_}OPTION}}{106} -\entry {\code {override}}{66} -\initial {P} -\entry {\code {patsubst}}{59, 78} -\entry {\code {PC}}{107} -\entry {\code {PFLAGS}}{108} -\initial {R} -\entry {\code {RFLAGS}}{108} -\entry {\code {RM}}{107} -\initial {S} -\entry {\code {shell}}{87} -\entry {\code {SHELL}}{42} -\entry {\code {SHELL \r {(command execution)}}}{42} -\entry {\code {sort}}{80} -\entry {\code {strip}}{79} -\entry {\code {subst}}{33, 78} -\entry {\code {suffix}}{82} -\entry {\code {SUFFIXES}}{119} -\initial {T} -\entry {\code {TANGLE}}{107} -\entry {\code {TEX}}{107} -\entry {\code {TEXI2DVI}}{107} -\initial {U} -\entry {\code {unexport}}{48} -\initial {V} -\entry {\code {vpath}}{23, 24} -\entry {\code {VPATH}}{23} -\initial {W} -\entry {\code {WEAVE}}{107} -\entry {\code {wildcard}}{22, 83} -\entry {\code {word}}{83} -\entry {\code {words}}{83} -\initial {Y} -\entry {\code {YACC}}{107} -\entry {\code {YACCR}}{107} -\entry {\code {YFLAGS}}{108} diff --git a/buildtools/windows/source/make/make.h b/buildtools/windows/source/make/make.h deleted file mode 100644 index 62ff2d89167..00000000000 --- a/buildtools/windows/source/make/make.h +++ /dev/null @@ -1,355 +0,0 @@ -/* Miscellaneous global declarations and portability cruft for GNU Make. -Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 95 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* AIX requires this to be the first thing in the file. */ -#if defined (_AIX) && !defined (__GNUC__) - #pragma alloca -#endif - -/* We use instead of "config.h" so that a compilation - using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h - (which it would do because make.h was found in $srcdir). */ -#include -#undef HAVE_CONFIG_H -#define HAVE_CONFIG_H - -#ifdef CRAY -/* This must happen before #include so - that the declaration therein is changed. */ -#define signal bsdsignal -#endif - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#ifdef HAVE_SYS_TIMEB_H -/* SCO 3.2 "devsys 4.2" has a prototype for `ftime' in that bombs - unless has been included first. Does every system have a - ? If any does not, configure should check for it. */ -#include -#endif -#include -#include - -#ifndef errno -extern int errno; -#endif - -#ifndef isblank -#define isblank(c) ((c) == ' ' || (c) == '\t') -#endif - -#ifdef HAVE_UNISTD_H -#include -/* Ultrix's unistd.h always defines _POSIX_VERSION, but you only get - POSIX.1 behavior with `cc -YPOSIX', which predefines POSIX itself! */ -#if defined (_POSIX_VERSION) && !defined (ultrix) -#define POSIX -#endif -#endif - -/* Some systems define _POSIX_VERSION but are not really POSIX.1. */ -#if (defined (butterfly) || defined (__arm) || \ - (defined (__mips) && defined (_SYSTYPE_SVR3)) || \ - (defined (sequent) && defined (i386))) -#undef POSIX -#endif - -#if !defined (POSIX) && defined (_AIX) && defined (_POSIX_SOURCE) -#define POSIX -#endif - -#if !defined (HAVE_SYS_SIGLIST) && defined (HAVE__SYS_SIGLIST) -#define sys_siglist _sys_siglist -#define HAVE_SYS_SIGLIST /* Now we have it. */ - -/* It was declared in , with who knows what type. - Don't declare it again and risk conflicting. */ -#define SYS_SIGLIST_DECLARED -#endif - -#ifdef HAVE_SYS_SIGLIST -#ifndef SYS_SIGLIST_DECLARED -extern char *sys_siglist[]; -#endif -#else -#include "signame.h" -#endif - -/* Some systems do not define NSIG in . */ -#ifndef NSIG -#ifdef _NSIG -#define NSIG _NSIG -#else -#define NSIG 32 -#endif -#endif - -#ifndef RETSIGTYPE -#define RETSIGTYPE void -#endif - -#ifndef sigmask -#define sigmask(sig) (1 << ((sig) - 1)) -#endif - -#ifdef HAVE_LIMITS_H -#include -#endif -#ifdef HAVE_SYS_PARAM_H -#include -#endif - -#ifndef PATH_MAX -#ifndef POSIX -#define PATH_MAX MAXPATHLEN -#endif /* Not POSIX. */ -#endif /* No PATH_MAX. */ -#ifndef MAXPATHLEN -#define MAXPATHLEN 1024 -#endif /* No MAXPATHLEN. */ - -#ifdef PATH_MAX -#define GET_PATH_MAX PATH_MAX -#define PATH_VAR(var) char var[PATH_MAX] -#else -#define NEED_GET_PATH_MAX -extern unsigned int get_path_max (); -#define GET_PATH_MAX (get_path_max ()) -#define PATH_VAR(var) char *var = (char *) alloca (GET_PATH_MAX) -#endif - -#ifdef STAT_MACROS_BROKEN -#ifdef S_ISREG -#undef S_ISREG -#endif -#ifdef S_ISDIR -#undef S_ISDIR -#endif -#endif /* STAT_MACROS_BROKEN. */ - -#ifndef S_ISREG -#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) -#endif -#ifndef S_ISDIR -#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) -#endif - - -#if (defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)) -#include -#include -#define ANSI_STRING -#else /* No standard headers. */ - -#ifdef HAVE_STRING_H -#include -#define ANSI_STRING -#else -#include -#endif -#ifdef HAVE_MEMORY_H -#include -#endif - -extern char *malloc (), *realloc (); -extern void free (); - -extern void abort (), exit (); - -#endif /* Standard headers. */ - -#ifdef ANSI_STRING - -#ifndef index -#define index(s, c) strchr((s), (c)) -#endif -#ifndef rindex -#define rindex(s, c) strrchr((s), (c)) -#endif - -#ifndef bcmp -#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) -#endif -#ifndef bzero -#define bzero(s, n) memset ((s), 0, (n)) -#endif -#ifndef bcopy -#define bcopy(s, d, n) memcpy ((d), (s), (n)) -#endif - -#else /* Not ANSI_STRING. */ - -#ifndef bcmp -extern int bcmp (); -#endif -#ifndef bzero -extern void bzero (); -#endif -#ifndef bcopy -extern void bcopy (); -#endif - -#endif /* ANSI_STRING. */ -#undef ANSI_STRING - -/* SCO Xenix has a buggy macro definition in . */ -#undef strerror - -#ifndef ANSI_STRING -extern char *strerror (); -#endif - - -#ifdef __GNUC__ -#undef alloca -#define alloca(n) __builtin_alloca (n) -#else /* Not GCC. */ -#ifdef HAVE_ALLOCA_H -#include -#elif defined(NETSCAPE) -#include -#else /* Not HAVE_ALLOCA_H. */ -#ifndef _AIX -extern char *alloca (); -#endif /* Not AIX. */ -#endif /* HAVE_ALLOCA_H. */ -#endif /* GCC. */ - -#ifndef iAPX286 -#define streq(a, b) \ - ((a) == (b) || \ - (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1)))) -#else -/* Buggy compiler can't handle this. */ -#define streq(a, b) (strcmp ((a), (b)) == 0) -#endif - -/* Add to VAR the hashing value of C, one character in a name. */ -#define HASH(var, c) \ - ((var += (c)), (var = ((var) << 7) + ((var) >> 20))) - -#if defined(__GNUC__) || defined(ENUM_BITFIELDS) -#define ENUM_BITFIELD(bits) :bits -#else -#define ENUM_BITFIELD(bits) -#endif - -#if defined(__MSDOS__) || defined(NETSCAPE) -#define PATH_SEPARATOR_CHAR ';' -#else -#define PATH_SEPARATOR_CHAR ':' -#endif - -extern void die (); -extern void message (), fatal (), error (); -extern void makefile_error (), makefile_fatal (); -extern void pfatal_with_name (), perror_with_name (); -extern char *savestring (), *concat (); -extern char *xmalloc (), *xrealloc (); -extern char *find_next_token (), *next_token (), *end_of_token (); -extern void collapse_continuations (), remove_comments (); -extern char *sindex (), *lindex (); -extern int alpha_compare (const void *elem1, const void *elem2); -extern void print_spaces (); -extern struct dep *copy_dep_chain (); -extern char *find_char_unquote (), *find_percent (); - -extern int safe_stat (char * name, struct stat * buf); - - -#ifndef NO_ARCHIVES -extern int ar_name (); -extern void ar_parse_name (); -extern int ar_touch (); -extern time_t ar_member_date (); -#endif - -extern void dir_load (); -extern int dir_file_exists_p (), file_exists_p (), file_impossible_p (); -extern void file_impossible (); -extern char *dir_name (); - -extern void define_default_variables (); -extern void set_default_suffixes (), install_default_suffix_rules (); -extern void install_default_implicit_rules (), count_implicit_rule_limits (); -extern void convert_to_pattern (), create_pattern_rule (); - -extern void build_vpath_lists (), construct_vpath_list (); -extern int vpath_search (); - -extern void construct_include_path (); -extern void uniquize_deps (); - -extern int update_goal_chain (); -extern void notice_finished_file (); - -extern void user_access (), make_access (), child_access (); - - -#ifdef HAVE_VFORK_H -#include -#endif - -/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION, - because such systems often declare the in header files anyway. */ - -#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) - -extern long int atol (); -extern long int lseek (); - -#endif /* Not GNU C library or POSIX. */ - -#ifdef HAVE_GETCWD -extern char *getcwd (); -#else -extern char *getwd (); -#define getcwd(buf, len) getwd (buf) -#endif - -extern char **environ; - -extern char *reading_filename; -extern unsigned int *reading_lineno_ptr; - -extern int just_print_flag, silent_flag, ignore_errors_flag, keep_going_flag; -extern int debug_flag, print_data_base_flag, question_flag, touch_flag; -extern int env_overrides, no_builtin_rules_flag, print_version_flag; -extern int print_directory_flag, warn_undefined_variables_flag; -extern int posix_pedantic; - -extern unsigned int job_slots; -extern double max_load_average; - -extern char *program; -extern char *starting_directory; -extern unsigned int makelevel; -extern char *version_string, *remote_description; - -extern unsigned int commands_started; - -extern int handling_fatal_signal; - - -#define DEBUGPR(msg) \ - do if (debug_flag) { print_spaces (depth); printf (msg, file->name); \ - fflush (stdout); } while (0) diff --git a/buildtools/windows/source/make/make.info b/buildtools/windows/source/make/make.info deleted file mode 100644 index be5446863a9..00000000000 --- a/buildtools/windows/source/make/make.info +++ /dev/null @@ -1,163 +0,0 @@ -This is Info file make.info, produced by Makeinfo-1.55 from the input -file ./make.texinfo. - - This file documents the GNU Make utility, which determines -automatically which pieces of a large program need to be recompiled, -and issues the commands to recompile them. - - This is Edition 0.48, last updated 4 April 1995, of `The GNU Make -Manual', for `make', Version 3.73 Beta. - - Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95 Free -Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -Indirect: -make.info-1: 1141 -make.info-2: 50405 -make.info-3: 97832 -make.info-4: 147393 -make.info-5: 196701 -make.info-6: 243137 -make.info-7: 292772 -make.info-8: 318335 - -Tag Table: -(Indirect) -Node: Top1141 -Node: Overview12012 -Node: Preparing12949 -Node: Reading13904 -Node: Bugs14826 -Node: Introduction16694 -Node: Rule Introduction18281 -Node: Simple Makefile19990 -Node: How Make Works23603 -Node: Variables Simplify26101 -Node: make Deduces28307 -Node: Combine By Dependency30054 -Node: Cleanup31082 -Node: Makefiles32492 -Node: Makefile Contents33189 -Node: Makefile Names35449 -Node: Include37051 -Node: MAKEFILES Variable40462 -Node: Remaking Makefiles41964 -Node: Overriding Makefiles45782 -Node: Rules47805 -Node: Rule Example50405 -Node: Rule Syntax51240 -Node: Wildcards53449 -Node: Wildcard Examples54959 -Node: Wildcard Pitfall56194 -Node: Wildcard Function57444 -Node: Directory Search59225 -Node: General Search60285 -Node: Selective Search61803 -Node: Commands/Search64723 -Node: Implicit/Search66063 -Node: Libraries/Search66998 -Node: Phony Targets68067 -Node: Force Targets71412 -Node: Empty Targets72449 -Node: Special Targets73709 -Node: Multiple Targets77631 -Node: Multiple Rules79498 -Node: Static Pattern81581 -Node: Static Usage82221 -Node: Static versus Implicit85875 -Node: Double-Colon87606 -Node: Automatic Dependencies89136 -Node: Commands93214 -Node: Echoing94906 -Node: Execution96164 -Node: Parallel97832 -Node: Errors101147 -Node: Interrupts104783 -Node: Recursion106364 -Node: MAKE Variable107650 -Node: Variables/Recursion109608 -Node: Options/Recursion114571 -Node: -w Option119257 -Node: Sequences120243 -Node: Empty Commands123238 -Node: Using Variables124406 -Node: Reference127390 -Node: Flavors128935 -Node: Advanced134252 -Node: Substitution Refs134752 -Node: Computed Names136279 -Node: Values140849 -Node: Setting141766 -Node: Appending143475 -Node: Override Directive147393 -Node: Defining148772 -Node: Environment150770 -Node: Conditionals152898 -Node: Conditional Example153607 -Node: Conditional Syntax156173 -Node: Testing Flags160919 -Node: Functions162016 -Node: Syntax of Functions163014 -Node: Text Functions165151 -Node: Filename Functions171905 -Node: Foreach Function177026 -Node: Origin Function180232 -Node: Shell Function183457 -Node: Running184834 -Node: Makefile Arguments186822 -Node: Goals187517 -Node: Instead of Execution191519 -Node: Avoiding Compilation194800 -Node: Overriding196701 -Node: Testing198989 -Node: Options Summary200866 -Node: Implicit Rules207676 -Node: Using Implicit209822 -Node: Catalogue of Rules213309 -Node: Implicit Variables222290 -Node: Chained Rules226416 -Node: Pattern Rules229114 -Node: Pattern Intro230642 -Node: Pattern Examples233453 -Node: Automatic235246 -Node: Pattern Match241533 -Node: Match-Anything Rules243137 -Node: Canceling Rules246996 -Node: Last Resort247699 -Node: Suffix Rules249536 -Node: Search Algorithm253243 -Node: Archives256739 -Node: Archive Members257434 -Node: Archive Update259013 -Node: Archive Symbols260929 -Node: Archive Pitfalls262128 -Node: Archive Suffix Rules262844 -Node: Features264384 -Node: Missing272736 -Node: Makefile Conventions277065 -Node: Makefile Basics277413 -Node: Utilities in Makefiles279752 -Node: Standard Targets281444 -Node: Command Variables289947 -Node: Directory Variables292772 -Node: Quick Reference302070 -Node: Complex Makefile309668 -Node: Concept Index318335 -Node: Name Index357722 - -End Tag Table diff --git a/buildtools/windows/source/make/make.info-1 b/buildtools/windows/source/make/make.info-1 deleted file mode 100644 index 84630943d3f..00000000000 --- a/buildtools/windows/source/make/make.info-1 +++ /dev/null @@ -1,1122 +0,0 @@ -This is Info file make.info, produced by Makeinfo-1.55 from the input -file ./make.texinfo. - - This file documents the GNU Make utility, which determines -automatically which pieces of a large program need to be recompiled, -and issues the commands to recompile them. - - This is Edition 0.48, last updated 4 April 1995, of `The GNU Make -Manual', for `make', Version 3.73 Beta. - - Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95 Free -Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: make.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir) - -Make -**** - - The GNU `make' utility automatically determines which pieces of a -large program need to be recompiled, and issues the commands to -recompile them. - - This is Edition 0.48 of the `GNU Make Manual', last updated 4 April -1995 for `make' Version 3.73 Beta. - - This manual describes `make' and contains the following chapters: - -* Menu: - -* Overview:: Overview of `make'. -* Introduction:: An introduction to `make'. -* Makefiles:: Makefiles tell `make' what to do. -* Rules:: Rules describe when a file must be remade. -* Commands:: Commands say how to remake a file. -* Using Variables:: You can use variables to avoid repetition. -* Conditionals:: Use or ignore parts of the makefile based - on the values of variables. -* Functions:: Many powerful ways to manipulate text. -* make Invocation: Running. How to invoke `make' on the command line. -* Implicit Rules:: Use implicit rules to treat many files alike, - based on their file names. -* Archives:: How `make' can update library archives. -* Features:: Features GNU `make' has over other `make's. -* Missing:: What GNU `make' lacks from other `make's. -* Makefile Conventions:: Conventions for makefiles in GNU programs. -* Quick Reference:: A quick reference for experienced users. -* Complex Makefile:: A real example of a straightforward, - but nontrivial, makefile. -* Concept Index:: Index of Concepts -* Name Index:: Index of Functions, Variables, & Directives - - -- The Detailed Node Listing -- - -Overview of `make' - -* Preparing:: Preparing and Running Make -* Reading:: On Reading this Text -* Bugs:: Problems and Bugs - -An Introduction to Makefiles - -* Rule Introduction:: What a rule looks like. -* Simple Makefile:: A Simple Makefile -* How Make Works:: How `make' Processes This Makefile -* Variables Simplify:: Variables Make Makefiles Simpler -* make Deduces:: Letting `make' Deduce the Commands -* Combine By Dependency:: Another Style of Makefile -* Cleanup:: Rules for Cleaning the Directory - -Writing Makefiles - -* Makefile Contents:: What makefiles contain. -* Makefile Names:: How to name your makefile. -* Include:: How one makefile can use another makefile. -* MAKEFILES Variable:: The environment can specify extra makefiles. -* Remaking Makefiles:: How makefiles get remade. -* Overriding Makefiles:: How to override part of one makefile - with another makefile. - -Writing Rules - -* Rule Example:: An example explained. -* Rule Syntax:: General syntax explained. -* Wildcards:: Using wildcard characters such as `*'. -* Directory Search:: Searching other directories for source files. -* Phony Targets:: Using a target that is not a real file's name. -* Force Targets:: You can use a target without commands - or dependencies to mark other - targets as phony. -* Empty Targets:: When only the date matters and the - files are empty. -* Special Targets:: Targets with special built-in meanings. -* Multiple Targets:: When to make use of several targets in a rule. -* Multiple Rules:: How to use several rules with the same target. -* Static Pattern:: Static pattern rules apply to multiple targets - and can vary the dependencies according to - the target name. -* Double-Colon:: How to use a special kind of rule to allow - several independent rules for one target. -* Automatic Dependencies:: How to automatically generate rules giving - dependencies from the source files themselves. - -Using Wildcard Characters in File Names - -* Wildcard Examples:: Several examples -* Wildcard Pitfall:: Problems to avoid. -* Wildcard Function:: How to cause wildcard expansion where - it does not normally take place. - -Searching Directories for Dependencies - -* General Search:: Specifying a search path that applies - to every dependency. -* Selective Search:: Specifying a search path - for a specified class of names. -* Commands/Search:: How to write shell commands that work together - with search paths. -* Implicit/Search:: How search paths affect implicit rules. -* Libraries/Search:: Directory search for link libraries. - -Static Pattern Rules - -* Static Usage:: The syntax of static pattern rules. -* Static versus Implicit:: When are they better than implicit rules? - -Writing the Commands in Rules - -* Echoing:: How to control when commands are echoed. -* Execution:: How commands are executed. -* Parallel:: How commands can be executed in parallel. -* Errors:: What happens after a command execution error. -* Interrupts:: What happens when a command is interrupted. -* Recursion:: Invoking `make' from makefiles. -* Sequences:: Defining canned sequences of commands. -* Empty Commands:: Defining useful, do-nothing commands. - -Recursive Use of `make' - -* MAKE Variable:: The special effects of using `$(MAKE)'. -* Variables/Recursion:: How to communicate variables to a sub-`make'. -* Options/Recursion:: How to communicate options to a sub-`make'. -* -w Option:: How the `-w' or `--print-directory' option - helps debug use of recursive `make' commands. - -How to Use Variables - -* Reference:: How to use the value of a variable. -* Flavors:: Variables come in two flavors. -* Advanced:: Advanced features for referencing a variable. -* Values:: All the ways variables get their values. -* Setting:: How to set a variable in the makefile. -* Appending:: How to append more text to the old value - of a variable. -* Override Directive:: How to set a variable in the makefile even if - the user has set it with a command argument. -* Defining:: An alternate way to set a variable - to a verbatim string. -* Environment:: Variable values can come from the environment. - -Advanced Features for Reference to Variables - -* Substitution Refs:: Referencing a variable with - substitutions on the value. -* Computed Names:: Computing the name of the variable to refer to. - -Conditional Parts of Makefiles - -* Conditional Example:: Example of a conditional -* Conditional Syntax:: The syntax of conditionals. -* Testing Flags:: Conditionals that test flags. - -Functions for Transforming Text - -* Syntax of Functions:: How to write a function call. -* Text Functions:: General-purpose text manipulation functions. -* Filename Functions:: Functions for manipulating file names. -* Foreach Function:: Repeat some text with controlled variation. -* Origin Function:: Find where a variable got its value. -* Shell Function:: Substitute the output of a shell command. - -How to Run `make' - -* Makefile Arguments:: How to specify which makefile to use. -* Goals:: How to use goal arguments to specify which - parts of the makefile to use. -* Instead of Execution:: How to use mode flags to specify what - kind of thing to do with the commands - in the makefile other than simply - execute them. -* Avoiding Compilation:: How to avoid recompiling certain files. -* Overriding:: How to override a variable to specify - an alternate compiler and other things. -* Testing:: How to proceed past some errors, to - test compilation. -* Options Summary:: Summary of Options - -Using Implicit Rules - -* Using Implicit:: How to use an existing implicit rule - to get the commands for updating a file. -* Catalogue of Rules:: A list of built-in implicit rules. -* Implicit Variables:: How to change what predefined rules do. -* Chained Rules:: How to use a chain of implicit rules. -* Pattern Rules:: How to define new implicit rules. -* Last Resort:: How to defining commands for rules - which cannot find any. -* Suffix Rules:: The old-fashioned style of implicit rule. -* Search Algorithm:: The precise algorithm for applying - implicit rules. - -Defining and Redefining Pattern Rules - -* Pattern Intro:: An introduction to pattern rules. -* Pattern Examples:: Examples of pattern rules. -* Automatic:: How to use automatic variables in the - commands of implicit rules. -* Pattern Match:: How patterns match. -* Match-Anything Rules:: Precautions you should take prior to - defining rules that can match any - target file whatever. -* Canceling Rules:: How to override or cancel built-in rules. - -Using `make' to Update Archive Files - -* Archive Members:: Archive members as targets. -* Archive Update:: The implicit rule for archive member targets. -* Archive Suffix Rules:: You can write a special kind of suffix rule - for updating archives. - -Implicit Rule for Archive Member Targets - -* Archive Symbols:: How to update archive symbol directories. - - -File: make.info, Node: Overview, Next: Introduction, Prev: Top, Up: Top - -Overview of `make' -****************** - - The `make' utility automatically determines which pieces of a large -program need to be recompiled, and issues commands to recompile them. -This manual describes GNU `make', which was implemented by Richard -Stallman and Roland McGrath. GNU `make' conforms to section 6.2 of -`IEEE Standard 1003.2-1992' (POSIX.2). - - Our examples show C programs, since they are most common, but you -can use `make' with any programming language whose compiler can be run -with a shell command. Indeed, `make' is not limited to programs. You -can use it to describe any task where some files must be updated -automatically from others whenever the others change. - -* Menu: - -* Preparing:: Preparing and Running Make -* Reading:: On Reading this Text -* Bugs:: Problems and Bugs - - -File: make.info, Node: Preparing, Next: Reading, Up: Overview - -Preparing and Running Make -========================== - - To prepare to use `make', you must write a file called the -"makefile" that describes the relationships among files in your program -and provides commands for updating each file. In a program, typically, -the executable file is updated from object files, which are in turn -made by compiling source files. - - Once a suitable makefile exists, each time you change some source -files, this simple shell command: - - make - -suffices to perform all necessary recompilations. The `make' program -uses the makefile data base and the last-modification times of the -files to decide which of the files need to be updated. For each of -those files, it issues the commands recorded in the data base. - - You can provide command line arguments to `make' to control which -files should be recompiled, or how. *Note How to Run `make': Running. - - -File: make.info, Node: Reading, Next: Bugs, Prev: Preparing, Up: Overview - -How to Read This Manual -======================= - - If you are new to `make', or are looking for a general introduction, -read the first few sections of each chapter, skipping the later -sections. In each chapter, the first few sections contain introductory -or general information and the later sections contain specialized or -technical information. The exception is the second chapter, *Note An -Introduction to Makefiles: Introduction, all of which is introductory. - - If you are familiar with other `make' programs, see *Note Features -of GNU `make': Features, which lists the enhancements GNU `make' has, -and *Note Incompatibilities and Missing Features: Missing, which -explains the few things GNU `make' lacks that others have. - - For a quick summary, see *Note Options Summary::, *Note Quick -Reference::, and *Note Special Targets::. - - -File: make.info, Node: Bugs, Prev: Reading, Up: Overview - -Problems and Bugs -================= - - If you have problems with GNU `make' or think you've found a bug, -please report it to the developers; we cannot promise to do anything but -we might well want to fix it. - - Before reporting a bug, make sure you've actually found a real bug. -Carefully reread the documentation and see if it really says you can do -what you're trying to do. If it's not clear whether you should be able -to do something or not, report that too; it's a bug in the -documentation! - - Before reporting a bug or trying to fix it yourself, try to isolate -it to the smallest possible makefile that reproduces the problem. Then -send us the makefile and the exact results `make' gave you. Also say -what you expected to occur; this will help us decide whether the -problem was really in the documentation. - - Once you've got a precise problem, please send electronic mail either -through the Internet or via UUCP: - - Internet address: - bug-gnu-utils@prep.ai.mit.edu - - UUCP path: - mit-eddie!prep.ai.mit.edu!bug-gnu-utils - -Please include the version number of `make' you are using. You can get -this information with the command `make --version'. Be sure also to -include the type of machine and operating system you are using. If -possible, include the contents of the file `config.h' that is generated -by the configuration process. - - Non-bug suggestions are always welcome as well. If you have -questions about things that are unclear in the documentation or are -just obscure features, send a message to the bug reporting address. We -cannot guarantee you'll get help with your problem, but many seasoned -`make' users read the mailing list and they will probably try to help -you out. The maintainers sometimes answer such questions as well, when -time permits. - - -File: make.info, Node: Introduction, Next: Makefiles, Prev: Overview, Up: Top - -An Introduction to Makefiles -**************************** - - You need a file called a "makefile" to tell `make' what to do. Most -often, the makefile tells `make' how to compile and link a program. - - In this chapter, we will discuss a simple makefile that describes -how to compile and link a text editor which consists of eight C source -files and three header files. The makefile can also tell `make' how to -run miscellaneous commands when explicitly asked (for example, to remove -certain files as a clean-up operation). To see a more complex example -of a makefile, see *Note Complex Makefile::. - - When `make' recompiles the editor, each changed C source file must -be recompiled. If a header file has changed, each C source file that -includes the header file must be recompiled to be safe. Each -compilation produces an object file corresponding to the source file. -Finally, if any source file has been recompiled, all the object files, -whether newly made or saved from previous compilations, must be linked -together to produce the new executable editor. - -* Menu: - -* Rule Introduction:: What a rule looks like. -* Simple Makefile:: A Simple Makefile -* How Make Works:: How `make' Processes This Makefile -* Variables Simplify:: Variables Make Makefiles Simpler -* make Deduces:: Letting `make' Deduce the Commands -* Combine By Dependency:: Another Style of Makefile -* Cleanup:: Rules for Cleaning the Directory - - -File: make.info, Node: Rule Introduction, Next: Simple Makefile, Up: Introduction - -What a Rule Looks Like -====================== - - A simple makefile consists of "rules" with the following shape: - - TARGET ... : DEPENDENCIES ... - COMMAND - ... - ... - - A "target" is usually the name of a file that is generated by a -program; examples of targets are executable or object files. A target -can also be the name of an action to carry out, such as `clean' (*note -Phony Targets::.). - - A "dependency" is a file that is used as input to create the target. -A target often depends on several files. - - A "command" is an action that `make' carries out. A rule may have -more than one command, each on its own line. *Please note:* you need -to put a tab character at the beginning of every command line! This is -an obscurity that catches the unwary. - - Usually a command is in a rule with dependencies and serves to -create a target file if any of the dependencies change. However, the -rule that specifies commands for the target need not have dependencies. -For example, the rule containing the delete command associated with the -target `clean' does not have dependencies. - - A "rule", then, explains how and when to remake certain files which -are the targets of the particular rule. `make' carries out the -commands on the dependencies to create or update the target. A rule -can also explain how and when to carry out an action. *Note Writing -Rules: Rules. - - A makefile may contain other text besides rules, but a simple -makefile need only contain rules. Rules may look somewhat more -complicated than shown in this template, but all fit the pattern more -or less. - - -File: make.info, Node: Simple Makefile, Next: How Make Works, Prev: Rule Introduction, Up: Introduction - -A Simple Makefile -================= - - Here is a straightforward makefile that describes the way an -executable file called `edit' depends on eight object files which, in -turn, depend on eight C source and three header files. - - In this example, all the C files include `defs.h', but only those -defining editing commands include `command.h', and only low level files -that change the editor buffer include `buffer.h'. - - edit : main.o kbd.o command.o display.o \ - insert.o search.o files.o utils.o - cc -o edit main.o kbd.o command.o display.o \ - insert.o search.o files.o utils.o - - main.o : main.c defs.h - cc -c main.c - kbd.o : kbd.c defs.h command.h - cc -c kbd.c - command.o : command.c defs.h command.h - cc -c command.c - display.o : display.c defs.h buffer.h - cc -c display.c - insert.o : insert.c defs.h buffer.h - cc -c insert.c - search.o : search.c defs.h buffer.h - cc -c search.c - files.o : files.c defs.h buffer.h command.h - cc -c files.c - utils.o : utils.c defs.h - cc -c utils.c - clean : - rm edit main.o kbd.o command.o display.o \ - insert.o search.o files.o utils.o - -We split each long line into two lines using backslash-newline; this is -like using one long line, but is easier to read. - - To use this makefile to create the executable file called `edit', -type: - - make - - To use this makefile to delete the executable file and all the object -files from the directory, type: - - make clean - - In the example makefile, the targets include the executable file -`edit', and the object files `main.o' and `kbd.o'. The dependencies -are files such as `main.c' and `defs.h'. In fact, each `.o' file is -both a target and a dependency. Commands include `cc -c main.c' and -`cc -c kbd.c'. - - When a target is a file, it needs to be recompiled or relinked if any -of its dependencies change. In addition, any dependencies that are -themselves automatically generated should be updated first. In this -example, `edit' depends on each of the eight object files; the object -file `main.o' depends on the source file `main.c' and on the header -file `defs.h'. - - A shell command follows each line that contains a target and -dependencies. These shell commands say how to update the target file. -A tab character must come at the beginning of every command line to -distinguish commands lines from other lines in the makefile. (Bear in -mind that `make' does not know anything about how the commands work. -It is up to you to supply commands that will update the target file -properly. All `make' does is execute the commands in the rule you have -specified when the target file needs to be updated.) - - The target `clean' is not a file, but merely the name of an action. -Since you normally do not want to carry out the actions in this rule, -`clean' is not a dependency of any other rule. Consequently, `make' -never does anything with it unless you tell it specifically. Note that -this rule not only is not a dependency, it also does not have any -dependencies, so the only purpose of the rule is to run the specified -commands. Targets that do not refer to files but are just actions are -called "phony targets". *Note Phony Targets::, for information about -this kind of target. *Note Errors in Commands: Errors, to see how to -cause `make' to ignore errors from `rm' or any other command. - - -File: make.info, Node: How Make Works, Next: Variables Simplify, Prev: Simple Makefile, Up: Introduction - -How `make' Processes a Makefile -=============================== - - By default, `make' starts with the first rule (not counting rules -whose target names start with `.'). This is called the "default goal". -("Goals" are the targets that `make' strives ultimately to update. -*Note Arguments to Specify the Goals: Goals.) - - In the simple example of the previous section, the default goal is to -update the executable program `edit'; therefore, we put that rule first. - - Thus, when you give the command: - - make - -`make' reads the makefile in the current directory and begins by -processing the first rule. In the example, this rule is for relinking -`edit'; but before `make' can fully process this rule, it must process -the rules for the files that `edit' depends on, which in this case are -the object files. Each of these files is processed according to its -own rule. These rules say to update each `.o' file by compiling its -source file. The recompilation must be done if the source file, or any -of the header files named as dependencies, is more recent than the -object file, or if the object file does not exist. - - The other rules are processed because their targets appear as -dependencies of the goal. If some other rule is not depended on by the -goal (or anything it depends on, etc.), that rule is not processed, -unless you tell `make' to do so (with a command such as `make clean'). - - Before recompiling an object file, `make' considers updating its -dependencies, the source file and header files. This makefile does not -specify anything to be done for them--the `.c' and `.h' files are not -the targets of any rules--so `make' does nothing for these files. But -`make' would update automatically generated C programs, such as those -made by Bison or Yacc, by their own rules at this time. - - After recompiling whichever object files need it, `make' decides -whether to relink `edit'. This must be done if the file `edit' does -not exist, or if any of the object files are newer than it. If an -object file was just recompiled, it is now newer than `edit', so `edit' -is relinked. - - Thus, if we change the file `insert.c' and run `make', `make' will -compile that file to update `insert.o', and then link `edit'. If we -change the file `command.h' and run `make', `make' will recompile the -object files `kbd.o', `command.o' and `files.o' and then link the file -`edit'. - - -File: make.info, Node: Variables Simplify, Next: make Deduces, Prev: How Make Works, Up: Introduction - -Variables Make Makefiles Simpler -================================ - - In our example, we had to list all the object files twice in the -rule for `edit' (repeated here): - - edit : main.o kbd.o command.o display.o \ - insert.o search.o files.o utils.o - cc -o edit main.o kbd.o command.o display.o \ - insert.o search.o files.o utils.o - - Such duplication is error-prone; if a new object file is added to the -system, we might add it to one list and forget the other. We can -eliminate the risk and simplify the makefile by using a variable. -"Variables" allow a text string to be defined once and substituted in -multiple places later (*note How to Use Variables: Using Variables.). - - It is standard practice for every makefile to have a variable named -`objects', `OBJECTS', `objs', `OBJS', `obj', or `OBJ' which is a list -of all object file names. We would define such a variable `objects' -with a line like this in the makefile: - - objects = main.o kbd.o command.o display.o \ - insert.o search.o files.o utils.o - -Then, each place we want to put a list of the object file names, we can -substitute the variable's value by writing `$(objects)' (*note How to -Use Variables: Using Variables.). - - Here is how the complete simple makefile looks when you use a -variable for the object files: - - objects = main.o kbd.o command.o display.o \ - insert.o search.o files.o utils.o - - edit : $(objects) - cc -o edit $(objects) - main.o : main.c defs.h - cc -c main.c - kbd.o : kbd.c defs.h command.h - cc -c kbd.c - command.o : command.c defs.h command.h - cc -c command.c - display.o : display.c defs.h buffer.h - cc -c display.c - insert.o : insert.c defs.h buffer.h - cc -c insert.c - search.o : search.c defs.h buffer.h - cc -c search.c - files.o : files.c defs.h buffer.h command.h - cc -c files.c - utils.o : utils.c defs.h - cc -c utils.c - clean : - rm edit $(objects) - - -File: make.info, Node: make Deduces, Next: Combine By Dependency, Prev: Variables Simplify, Up: Introduction - -Letting `make' Deduce the Commands -================================== - - It is not necessary to spell out the commands for compiling the -individual C source files, because `make' can figure them out: it has an -"implicit rule" for updating a `.o' file from a correspondingly named -`.c' file using a `cc -c' command. For example, it will use the -command `cc -c main.c -o main.o' to compile `main.c' into `main.o'. We -can therefore omit the commands from the rules for the object files. -*Note Using Implicit Rules: Implicit Rules. - - When a `.c' file is used automatically in this way, it is also -automatically added to the list of dependencies. We can therefore omit -the `.c' files from the dependencies, provided we omit the commands. - - Here is the entire example, with both of these changes, and a -variable `objects' as suggested above: - - objects = main.o kbd.o command.o display.o \ - insert.o search.o files.o utils.o - - edit : $(objects) - cc -o edit $(objects) - - main.o : defs.h - kbd.o : defs.h command.h - command.o : defs.h command.h - display.o : defs.h buffer.h - insert.o : defs.h buffer.h - search.o : defs.h buffer.h - files.o : defs.h buffer.h command.h - utils.o : defs.h - - .PHONY : clean - clean : - -rm edit $(objects) - -This is how we would write the makefile in actual practice. (The -complications associated with `clean' are described elsewhere. See -*Note Phony Targets::, and *Note Errors in Commands: Errors.) - - Because implicit rules are so convenient, they are important. You -will see them used frequently. - - -File: make.info, Node: Combine By Dependency, Next: Cleanup, Prev: make Deduces, Up: Introduction - -Another Style of Makefile -========================= - - When the objects of a makefile are created only by implicit rules, an -alternative style of makefile is possible. In this style of makefile, -you group entries by their dependencies instead of by their targets. -Here is what one looks like: - - objects = main.o kbd.o command.o display.o \ - insert.o search.o files.o utils.o - - edit : $(objects) - cc -o edit $(objects) - - $(objects) : defs.h - kbd.o command.o files.o : command.h - display.o insert.o search.o files.o : buffer.h - -Here `defs.h' is given as a dependency of all the object files; -`command.h' and `buffer.h' are dependencies of the specific object -files listed for them. - - Whether this is better is a matter of taste: it is more compact, but -some people dislike it because they find it clearer to put all the -information about each target in one place. - - -File: make.info, Node: Cleanup, Prev: Combine By Dependency, Up: Introduction - -Rules for Cleaning the Directory -================================ - - Compiling a program is not the only thing you might want to write -rules for. Makefiles commonly tell how to do a few other things besides -compiling a program: for example, how to delete all the object files -and executables so that the directory is `clean'. - - Here is how we could write a `make' rule for cleaning our example -editor: - - clean: - rm edit $(objects) - - In practice, we might want to write the rule in a somewhat more -complicated manner to handle unanticipated situations. We would do -this: - - .PHONY : clean - clean : - -rm edit $(objects) - -This prevents `make' from getting confused by an actual file called -`clean' and causes it to continue in spite of errors from `rm'. (See -*Note Phony Targets::, and *Note Errors in Commands: Errors.) - -A rule such as this should not be placed at the beginning of the -makefile, because we do not want it to run by default! Thus, in the -example makefile, we want the rule for `edit', which recompiles the -editor, to remain the default goal. - - Since `clean' is not a dependency of `edit', this rule will not run -at all if we give the command `make' with no arguments. In order to -make the rule run, we have to type `make clean'. *Note How to Run -`make': Running. - - -File: make.info, Node: Makefiles, Next: Rules, Prev: Introduction, Up: Top - -Writing Makefiles -***************** - - The information that tells `make' how to recompile a system comes -from reading a data base called the "makefile". - -* Menu: - -* Makefile Contents:: What makefiles contain. -* Makefile Names:: How to name your makefile. -* Include:: How one makefile can use another makefile. -* MAKEFILES Variable:: The environment can specify extra makefiles. -* Remaking Makefiles:: How makefiles get remade. -* Overriding Makefiles:: How to override part of one makefile - with another makefile. - - -File: make.info, Node: Makefile Contents, Next: Makefile Names, Up: Makefiles - -What Makefiles Contain -====================== - - Makefiles contain five kinds of things: "explicit rules", "implicit -rules", "variable definitions", "directives", and "comments". Rules, -variables, and directives are described at length in later chapters. - - * An "explicit rule" says when and how to remake one or more files, - called the rule's targets. It lists the other files that the - targets "depend on", and may also give commands to use to create - or update the targets. *Note Writing Rules: Rules. - - * An "implicit rule" says when and how to remake a class of files - based on their names. It describes how a target may depend on a - file with a name similar to the target and gives commands to - create or update such a target. *Note Using Implicit Rules: - Implicit Rules. - - * A "variable definition" is a line that specifies a text string - value for a variable that can be substituted into the text later. - The simple makefile example shows a variable definition for - `objects' as a list of all object files (*note Variables Make - Makefiles Simpler: Variables Simplify.). - - * A "directive" is a command for `make' to do something special while - reading the makefile. These include: - - * Reading another makefile (*note Including Other Makefiles: - Include.). - - * Deciding (based on the values of variables) whether to use or - ignore a part of the makefile (*note Conditional Parts of - Makefiles: Conditionals.). - - * Defining a variable from a verbatim string containing - multiple lines (*note Defining Variables Verbatim: Defining.). - - * `#' in a line of a makefile starts a "comment". It and the rest of - the line are ignored, except that a trailing backslash not escaped - by another backslash will continue the comment across multiple - lines. Comments may appear on any of the lines in the makefile, - except within a `define' directive, and perhaps within commands - (where the shell decides what is a comment). A line containing - just a comment (with perhaps spaces before it) is effectively - blank, and is ignored. - - -File: make.info, Node: Makefile Names, Next: Include, Prev: Makefile Contents, Up: Makefiles - -What Name to Give Your Makefile -=============================== - - By default, when `make' looks for the makefile, it tries the -following names, in order: `GNUmakefile', `makefile' and `Makefile'. - - Normally you should call your makefile either `makefile' or -`Makefile'. (We recommend `Makefile' because it appears prominently -near the beginning of a directory listing, right near other important -files such as `README'.) The first name checked, `GNUmakefile', is not -recommended for most makefiles. You should use this name if you have a -makefile that is specific to GNU `make', and will not be understood by -other versions of `make'. Other `make' programs look for `makefile' and -`Makefile', but not `GNUmakefile'. - - If `make' finds none of these names, it does not use any makefile. -Then you must specify a goal with a command argument, and `make' will -attempt to figure out how to remake it using only its built-in implicit -rules. *Note Using Implicit Rules: Implicit Rules. - - If you want to use a nonstandard name for your makefile, you can -specify the makefile name with the `-f' or `--file' option. The -arguments `-f NAME' or `--file=NAME' tell `make' to read the file NAME -as the makefile. If you use more than one `-f' or `--file' option, you -can specify several makefiles. All the makefiles are effectively -concatenated in the order specified. The default makefile names -`GNUmakefile', `makefile' and `Makefile' are not checked automatically -if you specify `-f' or `--file'. - - -File: make.info, Node: Include, Next: MAKEFILES Variable, Prev: Makefile Names, Up: Makefiles - -Including Other Makefiles -========================= - - The `include' directive tells `make' to suspend reading the current -makefile and read one or more other makefiles before continuing. The -directive is a line in the makefile that looks like this: - - include FILENAMES... - -FILENAMES can contain shell file name patterns. - - Extra spaces are allowed and ignored at the beginning of the line, -but a tab is not allowed. (If the line begins with a tab, it will be -considered a command line.) Whitespace is required between `include' -and the file names, and between file names; extra whitespace is ignored -there and at the end of the directive. A comment starting with `#' is -allowed at the end of the line. If the file names contain any variable -or function references, they are expanded. *Note How to Use Variables: -Using Variables. - - For example, if you have three `.mk' files, `a.mk', `b.mk', and -`c.mk', and `$(bar)' expands to `bish bash', then the following -expression - - include foo *.mk $(bar) - - is equivalent to - - include foo a.mk b.mk c.mk bish bash - - When `make' processes an `include' directive, it suspends reading of -the containing makefile and reads from each listed file in turn. When -that is finished, `make' resumes reading the makefile in which the -directive appears. - - One occasion for using `include' directives is when several programs, -handled by individual makefiles in various directories, need to use a -common set of variable definitions (*note Setting Variables: Setting.) -or pattern rules (*note Defining and Redefining Pattern Rules: Pattern -Rules.). - - Another such occasion is when you want to generate dependencies from -source files automatically; the dependencies can be put in a file that -is included by the main makefile. This practice is generally cleaner -than that of somehow appending the dependencies to the end of the main -makefile as has been traditionally done with other versions of `make'. -*Note Automatic Dependencies::. - - If the specified name does not start with a slash, and the file is -not found in the current directory, several other directories are -searched. First, any directories you have specified with the `-I' or -`--include-dir' option are searched (*note Summary of Options: Options -Summary.). Then the following directories (if they exist) are -searched, in this order: `PREFIX/include' (normally -`/usr/local/include') `/usr/gnu/include', `/usr/local/include', -`/usr/include'. - - If an included makefile cannot be found in any of these directories, -a warning message is generated, but it is not an immediately fatal -error; processing of the makefile containing the `include' continues. -Once it has finished reading makefiles, `make' will try to remake any -that are out of date or don't exist. *Note How Makefiles Are Remade: -Remaking Makefiles. Only after it has tried to find a way to remake a -makefile and failed, will `make' diagnose the missing makefile as a -fatal error. - - If you want `make' to simply ignore a makefile which does not exist -and cannot be remade, with no error message, use the `-include' -directive instead of `include', like this: - - -include FILENAMES... - - This is acts like `include' in every way except that there is no -error (not even a warning) if any of the FILENAMES do not exist. - - -File: make.info, Node: MAKEFILES Variable, Next: Remaking Makefiles, Prev: Include, Up: Makefiles - -The Variable `MAKEFILES' -======================== - - If the environment variable `MAKEFILES' is defined, `make' considers -its value as a list of names (separated by whitespace) of additional -makefiles to be read before the others. This works much like the -`include' directive: various directories are searched for those files -(*note Including Other Makefiles: Include.). In addition, the default -goal is never taken from one of these makefiles and it is not an error -if the files listed in `MAKEFILES' are not found. - - The main use of `MAKEFILES' is in communication between recursive -invocations of `make' (*note Recursive Use of `make': Recursion.). It -usually is not desirable to set the environment variable before a -top-level invocation of `make', because it is usually better not to -mess with a makefile from outside. However, if you are running `make' -without a specific makefile, a makefile in `MAKEFILES' can do useful -things to help the built-in implicit rules work better, such as -defining search paths (*note Directory Search::.). - - Some users are tempted to set `MAKEFILES' in the environment -automatically on login, and program makefiles to expect this to be done. -This is a very bad idea, because such makefiles will fail to work if -run by anyone else. It is much better to write explicit `include' -directives in the makefiles. *Note Including Other Makefiles: Include. - - -File: make.info, Node: Remaking Makefiles, Next: Overriding Makefiles, Prev: MAKEFILES Variable, Up: Makefiles - -How Makefiles Are Remade -======================== - - Sometimes makefiles can be remade from other files, such as RCS or -SCCS files. If a makefile can be remade from other files, you probably -want `make' to get an up-to-date version of the makefile to read in. - - To this end, after reading in all makefiles, `make' will consider -each as a goal target and attempt to update it. If a makefile has a -rule which says how to update it (found either in that very makefile or -in another one) or if an implicit rule applies to it (*note Using -Implicit Rules: Implicit Rules.), it will be updated if necessary. -After all makefiles have been checked, if any have actually been -changed, `make' starts with a clean slate and reads all the makefiles -over again. (It will also attempt to update each of them over again, -but normally this will not change them again, since they are already up -to date.) - - If the makefiles specify a double-colon rule to remake a file with -commands but no dependencies, that file will always be remade (*note -Double-Colon::.). In the case of makefiles, a makefile that has a -double-colon rule with commands but no dependencies will be remade every -time `make' is run, and then again after `make' starts over and reads -the makefiles in again. This would cause an infinite loop: `make' -would constantly remake the makefile, and never do anything else. So, -to avoid this, `make' will *not* attempt to remake makefiles which are -specified as double-colon targets but have no dependencies. - - If you do not specify any makefiles to be read with `-f' or `--file' -options, `make' will try the default makefile names; *note What Name to -Give Your Makefile: Makefile Names.. Unlike makefiles explicitly -requested with `-f' or `--file' options, `make' is not certain that -these makefiles should exist. However, if a default makefile does not -exist but can be created by running `make' rules, you probably want the -rules to be run so that the makefile can be used. - - Therefore, if none of the default makefiles exists, `make' will try -to make each of them in the same order in which they are searched for -(*note What Name to Give Your Makefile: Makefile Names.) until it -succeeds in making one, or it runs out of names to try. Note that it -is not an error if `make' cannot find or make any makefile; a makefile -is not always necessary. - - When you use the `-t' or `--touch' option (*note Instead of -Executing the Commands: Instead of Execution.), you would not want to -use an out-of-date makefile to decide which targets to touch. So the -`-t' option has no effect on updating makefiles; they are really -updated even if `-t' is specified. Likewise, `-q' (or `--question') -and `-n' (or `--just-print') do not prevent updating of makefiles, -because an out-of-date makefile would result in the wrong output for -other targets. Thus, `make -f mfile -n foo' will update `mfile', read -it in, and then print the commands to update `foo' and its dependencies -without running them. The commands printed for `foo' will be those -specified in the updated contents of `mfile'. - - However, on occasion you might actually wish to prevent updating of -even the makefiles. You can do this by specifying the makefiles as -goals in the command line as well as specifying them as makefiles. -When the makefile name is specified explicitly as a goal, the options -`-t' and so on do apply to them. - - Thus, `make -f mfile -n mfile foo' would read the makefile `mfile', -print the commands needed to update it without actually running them, -and then print the commands needed to update `foo' without running -them. The commands for `foo' will be those specified by the existing -contents of `mfile'. - - -File: make.info, Node: Overriding Makefiles, Prev: Remaking Makefiles, Up: Makefiles - -Overriding Part of Another Makefile -=================================== - - Sometimes it is useful to have a makefile that is mostly just like -another makefile. You can often use the `include' directive to include -one in the other, and add more targets or variable definitions. -However, if the two makefiles give different commands for the same -target, `make' will not let you just do this. But there is another way. - - In the containing makefile (the one that wants to include the other), -you can use a match-anything pattern rule to say that to remake any -target that cannot be made from the information in the containing -makefile, `make' should look in another makefile. *Note Pattern -Rules::, for more information on pattern rules. - - For example, if you have a makefile called `Makefile' that says how -to make the target `foo' (and other targets), you can write a makefile -called `GNUmakefile' that contains: - - foo: - frobnicate > foo - - %: force - @$(MAKE) -f Makefile $@ - force: ; - - If you say `make foo', `make' will find `GNUmakefile', read it, and -see that to make `foo', it needs to run the command `frobnicate > foo'. -If you say `make bar', `make' will find no way to make `bar' in -`GNUmakefile', so it will use the commands from the pattern rule: `make --f Makefile bar'. If `Makefile' provides a rule for updating `bar', -`make' will apply the rule. And likewise for any other target that -`GNUmakefile' does not say how to make. - - The way this works is that the pattern rule has a pattern of just -`%', so it matches any target whatever. The rule specifies a -dependency `force', to guarantee that the commands will be run even if -the target file already exists. We give `force' target empty commands -to prevent `make' from searching for an implicit rule to build -it--otherwise it would apply the same match-anything rule to `force' -itself and create a dependency loop! - - -File: make.info, Node: Rules, Next: Commands, Prev: Makefiles, Up: Top - -Writing Rules -************* - - A "rule" appears in the makefile and says when and how to remake -certain files, called the rule's "targets" (most often only one per -rule). It lists the other files that are the "dependencies" of the -target, and "commands" to use to create or update the target. - - The order of rules is not significant, except for determining the -"default goal": the target for `make' to consider, if you do not -otherwise specify one. The default goal is the target of the first -rule in the first makefile. If the first rule has multiple targets, -only the first target is taken as the default. There are two -exceptions: a target starting with a period is not a default unless it -contains one or more slashes, `/', as well; and, a target that defines -a pattern rule has no effect on the default goal. (*Note Defining and -Redefining Pattern Rules: Pattern Rules.) - - Therefore, we usually write the makefile so that the first rule is -the one for compiling the entire program or all the programs described -by the makefile (often with a target called `all'). *Note Arguments to -Specify the Goals: Goals. - -* Menu: - -* Rule Example:: An example explained. -* Rule Syntax:: General syntax explained. -* Wildcards:: Using wildcard characters such as `*'. -* Directory Search:: Searching other directories for source files. -* Phony Targets:: Using a target that is not a real file's name. -* Force Targets:: You can use a target without commands - or dependencies to mark other - targets as phony. -* Empty Targets:: When only the date matters and the - files are empty. -* Special Targets:: Targets with special built-in meanings. -* Multiple Targets:: When to make use of several targets in a rule. -* Multiple Rules:: How to use several rules with the same target. -* Static Pattern:: Static pattern rules apply to multiple targets - and can vary the dependencies according to - the target name. -* Double-Colon:: How to use a special kind of rule to allow - several independent rules for one target. -* Automatic Dependencies:: How to automatically generate rules giving - dependencies from the source files themselves. - diff --git a/buildtools/windows/source/make/make.info-2 b/buildtools/windows/source/make/make.info-2 deleted file mode 100644 index 3a6e261fcc4..00000000000 --- a/buildtools/windows/source/make/make.info-2 +++ /dev/null @@ -1,1195 +0,0 @@ -This is Info file make.info, produced by Makeinfo-1.55 from the input -file ./make.texinfo. - - This file documents the GNU Make utility, which determines -automatically which pieces of a large program need to be recompiled, -and issues the commands to recompile them. - - This is Edition 0.48, last updated 4 April 1995, of `The GNU Make -Manual', for `make', Version 3.73 Beta. - - Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95 Free -Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: make.info, Node: Rule Example, Next: Rule Syntax, Up: Rules - -Rule Example -============ - - Here is an example of a rule: - - foo.o : foo.c defs.h # module for twiddling the frobs - cc -c -g foo.c - - Its target is `foo.o' and its dependencies are `foo.c' and `defs.h'. -It has one command, which is `cc -c -g foo.c'. The command line -starts with a tab to identify it as a command. - - This rule says two things: - - * How to decide whether `foo.o' is out of date: it is out of date if - it does not exist, or if either `foo.c' or `defs.h' is more recent - than it. - - * How to update the file `foo.o': by running `cc' as stated. The - command does not explicitly mention `defs.h', but we presume that - `foo.c' includes it, and that that is why `defs.h' was added to - the dependencies. - - -File: make.info, Node: Rule Syntax, Next: Wildcards, Prev: Rule Example, Up: Rules - -Rule Syntax -=========== - - In general, a rule looks like this: - - TARGETS : DEPENDENCIES - COMMAND - ... - -or like this: - - TARGETS : DEPENDENCIES ; COMMAND - COMMAND - ... - - The TARGETS are file names, separated by spaces. Wildcard -characters may be used (*note Using Wildcard Characters in File Names: -Wildcards.) and a name of the form `A(M)' represents member M in -archive file A (*note Archive Members as Targets: Archive Members.). -Usually there is only one target per rule, but occasionally there is a -reason to have more (*note Multiple Targets in a Rule: Multiple -Targets.). - - The COMMAND lines start with a tab character. The first command may -appear on the line after the dependencies, with a tab character, or may -appear on the same line, with a semicolon. Either way, the effect is -the same. *Note Writing the Commands in Rules: Commands. - - Because dollar signs are used to start variable references, if you -really want a dollar sign in a rule you must write two of them, `$$' -(*note How to Use Variables: Using Variables.). You may split a long -line by inserting a backslash followed by a newline, but this is not -required, as `make' places no limit on the length of a line in a -makefile. - - A rule tells `make' two things: when the targets are out of date, -and how to update them when necessary. - - The criterion for being out of date is specified in terms of the -DEPENDENCIES, which consist of file names separated by spaces. -(Wildcards and archive members (*note Archives::.) are allowed here -too.) A target is out of date if it does not exist or if it is older -than any of the dependencies (by comparison of last-modification -times). The idea is that the contents of the target file are computed -based on information in the dependencies, so if any of the dependencies -changes, the contents of the existing target file are no longer -necessarily valid. - - How to update is specified by COMMANDS. These are lines to be -executed by the shell (normally `sh'), but with some extra features -(*note Writing the Commands in Rules: Commands.). - - -File: make.info, Node: Wildcards, Next: Directory Search, Prev: Rule Syntax, Up: Rules - -Using Wildcard Characters in File Names -======================================= - - A single file name can specify many files using "wildcard -characters". The wildcard characters in `make' are `*', `?' and -`[...]', the same as in the Bourne shell. For example, `*.c' specifies -a list of all the files (in the working directory) whose names end in -`.c'. - - The character `~' at the beginning of a file name also has special -significance. If alone, or followed by a slash, it represents your home -directory. For example `~/bin' expands to `/home/you/bin'. If the `~' -is followed by a word, the string represents the home directory of the -user named by that word. For example `~john/bin' expands to -`/home/john/bin'. - - Wildcard expansion happens automatically in targets, in dependencies, -and in commands (where the shell does the expansion). In other -contexts, wildcard expansion happens only if you request it explicitly -with the `wildcard' function. - - The special significance of a wildcard character can be turned off by -preceding it with a backslash. Thus, `foo\*bar' would refer to a -specific file whose name consists of `foo', an asterisk, and `bar'. - -* Menu: - -* Wildcard Examples:: Several examples -* Wildcard Pitfall:: Problems to avoid. -* Wildcard Function:: How to cause wildcard expansion where - it does not normally take place. - - -File: make.info, Node: Wildcard Examples, Next: Wildcard Pitfall, Up: Wildcards - -Wildcard Examples ------------------ - - Wildcards can be used in the commands of a rule, where they are -expanded by the shell. For example, here is a rule to delete all the -object files: - - clean: - rm -f *.o - - Wildcards are also useful in the dependencies of a rule. With the -following rule in the makefile, `make print' will print all the `.c' -files that have changed since the last time you printed them: - - print: *.c - lpr -p $? - touch print - -This rule uses `print' as an empty target file; see *Note Empty Target -Files to Record Events: Empty Targets. (The automatic variable `$?' is -used to print only those files that have changed; see *Note Automatic -Variables: Automatic.) - - Wildcard expansion does not happen when you define a variable. -Thus, if you write this: - - objects = *.o - -then the value of the variable `objects' is the actual string `*.o'. -However, if you use the value of `objects' in a target, dependency or -command, wildcard expansion will take place at that time. To set -`objects' to the expansion, instead use: - - objects := $(wildcard *.o) - -*Note Wildcard Function::. - - -File: make.info, Node: Wildcard Pitfall, Next: Wildcard Function, Prev: Wildcard Examples, Up: Wildcards - -Pitfalls of Using Wildcards ---------------------------- - - Now here is an example of a naive way of using wildcard expansion, -that does not do what you would intend. Suppose you would like to say -that the executable file `foo' is made from all the object files in the -directory, and you write this: - - objects = *.o - - foo : $(objects) - cc -o foo $(CFLAGS) $(objects) - -The value of `objects' is the actual string `*.o'. Wildcard expansion -happens in the rule for `foo', so that each *existing* `.o' file -becomes a dependency of `foo' and will be recompiled if necessary. - - But what if you delete all the `.o' files? When a wildcard matches -no files, it is left as it is, so then `foo' will depend on the -oddly-named file `*.o'. Since no such file is likely to exist, `make' -will give you an error saying it cannot figure out how to make `*.o'. -This is not what you want! - - Actually it is possible to obtain the desired result with wildcard -expansion, but you need more sophisticated techniques, including the -`wildcard' function and string substitution. *Note The Function -`wildcard': Wildcard Function. - - -File: make.info, Node: Wildcard Function, Prev: Wildcard Pitfall, Up: Wildcards - -The Function `wildcard' ------------------------ - - Wildcard expansion happens automatically in rules. But wildcard -expansion does not normally take place when a variable is set, or -inside the arguments of a function. If you want to do wildcard -expansion in such places, you need to use the `wildcard' function, like -this: - - $(wildcard PATTERN...) - -This string, used anywhere in a makefile, is replaced by a -space-separated list of names of existing files that match one of the -given file name patterns. If no existing file name matches a pattern, -then that pattern is omitted from the output of the `wildcard' -function. Note that this is different from how unmatched wildcards -behave in rules, where they are used verbatim rather than ignored -(*note Wildcard Pitfall::.). - - One use of the `wildcard' function is to get a list of all the C -source files in a directory, like this: - - $(wildcard *.c) - - We can change the list of C source files into a list of object files -by replacing the `.o' suffix with `.c' in the result, like this: - - $(patsubst %.c,%.o,$(wildcard *.c)) - -(Here we have used another function, `patsubst'. *Note Functions for -String Substitution and Analysis: Text Functions.) - - Thus, a makefile to compile all C source files in the directory and -then link them together could be written as follows: - - objects := $(patsubst %.c,%.o,$(wildcard *.c)) - - foo : $(objects) - cc -o foo $(objects) - -(This takes advantage of the implicit rule for compiling C programs, so -there is no need to write explicit rules for compiling the files. -*Note The Two Flavors of Variables: Flavors, for an explanation of -`:=', which is a variant of `='.) - - -File: make.info, Node: Directory Search, Next: Phony Targets, Prev: Wildcards, Up: Rules - -Searching Directories for Dependencies -====================================== - - For large systems, it is often desirable to put sources in a separate -directory from the binaries. The "directory search" features of `make' -facilitate this by searching several directories automatically to find -a dependency. When you redistribute the files among directories, you -do not need to change the individual rules, just the search paths. - -* Menu: - -* General Search:: Specifying a search path that applies - to every dependency. -* Selective Search:: Specifying a search path - for a specified class of names. -* Commands/Search:: How to write shell commands that work together - with search paths. -* Implicit/Search:: How search paths affect implicit rules. -* Libraries/Search:: Directory search for link libraries. - - -File: make.info, Node: General Search, Next: Selective Search, Up: Directory Search - -`VPATH': Search Path for All Dependencies ------------------------------------------ - - The value of the `make' variable `VPATH' specifies a list of -directories that `make' should search. Most often, the directories are -expected to contain dependency files that are not in the current -directory; however, `VPATH' specifies a search list that `make' applies -for all files, including files which are targets of rules. - - Thus, if a file that is listed as a target or dependency does not -exist in the current directory, `make' searches the directories listed -in `VPATH' for a file with that name. If a file is found in one of -them, that file becomes the dependency. Rules may then specify the -names of source files in the dependencies as if they all existed in the -current directory. *Note Writing Shell Commands with Directory Search: -Commands/Search. - - In the `VPATH' variable, directory names are separated by colons or -blanks. The order in which directories are listed is the order followed -by `make' in its search. - - For example, - - VPATH = src:../headers - -specifies a path containing two directories, `src' and `../headers', -which `make' searches in that order. - - With this value of `VPATH', the following rule, - - foo.o : foo.c - -is interpreted as if it were written like this: - - foo.o : src/foo.c - -assuming the file `foo.c' does not exist in the current directory but -is found in the directory `src'. - - -File: make.info, Node: Selective Search, Next: Commands/Search, Prev: General Search, Up: Directory Search - -The `vpath' Directive ---------------------- - - Similar to the `VPATH' variable but more selective is the `vpath' -directive (note lower case), which allows you to specify a search path -for a particular class of file names, those that match a particular -pattern. Thus you can supply certain search directories for one class -of file names and other directories (or none) for other file names. - - There are three forms of the `vpath' directive: - -`vpath PATTERN DIRECTORIES' - Specify the search path DIRECTORIES for file names that match - PATTERN. - - The search path, DIRECTORIES, is a list of directories to be - searched, separated by colons or blanks, just like the search path - used in the `VPATH' variable. - -`vpath PATTERN' - Clear out the search path associated with PATTERN. - -`vpath' - Clear all search paths previously specified with `vpath' - directives. - - A `vpath' pattern is a string containing a `%' character. The -string must match the file name of a dependency that is being searched -for, the `%' character matching any sequence of zero or more characters -(as in pattern rules; *note Defining and Redefining Pattern Rules: -Pattern Rules.). For example, `%.h' matches files that end in `.h'. -(If there is no `%', the pattern must match the dependency exactly, -which is not useful very often.) - - `%' characters in a `vpath' directive's pattern can be quoted with -preceding backslashes (`\'). Backslashes that would otherwise quote -`%' characters can be quoted with more backslashes. Backslashes that -quote `%' characters or other backslashes are removed from the pattern -before it is compared to file names. Backslashes that are not in -danger of quoting `%' characters go unmolested. - - When a dependency fails to exist in the current directory, if the -PATTERN in a `vpath' directive matches the name of the dependency file, -then the DIRECTORIES in that directive are searched just like (and -before) the directories in the `VPATH' variable. - - For example, - - vpath %.h ../headers - -tells `make' to look for any dependency whose name ends in `.h' in the -directory `../headers' if the file is not found in the current -directory. - - If several `vpath' patterns match the dependency file's name, then -`make' processes each matching `vpath' directive one by one, searching -all the directories mentioned in each directive. `make' handles -multiple `vpath' directives in the order in which they appear in the -makefile; multiple directives with the same pattern are independent of -each other. - - Thus, - - vpath %.c foo - vpath % blish - vpath %.c bar - -will look for a file ending in `.c' in `foo', then `blish', then `bar', -while - - vpath %.c foo:bar - vpath % blish - -will look for a file ending in `.c' in `foo', then `bar', then `blish'. - - -File: make.info, Node: Commands/Search, Next: Implicit/Search, Prev: Selective Search, Up: Directory Search - -Writing Shell Commands with Directory Search --------------------------------------------- - - When a dependency is found in another directory through directory -search, this cannot change the commands of the rule; they will execute -as written. Therefore, you must write the commands with care so that -they will look for the dependency in the directory where `make' finds -it. - - This is done with the "automatic variables" such as `$^' (*note -Automatic Variables: Automatic.). For instance, the value of `$^' is a -list of all the dependencies of the rule, including the names of the -directories in which they were found, and the value of `$@' is the -target. Thus: - - foo.o : foo.c - cc -c $(CFLAGS) $^ -o $@ - -(The variable `CFLAGS' exists so you can specify flags for C -compilation by implicit rules; we use it here for consistency so it will -affect all C compilations uniformly; *note Variables Used by Implicit -Rules: Implicit Variables..) - - Often the dependencies include header files as well, which you do not -want to mention in the commands. The automatic variable `$<' is just -the first dependency: - - VPATH = src:../headers - foo.o : foo.c defs.h hack.h - cc -c $(CFLAGS) $< -o $@ - - -File: make.info, Node: Implicit/Search, Next: Libraries/Search, Prev: Commands/Search, Up: Directory Search - -Directory Search and Implicit Rules ------------------------------------ - - The search through the directories specified in `VPATH' or with -`vpath' also happens during consideration of implicit rules (*note -Using Implicit Rules: Implicit Rules.). - - For example, when a file `foo.o' has no explicit rule, `make' -considers implicit rules, such as the built-in rule to compile `foo.c' -if that file exists. If such a file is lacking in the current -directory, the appropriate directories are searched for it. If `foo.c' -exists (or is mentioned in the makefile) in any of the directories, the -implicit rule for C compilation is applied. - - The commands of implicit rules normally use automatic variables as a -matter of necessity; consequently they will use the file names found by -directory search with no extra effort. - - -File: make.info, Node: Libraries/Search, Prev: Implicit/Search, Up: Directory Search - -Directory Search for Link Libraries ------------------------------------ - - Directory search applies in a special way to libraries used with the -linker. This special feature comes into play when you write a -dependency whose name is of the form `-lNAME'. (You can tell something -strange is going on here because the dependency is normally the name of -a file, and the *file name* of the library looks like `libNAME.a', not -like `-lNAME'.) - - When a dependency's name has the form `-lNAME', `make' handles it -specially by searching for the file `libNAME.a' in the current -directory, in directories specified by matching `vpath' search paths -and the `VPATH' search path, and then in the directories `/lib', -`/usr/lib', and `PREFIX/lib' (normally `/usr/local/lib'). - - For example, - - foo : foo.c -lcurses - cc $^ -o $@ - -would cause the command `cc foo.c /usr/lib/libcurses.a -o foo' to be -executed when `foo' is older than `foo.c' or than -`/usr/lib/libcurses.a'. - - -File: make.info, Node: Phony Targets, Next: Force Targets, Prev: Directory Search, Up: Rules - -Phony Targets -============= - - A phony target is one that is not really the name of a file. It is -just a name for some commands to be executed when you make an explicit -request. There are two reasons to use a phony target: to avoid a -conflict with a file of the same name, and to improve performance. - - If you write a rule whose commands will not create the target file, -the commands will be executed every time the target comes up for -remaking. Here is an example: - - clean: - rm *.o temp - -Because the `rm' command does not create a file named `clean', probably -no such file will ever exist. Therefore, the `rm' command will be -executed every time you say `make clean'. - - The phony target will cease to work if anything ever does create a -file named `clean' in this directory. Since it has no dependencies, the -file `clean' would inevitably be considered up to date, and its -commands would not be executed. To avoid this problem, you can -explicitly declare the target to be phony, using the special target -`.PHONY' (*note Special Built-in Target Names: Special Targets.) as -follows: - - .PHONY : clean - -Once this is done, `make clean' will run the commands regardless of -whether there is a file named `clean'. - - Since it knows that phony targets do not name actual files that -could be remade from other files, `make' skips the implicit rule search -for phony targets (*note Implicit Rules::.). This is why declaring a -target phony is good for performance, even if you are not worried about -the actual file existing. - - Thus, you first write the line that states that `clean' is a phony -target, then you write the rule, like this: - - .PHONY: clean - clean: - rm *.o temp - - A phony target should not be a dependency of a real target file; if -it is, its commands are run every time `make' goes to update that file. -As long as a phony target is never a dependency of a real target, the -phony target commands will be executed only when the phony target is a -specified goal (*note Arguments to Specify the Goals: Goals.). - - Phony targets can have dependencies. When one directory contains -multiple programs, it is most convenient to describe all of the -programs in one makefile `./Makefile'. Since the target remade by -default will be the first one in the makefile, it is common to make -this a phony target named `all' and give it, as dependencies, all the -individual programs. For example: - - all : prog1 prog2 prog3 - .PHONY : all - - prog1 : prog1.o utils.o - cc -o prog1 prog1.o utils.o - - prog2 : prog2.o - cc -o prog2 prog2.o - - prog3 : prog3.o sort.o utils.o - cc -o prog3 prog3.o sort.o utils.o - -Now you can say just `make' to remake all three programs, or specify as -arguments the ones to remake (as in `make prog1 prog3'). - - When one phony target is a dependency of another, it serves as a -subroutine of the other. For example, here `make cleanall' will delete -the object files, the difference files, and the file `program': - - .PHONY: cleanall cleanobj cleandiff - - cleanall : cleanobj cleandiff - rm program - - cleanobj : - rm *.o - - cleandiff : - rm *.diff - - -File: make.info, Node: Force Targets, Next: Empty Targets, Prev: Phony Targets, Up: Rules - -Rules without Commands or Dependencies -====================================== - - If a rule has no dependencies or commands, and the target of the rule -is a nonexistent file, then `make' imagines this target to have been -updated whenever its rule is run. This implies that all targets -depending on this one will always have their commands run. - - An example will illustrate this: - - clean: FORCE - rm $(objects) - FORCE: - - Here the target `FORCE' satisfies the special conditions, so the -target `clean' that depends on it is forced to run its commands. There -is nothing special about the name `FORCE', but that is one name -commonly used this way. - - As you can see, using `FORCE' this way has the same results as using -`.PHONY: clean'. - - Using `.PHONY' is more explicit and more efficient. However, other -versions of `make' do not support `.PHONY'; thus `FORCE' appears in -many makefiles. *Note Phony Targets::. - - -File: make.info, Node: Empty Targets, Next: Special Targets, Prev: Force Targets, Up: Rules - -Empty Target Files to Record Events -=================================== - - The "empty target" is a variant of the phony target; it is used to -hold commands for an action that you request explicitly from time to -time. Unlike a phony target, this target file can really exist; but -the file's contents do not matter, and usually are empty. - - The purpose of the empty target file is to record, with its -last-modification time, when the rule's commands were last executed. It -does so because one of the commands is a `touch' command to update the -target file. - - The empty target file must have some dependencies. When you ask to -remake the empty target, the commands are executed if any dependency is -more recent than the target; in other words, if a dependency has -changed since the last time you remade the target. Here is an example: - - print: foo.c bar.c - lpr -p $? - touch print - -With this rule, `make print' will execute the `lpr' command if either -source file has changed since the last `make print'. The automatic -variable `$?' is used to print only those files that have changed -(*note Automatic Variables: Automatic.). - - -File: make.info, Node: Special Targets, Next: Multiple Targets, Prev: Empty Targets, Up: Rules - -Special Built-in Target Names -============================= - - Certain names have special meanings if they appear as targets. - -`.PHONY' - The dependencies of the special target `.PHONY' are considered to - be phony targets. When it is time to consider such a target, - `make' will run its commands unconditionally, regardless of - whether a file with that name exists or what its last-modification - time is. *Note Phony Targets: Phony Targets. - -`.SUFFIXES' - The dependencies of the special target `.SUFFIXES' are the list of - suffixes to be used in checking for suffix rules. *Note - Old-Fashioned Suffix Rules: Suffix Rules. - -`.DEFAULT' - The commands specified for `.DEFAULT' are used for any target for - which no rules are found (either explicit rules or implicit rules). - *Note Last Resort::. If `.DEFAULT' commands are specified, every - file mentioned as a dependency, but not as a target in a rule, - will have these commands executed on its behalf. *Note Implicit - Rule Search Algorithm: Search Algorithm. - -`.PRECIOUS' - The targets which `.PRECIOUS' depends on are given the following - special treatment: if `make' is killed or interrupted during the - execution of their commands, the target is not deleted. *Note - Interrupting or Killing `make': Interrupts. Also, if the target - is an intermediate file, it will not be deleted after it is no - longer needed, as is normally done. *Note Chains of Implicit - Rules: Chained Rules. - - You can also list the target pattern of an implicit rule (such as - `%.o') as a dependency file of the special target `.PRECIOUS' to - preserve intermediate files created by rules whose target patterns - match that file's name. - -`.IGNORE' - If you specify dependencies for `.IGNORE', then `make' will ignore - errors in execution of the commands run for those particular - files. The commands for `.IGNORE' are not meaningful. - - If mentioned as a target with no dependencies, `.IGNORE' says to - ignore errors in execution of commands for all files. This usage - of `.IGNORE' is supported only for historical compatibility. Since - this affects every command in the makefile, it is not very useful; - we recommend you use the more selective ways to ignore errors in - specific commands. *Note Errors in Commands: Errors. - -`.SILENT' - If you specify dependencies for `.SILENT', then `make' will not - the print commands to remake those particular files before - executing them. The commands for `.SILENT' are not meaningful. - - If mentioned as a target with no dependencies, `.SILENT' says not - to print any commands before executing them. This usage of - `.SILENT' is supported only for historical compatibility. We - recommend you use the more selective ways to silence specific - commands. *Note Command Echoing: Echoing. If you want to silence - all commands for a particular run of `make', use the `-s' or - `--silent' option (*note Options Summary::.). - -`.EXPORT_ALL_VARIABLES' - Simply by being mentioned as a target, this tells `make' to export - all variables to child processes by default. *Note Communicating - Variables to a Sub-`make': Variables/Recursion. - - Any defined implicit rule suffix also counts as a special target if -it appears as a target, and so does the concatenation of two suffixes, -such as `.c.o'. These targets are suffix rules, an obsolete way of -defining implicit rules (but a way still widely used). In principle, -any target name could be special in this way if you break it in two and -add both pieces to the suffix list. In practice, suffixes normally -begin with `.', so these special target names also begin with `.'. -*Note Old-Fashioned Suffix Rules: Suffix Rules. - - -File: make.info, Node: Multiple Targets, Next: Multiple Rules, Prev: Special Targets, Up: Rules - -Multiple Targets in a Rule -========================== - - A rule with multiple targets is equivalent to writing many rules, -each with one target, and all identical aside from that. The same -commands apply to all the targets, but their effects may vary because -you can substitute the actual target name into the command using `$@'. -The rule contributes the same dependencies to all the targets also. - - This is useful in two cases. - - * You want just dependencies, no commands. For example: - - kbd.o command.o files.o: command.h - - gives an additional dependency to each of the three object files - mentioned. - - * Similar commands work for all the targets. The commands do not - need to be absolutely identical, since the automatic variable `$@' - can be used to substitute the particular target to be remade into - the commands (*note Automatic Variables: Automatic.). For example: - - bigoutput littleoutput : text.g - generate text.g -$(subst output,,$@) > $@ - - is equivalent to - - bigoutput : text.g - generate text.g -big > bigoutput - littleoutput : text.g - generate text.g -little > littleoutput - - Here we assume the hypothetical program `generate' makes two types - of output, one if given `-big' and one if given `-little'. *Note - Functions for String Substitution and Analysis: Text Functions, - for an explanation of the `subst' function. - - Suppose you would like to vary the dependencies according to the -target, much as the variable `$@' allows you to vary the commands. You -cannot do this with multiple targets in an ordinary rule, but you can -do it with a "static pattern rule". *Note Static Pattern Rules: Static -Pattern. - - -File: make.info, Node: Multiple Rules, Next: Static Pattern, Prev: Multiple Targets, Up: Rules - -Multiple Rules for One Target -============================= - - One file can be the target of several rules. All the dependencies -mentioned in all the rules are merged into one list of dependencies for -the target. If the target is older than any dependency from any rule, -the commands are executed. - - There can only be one set of commands to be executed for a file. If -more than one rule gives commands for the same file, `make' uses the -last set given and prints an error message. (As a special case, if the -file's name begins with a dot, no error message is printed. This odd -behavior is only for compatibility with other implementations of -`make'.) There is no reason to write your makefiles this way; that is -why `make' gives you an error message. - - An extra rule with just dependencies can be used to give a few extra -dependencies to many files at once. For example, one usually has a -variable named `objects' containing a list of all the compiler output -files in the system being made. An easy way to say that all of them -must be recompiled if `config.h' changes is to write the following: - - objects = foo.o bar.o - foo.o : defs.h - bar.o : defs.h test.h - $(objects) : config.h - - This could be inserted or taken out without changing the rules that -really specify how to make the object files, making it a convenient -form to use if you wish to add the additional dependency intermittently. - - Another wrinkle is that the additional dependencies could be -specified with a variable that you set with a command argument to `make' -(*note Overriding Variables: Overriding.). For example, - - extradeps= - $(objects) : $(extradeps) - -means that the command `make extradeps=foo.h' will consider `foo.h' as -a dependency of each object file, but plain `make' will not. - - If none of the explicit rules for a target has commands, then `make' -searches for an applicable implicit rule to find some commands *note -Using Implicit Rules: Implicit Rules.). - - -File: make.info, Node: Static Pattern, Next: Double-Colon, Prev: Multiple Rules, Up: Rules - -Static Pattern Rules -==================== - - "Static pattern rules" are rules which specify multiple targets and -construct the dependency names for each target based on the target name. -They are more general than ordinary rules with multiple targets because -the targets do not have to have identical dependencies. Their -dependencies must be *analogous*, but not necessarily *identical*. - -* Menu: - -* Static Usage:: The syntax of static pattern rules. -* Static versus Implicit:: When are they better than implicit rules? - - -File: make.info, Node: Static Usage, Next: Static versus Implicit, Up: Static Pattern - -Syntax of Static Pattern Rules ------------------------------- - - Here is the syntax of a static pattern rule: - - TARGETS ...: TARGET-PATTERN: DEP-PATTERNS ... - COMMANDS - ... - -The TARGETS list specifies the targets that the rule applies to. The -targets can contain wildcard characters, just like the targets of -ordinary rules (*note Using Wildcard Characters in File Names: -Wildcards.). - - The TARGET-PATTERN and DEP-PATTERNS say how to compute the -dependencies of each target. Each target is matched against the -TARGET-PATTERN to extract a part of the target name, called the "stem". -This stem is substituted into each of the DEP-PATTERNS to make the -dependency names (one from each DEP-PATTERN). - - Each pattern normally contains the character `%' just once. When the -TARGET-PATTERN matches a target, the `%' can match any part of the -target name; this part is called the "stem". The rest of the pattern -must match exactly. For example, the target `foo.o' matches the -pattern `%.o', with `foo' as the stem. The targets `foo.c' and -`foo.out' do not match that pattern. - - The dependency names for each target are made by substituting the -stem for the `%' in each dependency pattern. For example, if one -dependency pattern is `%.c', then substitution of the stem `foo' gives -the dependency name `foo.c'. It is legitimate to write a dependency -pattern that does not contain `%'; then this dependency is the same for -all targets. - - `%' characters in pattern rules can be quoted with preceding -backslashes (`\'). Backslashes that would otherwise quote `%' -characters can be quoted with more backslashes. Backslashes that quote -`%' characters or other backslashes are removed from the pattern before -it is compared to file names or has a stem substituted into it. -Backslashes that are not in danger of quoting `%' characters go -unmolested. For example, the pattern `the\%weird\\%pattern\\' has -`the%weird\' preceding the operative `%' character, and `pattern\\' -following it. The final two backslashes are left alone because they -cannot affect any `%' character. - - Here is an example, which compiles each of `foo.o' and `bar.o' from -the corresponding `.c' file: - - objects = foo.o bar.o - - $(objects): %.o: %.c - $(CC) -c $(CFLAGS) $< -o $@ - -Here `$<' is the automatic variable that holds the name of the -dependency and `$@' is the automatic variable that holds the name of -the target; see *Note Automatic Variables: Automatic. - - Each target specified must match the target pattern; a warning is -issued for each target that does not. If you have a list of files, -only some of which will match the pattern, you can use the `filter' -function to remove nonmatching file names (*note Functions for String -Substitution and Analysis: Text Functions.): - - files = foo.elc bar.o lose.o - - $(filter %.o,$(files)): %.o: %.c - $(CC) -c $(CFLAGS) $< -o $@ - $(filter %.elc,$(files)): %.elc: %.el - emacs -f batch-byte-compile $< - -In this example the result of `$(filter %.o,$(files))' is `bar.o -lose.o', and the first static pattern rule causes each of these object -files to be updated by compiling the corresponding C source file. The -result of `$(filter %.elc,$(files))' is `foo.elc', so that file is made -from `foo.el'. - - Another example shows how to use `$*' in static pattern rules: - - bigoutput littleoutput : %output : text.g - generate text.g -$* > $@ - -When the `generate' command is run, `$*' will expand to the stem, -either `big' or `little'. - - -File: make.info, Node: Static versus Implicit, Prev: Static Usage, Up: Static Pattern - -Static Pattern Rules versus Implicit Rules ------------------------------------------- - - A static pattern rule has much in common with an implicit rule -defined as a pattern rule (*note Defining and Redefining Pattern Rules: -Pattern Rules.). Both have a pattern for the target and patterns for -constructing the names of dependencies. The difference is in how -`make' decides *when* the rule applies. - - An implicit rule *can* apply to any target that matches its pattern, -but it *does* apply only when the target has no commands otherwise -specified, and only when the dependencies can be found. If more than -one implicit rule appears applicable, only one applies; the choice -depends on the order of rules. - - By contrast, a static pattern rule applies to the precise list of -targets that you specify in the rule. It cannot apply to any other -target and it invariably does apply to each of the targets specified. -If two conflicting rules apply, and both have commands, that's an error. - - The static pattern rule can be better than an implicit rule for these -reasons: - - * You may wish to override the usual implicit rule for a few files - whose names cannot be categorized syntactically but can be given - in an explicit list. - - * If you cannot be sure of the precise contents of the directories - you are using, you may not be sure which other irrelevant files - might lead `make' to use the wrong implicit rule. The choice - might depend on the order in which the implicit rule search is - done. With static pattern rules, there is no uncertainty: each - rule applies to precisely the targets specified. - - -File: make.info, Node: Double-Colon, Next: Automatic Dependencies, Prev: Static Pattern, Up: Rules - -Double-Colon Rules -================== - - "Double-colon" rules are rules written with `::' instead of `:' -after the target names. They are handled differently from ordinary -rules when the same target appears in more than one rule. - - When a target appears in multiple rules, all the rules must be the -same type: all ordinary, or all double-colon. If they are -double-colon, each of them is independent of the others. Each -double-colon rule's commands are executed if the target is older than -any dependencies of that rule. This can result in executing none, any, -or all of the double-colon rules. - - Double-colon rules with the same target are in fact completely -separate from one another. Each double-colon rule is processed -individually, just as rules with different targets are processed. - - The double-colon rules for a target are executed in the order they -appear in the makefile. However, the cases where double-colon rules -really make sense are those where the order of executing the commands -would not matter. - - Double-colon rules are somewhat obscure and not often very useful; -they provide a mechanism for cases in which the method used to update a -target differs depending on which dependency files caused the update, -and such cases are rare. - - Each double-colon rule should specify commands; if it does not, an -implicit rule will be used if one applies. *Note Using Implicit Rules: -Implicit Rules. - - -File: make.info, Node: Automatic Dependencies, Prev: Double-Colon, Up: Rules - -Generating Dependencies Automatically -===================================== - - In the makefile for a program, many of the rules you need to write -often say only that some object file depends on some header file. For -example, if `main.c' uses `defs.h' via an `#include', you would write: - - main.o: defs.h - -You need this rule so that `make' knows that it must remake `main.o' -whenever `defs.h' changes. You can see that for a large program you -would have to write dozens of such rules in your makefile. And, you -must always be very careful to update the makefile every time you add -or remove an `#include'. - - To avoid this hassle, most modern C compilers can write these rules -for you, by looking at the `#include' lines in the source files. -Usually this is done with the `-M' option to the compiler. For -example, the command: - - cc -M main.c - -generates the output: - - main.o : main.c defs.h - -Thus you no longer have to write all those rules yourself. The -compiler will do it for you. - - Note that such a dependency constitutes mentioning `main.o' in a -makefile, so it can never be considered an intermediate file by implicit -rule search. This means that `make' won't ever remove the file after -using it; *note Chains of Implicit Rules: Chained Rules.. - - With old `make' programs, it was traditional practice to use this -compiler feature to generate dependencies on demand with a command like -`make depend'. That command would create a file `depend' containing -all the automatically-generated dependencies; then the makefile could -use `include' to read them in (*note Include::.). - - In GNU `make', the feature of remaking makefiles makes this practice -obsolete--you need never tell `make' explicitly to regenerate the -dependencies, because it always regenerates any makefile that is out of -date. *Note Remaking Makefiles::. - - The practice we recommend for automatic dependency generation is to -have one makefile corresponding to each source file. For each source -file `NAME.c' there is a makefile `NAME.d' which lists what files the -object file `NAME.o' depends on. That way only the source files that -have changed need to be rescanned to produce the new dependencies. - - Here is the pattern rule to generate a file of dependencies (i.e., a -makefile) called `NAME.d' from a C source file called `NAME.c': - - %.d: %.c - $(SHELL) -ec '$(CC) -M $(CPPFLAGS) $< \ - | sed '\''s/$*\\.o[ :]*/& $@/g'\'' > $@' - -*Note Pattern Rules::, for information on defining pattern rules. The -`-e' flag to the shell makes it exit immediately if the `$(CC)' command -fails (exits with a nonzero status). Normally the shell exits with the -status of the last command in the pipeline (`sed' in this case), so -`make' would not notice a nonzero status from the compiler. - - With the GNU C compiler, you may wish to use the `-MM' flag instead -of `-M'. This omits dependencies on system header files. *Note -Options Controlling the Preprocessor: (gcc.info)Preprocessor Options, -for details. - - The purpose of the `sed' command is to translate (for example): - - main.o : main.c defs.h - -into: - - main.o main.d : main.c defs.h - -This makes each `.d' file depend on all the source and header files -that the corresponding `.o' file depends on. `make' then knows it must -regenerate the dependencies whenever any of the source or header files -changes. - - Once you've defined the rule to remake the `.d' files, you then use -the `include' directive to read them all in. *Note Include::. For -example: - - sources = foo.c bar.c - - include $(sources:.c=.d) - -(This example uses a substitution variable reference to translate the -list of source files `foo.c bar.c' into a list of dependency makefiles, -`foo.d bar.d'. *Note Substitution Refs::, for full information on -substitution references.) Since the `.d' files are makefiles like any -others, `make' will remake them as necessary with no further work from -you. *Note Remaking Makefiles::. - - -File: make.info, Node: Commands, Next: Using Variables, Prev: Rules, Up: Top - -Writing the Commands in Rules -***************************** - - The commands of a rule consist of shell command lines to be executed -one by one. Each command line must start with a tab, except that the -first command line may be attached to the target-and-dependencies line -with a semicolon in between. Blank lines and lines of just comments -may appear among the command lines; they are ignored. (But beware, an -apparently "blank" line that begins with a tab is *not* blank! It is an -empty command; *note Empty Commands::..) - - Users use many different shell programs, but commands in makefiles -are always interpreted by `/bin/sh' unless the makefile specifies -otherwise. *Note Command Execution: Execution. - - The shell that is in use determines whether comments can be written -on command lines, and what syntax they use. When the shell is -`/bin/sh', a `#' starts a comment that extends to the end of the line. -The `#' does not have to be at the beginning of a line. Text on a line -before a `#' is not part of the comment. - -* Menu: - -* Echoing:: How to control when commands are echoed. -* Execution:: How commands are executed. -* Parallel:: How commands can be executed in parallel. -* Errors:: What happens after a command execution error. -* Interrupts:: What happens when a command is interrupted. -* Recursion:: Invoking `make' from makefiles. -* Sequences:: Defining canned sequences of commands. -* Empty Commands:: Defining useful, do-nothing commands. - - -File: make.info, Node: Echoing, Next: Execution, Up: Commands - -Command Echoing -=============== - - Normally `make' prints each command line before it is executed. We -call this "echoing" because it gives the appearance that you are typing -the commands yourself. - - When a line starts with `@', the echoing of that line is suppressed. -The `@' is discarded before the command is passed to the shell. -Typically you would use this for a command whose only effect is to print -something, such as an `echo' command to indicate progress through the -makefile: - - @echo About to make distribution files - - When `make' is given the flag `-n' or `--just-print', echoing is all -that happens, no execution. *Note Summary of Options: Options Summary. -In this case and only this case, even the commands starting with `@' -are printed. This flag is useful for finding out which commands `make' -thinks are necessary without actually doing them. - - The `-s' or `--silent' flag to `make' prevents all echoing, as if -all commands started with `@'. A rule in the makefile for the special -target `.SILENT' without dependencies has the same effect (*note -Special Built-in Target Names: Special Targets.). `.SILENT' is -essentially obsolete since `@' is more flexible. - - -File: make.info, Node: Execution, Next: Parallel, Prev: Echoing, Up: Commands - -Command Execution -================= - - When it is time to execute commands to update a target, they are -executed by making a new subshell for each line. (In practice, `make' -may take shortcuts that do not affect the results.) - - *Please note:* this implies that shell commands such as `cd' that -set variables local to each process will not affect the following -command lines. If you want to use `cd' to affect the next command, put -the two on a single line with a semicolon between them. Then `make' -will consider them a single command and pass them, together, to a shell -which will execute them in sequence. For example: - - foo : bar/lose - cd bar; gobble lose > ../foo - - If you would like to split a single shell command into multiple -lines of text, you must use a backslash at the end of all but the last -subline. Such a sequence of lines is combined into a single line, by -deleting the backslash-newline sequences, before passing it to the -shell. Thus, the following is equivalent to the preceding example: - - foo : bar/lose - cd bar; \ - gobble lose > ../foo - - The program used as the shell is taken from the variable `SHELL'. -By default, the program `/bin/sh' is used. - - Unlike most variables, the variable `SHELL' is never set from the -environment. This is because the `SHELL' environment variable is used -to specify your personal choice of shell program for interactive use. -It would be very bad for personal choices like this to affect the -functioning of makefiles. *Note Variables from the Environment: -Environment. - diff --git a/buildtools/windows/source/make/make.info-3 b/buildtools/windows/source/make/make.info-3 deleted file mode 100644 index d9607df08fc..00000000000 --- a/buildtools/windows/source/make/make.info-3 +++ /dev/null @@ -1,1228 +0,0 @@ -This is Info file make.info, produced by Makeinfo-1.55 from the input -file ./make.texinfo. - - This file documents the GNU Make utility, which determines -automatically which pieces of a large program need to be recompiled, -and issues the commands to recompile them. - - This is Edition 0.48, last updated 4 April 1995, of `The GNU Make -Manual', for `make', Version 3.73 Beta. - - Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95 Free -Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: make.info, Node: Parallel, Next: Errors, Prev: Execution, Up: Commands - -Parallel Execution -================== - - GNU `make' knows how to execute several commands at once. Normally, -`make' will execute only one command at a time, waiting for it to -finish before executing the next. However, the `-j' or `--jobs' option -tells `make' to execute many commands simultaneously. - - If the `-j' option is followed by an integer, this is the number of -commands to execute at once; this is called the number of "job slots". -If there is nothing looking like an integer after the `-j' option, -there is no limit on the number of job slots. The default number of job -slots is one, which means serial execution (one thing at a time). - - One unpleasant consequence of running several commands -simultaneously is that output from all of the commands comes when the -commands send it, so messages from different commands may be -interspersed. - - Another problem is that two processes cannot both take input from the -same device; so to make sure that only one command tries to take input -from the terminal at once, `make' will invalidate the standard input -streams of all but one running command. This means that attempting to -read from standard input will usually be a fatal error (a `Broken pipe' -signal) for most child processes if there are several. - - It is unpredictable which command will have a valid standard input -stream (which will come from the terminal, or wherever you redirect the -standard input of `make'). The first command run will always get it -first, and the first command started after that one finishes will get -it next, and so on. - - We will change how this aspect of `make' works if we find a better -alternative. In the mean time, you should not rely on any command using -standard input at all if you are using the parallel execution feature; -but if you are not using this feature, then standard input works -normally in all commands. - - If a command fails (is killed by a signal or exits with a nonzero -status), and errors are not ignored for that command (*note Errors in -Commands: Errors.), the remaining command lines to remake the same -target will not be run. If a command fails and the `-k' or -`--keep-going' option was not given (*note Summary of Options: Options -Summary.), `make' aborts execution. If make terminates for any reason -(including a signal) with child processes running, it waits for them to -finish before actually exiting. - - When the system is heavily loaded, you will probably want to run -fewer jobs than when it is lightly loaded. You can use the `-l' option -to tell `make' to limit the number of jobs to run at once, based on the -load average. The `-l' or `--max-load' option is followed by a -floating-point number. For example, - - -l 2.5 - -will not let `make' start more than one job if the load average is -above 2.5. The `-l' option with no following number removes the load -limit, if one was given with a previous `-l' option. - - More precisely, when `make' goes to start up a job, and it already -has at least one job running, it checks the current load average; if it -is not lower than the limit given with `-l', `make' waits until the load -average goes below that limit, or until all the other jobs finish. - - By default, there is no load limit. - - -File: make.info, Node: Errors, Next: Interrupts, Prev: Parallel, Up: Commands - -Errors in Commands -================== - - After each shell command returns, `make' looks at its exit status. -If the command completed successfully, the next command line is executed -in a new shell; after the last command line is finished, the rule is -finished. - - If there is an error (the exit status is nonzero), `make' gives up on -the current rule, and perhaps on all rules. - - Sometimes the failure of a certain command does not indicate a -problem. For example, you may use the `mkdir' command to ensure that a -directory exists. If the directory already exists, `mkdir' will report -an error, but you probably want `make' to continue regardless. - - To ignore errors in a command line, write a `-' at the beginning of -the line's text (after the initial tab). The `-' is discarded before -the command is passed to the shell for execution. - - For example, - - clean: - -rm -f *.o - -This causes `rm' to continue even if it is unable to remove a file. - - When you run `make' with the `-i' or `--ignore-errors' flag, errors -are ignored in all commands of all rules. A rule in the makefile for -the special target `.IGNORE' has the same effect, if there are no -dependencies. These ways of ignoring errors are obsolete because `-' -is more flexible. - - When errors are to be ignored, because of either a `-' or the `-i' -flag, `make' treats an error return just like success, except that it -prints out a message that tells you the status code the command exited -with, and says that the error has been ignored. - - When an error happens that `make' has not been told to ignore, it -implies that the current target cannot be correctly remade, and neither -can any other that depends on it either directly or indirectly. No -further commands will be executed for these targets, since their -preconditions have not been achieved. - - Normally `make' gives up immediately in this circumstance, returning -a nonzero status. However, if the `-k' or `--keep-going' flag is -specified, `make' continues to consider the other dependencies of the -pending targets, remaking them if necessary, before it gives up and -returns nonzero status. For example, after an error in compiling one -object file, `make -k' will continue compiling other object files even -though it already knows that linking them will be impossible. *Note -Summary of Options: Options Summary. - - The usual behavior assumes that your purpose is to get the specified -targets up to date; once `make' learns that this is impossible, it -might as well report the failure immediately. The `-k' option says -that the real purpose is to test as many of the changes made in the -program as possible, perhaps to find several independent problems so -that you can correct them all before the next attempt to compile. This -is why Emacs' `compile' command passes the `-k' flag by default. - - Usually when a command fails, if it has changed the target file at -all, the file is corrupted and cannot be used--or at least it is not -completely updated. Yet the file's timestamp says that it is now up to -date, so the next time `make' runs, it will not try to update that -file. The situation is just the same as when the command is killed by a -signal; *note Interrupts::.. So generally the right thing to do is to -delete the target file if the command fails after beginning to change -the file. `make' will do this if `.DELETE_ON_ERROR' appears as a -target. This is almost always what you want `make' to do, but it is -not historical practice; so for compatibility, you must explicitly -request it. - - -File: make.info, Node: Interrupts, Next: Recursion, Prev: Errors, Up: Commands - -Interrupting or Killing `make' -============================== - - If `make' gets a fatal signal while a command is executing, it may -delete the target file that the command was supposed to update. This is -done if the target file's last-modification time has changed since -`make' first checked it. - - The purpose of deleting the target is to make sure that it is remade -from scratch when `make' is next run. Why is this? Suppose you type -`Ctrl-c' while a compiler is running, and it has begun to write an -object file `foo.o'. The `Ctrl-c' kills the compiler, resulting in an -incomplete file whose last-modification time is newer than the source -file `foo.c'. But `make' also receives the `Ctrl-c' signal and deletes -this incomplete file. If `make' did not do this, the next invocation -of `make' would think that `foo.o' did not require updating--resulting -in a strange error message from the linker when it tries to link an -object file half of which is missing. - - You can prevent the deletion of a target file in this way by making -the special target `.PRECIOUS' depend on it. Before remaking a target, -`make' checks to see whether it appears on the dependencies of -`.PRECIOUS', and thereby decides whether the target should be deleted -if a signal happens. Some reasons why you might do this are that the -target is updated in some atomic fashion, or exists only to record a -modification-time (its contents do not matter), or must exist at all -times to prevent other sorts of trouble. - - -File: make.info, Node: Recursion, Next: Sequences, Prev: Interrupts, Up: Commands - -Recursive Use of `make' -======================= - - Recursive use of `make' means using `make' as a command in a -makefile. This technique is useful when you want separate makefiles for -various subsystems that compose a larger system. For example, suppose -you have a subdirectory `subdir' which has its own makefile, and you -would like the containing directory's makefile to run `make' on the -subdirectory. You can do it by writing this: - - subsystem: - cd subdir; $(MAKE) - -or, equivalently, this (*note Summary of Options: Options Summary.): - - subsystem: - $(MAKE) -C subdir - - You can write recursive `make' commands just by copying this example, -but there are many things to know about how they work and why, and about -how the sub-`make' relates to the top-level `make'. - -* Menu: - -* MAKE Variable:: The special effects of using `$(MAKE)'. -* Variables/Recursion:: How to communicate variables to a sub-`make'. -* Options/Recursion:: How to communicate options to a sub-`make'. -* -w Option:: How the `-w' or `--print-directory' option - helps debug use of recursive `make' commands. - - -File: make.info, Node: MAKE Variable, Next: Variables/Recursion, Up: Recursion - -How the `MAKE' Variable Works ------------------------------ - - Recursive `make' commands should always use the variable `MAKE', not -the explicit command name `make', as shown here: - - subsystem: - cd subdir; $(MAKE) - - The value of this variable is the file name with which `make' was -invoked. If this file name was `/bin/make', then the command executed -is `cd subdir; /bin/make'. If you use a special version of `make' to -run the top-level makefile, the same special version will be executed -for recursive invocations. - - As a special feature, using the variable `MAKE' in the commands of a -rule alters the effects of the `-t' (`--touch'), `-n' (`--just-print'), -or `-q' (`--question') option. Using the `MAKE' variable has the same -effect as using a `+' character at the beginning of the command line. -*Note Instead of Executing the Commands: Instead of Execution. - - Consider the command `make -t' in the above example. (The `-t' -option marks targets as up to date without actually running any -commands; see *Note Instead of Execution::.) Following the usual -definition of `-t', a `make -t' command in the example would create a -file named `subsystem' and do nothing else. What you really want it to -do is run `cd subdir; make -t'; but that would require executing the -command, and `-t' says not to execute commands. - - The special feature makes this do what you want: whenever a command -line of a rule contains the variable `MAKE', the flags `-t', `-n' and -`-q' do not apply to that line. Command lines containing `MAKE' are -executed normally despite the presence of a flag that causes most -commands not to be run. The usual `MAKEFLAGS' mechanism passes the -flags to the sub-`make' (*note Communicating Options to a Sub-`make': -Options/Recursion.), so your request to touch the files, or print the -commands, is propagated to the subsystem. - - -File: make.info, Node: Variables/Recursion, Next: Options/Recursion, Prev: MAKE Variable, Up: Recursion - -Communicating Variables to a Sub-`make' ---------------------------------------- - - Variable values of the top-level `make' can be passed to the -sub-`make' through the environment by explicit request. These -variables are defined in the sub-`make' as defaults, but do not -override what is specified in the makefile used by the sub-`make' -makefile unless you use the `-e' switch (*note Summary of Options: -Options Summary.). - - To pass down, or "export", a variable, `make' adds the variable and -its value to the environment for running each command. The sub-`make', -in turn, uses the environment to initialize its table of variable -values. *Note Variables from the Environment: Environment. - - Except by explicit request, `make' exports a variable only if it is -either defined in the environment initially or set on the command line, -and if its name consists only of letters, numbers, and underscores. -Some shells cannot cope with environment variable names consisting of -characters other than letters, numbers, and underscores. - - The special variables `SHELL' and `MAKEFLAGS' are always exported -(unless you unexport them). `MAKEFILES' is exported if you set it to -anything. - - `make' automatically passes down variable values that were defined -on the command line, by putting them in the `MAKEFLAGS' variable. -*Note Options/Recursion::. - - Variables are *not* normally passed down if they were created by -default by `make' (*note Variables Used by Implicit Rules: Implicit -Variables.). The sub-`make' will define these for itself. - - If you want to export specific variables to a sub-`make', use the -`export' directive, like this: - - export VARIABLE ... - -If you want to *prevent* a variable from being exported, use the -`unexport' directive, like this: - - unexport VARIABLE ... - -As a convenience, you can define a variable and export it at the same -time by doing: - - export VARIABLE = value - -has the same result as: - - VARIABLE = value - export VARIABLE - -and - - export VARIABLE := value - -has the same result as: - - VARIABLE := value - export VARIABLE - - Likewise, - - export VARIABLE += value - -is just like: - - VARIABLE += value - export VARIABLE - -*Note Appending More Text to Variables: Appending. - - You may notice that the `export' and `unexport' directives work in -`make' in the same way they work in the shell, `sh'. - - If you want all variables to be exported by default, you can use -`export' by itself: - - export - -This tells `make' that variables which are not explicitly mentioned in -an `export' or `unexport' directive should be exported. Any variable -given in an `unexport' directive will still *not* be exported. If you -use `export' by itself to export variables by default, variables whose -names contain characters other than alphanumerics and underscores will -not be exported unless specifically mentioned in an `export' directive. - - The behavior elicited by an `export' directive by itself was the -default in older versions of GNU `make'. If your makefiles depend on -this behavior and you want to be compatible with old versions of -`make', you can write a rule for the special target -`.EXPORT_ALL_VARIABLES' instead of using the `export' directive. This -will be ignored by old `make's, while the `export' directive will cause -a syntax error. - - Likewise, you can use `unexport' by itself to tell `make' *not* to -export variables by default. Since this is the default behavior, you -would only need to do this if `export' had been used by itself earlier -(in an included makefile, perhaps). You *cannot* use `export' and -`unexport' by themselves to have variables exported for some commands -and not for others. The last `export' or `unexport' directive that -appears by itself determines the behavior for the entire run of `make'. - - As a special feature, the variable `MAKELEVEL' is changed when it is -passed down from level to level. This variable's value is a string -which is the depth of the level as a decimal number. The value is `0' -for the top-level `make'; `1' for a sub-`make', `2' for a -sub-sub-`make', and so on. The incrementation happens when `make' sets -up the environment for a command. - - The main use of `MAKELEVEL' is to test it in a conditional directive -(*note Conditional Parts of Makefiles: Conditionals.); this way you can -write a makefile that behaves one way if run recursively and another -way if run directly by you. - - You can use the variable `MAKEFILES' to cause all sub-`make' -commands to use additional makefiles. The value of `MAKEFILES' is a -whitespace-separated list of file names. This variable, if defined in -the outer-level makefile, is passed down through the environment; then -it serves as a list of extra makefiles for the sub-`make' to read -before the usual or specified ones. *Note The Variable `MAKEFILES': -MAKEFILES Variable. - - -File: make.info, Node: Options/Recursion, Next: -w Option, Prev: Variables/Recursion, Up: Recursion - -Communicating Options to a Sub-`make' -------------------------------------- - - Flags such as `-s' and `-k' are passed automatically to the -sub-`make' through the variable `MAKEFLAGS'. This variable is set up -automatically by `make' to contain the flag letters that `make' -received. Thus, if you do `make -ks' then `MAKEFLAGS' gets the value -`ks'. - - As a consequence, every sub-`make' gets a value for `MAKEFLAGS' in -its environment. In response, it takes the flags from that value and -processes them as if they had been given as arguments. *Note Summary -of Options: Options Summary. - - Likewise variables defined on the command line are passed to the -sub-`make' through `MAKEFLAGS'. Words in the value of `MAKEFLAGS' that -contain `=', `make' treats as variable definitions just as if they -appeared on the command line. *Note Overriding Variables: Overriding. - - The options `-C', `-f', `-o', and `-W' are not put into `MAKEFLAGS'; -these options are not passed down. - - The `-j' option is a special case (*note Parallel Execution: -Parallel.). If you set it to some numeric value, `-j 1' is always put -into `MAKEFLAGS' instead of the value you specified. This is because if -the `-j' option were passed down to sub-`make's, you would get many -more jobs running in parallel than you asked for. If you give `-j' -with no numeric argument, meaning to run as many jobs as possible in -parallel, this is passed down, since multiple infinities are no more -than one. - - If you do not want to pass the other flags down, you must change the -value of `MAKEFLAGS', like this: - - MAKEFLAGS= - subsystem: - cd subdir; $(MAKE) - - or like this: - - subsystem: - cd subdir; $(MAKE) MAKEFLAGS= - - The command line variable definitions really appear in the variable -`MAKEOVERRIDES', and `MAKEFLAGS' contains a reference to this variable. -If you do want to pass flags down normally, but don't want to pass -down the command line variable definitions, you can reset -`MAKEOVERRIDES' to empty, like this: - - MAKEOVERRIDES = - -This is not usually useful to do. However, some systems have a small -fixed limit on the size of the environment, and putting so much -information in into the value of `MAKEFLAGS' can exceed it. If you see -the error message `Arg list too long', this may be the problem. (For -strict compliance with POSIX.2, changing `MAKEOVERRIDES' does not -affect `MAKEFLAGS' if the special target `.POSIX' appears in the -makefile. You probably do not care about this.) - - A similar variable `MFLAGS' exists also, for historical -compatibility. It has the same value as `MAKEFLAGS' except that it -does not contain the command line variable definitions, and it always -begins with a hyphen unless it is empty (`MAKEFLAGS' begins with a -hyphen only when it begins with an option that has no single-letter -version, such as `--warn-undefined-variables'). `MFLAGS' was -traditionally used explicitly in the recursive `make' command, like -this: - - subsystem: - cd subdir; $(MAKE) $(MFLAGS) - -but now `MAKEFLAGS' makes this usage redundant. If you want your -makefiles to be compatible with old `make' programs, use this -technique; it will work fine with more modern `make' versions too. - - The `MAKEFLAGS' variable can also be useful if you want to have -certain options, such as `-k' (*note Summary of Options: Options -Summary.), set each time you run `make'. You simply put a value for -`MAKEFLAGS' in your environment. You can also set `MAKEFLAGS' in a -makefile, to specify additional flags that should also be in effect for -that makefile. (Note that you cannot use `MFLAGS' this way. That -variable is set only for compatibility; `make' does not interpret a -value you set for it in any way.) - - When `make' interprets the value of `MAKEFLAGS' (either from the -environment or from a makefile), it first prepends a hyphen if the value -does not already begin with one. Then it chops the value into words -separated by blanks, and parses these words as if they were options -given on the command line (except that `-C', `-f', `-h', `-o', `-W', -and their long-named versions are ignored; and there is no error for an -invalid option). - - If you do put `MAKEFLAGS' in your environment, you should be sure not -to include any options that will drastically affect the actions of -`make' and undermine the purpose of makefiles and of `make' itself. -For instance, the `-t', `-n', and `-q' options, if put in one of these -variables, could have disastrous consequences and would certainly have -at least surprising and probably annoying effects. - - -File: make.info, Node: -w Option, Prev: Options/Recursion, Up: Recursion - -The `--print-directory' Option ------------------------------- - - If you use several levels of recursive `make' invocations, the `-w' -or `--print-directory' option can make the output a lot easier to -understand by showing each directory as `make' starts processing it and -as `make' finishes processing it. For example, if `make -w' is run in -the directory `/u/gnu/make', `make' will print a line of the form: - - make: Entering directory `/u/gnu/make'. - -before doing anything else, and a line of the form: - - make: Leaving directory `/u/gnu/make'. - -when processing is completed. - - Normally, you do not need to specify this option because `make' does -it for you: `-w' is turned on automatically when you use the `-C' -option, and in sub-`make's. `make' will not automatically turn on `-w' -if you also use `-s', which says to be silent, or if you use -`--no-print-directory' to explicitly disable it. - - -File: make.info, Node: Sequences, Next: Empty Commands, Prev: Recursion, Up: Commands - -Defining Canned Command Sequences -================================= - - When the same sequence of commands is useful in making various -targets, you can define it as a canned sequence with the `define' -directive, and refer to the canned sequence from the rules for those -targets. The canned sequence is actually a variable, so the name must -not conflict with other variable names. - - Here is an example of defining a canned sequence of commands: - - define run-yacc - yacc $(firstword $^) - mv y.tab.c $@ - endef - -Here `run-yacc' is the name of the variable being defined; `endef' -marks the end of the definition; the lines in between are the commands. -The `define' directive does not expand variable references and -function calls in the canned sequence; the `$' characters, parentheses, -variable names, and so on, all become part of the value of the variable -you are defining. *Note Defining Variables Verbatim: Defining, for a -complete explanation of `define'. - - The first command in this example runs Yacc on the first dependency -of whichever rule uses the canned sequence. The output file from Yacc -is always named `y.tab.c'. The second command moves the output to the -rule's target file name. - - To use the canned sequence, substitute the variable into the -commands of a rule. You can substitute it like any other variable -(*note Basics of Variable References: Reference.). Because variables -defined by `define' are recursively expanded variables, all the -variable references you wrote inside the `define' are expanded now. -For example: - - foo.c : foo.y - $(run-yacc) - -`foo.y' will be substituted for the variable `$^' when it occurs in -`run-yacc''s value, and `foo.c' for `$@'. - - This is a realistic example, but this particular one is not needed in -practice because `make' has an implicit rule to figure out these -commands based on the file names involved (*note Using Implicit Rules: -Implicit Rules.). - - In command execution, each line of a canned sequence is treated just -as if the line appeared on its own in the rule, preceded by a tab. In -particular, `make' invokes a separate subshell for each line. You can -use the special prefix characters that affect command lines (`@', `-', -and `+') on each line of a canned sequence. *Note Writing the Commands -in Rules: Commands. For example, using this canned sequence: - - define frobnicate - @echo "frobnicating target $@" - frob-step-1 $< -o $@-step-1 - frob-step-2 $@-step-1 -o $@ - endef - -`make' will not echo the first line, the `echo' command. But it *will* -echo the following two command lines. - - On the other hand, prefix characters on the command line that refers -to a canned sequence apply to every line in the sequence. So the rule: - - frob.out: frob.in - @$(frobnicate) - -does not echo *any* commands. (*Note Command Echoing: Echoing, for a -full explanation of `@'.) - - -File: make.info, Node: Empty Commands, Prev: Sequences, Up: Commands - -Using Empty Commands -==================== - - It is sometimes useful to define commands which do nothing. This is -done simply by giving a command that consists of nothing but -whitespace. For example: - - target: ; - -defines an empty command string for `target'. You could also use a -line beginning with a tab character to define an empty command string, -but this would be confusing because such a line looks empty. - - You may be wondering why you would want to define a command string -that does nothing. The only reason this is useful is to prevent a -target from getting implicit commands (from implicit rules or the -`.DEFAULT' special target; *note Implicit Rules::. and *note Defining -Last-Resort Default Rules: Last Resort.). - - You may be inclined to define empty command strings for targets that -are not actual files, but only exist so that their dependencies can be -remade. However, this is not the best way to do that, because the -dependencies may not be remade properly if the target file actually -does exist. *Note Phony Targets: Phony Targets, for a better way to do -this. - - -File: make.info, Node: Using Variables, Next: Conditionals, Prev: Commands, Up: Top - -How to Use Variables -******************** - - A "variable" is a name defined in a makefile to represent a string -of text, called the variable's "value". These values are substituted -by explicit request into targets, dependencies, commands, and other -parts of the makefile. (In some other versions of `make', variables -are called "macros".) - - Variables and functions in all parts of a makefile are expanded when -read, except for the shell commands in rules, the right-hand sides of -variable definitions using `=', and the bodies of variable definitions -using the `define' directive. - - Variables can represent lists of file names, options to pass to -compilers, programs to run, directories to look in for source files, -directories to write output in, or anything else you can imagine. - - A variable name may be any sequence of characters not containing `:', -`#', `=', or leading or trailing whitespace. However, variable names -containing characters other than letters, numbers, and underscores -should be avoided, as they may be given special meanings in the future, -and with some shells they cannot be passed through the environment to a -sub-`make' (*note Communicating Variables to a Sub-`make': -Variables/Recursion.). - - Variable names are case-sensitive. The names `foo', `FOO', and -`Foo' all refer to different variables. - - It is traditional to use upper case letters in variable names, but we -recommend using lower case letters for variable names that serve -internal purposes in the makefile, and reserving upper case for -parameters that control implicit rules or for parameters that the user -should override with command options (*note Overriding Variables: -Overriding.). - - A few variables have names that are a single punctuation character or -just a few characters. These are the "automatic variables", and they -have particular specialized uses. *Note Automatic Variables: Automatic. - -* Menu: - -* Reference:: How to use the value of a variable. -* Flavors:: Variables come in two flavors. -* Advanced:: Advanced features for referencing a variable. -* Values:: All the ways variables get their values. -* Setting:: How to set a variable in the makefile. -* Appending:: How to append more text to the old value - of a variable. -* Override Directive:: How to set a variable in the makefile even if - the user has set it with a command argument. -* Defining:: An alternate way to set a variable - to a verbatim string. -* Environment:: Variable values can come from the environment. -* Automatic:: Some special variables have predefined - meanings for use with implicit rules. - - -File: make.info, Node: Reference, Next: Flavors, Up: Using Variables - -Basics of Variable References -============================= - - To substitute a variable's value, write a dollar sign followed by -the name of the variable in parentheses or braces: either `$(foo)' or -`${foo}' is a valid reference to the variable `foo'. This special -significance of `$' is why you must write `$$' to have the effect of a -single dollar sign in a file name or command. - - Variable references can be used in any context: targets, -dependencies, commands, most directives, and new variable values. Here -is an example of a common case, where a variable holds the names of all -the object files in a program: - - objects = program.o foo.o utils.o - program : $(objects) - cc -o program $(objects) - - $(objects) : defs.h - - Variable references work by strict textual substitution. Thus, the -rule - - foo = c - prog.o : prog.$(foo) - $(foo)$(foo) -$(foo) prog.$(foo) - -could be used to compile a C program `prog.c'. Since spaces before the -variable value are ignored in variable assignments, the value of `foo' -is precisely `c'. (Don't actually write your makefiles this way!) - - A dollar sign followed by a character other than a dollar sign, -open-parenthesis or open-brace treats that single character as the -variable name. Thus, you could reference the variable `x' with `$x'. -However, this practice is strongly discouraged, except in the case of -the automatic variables (*note Automatic Variables: Automatic.). - - -File: make.info, Node: Flavors, Next: Advanced, Prev: Reference, Up: Using Variables - -The Two Flavors of Variables -============================ - - There are two ways that a variable in GNU `make' can have a value; -we call them the two "flavors" of variables. The two flavors are -distinguished in how they are defined and in what they do when expanded. - - The first flavor of variable is a "recursively expanded" variable. -Variables of this sort are defined by lines using `=' (*note Setting -Variables: Setting.) or by the `define' directive (*note Defining -Variables Verbatim: Defining.). The value you specify is installed -verbatim; if it contains references to other variables, these -references are expanded whenever this variable is substituted (in the -course of expanding some other string). When this happens, it is -called "recursive expansion". - - For example, - - foo = $(bar) - bar = $(ugh) - ugh = Huh? - - all:;echo $(foo) - -will echo `Huh?': `$(foo)' expands to `$(bar)' which expands to -`$(ugh)' which finally expands to `Huh?'. - - This flavor of variable is the only sort supported by other versions -of `make'. It has its advantages and its disadvantages. An advantage -(most would say) is that: - - CFLAGS = $(include_dirs) -O - include_dirs = -Ifoo -Ibar - -will do what was intended: when `CFLAGS' is expanded in a command, it -will expand to `-Ifoo -Ibar -O'. A major disadvantage is that you -cannot append something on the end of a variable, as in - - CFLAGS = $(CFLAGS) -O - -because it will cause an infinite loop in the variable expansion. -(Actually `make' detects the infinite loop and reports an error.) - - Another disadvantage is that any functions (*note Functions for -Transforming Text: Functions.) referenced in the definition will be -executed every time the variable is expanded. This makes `make' run -slower; worse, it causes the `wildcard' and `shell' functions to give -unpredictable results because you cannot easily control when they are -called, or even how many times. - - To avoid all the problems and inconveniences of recursively expanded -variables, there is another flavor: simply expanded variables. - - "Simply expanded variables" are defined by lines using `:=' (*note -Setting Variables: Setting.). The value of a simply expanded variable -is scanned once and for all, expanding any references to other -variables and functions, when the variable is defined. The actual -value of the simply expanded variable is the result of expanding the -text that you write. It does not contain any references to other -variables; it contains their values *as of the time this variable was -defined*. Therefore, - - x := foo - y := $(x) bar - x := later - -is equivalent to - - y := foo bar - x := later - - When a simply expanded variable is referenced, its value is -substituted verbatim. - - Here is a somewhat more complicated example, illustrating the use of -`:=' in conjunction with the `shell' function. (*Note The `shell' -Function: Shell Function.) This example also shows use of the variable -`MAKELEVEL', which is changed when it is passed down from level to -level. (*Note Communicating Variables to a Sub-`make': -Variables/Recursion, for information about `MAKELEVEL'.) - - ifeq (0,${MAKELEVEL}) - cur-dir := $(shell pwd) - whoami := $(shell whoami) - host-type := $(shell arch) - MAKE := ${MAKE} host-type=${host-type} whoami=${whoami} - endif - -An advantage of this use of `:=' is that a typical `descend into a -directory' command then looks like this: - - ${subdirs}: - ${MAKE} cur-dir=${cur-dir}/$@ -C $@ all - - Simply expanded variables generally make complicated makefile -programming more predictable because they work like variables in most -programming languages. They allow you to redefine a variable using its -own value (or its value processed in some way by one of the expansion -functions) and to use the expansion functions much more efficiently -(*note Functions for Transforming Text: Functions.). - - You can also use them to introduce controlled leading whitespace into -variable values. Leading whitespace characters are discarded from your -input before substitution of variable references and function calls; -this means you can include leading spaces in a variable value by -protecting them with variable references, like this: - - nullstring := - space := $(nullstring) # end of the line - -Here the value of the variable `space' is precisely one space. The -comment `# end of the line' is included here just for clarity. Since -trailing space characters are *not* stripped from variable values, just -a space at the end of the line would have the same effect (but be -rather hard to read). If you put whitespace at the end of a variable -value, it is a good idea to put a comment like that at the end of the -line to make your intent clear. Conversely, if you do *not* want any -whitespace characters at the end of your variable value, you must -remember not to put a random comment on the end of the line after some -whitespace, such as this: - - dir := /foo/bar # directory to put the frobs in - -Here the value of the variable `dir' is `/foo/bar ' (with four -trailing spaces), which was probably not the intention. (Imagine -something like `$(dir)/file' with this definition!) - - -File: make.info, Node: Advanced, Next: Values, Prev: Flavors, Up: Using Variables - -Advanced Features for Reference to Variables -============================================ - - This section describes some advanced features you can use to -reference variables in more flexible ways. - -* Menu: - -* Substitution Refs:: Referencing a variable with - substitutions on the value. -* Computed Names:: Computing the name of the variable to refer to. - - -File: make.info, Node: Substitution Refs, Next: Computed Names, Up: Advanced - -Substitution References ------------------------ - - A "substitution reference" substitutes the value of a variable with -alterations that you specify. It has the form `$(VAR:A=B)' (or -`${VAR:A=B}') and its meaning is to take the value of the variable VAR, -replace every A at the end of a word with B in that value, and -substitute the resulting string. - - When we say "at the end of a word", we mean that A must appear -either followed by whitespace or at the end of the value in order to be -replaced; other occurrences of A in the value are unaltered. For -example: - - foo := a.o b.o c.o - bar := $(foo:.o=.c) - -sets `bar' to `a.c b.c c.c'. *Note Setting Variables: Setting. - - A substitution reference is actually an abbreviation for use of the -`patsubst' expansion function (*note Functions for String Substitution -and Analysis: Text Functions.). We provide substitution references as -well as `patsubst' for compatibility with other implementations of -`make'. - - Another type of substitution reference lets you use the full power of -the `patsubst' function. It has the same form `$(VAR:A=B)' described -above, except that now A must contain a single `%' character. This -case is equivalent to `$(patsubst A,B,$(VAR))'. *Note Functions for -String Substitution and Analysis: Text Functions, for a description of -the `patsubst' function. - -For example: - - foo := a.o b.o c.o - bar := $(foo:%.o=%.c) - -sets `bar' to `a.c b.c c.c'. - - -File: make.info, Node: Computed Names, Prev: Substitution Refs, Up: Advanced - -Computed Variable Names ------------------------ - - Computed variable names are a complicated concept needed only for -sophisticated makefile programming. For most purposes you need not -consider them, except to know that making a variable with a dollar sign -in its name might have strange results. However, if you are the type -that wants to understand everything, or you are actually interested in -what they do, read on. - - Variables may be referenced inside the name of a variable. This is -called a "computed variable name" or a "nested variable reference". -For example, - - x = y - y = z - a := $($(x)) - -defines `a' as `z': the `$(x)' inside `$($(x))' expands to `y', so -`$($(x))' expands to `$(y)' which in turn expands to `z'. Here the -name of the variable to reference is not stated explicitly; it is -computed by expansion of `$(x)'. The reference `$(x)' here is nested -within the outer variable reference. - - The previous example shows two levels of nesting, but any number of -levels is possible. For example, here are three levels: - - x = y - y = z - z = u - a := $($($(x))) - -Here the innermost `$(x)' expands to `y', so `$($(x))' expands to -`$(y)' which in turn expands to `z'; now we have `$(z)', which becomes -`u'. - - References to recursively-expanded variables within a variable name -are reexpanded in the usual fashion. For example: - - x = $(y) - y = z - z = Hello - a := $($(x)) - -defines `a' as `Hello': `$($(x))' becomes `$($(y))' which becomes -`$(z)' which becomes `Hello'. - - Nested variable references can also contain modified references and -function invocations (*note Functions for Transforming Text: -Functions.), just like any other reference. For example, using the -`subst' function (*note Functions for String Substitution and Analysis: -Text Functions.): - - x = variable1 - variable2 := Hello - y = $(subst 1,2,$(x)) - z = y - a := $($($(z))) - -eventually defines `a' as `Hello'. It is doubtful that anyone would -ever want to write a nested reference as convoluted as this one, but it -works: `$($($(z)))' expands to `$($(y))' which becomes `$($(subst -1,2,$(x)))'. This gets the value `variable1' from `x' and changes it -by substitution to `variable2', so that the entire string becomes -`$(variable2)', a simple variable reference whose value is `Hello'. - - A computed variable name need not consist entirely of a single -variable reference. It can contain several variable references, as -well as some invariant text. For example, - - a_dirs := dira dirb - 1_dirs := dir1 dir2 - - a_files := filea fileb - 1_files := file1 file2 - - ifeq "$(use_a)" "yes" - a1 := a - else - a1 := 1 - endif - - ifeq "$(use_dirs)" "yes" - df := dirs - else - df := files - endif - - dirs := $($(a1)_$(df)) - -will give `dirs' the same value as `a_dirs', `1_dirs', `a_files' or -`1_files' depending on the settings of `use_a' and `use_dirs'. - - Computed variable names can also be used in substitution references: - - a_objects := a.o b.o c.o - 1_objects := 1.o 2.o 3.o - - sources := $($(a1)_objects:.o=.c) - -defines `sources' as either `a.c b.c c.c' or `1.c 2.c 3.c', depending -on the value of `a1'. - - The only restriction on this sort of use of nested variable -references is that they cannot specify part of the name of a function -to be called. This is because the test for a recognized function name -is done before the expansion of nested references. For example, - - ifdef do_sort - func := sort - else - func := strip - endif - - bar := a d b g q c - - foo := $($(func) $(bar)) - -attempts to give `foo' the value of the variable `sort a d b g q c' or -`strip a d b g q c', rather than giving `a d b g q c' as the argument -to either the `sort' or the `strip' function. This restriction could -be removed in the future if that change is shown to be a good idea. - - You can also use computed variable names in the left-hand side of a -variable assignment, or in a `define' directive, as in: - - dir = foo - $(dir)_sources := $(wildcard $(dir)/*.c) - define $(dir)_print - lpr $($(dir)_sources) - endef - -This example defines the variables `dir', `foo_sources', and -`foo_print'. - - Note that "nested variable references" are quite different from -"recursively expanded variables" (*note The Two Flavors of Variables: -Flavors.), though both are used together in complex ways when doing -makefile programming. - - -File: make.info, Node: Values, Next: Setting, Prev: Advanced, Up: Using Variables - -How Variables Get Their Values -============================== - - Variables can get values in several different ways: - - * You can specify an overriding value when you run `make'. *Note - Overriding Variables: Overriding. - - * You can specify a value in the makefile, either with an assignment - (*note Setting Variables: Setting.) or with a verbatim definition - (*note Defining Variables Verbatim: Defining.). - - * Variables in the environment become `make' variables. *Note - Variables from the Environment: Environment. - - * Several "automatic" variables are given new values for each rule. - Each of these has a single conventional use. *Note Automatic - Variables: Automatic. - - * Several variables have constant initial values. *Note Variables - Used by Implicit Rules: Implicit Variables. - - -File: make.info, Node: Setting, Next: Appending, Prev: Values, Up: Using Variables - -Setting Variables -================= - - To set a variable from the makefile, write a line starting with the -variable name followed by `=' or `:='. Whatever follows the `=' or -`:=' on the line becomes the value. For example, - - objects = main.o foo.o bar.o utils.o - -defines a variable named `objects'. Whitespace around the variable -name and immediately after the `=' is ignored. - - Variables defined with `=' are "recursively expanded" variables. -Variables defined with `:=' are "simply expanded" variables; these -definitions can contain variable references which will be expanded -before the definition is made. *Note The Two Flavors of Variables: -Flavors. - - The variable name may contain function and variable references, which -are expanded when the line is read to find the actual variable name to -use. - - There is no limit on the length of the value of a variable except the -amount of swapping space on the computer. When a variable definition is -long, it is a good idea to break it into several lines by inserting -backslash-newline at convenient places in the definition. This will not -affect the functioning of `make', but it will make the makefile easier -to read. - - Most variable names are considered to have the empty string as a -value if you have never set them. Several variables have built-in -initial values that are not empty, but you can set them in the usual -ways (*note Variables Used by Implicit Rules: Implicit Variables.). -Several special variables are set automatically to a new value for each -rule; these are called the "automatic" variables (*note Automatic -Variables: Automatic.). - - -File: make.info, Node: Appending, Next: Override Directive, Prev: Setting, Up: Using Variables - -Appending More Text to Variables -================================ - - Often it is useful to add more text to the value of a variable -already defined. You do this with a line containing `+=', like this: - - objects += another.o - -This takes the value of the variable `objects', and adds the text -`another.o' to it (preceded by a single space). Thus: - - objects = main.o foo.o bar.o utils.o - objects += another.o - -sets `objects' to `main.o foo.o bar.o utils.o another.o'. - - Using `+=' is similar to: - - objects = main.o foo.o bar.o utils.o - objects := $(objects) another.o - -but differs in ways that become important when you use more complex -values. - - When the variable in question has not been defined before, `+=' acts -just like normal `=': it defines a recursively-expanded variable. -However, when there *is* a previous definition, exactly what `+=' does -depends on what flavor of variable you defined originally. *Note The -Two Flavors of Variables: Flavors, for an explanation of the two -flavors of variables. - - When you add to a variable's value with `+=', `make' acts -essentially as if you had included the extra text in the initial -definition of the variable. If you defined it first with `:=', making -it a simply-expanded variable, `+=' adds to that simply-expanded -definition, and expands the new text before appending it to the old -value just as `:=' does (*note Setting Variables: Setting., for a full -explanation of `:='). In fact, - - variable := value - variable += more - -is exactly equivalent to: - - variable := value - variable := $(variable) more - - On the other hand, when you use `+=' with a variable that you defined -first to be recursively-expanded using plain `=', `make' does something -a bit different. Recall that when you define a recursively-expanded -variable, `make' does not expand the value you set for variable and -function references immediately. Instead it stores the text verbatim, -and saves these variable and function references to be expanded later, -when you refer to the new variable (*note The Two Flavors of Variables: -Flavors.). When you use `+=' on a recursively-expanded variable, it is -this unexpanded text to which `make' appends the new text you specify. - - variable = value - variable += more - -is roughly equivalent to: - - temp = value - variable = $(temp) more - -except that of course it never defines a variable called `temp'. The -importance of this comes when the variable's old value contains -variable references. Take this common example: - - CFLAGS = $(includes) -O - ... - CFLAGS += -pg # enable profiling - -The first line defines the `CFLAGS' variable with a reference to another -variable, `includes'. (`CFLAGS' is used by the rules for C -compilation; *note Catalogue of Implicit Rules: Catalogue of Rules..) -Using `=' for the definition makes `CFLAGS' a recursively-expanded -variable, meaning `$(includes) -O' is *not* expanded when `make' -processes the definition of `CFLAGS'. Thus, `includes' need not be -defined yet for its value to take effect. It only has to be defined -before any reference to `CFLAGS'. If we tried to append to the value -of `CFLAGS' without using `+=', we might do it like this: - - CFLAGS := $(CFLAGS) -pg # enable profiling - -This is pretty close, but not quite what we want. Using `:=' redefines -`CFLAGS' as a simply-expanded variable; this means `make' expands the -text `$(CFLAGS) -pg' before setting the variable. If `includes' is not -yet defined, we get ` -O -pg', and a later definition of `includes' -will have no effect. Conversely, by using `+=' we set `CFLAGS' to the -*unexpanded* value `$(includes) -O -pg'. Thus we preserve the -reference to `includes', so if that variable gets defined at any later -point, a reference like `$(CFLAGS)' still uses its value. - diff --git a/buildtools/windows/source/make/make.info-4 b/buildtools/windows/source/make/make.info-4 deleted file mode 100644 index 15a1d75dcbd..00000000000 --- a/buildtools/windows/source/make/make.info-4 +++ /dev/null @@ -1,1296 +0,0 @@ -This is Info file make.info, produced by Makeinfo-1.55 from the input -file ./make.texinfo. - - This file documents the GNU Make utility, which determines -automatically which pieces of a large program need to be recompiled, -and issues the commands to recompile them. - - This is Edition 0.48, last updated 4 April 1995, of `The GNU Make -Manual', for `make', Version 3.73 Beta. - - Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95 Free -Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: make.info, Node: Override Directive, Next: Defining, Prev: Appending, Up: Using Variables - -The `override' Directive -======================== - - If a variable has been set with a command argument (*note Overriding -Variables: Overriding.), then ordinary assignments in the makefile are -ignored. If you want to set the variable in the makefile even though -it was set with a command argument, you can use an `override' -directive, which is a line that looks like this: - - override VARIABLE = VALUE - -or - - override VARIABLE := VALUE - - To append more text to a variable defined on the command line, use: - - override VARIABLE += MORE TEXT - -*Note Appending More Text to Variables: Appending. - - The `override' directive was not invented for escalation in the war -between makefiles and command arguments. It was invented so you can -alter and add to values that the user specifies with command arguments. - - For example, suppose you always want the `-g' switch when you run the -C compiler, but you would like to allow the user to specify the other -switches with a command argument just as usual. You could use this -`override' directive: - - override CFLAGS += -g - - You can also use `override' directives with `define' directives. -This is done as you might expect: - - override define foo - bar - endef - -*Note Defining Variables Verbatim: Defining. - - -File: make.info, Node: Defining, Next: Environment, Prev: Override Directive, Up: Using Variables - -Defining Variables Verbatim -=========================== - -Another way to set the value of a variable is to use the `define' -directive. This directive has an unusual syntax which allows newline -characters to be included in the value, which is convenient for defining -canned sequences of commands (*note Defining Canned Command Sequences: -Sequences.). - - The `define' directive is followed on the same line by the name of -the variable and nothing more. The value to give the variable appears -on the following lines. The end of the value is marked by a line -containing just the word `endef'. Aside from this difference in -syntax, `define' works just like `=': it creates a recursively-expanded -variable (*note The Two Flavors of Variables: Flavors.). The variable -name may contain function and variable references, which are expanded -when the directive is read to find the actual variable name to use. - - define two-lines - echo foo - echo $(bar) - endef - - The value in an ordinary assignment cannot contain a newline; but the -newlines that separate the lines of the value in a `define' become part -of the variable's value (except for the final newline which precedes -the `endef' and is not considered part of the value). - - The previous example is functionally equivalent to this: - - two-lines = echo foo; echo $(bar) - -since two commands separated by semicolon behave much like two separate -shell commands. However, note that using two separate lines means -`make' will invoke the shell twice, running an independent subshell for -each line. *Note Command Execution: Execution. - - If you want variable definitions made with `define' to take -precedence over command-line variable definitions, you can use the -`override' directive together with `define': - - override define two-lines - foo - $(bar) - endef - -*Note The `override' Directive: Override Directive. - - -File: make.info, Node: Environment, Prev: Defining, Up: Using Variables - -Variables from the Environment -============================== - - Variables in `make' can come from the environment in which `make' is -run. Every environment variable that `make' sees when it starts up is -transformed into a `make' variable with the same name and value. But -an explicit assignment in the makefile, or with a command argument, -overrides the environment. (If the `-e' flag is specified, then values -from the environment override assignments in the makefile. *Note -Summary of Options: Options Summary. But this is not recommended -practice.) - - Thus, by setting the variable `CFLAGS' in your environment, you can -cause all C compilations in most makefiles to use the compiler switches -you prefer. This is safe for variables with standard or conventional -meanings because you know that no makefile will use them for other -things. (But this is not totally reliable; some makefiles set `CFLAGS' -explicitly and therefore are not affected by the value in the -environment.) - - When `make' is invoked recursively, variables defined in the outer -invocation can be passed to inner invocations through the environment -(*note Recursive Use of `make': Recursion.). By default, only -variables that came from the environment or the command line are passed -to recursive invocations. You can use the `export' directive to pass -other variables. *Note Communicating Variables to a Sub-`make': -Variables/Recursion, for full details. - - Other use of variables from the environment is not recommended. It -is not wise for makefiles to depend for their functioning on -environment variables set up outside their control, since this would -cause different users to get different results from the same makefile. -This is against the whole purpose of most makefiles. - - Such problems would be especially likely with the variable `SHELL', -which is normally present in the environment to specify the user's -choice of interactive shell. It would be very undesirable for this -choice to affect `make'. So `make' ignores the environment value of -`SHELL'. - - -File: make.info, Node: Conditionals, Next: Functions, Prev: Using Variables, Up: Top - -Conditional Parts of Makefiles -****************************** - - A "conditional" causes part of a makefile to be obeyed or ignored -depending on the values of variables. Conditionals can compare the -value of one variable to another, or the value of a variable to a -constant string. Conditionals control what `make' actually "sees" in -the makefile, so they *cannot* be used to control shell commands at the -time of execution. - -* Menu: - -* Conditional Example:: Example of a conditional -* Conditional Syntax:: The syntax of conditionals. -* Testing Flags:: Conditionals that test flags. - - -File: make.info, Node: Conditional Example, Next: Conditional Syntax, Up: Conditionals - -Example of a Conditional -======================== - - The following example of a conditional tells `make' to use one set -of libraries if the `CC' variable is `gcc', and a different set of -libraries otherwise. It works by controlling which of two command -lines will be used as the command for a rule. The result is that -`CC=gcc' as an argument to `make' changes not only which compiler is -used but also which libraries are linked. - - libs_for_gcc = -lgnu - normal_libs = - - foo: $(objects) - ifeq ($(CC),gcc) - $(CC) -o foo $(objects) $(libs_for_gcc) - else - $(CC) -o foo $(objects) $(normal_libs) - endif - - This conditional uses three directives: one `ifeq', one `else' and -one `endif'. - - The `ifeq' directive begins the conditional, and specifies the -condition. It contains two arguments, separated by a comma and -surrounded by parentheses. Variable substitution is performed on both -arguments and then they are compared. The lines of the makefile -following the `ifeq' are obeyed if the two arguments match; otherwise -they are ignored. - - The `else' directive causes the following lines to be obeyed if the -previous conditional failed. In the example above, this means that the -second alternative linking command is used whenever the first -alternative is not used. It is optional to have an `else' in a -conditional. - - The `endif' directive ends the conditional. Every conditional must -end with an `endif'. Unconditional makefile text follows. - - As this example illustrates, conditionals work at the textual level: -the lines of the conditional are treated as part of the makefile, or -ignored, according to the condition. This is why the larger syntactic -units of the makefile, such as rules, may cross the beginning or the -end of the conditional. - - When the variable `CC' has the value `gcc', the above example has -this effect: - - foo: $(objects) - $(CC) -o foo $(objects) $(libs_for_gcc) - -When the variable `CC' has any other value, the effect is this: - - foo: $(objects) - $(CC) -o foo $(objects) $(normal_libs) - - Equivalent results can be obtained in another way by -conditionalizing a variable assignment and then using the variable -unconditionally: - - libs_for_gcc = -lgnu - normal_libs = - - ifeq ($(CC),gcc) - libs=$(libs_for_gcc) - else - libs=$(normal_libs) - endif - - foo: $(objects) - $(CC) -o foo $(objects) $(libs) - - -File: make.info, Node: Conditional Syntax, Next: Testing Flags, Prev: Conditional Example, Up: Conditionals - -Syntax of Conditionals -====================== - - The syntax of a simple conditional with no `else' is as follows: - - CONDITIONAL-DIRECTIVE - TEXT-IF-TRUE - endif - -The TEXT-IF-TRUE may be any lines of text, to be considered as part of -the makefile if the condition is true. If the condition is false, no -text is used instead. - - The syntax of a complex conditional is as follows: - - CONDITIONAL-DIRECTIVE - TEXT-IF-TRUE - else - TEXT-IF-FALSE - endif - -If the condition is true, TEXT-IF-TRUE is used; otherwise, -TEXT-IF-FALSE is used instead. The TEXT-IF-FALSE can be any number of -lines of text. - - The syntax of the CONDITIONAL-DIRECTIVE is the same whether the -conditional is simple or complex. There are four different directives -that test different conditions. Here is a table of them: - -`ifeq (ARG1, ARG2)' -`ifeq 'ARG1' 'ARG2'' -`ifeq "ARG1" "ARG2"' -`ifeq "ARG1" 'ARG2'' -`ifeq 'ARG1' "ARG2"' - Expand all variable references in ARG1 and ARG2 and compare them. - If they are identical, the TEXT-IF-TRUE is effective; otherwise, - the TEXT-IF-FALSE, if any, is effective. - - Often you want to test if a variable has a non-empty value. When - the value results from complex expansions of variables and - functions, expansions you would consider empty may actually - contain whitespace characters and thus are not seen as empty. - However, you can use the `strip' function (*note Text - Functions::.) to avoid interpreting whitespace as a non-empty - value. For example: - - ifeq ($(strip $(foo)),) - TEXT-IF-EMPTY - endif - - will evaluate TEXT-IF-EMPTY even if the expansion of `$(foo)' - contains whitespace characters. - -`ifneq (ARG1, ARG2)' -`ifneq 'ARG1' 'ARG2'' -`ifneq "ARG1" "ARG2"' -`ifneq "ARG1" 'ARG2'' -`ifneq 'ARG1' "ARG2"' - Expand all variable references in ARG1 and ARG2 and compare them. - If they are different, the TEXT-IF-TRUE is effective; otherwise, - the TEXT-IF-FALSE, if any, is effective. - -`ifdef VARIABLE-NAME' - If the variable VARIABLE-NAME has a non-empty value, the - TEXT-IF-TRUE is effective; otherwise, the TEXT-IF-FALSE, if any, - is effective. Variables that have never been defined have an - empty value. - - Note that `ifdef' only tests whether a variable has a value. It - does not expand the variable to see if that value is nonempty. - Consequently, tests using `ifdef' return true for all definitions - except those like `foo ='. To test for an empty value, use - `ifeq ($(foo),)'. For example, - - bar = - foo = $(bar) - ifdef foo - frobozz = yes - else - frobozz = no - endif - - sets `frobozz' to `yes', while: - - foo = - ifdef foo - frobozz = yes - else - frobozz = no - endif - - sets `frobozz' to `no'. - -`ifndef VARIABLE-NAME' - If the variable VARIABLE-NAME has an empty value, the TEXT-IF-TRUE - is effective; otherwise, the TEXT-IF-FALSE, if any, is effective. - - Extra spaces are allowed and ignored at the beginning of the -conditional directive line, but a tab is not allowed. (If the line -begins with a tab, it will be considered a command for a rule.) Aside -from this, extra spaces or tabs may be inserted with no effect anywhere -except within the directive name or within an argument. A comment -starting with `#' may appear at the end of the line. - - The other two directives that play a part in a conditional are `else' -and `endif'. Each of these directives is written as one word, with no -arguments. Extra spaces are allowed and ignored at the beginning of the -line, and spaces or tabs at the end. A comment starting with `#' may -appear at the end of the line. - - Conditionals affect which lines of the makefile `make' uses. If the -condition is true, `make' reads the lines of the TEXT-IF-TRUE as part -of the makefile; if the condition is false, `make' ignores those lines -completely. It follows that syntactic units of the makefile, such as -rules, may safely be split across the beginning or the end of the -conditional. - - `make' evaluates conditionals when it reads a makefile. -Consequently, you cannot use automatic variables in the tests of -conditionals because they are not defined until commands are run (*note -Automatic Variables: Automatic.). - - To prevent intolerable confusion, it is not permitted to start a -conditional in one makefile and end it in another. However, you may -write an `include' directive within a conditional, provided you do not -attempt to terminate the conditional inside the included file. - - -File: make.info, Node: Testing Flags, Prev: Conditional Syntax, Up: Conditionals - -Conditionals that Test Flags -============================ - - You can write a conditional that tests `make' command flags such as -`-t' by using the variable `MAKEFLAGS' together with the `findstring' -function (*note Functions for String Substitution and Analysis: Text -Functions.). This is useful when `touch' is not enough to make a file -appear up to date. - - The `findstring' function determines whether one string appears as a -substring of another. If you want to test for the `-t' flag, use `t' -as the first string and the value of `MAKEFLAGS' as the other. - - For example, here is how to arrange to use `ranlib -t' to finish -marking an archive file up to date: - - archive.a: ... - ifneq (,$(findstring t,$(MAKEFLAGS))) - +touch archive.a - +ranlib -t archive.a - else - ranlib archive.a - endif - -The `+' prefix marks those command lines as "recursive" so that they -will be executed despite use of the `-t' flag. *Note Recursive Use of -`make': Recursion. - - -File: make.info, Node: Functions, Next: Running, Prev: Conditionals, Up: Top - -Functions for Transforming Text -******************************* - - "Functions" allow you to do text processing in the makefile to -compute the files to operate on or the commands to use. You use a -function in a "function call", where you give the name of the function -and some text (the "arguments") for the function to operate on. The -result of the function's processing is substituted into the makefile at -the point of the call, just as a variable might be substituted. - -* Menu: - -* Syntax of Functions:: How to write a function call. -* Text Functions:: General-purpose text manipulation functions. -* Filename Functions:: Functions for manipulating file names. -* Foreach Function:: Repeat some text with controlled variation. -* Origin Function:: Find where a variable got its value. -* Shell Function:: Substitute the output of a shell command. - - -File: make.info, Node: Syntax of Functions, Next: Text Functions, Up: Functions - -Function Call Syntax -==================== - - A function call resembles a variable reference. It looks like this: - - $(FUNCTION ARGUMENTS) - -or like this: - - ${FUNCTION ARGUMENTS} - - Here FUNCTION is a function name; one of a short list of names that -are part of `make'. There is no provision for defining new functions. - - The ARGUMENTS are the arguments of the function. They are separated -from the function name by one or more spaces or tabs, and if there is -more than one argument, then they are separated by commas. Such -whitespace and commas are not part of an argument's value. The -delimiters which you use to surround the function call, whether -parentheses or braces, can appear in an argument only in matching pairs; -the other kind of delimiters may appear singly. If the arguments -themselves contain other function calls or variable references, it is -wisest to use the same kind of delimiters for all the references; write -`$(subst a,b,$(x))', not `$(subst a,b,${x})'. This is because it is -clearer, and because only one type of delimiter is matched to find the -end of the reference. - - The text written for each argument is processed by substitution of -variables and function calls to produce the argument value, which is -the text on which the function acts. The substitution is done in the -order in which the arguments appear. - - Commas and unmatched parentheses or braces cannot appear in the text -of an argument as written; leading spaces cannot appear in the text of -the first argument as written. These characters can be put into the -argument value by variable substitution. First define variables -`comma' and `space' whose values are isolated comma and space -characters, then substitute these variables where such characters are -wanted, like this: - - comma:= , - empty:= - space:= $(empty) $(empty) - foo:= a b c - bar:= $(subst $(space),$(comma),$(foo)) - # bar is now `a,b,c'. - -Here the `subst' function replaces each space with a comma, through the -value of `foo', and substitutes the result. - - -File: make.info, Node: Text Functions, Next: Filename Functions, Prev: Syntax of Functions, Up: Functions - -Functions for String Substitution and Analysis -============================================== - - Here are some functions that operate on strings: - -`$(subst FROM,TO,TEXT)' - Performs a textual replacement on the text TEXT: each occurrence - of FROM is replaced by TO. The result is substituted for the - function call. For example, - - $(subst ee,EE,feet on the street) - - substitutes the string `fEEt on the strEEt'. - -`$(patsubst PATTERN,REPLACEMENT,TEXT)' - Finds whitespace-separated words in TEXT that match PATTERN and - replaces them with REPLACEMENT. Here PATTERN may contain a `%' - which acts as a wildcard, matching any number of any characters - within a word. If REPLACEMENT also contains a `%', the `%' is - replaced by the text that matched the `%' in PATTERN. - - `%' characters in `patsubst' function invocations can be quoted - with preceding backslashes (`\'). Backslashes that would - otherwise quote `%' characters can be quoted with more backslashes. - Backslashes that quote `%' characters or other backslashes are - removed from the pattern before it is compared file names or has a - stem substituted into it. Backslashes that are not in danger of - quoting `%' characters go unmolested. For example, the pattern - `the\%weird\\%pattern\\' has `the%weird\' preceding the operative - `%' character, and `pattern\\' following it. The final two - backslashes are left alone because they cannot affect any `%' - character. - - Whitespace between words is folded into single space characters; - leading and trailing whitespace is discarded. - - For example, - - $(patsubst %.c,%.o,x.c.c bar.c) - - produces the value `x.c.o bar.o'. - - Substitution references (*note Substitution References: - Substitution Refs.) are a simpler way to get the effect of the - `patsubst' function: - - $(VAR:PATTERN=REPLACEMENT) - - is equivalent to - - $(patsubst PATTERN,REPLACEMENT,$(VAR)) - - The second shorthand simplifies one of the most common uses of - `patsubst': replacing the suffix at the end of file names. - - $(VAR:SUFFIX=REPLACEMENT) - - is equivalent to - - $(patsubst %SUFFIX,%REPLACEMENT,$(VAR)) - - For example, you might have a list of object files: - - objects = foo.o bar.o baz.o - - To get the list of corresponding source files, you could simply - write: - - $(objects:.o=.c) - - instead of using the general form: - - $(patsubst %.o,%.c,$(objects)) - -`$(strip STRING)' - Removes leading and trailing whitespace from STRING and replaces - each internal sequence of one or more whitespace characters with a - single space. Thus, `$(strip a b c )' results in `a b c'. - - The function `strip' can be very useful when used in conjunction - with conditionals. When comparing something with the empty string - `' using `ifeq' or `ifneq', you usually want a string of just - whitespace to match the empty string (*note Conditionals::.). - - Thus, the following may fail to have the desired results: - - .PHONY: all - ifneq "$(needs_made)" "" - all: $(needs_made) - else - all:;@echo 'Nothing to make!' - endif - - Replacing the variable reference `$(needs_made)' with the function - call `$(strip $(needs_made))' in the `ifneq' directive would make - it more robust. - -`$(findstring FIND,IN)' - Searches IN for an occurrence of FIND. If it occurs, the value is - FIND; otherwise, the value is empty. You can use this function in - a conditional to test for the presence of a specific substring in - a given string. Thus, the two examples, - - $(findstring a,a b c) - $(findstring a,b c) - - produce the values `a' and `' (the empty string), respectively. - *Note Testing Flags::, for a practical application of `findstring'. - -`$(filter PATTERN...,TEXT)' - Removes all whitespace-separated words in TEXT that do *not* match - any of the PATTERN words, returning only matching words. The - patterns are written using `%', just like the patterns used in the - `patsubst' function above. - - The `filter' function can be used to separate out different types - of strings (such as file names) in a variable. For example: - - sources := foo.c bar.c baz.s ugh.h - foo: $(sources) - cc $(filter %.c %.s,$(sources)) -o foo - - says that `foo' depends of `foo.c', `bar.c', `baz.s' and `ugh.h' - but only `foo.c', `bar.c' and `baz.s' should be specified in the - command to the compiler. - -`$(filter-out PATTERN...,TEXT)' - Removes all whitespace-separated words in TEXT that *do* match the - PATTERN words, returning only the words that *do not* match. This - is the exact opposite of the `filter' function. - - For example, given: - - objects=main1.o foo.o main2.o bar.o - mains=main1.o main2.o - - the following generates a list which contains all the object files - not in `mains': - - $(filter-out $(mains),$(objects)) - -`$(sort LIST)' - Sorts the words of LIST in lexical order, removing duplicate - words. The output is a list of words separated by single spaces. - Thus, - - $(sort foo bar lose) - - returns the value `bar foo lose'. - - Incidentally, since `sort' removes duplicate words, you can use it - for this purpose even if you don't care about the sort order. - - Here is a realistic example of the use of `subst' and `patsubst'. -Suppose that a makefile uses the `VPATH' variable to specify a list of -directories that `make' should search for dependency files (*note -`VPATH' Search Path for All Dependencies: General Search.). This -example shows how to tell the C compiler to search for header files in -the same list of directories. - - The value of `VPATH' is a list of directories separated by colons, -such as `src:../headers'. First, the `subst' function is used to -change the colons to spaces: - - $(subst :, ,$(VPATH)) - -This produces `src ../headers'. Then `patsubst' is used to turn each -directory name into a `-I' flag. These can be added to the value of -the variable `CFLAGS', which is passed automatically to the C compiler, -like this: - - override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH))) - -The effect is to append the text `-Isrc -I../headers' to the previously -given value of `CFLAGS'. The `override' directive is used so that the -new value is assigned even if the previous value of `CFLAGS' was -specified with a command argument (*note The `override' Directive: -Override Directive.). - - -File: make.info, Node: Filename Functions, Next: Foreach Function, Prev: Text Functions, Up: Functions - -Functions for File Names -======================== - - Several of the built-in expansion functions relate specifically to -taking apart file names or lists of file names. - - Each of the following functions performs a specific transformation -on a file name. The argument of the function is regarded as a series -of file names, separated by whitespace. (Leading and trailing -whitespace is ignored.) Each file name in the series is transformed in -the same way and the results are concatenated with single spaces -between them. - -`$(dir NAMES...)' - Extracts the directory-part of each file name in NAMES. The - directory-part of the file name is everything up through (and - including) the last slash in it. If the file name contains no - slash, the directory part is the string `./'. For example, - - $(dir src/foo.c hacks) - - produces the result `src/ ./'. - -`$(notdir NAMES...)' - Extracts all but the directory-part of each file name in NAMES. - If the file name contains no slash, it is left unchanged. - Otherwise, everything through the last slash is removed from it. - - A file name that ends with a slash becomes an empty string. This - is unfortunate, because it means that the result does not always - have the same number of whitespace-separated file names as the - argument had; but we do not see any other valid alternative. - - For example, - - $(notdir src/foo.c hacks) - - produces the result `foo.c hacks'. - -`$(suffix NAMES...)' - Extracts the suffix of each file name in NAMES. If the file name - contains a period, the suffix is everything starting with the last - period. Otherwise, the suffix is the empty string. This - frequently means that the result will be empty when NAMES is not, - and if NAMES contains multiple file names, the result may contain - fewer file names. - - For example, - - $(suffix src/foo.c hacks) - - produces the result `.c'. - -`$(basename NAMES...)' - Extracts all but the suffix of each file name in NAMES. If the - file name contains a period, the basename is everything starting - up to (and not including) the last period. Otherwise, the - basename is the entire file name. For example, - - $(basename src/foo.c hacks) - - produces the result `src/foo hacks'. - -`$(addsuffix SUFFIX,NAMES...)' - The argument NAMES is regarded as a series of names, separated by - whitespace; SUFFIX is used as a unit. The value of SUFFIX is - appended to the end of each individual name and the resulting - larger names are concatenated with single spaces between them. - For example, - - $(addsuffix .c,foo bar) - - produces the result `foo.c bar.c'. - -`$(addprefix PREFIX,NAMES...)' - The argument NAMES is regarded as a series of names, separated by - whitespace; PREFIX is used as a unit. The value of PREFIX is - prepended to the front of each individual name and the resulting - larger names are concatenated with single spaces between them. - For example, - - $(addprefix src/,foo bar) - - produces the result `src/foo src/bar'. - -`$(join LIST1,LIST2)' - Concatenates the two arguments word by word: the two first words - (one from each argument) concatenated form the first word of the - result, the two second words form the second word of the result, - and so on. So the Nth word of the result comes from the Nth word - of each argument. If one argument has more words that the other, - the extra words are copied unchanged into the result. - - For example, `$(join a b,.c .o)' produces `a.c b.o'. - - Whitespace between the words in the lists is not preserved; it is - replaced with a single space. - - This function can merge the results of the `dir' and `notdir' - functions, to produce the original list of files which was given - to those two functions. - -`$(word N,TEXT)' - Returns the Nth word of TEXT. The legitimate values of N start - from 1. If N is bigger than the number of words in TEXT, the - value is empty. For example, - - $(word 2, foo bar baz) - - returns `bar'. - -`$(words TEXT)' - Returns the number of words in TEXT. Thus, the last word of TEXT - is `$(word $(words TEXT),TEXT)'. - -`$(firstword NAMES...)' - The argument NAMES is regarded as a series of names, separated by - whitespace. The value is the first name in the series. The rest - of the names are ignored. - - For example, - - $(firstword foo bar) - - produces the result `foo'. Although `$(firstword TEXT)' is the - same as `$(word 1,TEXT)', the `firstword' function is retained for - its simplicity. - -`$(wildcard PATTERN)' - The argument PATTERN is a file name pattern, typically containing - wildcard characters (as in shell file name patterns). The result - of `wildcard' is a space-separated list of the names of existing - files that match the pattern. *Note Using Wildcard Characters in - File Names: Wildcards. - - -File: make.info, Node: Foreach Function, Next: Origin Function, Prev: Filename Functions, Up: Functions - -The `foreach' Function -====================== - - The `foreach' function is very different from other functions. It -causes one piece of text to be used repeatedly, each time with a -different substitution performed on it. It resembles the `for' command -in the shell `sh' and the `foreach' command in the C-shell `csh'. - - The syntax of the `foreach' function is: - - $(foreach VAR,LIST,TEXT) - -The first two arguments, VAR and LIST, are expanded before anything -else is done; note that the last argument, TEXT, is *not* expanded at -the same time. Then for each word of the expanded value of LIST, the -variable named by the expanded value of VAR is set to that word, and -TEXT is expanded. Presumably TEXT contains references to that -variable, so its expansion will be different each time. - - The result is that TEXT is expanded as many times as there are -whitespace-separated words in LIST. The multiple expansions of TEXT -are concatenated, with spaces between them, to make the result of -`foreach'. - - This simple example sets the variable `files' to the list of all -files in the directories in the list `dirs': - - dirs := a b c d - files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)) - - Here TEXT is `$(wildcard $(dir)/*)'. The first repetition finds the -value `a' for `dir', so it produces the same result as `$(wildcard -a/*)'; the second repetition produces the result of `$(wildcard b/*)'; -and the third, that of `$(wildcard c/*)'. - - This example has the same result (except for setting `dirs') as the -following example: - - files := $(wildcard a/* b/* c/* d/*) - - When TEXT is complicated, you can improve readability by giving it a -name, with an additional variable: - - find_files = $(wildcard $(dir)/*) - dirs := a b c d - files := $(foreach dir,$(dirs),$(find_files)) - -Here we use the variable `find_files' this way. We use plain `=' to -define a recursively-expanding variable, so that its value contains an -actual function call to be reexpanded under the control of `foreach'; a -simply-expanded variable would not do, since `wildcard' would be called -only once at the time of defining `find_files'. - - The `foreach' function has no permanent effect on the variable VAR; -its value and flavor after the `foreach' function call are the same as -they were beforehand. The other values which are taken from LIST are -in effect only temporarily, during the execution of `foreach'. The -variable VAR is a simply-expanded variable during the execution of -`foreach'. If VAR was undefined before the `foreach' function call, it -is undefined after the call. *Note The Two Flavors of Variables: -Flavors. - - You must take care when using complex variable expressions that -result in variable names because many strange things are valid variable -names, but are probably not what you intended. For example, - - files := $(foreach Esta escrito en espanol!,b c ch,$(find_files)) - -might be useful if the value of `find_files' references the variable -whose name is `Esta escrito en espanol!' (es un nombre bastante largo, -no?), but it is more likely to be a mistake. - - -File: make.info, Node: Origin Function, Next: Shell Function, Prev: Foreach Function, Up: Functions - -The `origin' Function -===================== - - The `origin' function is unlike most other functions in that it does -not operate on the values of variables; it tells you something *about* -a variable. Specifically, it tells you where it came from. - - The syntax of the `origin' function is: - - $(origin VARIABLE) - - Note that VARIABLE is the *name* of a variable to inquire about; not -a *reference* to that variable. Therefore you would not normally use a -`$' or parentheses when writing it. (You can, however, use a variable -reference in the name if you want the name not to be a constant.) - - The result of this function is a string telling you how the variable -VARIABLE was defined: - -`undefined' - if VARIABLE was never defined. - -`default' - if VARIABLE has a default definition, as is usual with `CC' and so - on. *Note Variables Used by Implicit Rules: Implicit Variables. - Note that if you have redefined a default variable, the `origin' - function will return the origin of the later definition. - -`environment' - if VARIABLE was defined as an environment variable and the `-e' - option is *not* turned on (*note Summary of Options: Options - Summary.). - -`environment override' - if VARIABLE was defined as an environment variable and the `-e' - option *is* turned on (*note Summary of Options: Options Summary.). - -`file' - if VARIABLE was defined in a makefile. - -`command line' - if VARIABLE was defined on the command line. - -`override' - if VARIABLE was defined with an `override' directive in a makefile - (*note The `override' Directive: Override Directive.). - -`automatic' - if VARIABLE is an automatic variable defined for the execution of - the commands for each rule (*note Automatic Variables: Automatic.). - - This information is primarily useful (other than for your curiosity) -to determine if you want to believe the value of a variable. For -example, suppose you have a makefile `foo' that includes another -makefile `bar'. You want a variable `bletch' to be defined in `bar' if -you run the command `make -f bar', even if the environment contains a -definition of `bletch'. However, if `foo' defined `bletch' before -including `bar', you do not want to override that definition. This -could be done by using an `override' directive in `foo', giving that -definition precedence over the later definition in `bar'; -unfortunately, the `override' directive would also override any command -line definitions. So, `bar' could include: - - ifdef bletch - ifeq "$(origin bletch)" "environment" - bletch = barf, gag, etc. - endif - endif - -If `bletch' has been defined from the environment, this will redefine -it. - - If you want to override a previous definition of `bletch' if it came -from the environment, even under `-e', you could instead write: - - ifneq "$(findstring environment,$(origin bletch))" "" - bletch = barf, gag, etc. - endif - - Here the redefinition takes place if `$(origin bletch)' returns -either `environment' or `environment override'. *Note Functions for -String Substitution and Analysis: Text Functions. - - -File: make.info, Node: Shell Function, Prev: Origin Function, Up: Functions - -The `shell' Function -==================== - - The `shell' function is unlike any other function except the -`wildcard' function (*note The Function `wildcard': Wildcard Function.) -in that it communicates with the world outside of `make'. - - The `shell' function performs the same function that backquotes -(``') perform in most shells: it does "command expansion". This means -that it takes an argument that is a shell command and returns the -output of the command. The only processing `make' does on the result, -before substituting it into the surrounding text, is to convert -newlines to spaces. - - The commands run by calls to the `shell' function are run when the -function calls are expanded. In most cases, this is when the makefile -is read in. The exception is that function calls in the commands of -the rules are expanded when the commands are run, and this applies to -`shell' function calls like all others. - - Here are some examples of the use of the `shell' function: - - contents := $(shell cat foo) - -sets `contents' to the contents of the file `foo', with a space (rather -than a newline) separating each line. - - files := $(shell echo *.c) - -sets `files' to the expansion of `*.c'. Unless `make' is using a very -strange shell, this has the same result as `$(wildcard *.c)'. - - -File: make.info, Node: Running, Next: Implicit Rules, Prev: Functions, Up: Top - -How to Run `make' -***************** - - A makefile that says how to recompile a program can be used in more -than one way. The simplest use is to recompile every file that is out -of date. Usually, makefiles are written so that if you run `make' with -no arguments, it does just that. - - But you might want to update only some of the files; you might want -to use a different compiler or different compiler options; you might -want just to find out which files are out of date without changing them. - - By giving arguments when you run `make', you can do any of these -things and many others. - - The exit status of `make' is always one of three values: -`0' - The exit status is zero if `make' is successful. - -`2' - The exit status is two if `make' encounters any errors. It will - print messages describing the particular errors. - -`1' - The exit status is one if you use the `-q' flag and `make' - determines that some target is not already up to date. *Note - Instead of Executing the Commands: Instead of Execution. - -* Menu: - -* Makefile Arguments:: How to specify which makefile to use. -* Goals:: How to use goal arguments to specify which - parts of the makefile to use. -* Instead of Execution:: How to use mode flags to specify what - kind of thing to do with the commands - in the makefile other than simply - execute them. -* Avoiding Compilation:: How to avoid recompiling certain files. -* Overriding:: How to override a variable to specify - an alternate compiler and other things. -* Testing:: How to proceed past some errors, to - test compilation. -* Options Summary:: Summary of Options - - -File: make.info, Node: Makefile Arguments, Next: Goals, Up: Running - -Arguments to Specify the Makefile -================================= - - The way to specify the name of the makefile is with the `-f' or -`--file' option (`--makefile' also works). For example, `-f altmake' -says to use the file `altmake' as the makefile. - - If you use the `-f' flag several times and follow each `-f' with an -argument, all the specified files are used jointly as makefiles. - - If you do not use the `-f' or `--file' flag, the default is to try -`GNUmakefile', `makefile', and `Makefile', in that order, and use the -first of these three which exists or can be made (*note Writing -Makefiles: Makefiles.). - - -File: make.info, Node: Goals, Next: Instead of Execution, Prev: Makefile Arguments, Up: Running - -Arguments to Specify the Goals -============================== - - The "goals" are the targets that `make' should strive ultimately to -update. Other targets are updated as well if they appear as -dependencies of goals, or dependencies of dependencies of goals, etc. - - By default, the goal is the first target in the makefile (not -counting targets that start with a period). Therefore, makefiles are -usually written so that the first target is for compiling the entire -program or programs they describe. If the first rule in the makefile -has several targets, only the first target in the rule becomes the -default goal, not the whole list. - - You can specify a different goal or goals with arguments to `make'. -Use the name of the goal as an argument. If you specify several goals, -`make' processes each of them in turn, in the order you name them. - - Any target in the makefile may be specified as a goal (unless it -starts with `-' or contains an `=', in which case it will be parsed as -a switch or variable definition, respectively). Even targets not in -the makefile may be specified, if `make' can find implicit rules that -say how to make them. - - One use of specifying a goal is if you want to compile only a part of -the program, or only one of several programs. Specify as a goal each -file that you wish to remake. For example, consider a directory -containing several programs, with a makefile that starts like this: - - .PHONY: all - all: size nm ld ar as - - If you are working on the program `size', you might want to say -`make size' so that only the files of that program are recompiled. - - Another use of specifying a goal is to make files that are not -normally made. For example, there may be a file of debugging output, -or a version of the program that is compiled specially for testing, -which has a rule in the makefile but is not a dependency of the default -goal. - - Another use of specifying a goal is to run the commands associated -with a phony target (*note Phony Targets::.) or empty target (*note -Empty Target Files to Record Events: Empty Targets.). Many makefiles -contain a phony target named `clean' which deletes everything except -source files. Naturally, this is done only if you request it -explicitly with `make clean'. Following is a list of typical phony and -empty target names. *Note Standard Targets::, for a detailed list of -all the standard target names which GNU software packages use. - -`all' - Make all the top-level targets the makefile knows about. - -`clean' - Delete all files that are normally created by running `make'. - -`mostlyclean' - Like `clean', but may refrain from deleting a few files that people - normally don't want to recompile. For example, the `mostlyclean' - target for GCC does not delete `libgcc.a', because recompiling it - is rarely necessary and takes a lot of time. - -`distclean' -`realclean' -`clobber' - Any of these targets might be defined to delete *more* files than - `clean' does. For example, this would delete configuration files - or links that you would normally create as preparation for - compilation, even if the makefile itself cannot create these files. - -`install' - Copy the executable file into a directory that users typically - search for commands; copy any auxiliary files that the executable - uses into the directories where it will look for them. - -`print' - Print listings of the source files that have changed. - -`tar' - Create a tar file of the source files. - -`shar' - Create a shell archive (shar file) of the source files. - -`dist' - Create a distribution file of the source files. This might be a - tar file, or a shar file, or a compressed version of one of the - above, or even more than one of the above. - -`TAGS' - Update a tags table for this program. - -`check' -`test' - Perform self tests on the program this makefile builds. - - -File: make.info, Node: Instead of Execution, Next: Avoiding Compilation, Prev: Goals, Up: Running - -Instead of Executing the Commands -================================= - - The makefile tells `make' how to tell whether a target is up to date, -and how to update each target. But updating the targets is not always -what you want. Certain options specify other activities for `make'. - -`-n' -`--just-print' -`--dry-run' -`--recon' - "No-op". The activity is to print what commands would be used to - make the targets up to date, but not actually execute them. - -`-t' -`--touch' - "Touch". The activity is to mark the targets as up to date without - actually changing them. In other words, `make' pretends to compile - the targets but does not really change their contents. - -`-q' -`--question' - "Question". The activity is to find out silently whether the - targets are up to date already; but execute no commands in either - case. In other words, neither compilation nor output will occur. - -`-W FILE' -`--what-if=FILE' -`--assume-new=FILE' -`--new-file=FILE' - "What if". Each `-W' flag is followed by a file name. The given - files' modification times are recorded by `make' as being the - present time, although the actual modification times remain the - same. You can use the `-W' flag in conjunction with the `-n' flag - to see what would happen if you were to modify specific files. - - With the `-n' flag, `make' prints the commands that it would -normally execute but does not execute them. - - With the `-t' flag, `make' ignores the commands in the rules and -uses (in effect) the command `touch' for each target that needs to be -remade. The `touch' command is also printed, unless `-s' or `.SILENT' -is used. For speed, `make' does not actually invoke the program -`touch'. It does the work directly. - - With the `-q' flag, `make' prints nothing and executes no commands, -but the exit status code it returns is zero if and only if the targets -to be considered are already up to date. If the exit status is one, -then some updating needs to be done. If `make' encounters an error, -the exit status is two, so you can distinguish an error from a target -that is not up to date. - - It is an error to use more than one of these three flags in the same -invocation of `make'. - - The `-n', `-t', and `-q' options do not affect command lines that -begin with `+' characters or contain the strings `$(MAKE)' or -`${MAKE}'. Note that only the line containing the `+' character or the -strings `$(MAKE)' or `${MAKE}' is run regardless of these options. -Other lines in the same rule are not run unless they too begin with `+' -or contain `$(MAKE)' or `${MAKE}' (*Note How the `MAKE' Variable Works: -MAKE Variable.) - - The `-W' flag provides two features: - - * If you also use the `-n' or `-q' flag, you can see what `make' - would do if you were to modify some files. - - * Without the `-n' or `-q' flag, when `make' is actually executing - commands, the `-W' flag can direct `make' to act as if some files - had been modified, without actually modifying the files. - - Note that the options `-p' and `-v' allow you to obtain other -information about `make' or about the makefiles in use (*note Summary -of Options: Options Summary.). - - -File: make.info, Node: Avoiding Compilation, Next: Overriding, Prev: Instead of Execution, Up: Running - -Avoiding Recompilation of Some Files -==================================== - - Sometimes you may have changed a source file but you do not want to -recompile all the files that depend on it. For example, suppose you -add a macro or a declaration to a header file that many other files -depend on. Being conservative, `make' assumes that any change in the -header file requires recompilation of all dependent files, but you know -that they do not need to be recompiled and you would rather not waste -the time waiting for them to compile. - - If you anticipate the problem before changing the header file, you -can use the `-t' flag. This flag tells `make' not to run the commands -in the rules, but rather to mark the target up to date by changing its -last-modification date. You would follow this procedure: - - 1. Use the command `make' to recompile the source files that really - need recompilation. - - 2. Make the changes in the header files. - - 3. Use the command `make -t' to mark all the object files as up to - date. The next time you run `make', the changes in the header - files will not cause any recompilation. - - If you have already changed the header file at a time when some files -do need recompilation, it is too late to do this. Instead, you can use -the `-o FILE' flag, which marks a specified file as "old" (*note -Summary of Options: Options Summary.). This means that the file itself -will not be remade, and nothing else will be remade on its account. -Follow this procedure: - - 1. Recompile the source files that need compilation for reasons - independent of the particular header file, with `make -o - HEADERFILE'. If several header files are involved, use a separate - `-o' option for each header file. - - 2. Touch all the object files with `make -t'. - diff --git a/buildtools/windows/source/make/make.info-5 b/buildtools/windows/source/make/make.info-5 deleted file mode 100644 index 13914a10faa..00000000000 --- a/buildtools/windows/source/make/make.info-5 +++ /dev/null @@ -1,1131 +0,0 @@ -This is Info file make.info, produced by Makeinfo-1.55 from the input -file ./make.texinfo. - - This file documents the GNU Make utility, which determines -automatically which pieces of a large program need to be recompiled, -and issues the commands to recompile them. - - This is Edition 0.48, last updated 4 April 1995, of `The GNU Make -Manual', for `make', Version 3.73 Beta. - - Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95 Free -Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: make.info, Node: Overriding, Next: Testing, Prev: Avoiding Compilation, Up: Running - -Overriding Variables -==================== - - An argument that contains `=' specifies the value of a variable: -`V=X' sets the value of the variable V to X. If you specify a value in -this way, all ordinary assignments of the same variable in the makefile -are ignored; we say they have been "overridden" by the command line -argument. - - The most common way to use this facility is to pass extra flags to -compilers. For example, in a properly written makefile, the variable -`CFLAGS' is included in each command that runs the C compiler, so a -file `foo.c' would be compiled something like this: - - cc -c $(CFLAGS) foo.c - - Thus, whatever value you set for `CFLAGS' affects each compilation -that occurs. The makefile probably specifies the usual value for -`CFLAGS', like this: - - CFLAGS=-g - - Each time you run `make', you can override this value if you wish. -For example, if you say `make CFLAGS='-g -O'', each C compilation will -be done with `cc -c -g -O'. (This illustrates how you can use quoting -in the shell to enclose spaces and other special characters in the -value of a variable when you override it.) - - The variable `CFLAGS' is only one of many standard variables that -exist just so that you can change them this way. *Note Variables Used -by Implicit Rules: Implicit Variables, for a complete list. - - You can also program the makefile to look at additional variables of -your own, giving the user the ability to control other aspects of how -the makefile works by changing the variables. - - When you override a variable with a command argument, you can define -either a recursively-expanded variable or a simply-expanded variable. -The examples shown above make a recursively-expanded variable; to make a -simply-expanded variable, write `:=' instead of `='. But, unless you -want to include a variable reference or function call in the *value* -that you specify, it makes no difference which kind of variable you -create. - - There is one way that the makefile can change a variable that you -have overridden. This is to use the `override' directive, which is a -line that looks like this: `override VARIABLE = VALUE' (*note The -`override' Directive: Override Directive.). - - -File: make.info, Node: Testing, Next: Options Summary, Prev: Overriding, Up: Running - -Testing the Compilation of a Program -==================================== - - Normally, when an error happens in executing a shell command, `make' -gives up immediately, returning a nonzero status. No further commands -are executed for any target. The error implies that the goal cannot be -correctly remade, and `make' reports this as soon as it knows. - - When you are compiling a program that you have just changed, this is -not what you want. Instead, you would rather that `make' try compiling -every file that can be tried, to show you as many compilation errors as -possible. - - On these occasions, you should use the `-k' or `--keep-going' flag. -This tells `make' to continue to consider the other dependencies of the -pending targets, remaking them if necessary, before it gives up and -returns nonzero status. For example, after an error in compiling one -object file, `make -k' will continue compiling other object files even -though it already knows that linking them will be impossible. In -addition to continuing after failed shell commands, `make -k' will -continue as much as possible after discovering that it does not know -how to make a target or dependency file. This will always cause an -error message, but without `-k', it is a fatal error (*note Summary of -Options: Options Summary.). - - The usual behavior of `make' assumes that your purpose is to get the -goals up to date; once `make' learns that this is impossible, it might -as well report the failure immediately. The `-k' flag says that the -real purpose is to test as much as possible of the changes made in the -program, perhaps to find several independent problems so that you can -correct them all before the next attempt to compile. This is why Emacs' -`M-x compile' command passes the `-k' flag by default. - - -File: make.info, Node: Options Summary, Prev: Testing, Up: Running - -Summary of Options -================== - - Here is a table of all the options `make' understands: - -`-b' -`-m' - These options are ignored for compatibility with other versions of - `make'. - -`-C DIR' -`--directory=DIR' - Change to directory DIR before reading the makefiles. If multiple - `-C' options are specified, each is interpreted relative to the - previous one: `-C / -C etc' is equivalent to `-C /etc'. This is - typically used with recursive invocations of `make' (*note - Recursive Use of `make': Recursion.). - -`-d' -`--debug' - Print debugging information in addition to normal processing. The - debugging information says which files are being considered for - remaking, which file-times are being compared and with what - results, which files actually need to be remade, which implicit - rules are considered and which are applied--everything interesting - about how `make' decides what to do. - -`-e' -`--environment-overrides' - Give variables taken from the environment precedence over - variables from makefiles. *Note Variables from the Environment: - Environment. - -`-f FILE' -`--file=FILE' -`--makefile=FILE' - Read the file named FILE as a makefile. *Note Writing Makefiles: - Makefiles. - -`-h' -`--help' - Remind you of the options that `make' understands and then exit. - -`-i' -`--ignore-errors' - Ignore all errors in commands executed to remake files. *Note - Errors in Commands: Errors. - -`-I DIR' -`--include-dir=DIR' - Specifies a directory DIR to search for included makefiles. *Note - Including Other Makefiles: Include. If several `-I' options are - used to specify several directories, the directories are searched - in the order specified. - -`-j [JOBS]' -`--jobs=[JOBS]' - Specifies the number of jobs (commands) to run simultaneously. - With no argument, `make' runs as many jobs simultaneously as - possible. If there is more than one `-j' option, the last one is - effective. *Note Parallel Execution: Parallel, for more - information on how commands are run. - -`-k' -`--keep-going' - Continue as much as possible after an error. While the target that - failed, and those that depend on it, cannot be remade, the other - dependencies of these targets can be processed all the same. - *Note Testing the Compilation of a Program: Testing. - -`-l [LOAD]' -`--load-average[=LOAD]' -`--max-load[=LOAD]' - Specifies that no new jobs (commands) should be started if there - are other jobs running and the load average is at least LOAD (a - floating-point number). With no argument, removes a previous load - limit. *Note Parallel Execution: Parallel. - -`-n' -`--just-print' -`--dry-run' -`--recon' - Print the commands that would be executed, but do not execute them. - *Note Instead of Executing the Commands: Instead of Execution. - -`-o FILE' -`--old-file=FILE' -`--assume-old=FILE' - Do not remake the file FILE even if it is older than its - dependencies, and do not remake anything on account of changes in - FILE. Essentially the file is treated as very old and its rules - are ignored. *Note Avoiding Recompilation of Some Files: Avoiding - Compilation. - -`-p' -`--print-data-base' - Print the data base (rules and variable values) that results from - reading the makefiles; then execute as usual or as otherwise - specified. This also prints the version information given by the - `-v' switch (see below). To print the data base without trying to - remake any files, use `make -p -f /dev/null'. - -`-q' -`--question' - "Question mode". Do not run any commands, or print anything; just - return an exit status that is zero if the specified targets are - already up to date, one if any remaking is required, or two if an - error is encountered. *Note Instead of Executing the Commands: - Instead of Execution. - -`-r' -`--no-builtin-rules' - Eliminate use of the built-in implicit rules (*note Using Implicit - Rules: Implicit Rules.). You can still define your own by writing - pattern rules (*note Defining and Redefining Pattern Rules: - Pattern Rules.). The `-r' option also clears out the default list - of suffixes for suffix rules (*note Old-Fashioned Suffix Rules: - Suffix Rules.). But you can still define your own suffixes with a - rule for `.SUFFIXES', and then define your own suffix rules. - -`-s' -`--silent' -`--quiet' - Silent operation; do not print the commands as they are executed. - *Note Command Echoing: Echoing. - -`-S' -`--no-keep-going' -`--stop' - Cancel the effect of the `-k' option. This is never necessary - except in a recursive `make' where `-k' might be inherited from - the top-level `make' via `MAKEFLAGS' (*note Recursive Use of - `make': Recursion.) or if you set `-k' in `MAKEFLAGS' in your - environment. - -`-t' -`--touch' - Touch files (mark them up to date without really changing them) - instead of running their commands. This is used to pretend that - the commands were done, in order to fool future invocations of - `make'. *Note Instead of Executing the Commands: Instead of - Execution. - -`-v' -`--version' - Print the version of the `make' program plus a copyright, a list - of authors, and a notice that there is no warranty; then exit. - -`-w' -`--print-directory' - Print a message containing the working directory both before and - after executing the makefile. This may be useful for tracking - down errors from complicated nests of recursive `make' commands. - *Note Recursive Use of `make': Recursion. (In practice, you - rarely need to specify this option since `make' does it for you; - see *Note The `--print-directory' Option: -w Option.) - -`--no-print-directory' - Disable printing of the working directory under `-w'. This option - is useful when `-w' is turned on automatically, but you do not - want to see the extra messages. *Note The `--print-directory' - Option: -w Option. - -`-W FILE' -`--what-if=FILE' -`--new-file=FILE' -`--assume-new=FILE' - Pretend that the target FILE has just been modified. When used - with the `-n' flag, this shows you what would happen if you were - to modify that file. Without `-n', it is almost the same as - running a `touch' command on the given file before running `make', - except that the modification time is changed only in the - imagination of `make'. *Note Instead of Executing the Commands: - Instead of Execution. - -`--warn-undefined-variables' - Issue a warning message whenever `make' sees a reference to an - undefined variable. This can be helpful when you are trying to - debug makefiles which use variables in complex ways. - - -File: make.info, Node: Implicit Rules, Next: Archives, Prev: Running, Up: Top - -Using Implicit Rules -******************** - - Certain standard ways of remaking target files are used very often. -For example, one customary way to make an object file is from a C -source file using the C compiler, `cc'. - - "Implicit rules" tell `make' how to use customary techniques so that -you do not have to specify them in detail when you want to use them. -For example, there is an implicit rule for C compilation. File names -determine which implicit rules are run. For example, C compilation -typically takes a `.c' file and makes a `.o' file. So `make' applies -the implicit rule for C compilation when it sees this combination of -file name endings. - - A chain of implicit rules can apply in sequence; for example, `make' -will remake a `.o' file from a `.y' file by way of a `.c' file. - - The built-in implicit rules use several variables in their commands -so that, by changing the values of the variables, you can change the -way the implicit rule works. For example, the variable `CFLAGS' -controls the flags given to the C compiler by the implicit rule for C -compilation. - - You can define your own implicit rules by writing "pattern rules". - - "Suffix rules" are a more limited way to define implicit rules. -Pattern rules are more general and clearer, but suffix rules are -retained for compatibility. - -* Menu: - -* Using Implicit:: How to use an existing implicit rule - to get the commands for updating a file. -* Catalogue of Rules:: A list of built-in implicit rules. -* Implicit Variables:: How to change what predefined rules do. -* Chained Rules:: How to use a chain of implicit rules. -* Pattern Rules:: How to define new implicit rules. -* Last Resort:: How to defining commands for rules - which cannot find any. -* Suffix Rules:: The old-fashioned style of implicit rule. -* Search Algorithm:: The precise algorithm for applying - implicit rules. - - -File: make.info, Node: Using Implicit, Next: Catalogue of Rules, Up: Implicit Rules - -Using Implicit Rules -==================== - - To allow `make' to find a customary method for updating a target -file, all you have to do is refrain from specifying commands yourself. -Either write a rule with no command lines, or don't write a rule at -all. Then `make' will figure out which implicit rule to use based on -which kind of source file exists or can be made. - - For example, suppose the makefile looks like this: - - foo : foo.o bar.o - cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS) - -Because you mention `foo.o' but do not give a rule for it, `make' will -automatically look for an implicit rule that tells how to update it. -This happens whether or not the file `foo.o' currently exists. - - If an implicit rule is found, it can supply both commands and one or -more dependencies (the source files). You would want to write a rule -for `foo.o' with no command lines if you need to specify additional -dependencies, such as header files, that the implicit rule cannot -supply. - - Each implicit rule has a target pattern and dependency patterns. -There may be many implicit rules with the same target pattern. For -example, numerous rules make `.o' files: one, from a `.c' file with the -C compiler; another, from a `.p' file with the Pascal compiler; and so -on. The rule that actually applies is the one whose dependencies exist -or can be made. So, if you have a file `foo.c', `make' will run the C -compiler; otherwise, if you have a file `foo.p', `make' will run the -Pascal compiler; and so on. - - Of course, when you write the makefile, you know which implicit rule -you want `make' to use, and you know it will choose that one because you -know which possible dependency files are supposed to exist. *Note -Catalogue of Implicit Rules: Catalogue of Rules, for a catalogue of all -the predefined implicit rules. - - Above, we said an implicit rule applies if the required dependencies -"exist or can be made". A file "can be made" if it is mentioned -explicitly in the makefile as a target or a dependency, or if an -implicit rule can be recursively found for how to make it. When an -implicit dependency is the result of another implicit rule, we say that -"chaining" is occurring. *Note Chains of Implicit Rules: Chained Rules. - - In general, `make' searches for an implicit rule for each target, and -for each double-colon rule, that has no commands. A file that is -mentioned only as a dependency is considered a target whose rule -specifies nothing, so implicit rule search happens for it. *Note -Implicit Rule Search Algorithm: Search Algorithm, for the details of -how the search is done. - - Note that explicit dependencies do not influence implicit rule -search. For example, consider this explicit rule: - - foo.o: foo.p - -The dependency on `foo.p' does not necessarily mean that `make' will -remake `foo.o' according to the implicit rule to make an object file, a -`.o' file, from a Pascal source file, a `.p' file. For example, if -`foo.c' also exists, the implicit rule to make an object file from a C -source file is used instead, because it appears before the Pascal rule -in the list of predefined implicit rules (*note Catalogue of Implicit -Rules: Catalogue of Rules.). - - If you do not want an implicit rule to be used for a target that has -no commands, you can give that target empty commands by writing a -semicolon (*note Defining Empty Commands: Empty Commands.). - - -File: make.info, Node: Catalogue of Rules, Next: Implicit Variables, Prev: Using Implicit, Up: Implicit Rules - -Catalogue of Implicit Rules -=========================== - - Here is a catalogue of predefined implicit rules which are always -available unless the makefile explicitly overrides or cancels them. -*Note Canceling Implicit Rules: Canceling Rules, for information on -canceling or overriding an implicit rule. The `-r' or -`--no-builtin-rules' option cancels all predefined rules. - - Not all of these rules will always be defined, even when the `-r' -option is not given. Many of the predefined implicit rules are -implemented in `make' as suffix rules, so which ones will be defined -depends on the "suffix list" (the list of dependencies of the special -target `.SUFFIXES'). The default suffix list is: `.out', `.a', `.ln', -`.o', `.c', `.cc', `.C', `.p', `.f', `.F', `.r', `.y', `.l', `.s', -`.S', `.mod', `.sym', `.def', `.h', `.info', `.dvi', `.tex', `.texinfo', -`.texi', `.txinfo', `.w', `.ch' `.web', `.sh', `.elc', `.el'. All of -the implicit rules described below whose dependencies have one of these -suffixes are actually suffix rules. If you modify the suffix list, the -only predefined suffix rules in effect will be those named by one or -two of the suffixes that are on the list you specify; rules whose -suffixes fail to be on the list are disabled. *Note Old-Fashioned -Suffix Rules: Suffix Rules, for full details on suffix rules. - -Compiling C programs - `N.o' is made automatically from `N.c' with a command of the form - `$(CC) -c $(CPPFLAGS) $(CFLAGS)'. - -Compiling C++ programs - `N.o' is made automatically from `N.cc' or `N.C' with a command of - the form `$(CXX) -c $(CPPFLAGS) $(CXXFLAGS)'. We encourage you to - use the suffix `.cc' for C++ source files instead of `.C'. - -Compiling Pascal programs - `N.o' is made automatically from `N.p' with the command `$(PC) -c - $(PFLAGS)'. - -Compiling Fortran and Ratfor programs - `N.o' is made automatically from `N.r', `N.F' or `N.f' by running - the Fortran compiler. The precise command used is as follows: - - `.f' - `$(FC) -c $(FFLAGS)'. - - `.F' - `$(FC) -c $(FFLAGS) $(CPPFLAGS)'. - - `.r' - `$(FC) -c $(FFLAGS) $(RFLAGS)'. - -Preprocessing Fortran and Ratfor programs - `N.f' is made automatically from `N.r' or `N.F'. This rule runs - just the preprocessor to convert a Ratfor or preprocessable - Fortran program into a strict Fortran program. The precise - command used is as follows: - - `.F' - `$(FC) -F $(CPPFLAGS) $(FFLAGS)'. - - `.r' - `$(FC) -F $(FFLAGS) $(RFLAGS)'. - -Compiling Modula-2 programs - `N.sym' is made from `N.def' with a command of the form `$(M2C) - $(M2FLAGS) $(DEFFLAGS)'. `N.o' is made from `N.mod'; the form is: - `$(M2C) $(M2FLAGS) $(MODFLAGS)'. - -Assembling and preprocessing assembler programs - `N.o' is made automatically from `N.s' by running the assembler, - `as'. The precise command is `$(AS) $(ASFLAGS)'. - - `N.s' is made automatically from `N.S' by running the C - preprocessor, `cpp'. The precise command is `$(CPP) $(CPPFLAGS)'. - -Linking a single object file - `N' is made automatically from `N.o' by running the linker - (usually called `ld') via the C compiler. The precise command - used is `$(CC) $(LDFLAGS) N.o $(LOADLIBES)'. - - This rule does the right thing for a simple program with only one - source file. It will also do the right thing if there are multiple - object files (presumably coming from various other source files), - one of which has a name matching that of the executable file. - Thus, - - x: y.o z.o - - when `x.c', `y.c' and `z.c' all exist will execute: - - cc -c x.c -o x.o - cc -c y.c -o y.o - cc -c z.c -o z.o - cc x.o y.o z.o -o x - rm -f x.o - rm -f y.o - rm -f z.o - - In more complicated cases, such as when there is no object file - whose name derives from the executable file name, you must write - an explicit command for linking. - - Each kind of file automatically made into `.o' object files will - be automatically linked by using the compiler (`$(CC)', `$(FC)' or - `$(PC)'; the C compiler `$(CC)' is used to assemble `.s' files) - without the `-c' option. This could be done by using the `.o' - object files as intermediates, but it is faster to do the - compiling and linking in one step, so that's how it's done. - -Yacc for C programs - `N.c' is made automatically from `N.y' by running Yacc with the - command `$(YACC) $(YFLAGS)'. - -Lex for C programs - `N.c' is made automatically from `N.l' by by running Lex. The - actual command is `$(LEX) $(LFLAGS)'. - -Lex for Ratfor programs - `N.r' is made automatically from `N.l' by by running Lex. The - actual command is `$(LEX) $(LFLAGS)'. - - The convention of using the same suffix `.l' for all Lex files - regardless of whether they produce C code or Ratfor code makes it - impossible for `make' to determine automatically which of the two - languages you are using in any particular case. If `make' is - called upon to remake an object file from a `.l' file, it must - guess which compiler to use. It will guess the C compiler, because - that is more common. If you are using Ratfor, make sure `make' - knows this by mentioning `N.r' in the makefile. Or, if you are - using Ratfor exclusively, with no C files, remove `.c' from the - list of implicit rule suffixes with: - - .SUFFIXES: - .SUFFIXES: .o .r .f .l ... - -Making Lint Libraries from C, Yacc, or Lex programs - `N.ln' is made from `N.c' by running `lint'. The precise command - is `$(LINT) $(LINTFLAGS) $(CPPFLAGS) -i'. The same command is - used on the C code produced from `N.y' or `N.l'. - -TeX and Web - `N.dvi' is made from `N.tex' with the command `$(TEX)'. `N.tex' - is made from `N.web' with `$(WEAVE)', or from `N.w' (and from - `N.ch' if it exists or can be made) with `$(CWEAVE)'. `N.p' is - made from `N.web' with `$(TANGLE)' and `N.c' is made from `N.w' - (and from `N.ch' if it exists or can be made) with `$(CTANGLE)'. - -Texinfo and Info - `N.dvi' is made from `N.texinfo', `N.texi', or `N.txinfo', with - the command `$(TEXI2DVI) $(TEXI2DVI_FLAGS)'. `N.info' is made from - `N.texinfo', `N.texi', or `N.txinfo', with the command - `$(MAKEINFO) $(MAKEINFO_FLAGS)'. - -RCS - Any file `N' is extracted if necessary from an RCS file named - either `N,v' or `RCS/N,v'. The precise command used is - `$(CO) $(COFLAGS)'. `N' will not be extracted from RCS if it - already exists, even if the RCS file is newer. The rules for RCS - are terminal (*note Match-Anything Pattern Rules: Match-Anything - Rules.), so RCS files cannot be generated from another source; - they must actually exist. - -SCCS - Any file `N' is extracted if necessary from an SCCS file named - either `s.N' or `SCCS/s.N'. The precise command used is - `$(GET) $(GFLAGS)'. The rules for SCCS are terminal (*note - Match-Anything Pattern Rules: Match-Anything Rules.), so SCCS - files cannot be generated from another source; they must actually - exist. - - For the benefit of SCCS, a file `N' is copied from `N.sh' and made - executable (by everyone). This is for shell scripts that are - checked into SCCS. Since RCS preserves the execution permission - of a file, you do not need to use this feature with RCS. - - We recommend that you avoid using of SCCS. RCS is widely held to - be superior, and is also free. By choosing free software in place - of comparable (or inferior) proprietary software, you support the - free software movement. - - Usually, you want to change only the variables listed in the table -above, which are documented in the following section. - - However, the commands in built-in implicit rules actually use -variables such as `COMPILE.c', `LINK.p', and `PREPROCESS.S', whose -values contain the commands listed above. - - `make' follows the convention that the rule to compile a `.X' source -file uses the variable `COMPILE.X'. Similarly, the rule to produce an -executable from a `.X' file uses `LINK.X'; and the rule to preprocess a -`.X' file uses `PREPROCESS.X'. - - Every rule that produces an object file uses the variable -`OUTPUT_OPTION'. `make' defines this variable either to contain `-o -$@', or to be empty, depending on a compile-time option. You need the -`-o' option to ensure that the output goes into the right file when the -source file is in a different directory, as when using `VPATH' (*note -Directory Search::.). However, compilers on some systems do not accept -a `-o' switch for object files. If you use such a system, and use -`VPATH', some compilations will put their output in the wrong place. A -possible workaround for this problem is to give `OUTPUT_OPTION' the -value `; mv $*.o $@'. - - -File: make.info, Node: Implicit Variables, Next: Chained Rules, Prev: Catalogue of Rules, Up: Implicit Rules - -Variables Used by Implicit Rules -================================ - - The commands in built-in implicit rules make liberal use of certain -predefined variables. You can alter these variables in the makefile, -with arguments to `make', or in the environment to alter how the -implicit rules work without redefining the rules themselves. - - For example, the command used to compile a C source file actually -says `$(CC) -c $(CFLAGS) $(CPPFLAGS)'. The default values of the -variables used are `cc' and nothing, resulting in the command `cc -c'. -By redefining `CC' to `ncc', you could cause `ncc' to be used for all C -compilations performed by the implicit rule. By redefining `CFLAGS' to -be `-g', you could pass the `-g' option to each compilation. *All* -implicit rules that do C compilation use `$(CC)' to get the program -name for the compiler and *all* include `$(CFLAGS)' among the arguments -given to the compiler. - - The variables used in implicit rules fall into two classes: those -that are names of programs (like `CC') and those that contain arguments -for the programs (like `CFLAGS'). (The "name of a program" may also -contain some command arguments, but it must start with an actual -executable program name.) If a variable value contains more than one -argument, separate them with spaces. - - Here is a table of variables used as names of programs in built-in -rules: - -`AR' - Archive-maintaining program; default `ar'. - -`AS' - Program for doing assembly; default `as'. - -`CC' - Program for compiling C programs; default `cc'. - -`CXX' - Program for compiling C++ programs; default `g++'. - -`CO' - Program for extracting a file from RCS; default `co'. - -`CPP' - Program for running the C preprocessor, with results to standard - output; default `$(CC) -E'. - -`FC' - Program for compiling or preprocessing Fortran and Ratfor programs; - default `f77'. - -`GET' - Program for extracting a file from SCCS; default `get'. - -`LEX' - Program to use to turn Lex grammars into C programs or Ratfor - programs; default `lex'. - -`PC' - Program for compiling Pascal programs; default `pc'. - -`YACC' - Program to use to turn Yacc grammars into C programs; default - `yacc'. - -`YACCR' - Program to use to turn Yacc grammars into Ratfor programs; default - `yacc -r'. - -`MAKEINFO' - Program to convert a Texinfo source file into an Info file; default - `makeinfo'. - -`TEX' - Program to make TeX DVI files from TeX source; default `tex'. - -`TEXI2DVI' - Program to make TeX DVI files from Texinfo source; default - `texi2dvi'. - -`WEAVE' - Program to translate Web into TeX; default `weave'. - -`CWEAVE' - Program to translate C Web into TeX; default `cweave'. - -`TANGLE' - Program to translate Web into Pascal; default `tangle'. - -`CTANGLE' - Program to translate C Web into C; default `ctangle'. - -`RM' - Command to remove a file; default `rm -f'. - - Here is a table of variables whose values are additional arguments -for the programs above. The default values for all of these is the -empty string, unless otherwise noted. - -`ARFLAGS' - Flags to give the archive-maintaining program; default `rv'. - -`ASFLAGS' - Extra flags to give to the assembler (when explicitly invoked on a - `.s' or `.S' file). - -`CFLAGS' - Extra flags to give to the C compiler. - -`CXXFLAGS' - Extra flags to give to the C++ compiler. - -`COFLAGS' - Extra flags to give to the RCS `co' program. - -`CPPFLAGS' - Extra flags to give to the C preprocessor and programs that use it - (the C and Fortran compilers). - -`FFLAGS' - Extra flags to give to the Fortran compiler. - -`GFLAGS' - Extra flags to give to the SCCS `get' program. - -`LDFLAGS' - Extra flags to give to compilers when they are supposed to invoke - the linker, `ld'. - -`LFLAGS' - Extra flags to give to Lex. - -`PFLAGS' - Extra flags to give to the Pascal compiler. - -`RFLAGS' - Extra flags to give to the Fortran compiler for Ratfor programs. - -`YFLAGS' - Extra flags to give to Yacc. - - -File: make.info, Node: Chained Rules, Next: Pattern Rules, Prev: Implicit Variables, Up: Implicit Rules - -Chains of Implicit Rules -======================== - - Sometimes a file can be made by a sequence of implicit rules. For -example, a file `N.o' could be made from `N.y' by running first Yacc -and then `cc'. Such a sequence is called a "chain". - - If the file `N.c' exists, or is mentioned in the makefile, no -special searching is required: `make' finds that the object file can be -made by C compilation from `N.c'; later on, when considering how to -make `N.c', the rule for running Yacc is used. Ultimately both `N.c' -and `N.o' are updated. - - However, even if `N.c' does not exist and is not mentioned, `make' -knows how to envision it as the missing link between `N.o' and `N.y'! -In this case, `N.c' is called an "intermediate file". Once `make' has -decided to use the intermediate file, it is entered in the data base as -if it had been mentioned in the makefile, along with the implicit rule -that says how to create it. - - Intermediate files are remade using their rules just like all other -files. The difference is that the intermediate file is deleted when -`make' is finished. Therefore, the intermediate file which did not -exist before `make' also does not exist after `make'. The deletion is -reported to you by printing a `rm -f' command that shows what `make' is -doing. (You can list the target pattern of an implicit rule (such as -`%.o') as a dependency of the special target `.PRECIOUS' to preserve -intermediate files made by implicit rules whose target patterns match -that file's name; see *Note Interrupts::.) - - A chain can involve more than two implicit rules. For example, it is -possible to make a file `foo' from `RCS/foo.y,v' by running RCS, Yacc -and `cc'. Then both `foo.y' and `foo.c' are intermediate files that -are deleted at the end. - - No single implicit rule can appear more than once in a chain. This -means that `make' will not even consider such a ridiculous thing as -making `foo' from `foo.o.o' by running the linker twice. This -constraint has the added benefit of preventing any infinite loop in the -search for an implicit rule chain. - - There are some special implicit rules to optimize certain cases that -would otherwise be handled by rule chains. For example, making `foo' -from `foo.c' could be handled by compiling and linking with separate -chained rules, using `foo.o' as an intermediate file. But what -actually happens is that a special rule for this case does the -compilation and linking with a single `cc' command. The optimized rule -is used in preference to the step-by-step chain because it comes -earlier in the ordering of rules. - - -File: make.info, Node: Pattern Rules, Next: Last Resort, Prev: Chained Rules, Up: Implicit Rules - -Defining and Redefining Pattern Rules -===================================== - - You define an implicit rule by writing a "pattern rule". A pattern -rule looks like an ordinary rule, except that its target contains the -character `%' (exactly one of them). The target is considered a -pattern for matching file names; the `%' can match any nonempty -substring, while other characters match only themselves. The -dependencies likewise use `%' to show how their names relate to the -target name. - - Thus, a pattern rule `%.o : %.c' says how to make any file `STEM.o' -from another file `STEM.c'. - - Note that expansion using `%' in pattern rules occurs *after* any -variable or function expansions, which take place when the makefile is -read. *Note How to Use Variables: Using Variables, and *Note Functions -for Transforming Text: Functions. - -* Menu: - -* Pattern Intro:: An introduction to pattern rules. -* Pattern Examples:: Examples of pattern rules. -* Automatic:: How to use automatic variables in the - commands of implicit rules. -* Pattern Match:: How patterns match. -* Match-Anything Rules:: Precautions you should take prior to - defining rules that can match any - target file whatever. -* Canceling Rules:: How to override or cancel built-in rules. - - -File: make.info, Node: Pattern Intro, Next: Pattern Examples, Up: Pattern Rules - -Introduction to Pattern Rules ------------------------------ - - A pattern rule contains the character `%' (exactly one of them) in -the target; otherwise, it looks exactly like an ordinary rule. The -target is a pattern for matching file names; the `%' matches any -nonempty substring, while other characters match only themselves. - - For example, `%.c' as a pattern matches any file name that ends in -`.c'. `s.%.c' as a pattern matches any file name that starts with -`s.', ends in `.c' and is at least five characters long. (There must -be at least one character to match the `%'.) The substring that the -`%' matches is called the "stem". - - `%' in a dependency of a pattern rule stands for the same stem that -was matched by the `%' in the target. In order for the pattern rule to -apply, its target pattern must match the file name under consideration, -and its dependency patterns must name files that exist or can be made. -These files become dependencies of the target. - - Thus, a rule of the form - - %.o : %.c ; COMMAND... - -specifies how to make a file `N.o', with another file `N.c' as its -dependency, provided that `N.c' exists or can be made. - - There may also be dependencies that do not use `%'; such a dependency -attaches to every file made by this pattern rule. These unvarying -dependencies are useful occasionally. - - A pattern rule need not have any dependencies that contain `%', or -in fact any dependencies at all. Such a rule is effectively a general -wildcard. It provides a way to make any file that matches the target -pattern. *Note Last Resort::. - - Pattern rules may have more than one target. Unlike normal rules, -this does not act as many different rules with the same dependencies and -commands. If a pattern rule has multiple targets, `make' knows that -the rule's commands are responsible for making all of the targets. The -commands are executed only once to make all the targets. When searching -for a pattern rule to match a target, the target patterns of a rule -other than the one that matches the target in need of a rule are -incidental: `make' worries only about giving commands and dependencies -to the file presently in question. However, when this file's commands -are run, the other targets are marked as having been updated themselves. - - The order in which pattern rules appear in the makefile is important -since this is the order in which they are considered. Of equally -applicable rules, only the first one found is used. The rules you -write take precedence over those that are built in. Note however, that -a rule whose dependencies actually exist or are mentioned always takes -priority over a rule with dependencies that must be made by chaining -other implicit rules. - - -File: make.info, Node: Pattern Examples, Next: Automatic, Prev: Pattern Intro, Up: Pattern Rules - -Pattern Rule Examples ---------------------- - - Here are some examples of pattern rules actually predefined in -`make'. First, the rule that compiles `.c' files into `.o' files: - - %.o : %.c - $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ - -defines a rule that can make any file `X.o' from `X.c'. The command -uses the automatic variables `$@' and `$<' to substitute the names of -the target file and the source file in each case where the rule applies -(*note Automatic Variables: Automatic.). - - Here is a second built-in rule: - - % :: RCS/%,v - $(CO) $(COFLAGS) $< - -defines a rule that can make any file `X' whatsoever from a -corresponding file `X,v' in the subdirectory `RCS'. Since the target -is `%', this rule will apply to any file whatever, provided the -appropriate dependency file exists. The double colon makes the rule -"terminal", which means that its dependency may not be an intermediate -file (*note Match-Anything Pattern Rules: Match-Anything Rules.). - - This pattern rule has two targets: - - %.tab.c %.tab.h: %.y - bison -d $< - -This tells `make' that the command `bison -d X.y' will make both -`X.tab.c' and `X.tab.h'. If the file `foo' depends on the files -`parse.tab.o' and `scan.o' and the file `scan.o' depends on the file -`parse.tab.h', when `parse.y' is changed, the command `bison -d parse.y' -will be executed only once, and the dependencies of both `parse.tab.o' -and `scan.o' will be satisfied. (Presumably the file `parse.tab.o' -will be recompiled from `parse.tab.c' and the file `scan.o' from -`scan.c', while `foo' is linked from `parse.tab.o', `scan.o', and its -other dependencies, and it will execute happily ever after.) - - -File: make.info, Node: Automatic, Next: Pattern Match, Prev: Pattern Examples, Up: Pattern Rules - -Automatic Variables -------------------- - - Suppose you are writing a pattern rule to compile a `.c' file into a -`.o' file: how do you write the `cc' command so that it operates on the -right source file name? You cannot write the name in the command, -because the name is different each time the implicit rule is applied. - - What you do is use a special feature of `make', the "automatic -variables". These variables have values computed afresh for each rule -that is executed, based on the target and dependencies of the rule. In -this example, you would use `$@' for the object file name and `$<' for -the source file name. - - Here is a table of automatic variables: - -`$@' - The file name of the target of the rule. If the target is an - archive member, then `$@' is the name of the archive file. In a - pattern rule that has multiple targets (*note Introduction to - Pattern Rules: Pattern Intro.), `$@' is the name of whichever - target caused the rule's commands to be run. - -`$%' - The target member name, when the target is an archive member. - *Note Archives::. For example, if the target is `foo.a(bar.o)' - then `$%' is `bar.o' and `$@' is `foo.a'. `$%' is empty when the - target is not an archive member. - -`$<' - The name of the first dependency. If the target got its commands - from an implicit rule, this will be the first dependency added by - the implicit rule (*note Implicit Rules::.). - -`$?' - The names of all the dependencies that are newer than the target, - with spaces between them. For dependencies which are archive - members, only the member named is used (*note Archives::.). - -`$^' - The names of all the dependencies, with spaces between them. For - dependencies which are archive members, only the member named is - used (*note Archives::.). A target has only one dependency on - each other file it depends on, no matter how many times each file - is listed as a dependency. So if you list a dependency more than - once for a target, the value of `$^' contains just one copy of the - name. - -`$+' - This is like `$^', but dependencies listed more than once are - duplicated in the order they were listed in the makefile. This is - primarily useful for use in linking commands where it is - meaningful to repeat library file names in a particular order. - -`$*' - The stem with which an implicit rule matches (*note How Patterns - Match: Pattern Match.). If the target is `dir/a.foo.b' and the - target pattern is `a.%.b' then the stem is `dir/foo'. The stem is - useful for constructing names of related files. - - In a static pattern rule, the stem is part of the file name that - matched the `%' in the target pattern. - - In an explicit rule, there is no stem; so `$*' cannot be determined - in that way. Instead, if the target name ends with a recognized - suffix (*note Old-Fashioned Suffix Rules: Suffix Rules.), `$*' is - set to the target name minus the suffix. For example, if the - target name is `foo.c', then `$*' is set to `foo', since `.c' is a - suffix. GNU `make' does this bizarre thing only for compatibility - with other implementations of `make'. You should generally avoid - using `$*' except in implicit rules or static pattern rules. - - If the target name in an explicit rule does not end with a - recognized suffix, `$*' is set to the empty string for that rule. - - `$?' is useful even in explicit rules when you wish to operate on -only the dependencies that have changed. For example, suppose that an -archive named `lib' is supposed to contain copies of several object -files. This rule copies just the changed object files into the archive: - - lib: foo.o bar.o lose.o win.o - ar r lib $? - - Of the variables listed above, four have values that are single file -names, and two have values that are lists of file names. These six have -variants that get just the file's directory name or just the file name -within the directory. The variant variables' names are formed by -appending `D' or `F', respectively. These variants are semi-obsolete -in GNU `make' since the functions `dir' and `notdir' can be used to get -a similar effect (*note Functions for File Names: Filename Functions.). -Note, however, that the `F' variants all omit the trailing slash which -always appears in the output of the `dir' function. Here is a table of -the variants: - -`$(@D)' - The directory part of the file name of the target, with the - trailing slash removed. If the value of `$@' is `dir/foo.o' then - `$(@D)' is `dir'. This value is `.' if `$@' does not contain a - slash. - -`$(@F)' - The file-within-directory part of the file name of the target. If - the value of `$@' is `dir/foo.o' then `$(@F)' is `foo.o'. `$(@F)' - is equivalent to `$(notdir $@)'. - -`$(*D)' -`$(*F)' - The directory part and the file-within-directory part of the stem; - `dir' and `foo' in this example. - -`$(%D)' -`$(%F)' - The directory part and the file-within-directory part of the target - archive member name. This makes sense only for archive member - targets of the form `ARCHIVE(MEMBER)' and is useful only when - MEMBER may contain a directory name. (*Note Archive Members as - Targets: Archive Members.) - -`$( foo.1 - -will fail when the current directory is not the source directory, -because `foo.man' and `sedscript' are not in the current directory. - - When using GNU `make', relying on `VPATH' to find the source file -will work in the case where there is a single dependency file, since -the `make' automatic variable `$<' will represent the source file -wherever it is. (Many versions of `make' set `$<' only in implicit -rules.) A makefile target like - - foo.o : bar.c - $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o - -should instead be written as - - foo.o : bar.c - $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@ - -in order to allow `VPATH' to work correctly. When the target has -multiple dependencies, using an explicit `$(srcdir)' is the easiest way -to make the rule work well. For example, the target above for `foo.1' -is best written as: - - foo.1 : foo.man sedscript - sed -e $(srcdir)/sedscript $(srcdir)/foo.man > $@ - - -File: make.info, Node: Utilities in Makefiles, Next: Standard Targets, Prev: Makefile Basics, Up: Makefile Conventions - -Utilities in Makefiles -====================== - - Write the Makefile commands (and any shell scripts, such as -`configure') to run in `sh', not in `csh'. Don't use any special -features of `ksh' or `bash'. - - The `configure' script and the Makefile rules for building and -installation should not use any utilities directly except these: - - cat cmp cp echo egrep expr grep - ln mkdir mv pwd rm rmdir sed test touch - - Stick to the generally supported options for these programs. For -example, don't use `mkdir -p', convenient as it may be, because most -systems don't support it. - - The Makefile rules for building and installation can also use -compilers and related programs, but should do so via `make' variables -so that the user can substitute alternatives. Here are some of the -programs we mean: - - ar bison cc flex install ld lex - make makeinfo ranlib texi2dvi yacc - - Use the following `make' variables: - - $(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LEX) - $(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC) - - When you use `ranlib', you should make sure nothing bad happens if -the system does not have `ranlib'. Arrange to ignore an error from -that command, and print a message before the command to tell the user -that failure of the `ranlib' command does not mean a problem. - - If you use symbolic links, you should implement a fallback for -systems that don't have symbolic links. - - It is ok to use other utilities in Makefile portions (or scripts) -intended only for particular systems where you know those utilities to -exist. - - -File: make.info, Node: Standard Targets, Next: Command Variables, Prev: Utilities in Makefiles, Up: Makefile Conventions - -Standard Targets for Users -========================== - - All GNU programs should have the following targets in their -Makefiles: - -`all' - Compile the entire program. This should be the default target. - This target need not rebuild any documentation files; Info files - should normally be included in the distribution, and DVI files - should be made only when explicitly asked for. - -`install' - Compile the program and copy the executables, libraries, and so on - to the file names where they should reside for actual use. If - there is a simple test to verify that a program is properly - installed, this target should run that test. - - If possible, write the `install' target rule so that it does not - modify anything in the directory where the program was built, - provided `make all' has just been done. This is convenient for - building the program under one user name and installing it under - another. - - The commands should create all the directories in which files are - to be installed, if they don't already exist. This includes the - directories specified as the values of the variables `prefix' and - `exec_prefix', as well as all subdirectories that are needed. One - way to do this is by means of an `installdirs' target as described - below. - - Use `-' before any command for installing a man page, so that - `make' will ignore any errors. This is in case there are systems - that don't have the Unix man page documentation system installed. - - The way to install Info files is to copy them into `$(infodir)' - with `$(INSTALL_DATA)' (*note Command Variables::.), and then run - the `install-info' program if it is present. `install-info' is a - script that edits the Info `dir' file to add or update the menu - entry for the given Info file; it will be part of the Texinfo - package. Here is a sample rule to install an Info file: - - $(infodir)/foo.info: foo.info - # There may be a newer info file in . than in srcdir. - -if test -f foo.info; then d=.; \ - else d=$(srcdir); fi; \ - $(INSTALL_DATA) $$d/foo.info $@; \ - # Run install-info only if it exists. - # Use `if' instead of just prepending `-' to the - # line so we notice real errors from install-info. - # We use `$(SHELL) -c' because some shells do not - # fail gracefully when there is an unknown command. - if $(SHELL) -c 'install-info --version' \ - >/dev/null 2>&1; then \ - install-info --infodir=$(infodir) $$d/foo.info; \ - else true; fi - -`uninstall' - Delete all the installed files that the `install' target would - create (but not the noninstalled files such as `make all' would - create). - - This rule should not modify the directories where compilation is - done, only the directories where files are installed. - -`clean' - Delete all files from the current directory that are normally - created by building the program. Don't delete the files that - record the configuration. Also preserve files that could be made - by building, but normally aren't because the distribution comes - with them. - - Delete `.dvi' files here if they are not part of the distribution. - -`distclean' - Delete all files from the current directory that are created by - configuring or building the program. If you have unpacked the - source and built the program without creating any other files, - `make distclean' should leave only the files that were in the - distribution. - -`mostlyclean' - Like `clean', but may refrain from deleting a few files that people - normally don't want to recompile. For example, the `mostlyclean' - target for GCC does not delete `libgcc.a', because recompiling it - is rarely necessary and takes a lot of time. - -`maintainer-clean' - Delete almost everything from the current directory that can be - reconstructed with this Makefile. This typically includes - everything deleted by `distclean', plus more: C source files - produced by Bison, tags tables, Info files, and so on. - - The reason we say "almost everything" is that `make - maintainer-clean' should not delete `configure' even if - `configure' can be remade using a rule in the Makefile. More - generally, `make maintainer-clean' should not delete anything that - needs to exist in order to run `configure' and then begin to build - the program. This is the only exception; `maintainer-clean' should - delete everything else that can be rebuilt. - - The `maintainer-clean' is intended to be used by a maintainer of - the package, not by ordinary users. You may need special tools to - reconstruct some of the files that `make maintainer-clean' deletes. - Since these files are normally included in the distribution, we - don't take care to make them easy to reconstruct. If you find you - need to unpack the full distribution again, don't blame us. - - To help make users aware of this, the commands for - `maintainer-clean' should start with these two: - - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -`TAGS' - Update a tags table for this program. - -`info' - Generate any Info files needed. The best way to write the rules - is as follows: - - info: foo.info - - foo.info: foo.texi chap1.texi chap2.texi - $(MAKEINFO) $(srcdir)/foo.texi - - You must define the variable `MAKEINFO' in the Makefile. It should - run the `makeinfo' program, which is part of the Texinfo - distribution. - -`dvi' - Generate DVI files for all TeXinfo documentation. For example: - - dvi: foo.dvi - - foo.dvi: foo.texi chap1.texi chap2.texi - $(TEXI2DVI) $(srcdir)/foo.texi - - You must define the variable `TEXI2DVI' in the Makefile. It should - run the program `texi2dvi', which is part of the Texinfo - distribution. Alternatively, write just the dependencies, and - allow GNU Make to provide the command. - -`dist' - Create a distribution tar file for this program. The tar file - should be set up so that the file names in the tar file start with - a subdirectory name which is the name of the package it is a - distribution for. This name can include the version number. - - For example, the distribution tar file of GCC version 1.40 unpacks - into a subdirectory named `gcc-1.40'. - - The easiest way to do this is to create a subdirectory - appropriately named, use `ln' or `cp' to install the proper files - in it, and then `tar' that subdirectory. - - The `dist' target should explicitly depend on all non-source files - that are in the distribution, to make sure they are up to date in - the distribution. *Note Making Releases: (standards)Releases. - -`check' - Perform self-tests (if any). The user must build the program - before running the tests, but need not install the program; you - should write the self-tests so that they work when the program is - built but not installed. - - The following targets are suggested as conventional names, for -programs in which they are useful. - -`installcheck' - Perform installation tests (if any). The user must build and - install the program before running the tests. You should not - assume that `$(bindir)' is in the search path. - -`installdirs' - It's useful to add a target named `installdirs' to create the - directories where files are installed, and their parent - directories. There is a script called `mkinstalldirs' which is - convenient for this; find it in the Texinfo package.You can use a - rule like this: - - # Make sure all installation directories (e.g. $(bindir)) - # actually exist by making them if necessary. - installdirs: mkinstalldirs - $(srcdir)/mkinstalldirs $(bindir) $(datadir) \ - $(libdir) $(infodir) \ - $(mandir) - - This rule should not modify the directories where compilation is - done. It should do nothing but create installation directories. - - -File: make.info, Node: Command Variables, Next: Directory Variables, Prev: Standard Targets, Up: Makefile Conventions - -Variables for Specifying Commands -================================= - - Makefiles should provide variables for overriding certain commands, -options, and so on. - - In particular, you should run most utility programs via variables. -Thus, if you use Bison, have a variable named `BISON' whose default -value is set with `BISON = bison', and refer to it with `$(BISON)' -whenever you need to use Bison. - - File management utilities such as `ln', `rm', `mv', and so on, need -not be referred to through variables in this way, since users don't -need to replace them with other programs. - - Each program-name variable should come with an options variable that -is used to supply options to the program. Append `FLAGS' to the -program-name variable name to get the options variable name--for -example, `BISONFLAGS'. (The name `CFLAGS' is an exception to this -rule, but we keep it because it is standard.) Use `CPPFLAGS' in any -compilation command that runs the preprocessor, and use `LDFLAGS' in -any compilation command that does linking as well as in any direct use -of `ld'. - - If there are C compiler options that *must* be used for proper -compilation of certain files, do not include them in `CFLAGS'. Users -expect to be able to specify `CFLAGS' freely themselves. Instead, -arrange to pass the necessary options to the C compiler independently -of `CFLAGS', by writing them explicitly in the compilation commands or -by defining an implicit rule, like this: - - CFLAGS = -g - ALL_CFLAGS = -I. $(CFLAGS) - .c.o: - $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< - - Do include the `-g' option in `CFLAGS', because that is not -*required* for proper compilation. You can consider it a default that -is only recommended. If the package is set up so that it is compiled -with GCC by default, then you might as well include `-O' in the default -value of `CFLAGS' as well. - - Put `CFLAGS' last in the compilation command, after other variables -containing compiler options, so the user can use `CFLAGS' to override -the others. - - Every Makefile should define the variable `INSTALL', which is the -basic command for installing a file into the system. - - Every Makefile should also define the variables `INSTALL_PROGRAM' -and `INSTALL_DATA'. (The default for each of these should be -`$(INSTALL)'.) Then it should use those variables as the commands for -actual installation, for executables and nonexecutables respectively. -Use these variables as follows: - - $(INSTALL_PROGRAM) foo $(bindir)/foo - $(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a - -Always use a file name, not a directory name, as the second argument of -the installation commands. Use a separate command for each file to be -installed. - diff --git a/buildtools/windows/source/make/make.info-7 b/buildtools/windows/source/make/make.info-7 deleted file mode 100644 index 843095c0a9b..00000000000 --- a/buildtools/windows/source/make/make.info-7 +++ /dev/null @@ -1,727 +0,0 @@ -This is Info file make.info, produced by Makeinfo-1.55 from the input -file ./make.texinfo. - - This file documents the GNU Make utility, which determines -automatically which pieces of a large program need to be recompiled, -and issues the commands to recompile them. - - This is Edition 0.48, last updated 4 April 1995, of `The GNU Make -Manual', for `make', Version 3.73 Beta. - - Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95 Free -Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: make.info, Node: Directory Variables, Prev: Command Variables, Up: Makefile Conventions - -Variables for Installation Directories -====================================== - - Installation directories should always be named by variables, so it -is easy to install in a nonstandard place. The standard names for these -variables are described below. They are based on a standard filesystem -layout; variants of it are used in SVR4, 4.4BSD, Linux, Ultrix v4, and -other modern operating systems. - - These two variables set the root for the installation. All the other -installation directories should be subdirectories of one of these two, -and nothing should be directly installed into these two directories. - -`prefix' - A prefix used in constructing the default values of the variables - listed below. The default value of `prefix' should be `/usr/local' - When building the complete GNU system, the prefix will be empty and - `/usr' will be a symbolic link to `/'. - -`exec_prefix' - A prefix used in constructing the default values of some of the - variables listed below. The default value of `exec_prefix' should - be `$(prefix)'. - - Generally, `$(exec_prefix)' is used for directories that contain - machine-specific files (such as executables and subroutine - libraries), while `$(prefix)' is used directly for other - directories. - - Executable programs are installed in one of the following -directories. - -`bindir' - The directory for installing executable programs that users can - run. This should normally be `/usr/local/bin', but write it as - `$(exec_prefix)/bin'. - -`sbindir' - The directory for installing executable programs that can be run - from the shell, but are only generally useful to system - administrators. This should normally be `/usr/local/sbin', but - write it as `$(exec_prefix)/sbin'. - -`libexecdir' - The directory for installing executable programs to be run by other - programs rather than by users. This directory should normally be - `/usr/local/libexec', but write it as `$(exec_prefix)/libexec'. - - Data files used by the program during its execution are divided into -categories in two ways. - - * Some files are normally modified by programs; others are never - normally modified (though users may edit some of these). - - * Some files are architecture-independent and can be shared by all - machines at a site; some are architecture-dependent and can be - shared only by machines of the same kind and operating system; - others may never be shared between two machines. - - This makes for six different possibilities. However, we want to -discourage the use of architecture-dependent files, aside from of object -files and libraries. It is much cleaner to make other data files -architecture-independent, and it is generally not hard. - - Therefore, here are the variables makefiles should use to specify -directories: - -`datadir' - The directory for installing read-only architecture independent - data files. This should normally be `/usr/local/share', but write - it as `$(prefix)/share'. As a special exception, see `$(infodir)' - and `$(includedir)' below. - -`sysconfdir' - The directory for installing read-only data files that pertain to a - single machine-that is to say, files for configuring a host. - Mailer and network configuration files, `/etc/passwd', and so - forth belong here. All the files in this directory should be - ordinary ASCII text files. This directory should normally be - `/usr/local/etc', but write it as `$(prefix)/etc'. - - Do not install executables in this directory (they probably belong - in `$(libexecdir)' or `$(sbindir))'. Also do not install files - that are modified in the normal course of their use (programs - whose purpose is to change the configuration of the system - excluded). Those probably belong in `$(localstatedir)'. - -`sharedstatedir' - The directory for installing architecture-independent data files - which the programs modify while they run. This should normally be - `/usr/local/com', but write it as `$(prefix)/com'. - -`localstatedir' - The directory for installing data files which the programs modify - while they run, and that pertain to one specific machine. Users - should never need to modify files in this directory to configure - the package's operation; put such configuration information in - separate files that go in `datadir' or `$(sysconfdir)'. - `$(localstatedir)' should normally be `/usr/local/var', but write - it as `$(prefix)/var'. - -`libdir' - The directory for object files and libraries of object code. Do - not install executables here, they probably belong in - `$(libexecdir)' instead. The value of `libdir' should normally be - `/usr/local/lib', but write it as `$(exec_prefix)/lib'. - -`infodir' - The directory for installing the Info files for this package. By - default, it should be `/usr/local/info', but it should be written - as `$(prefix)/info'. - -`includedir' - The directory for installing header files to be included by user - programs with the C `#include' preprocessor directive. This - should normally be `/usr/local/include', but write it as - `$(prefix)/include'. - - Most compilers other than GCC do not look for header files in - `/usr/local/include'. So installing the header files this way is - only useful with GCC. Sometimes this is not a problem because some - libraries are only really intended to work with GCC. But some - libraries are intended to work with other compilers. They should - install their header files in two places, one specified by - `includedir' and one specified by `oldincludedir'. - -`oldincludedir' - The directory for installing `#include' header files for use with - compilers other than GCC. This should normally be `/usr/include'. - - The Makefile commands should check whether the value of - `oldincludedir' is empty. If it is, they should not try to use - it; they should cancel the second installation of the header files. - - A package should not replace an existing header in this directory - unless the header came from the same package. Thus, if your Foo - package provides a header file `foo.h', then it should install the - header file in the `oldincludedir' directory if either (1) there - is no `foo.h' there or (2) the `foo.h' that exists came from the - Foo package. - - To tell whether `foo.h' came from the Foo package, put a magic - string in the file--part of a comment--and grep for that string. - - Unix-style man pages are installed in one of the following: - -`mandir' - The directory for installing the man pages (if any) for this - package. It should include the suffix for the proper section of - the manual--usually `1' for a utility. It will normally be - `/usr/local/man/man1', but you should write it as - `$(prefix)/man/man1'. - -`man1dir' - The directory for installing section 1 man pages. - -`man2dir' - The directory for installing section 2 man pages. - -`...' - Use these names instead of `mandir' if the package needs to - install man pages in more than one section of the manual. - - *Don't make the primary documentation for any GNU software be a - man page. Write a manual in Texinfo instead. Man pages are just - for the sake of people running GNU software on Unix, which is a - secondary application only.* - -`manext' - The file name extension for the installed man page. This should - contain a period followed by the appropriate digit; it should - normally be `.1'. - -`man1ext' - The file name extension for installed section 1 man pages. - -`man2ext' - The file name extension for installed section 2 man pages. - -`...' - Use these names instead of `manext' if the package needs to - install man pages in more than one section of the manual. - - And finally, you should set the following variable: - -`srcdir' - The directory for the sources being compiled. The value of this - variable is normally inserted by the `configure' shell script. - - For example: - - # Common prefix for installation directories. - # NOTE: This directory must exist when you start the install. - prefix = /usr/local - exec_prefix = $(prefix) - # Where to put the executable for the command `gcc'. - bindir = $(exec_prefix)/bin - # Where to put the directories used by the compiler. - libexecdir = $(exec_prefix)/libexec - # Where to put the Info files. - infodir = $(prefix)/info - - If your program installs a large number of files into one of the -standard user-specified directories, it might be useful to group them -into a subdirectory particular to that program. If you do this, you -should write the `install' rule to create these subdirectories. - - Do not expect the user to include the subdirectory name in the value -of any of the variables listed above. The idea of having a uniform set -of variable names for installation directories is to enable the user to -specify the exact same values for several different GNU packages. In -order for this to be useful, all the packages must be designed so that -they will work sensibly when the user does so. - - -File: make.info, Node: Quick Reference, Next: Complex Makefile, Prev: Makefile Conventions, Up: Top - -Quick Reference -*************** - - This appendix summarizes the directives, text manipulation functions, -and special variables which GNU `make' understands. *Note Special -Targets::, *Note Catalogue of Implicit Rules: Catalogue of Rules, and -*Note Summary of Options: Options Summary, for other summaries. - - Here is a summary of the directives GNU `make' recognizes: - -`define VARIABLE' -`endef' - Define a multi-line, recursively-expanded variable. - *Note Sequences::. - -`ifdef VARIABLE' -`ifndef VARIABLE' -`ifeq (A,B)' -`ifeq "A" "B"' -`ifeq 'A' 'B'' -`ifneq (A,B)' -`ifneq "A" "B"' -`ifneq 'A' 'B'' -`else' -`endif' - Conditionally evaluate part of the makefile. - *Note Conditionals::. - -`include FILE' - Include another makefile. - *Note Including Other Makefiles: Include. - -`override VARIABLE = VALUE' -`override VARIABLE := VALUE' -`override VARIABLE += VALUE' -`override define VARIABLE' -`endef' - Define a variable, overriding any previous definition, even one - from the command line. - *Note The `override' Directive: Override Directive. - -`export' - Tell `make' to export all variables to child processes by default. - *Note Communicating Variables to a Sub-`make': Variables/Recursion. - -`export VARIABLE' -`export VARIABLE = VALUE' -`export VARIABLE := VALUE' -`export VARIABLE += VALUE' -`unexport VARIABLE' - Tell `make' whether or not to export a particular variable to child - processes. - *Note Communicating Variables to a Sub-`make': Variables/Recursion. - -`vpath PATTERN PATH' - Specify a search path for files matching a `%' pattern. - *Note The `vpath' Directive: Selective Search. - -`vpath PATTERN' - Remove all search paths previously specified for PATTERN. - -`vpath' - Remove all search paths previously specified in any `vpath' - directive. - - Here is a summary of the text manipulation functions (*note -Functions::.): - -`$(subst FROM,TO,TEXT)' - Replace FROM with TO in TEXT. - *Note Functions for String Substitution and Analysis: Text - Functions. - -`$(patsubst PATTERN,REPLACEMENT,TEXT)' - Replace words matching PATTERN with REPLACEMENT in TEXT. - *Note Functions for String Substitution and Analysis: Text - Functions. - -`$(strip STRING)' - Remove excess whitespace characters from STRING. - *Note Functions for String Substitution and Analysis: Text - Functions. - -`$(findstring FIND,TEXT)' - Locate FIND in TEXT. - *Note Functions for String Substitution and Analysis: Text - Functions. - -`$(filter PATTERN...,TEXT)' - Select words in TEXT that match one of the PATTERN words. - *Note Functions for String Substitution and Analysis: Text - Functions. - -`$(filter-out PATTERN...,TEXT)' - Select words in TEXT that *do not* match any of the PATTERN words. - *Note Functions for String Substitution and Analysis: Text - Functions. - -`$(sort LIST)' - Sort the words in LIST lexicographically, removing duplicates. - *Note Functions for String Substitution and Analysis: Text - Functions. - -`$(dir NAMES...)' - Extract the directory part of each file name. - *Note Functions for File Names: Filename Functions. - -`$(notdir NAMES...)' - Extract the non-directory part of each file name. - *Note Functions for File Names: Filename Functions. - -`$(suffix NAMES...)' - Extract the suffix (the last `.' and following characters) of each - file name. - *Note Functions for File Names: Filename Functions. - -`$(basename NAMES...)' - Extract the base name (name without suffix) of each file name. - *Note Functions for File Names: Filename Functions. - -`$(addsuffix SUFFIX,NAMES...)' - Append SUFFIX to each word in NAMES. - *Note Functions for File Names: Filename Functions. - -`$(addprefix PREFIX,NAMES...)' - Prepend PREFIX to each word in NAMES. - *Note Functions for File Names: Filename Functions. - -`$(join LIST1,LIST2)' - Join two parallel lists of words. - *Note Functions for File Names: Filename Functions. - -`$(word N,TEXT)' - Extract the Nth word (one-origin) of TEXT. - *Note Functions for File Names: Filename Functions. - -`$(words TEXT)' - Count the number of words in TEXT. - *Note Functions for File Names: Filename Functions. - -`$(firstword NAMES...)' - Extract the first word of NAMES. - *Note Functions for File Names: Filename Functions. - -`$(wildcard PATTERN...)' - Find file names matching a shell file name pattern (*not* a `%' - pattern). - *Note The Function `wildcard': Wildcard Function. - -`$(shell COMMAND)' - Execute a shell command and return its output. - *Note The `shell' Function: Shell Function. - -`$(origin VARIABLE)' - Return a string describing how the `make' variable VARIABLE was - defined. - *Note The `origin' Function: Origin Function. - -`$(foreach VAR,WORDS,TEXT)' - Evaluate TEXT with VAR bound to each word in WORDS, and - concatenate the results. - *Note The `foreach' Function: Foreach Function. - - Here is a summary of the automatic variables. *Note Automatic -Variables: Automatic, for full information. - -`$@' - The file name of the target. - -`$%' - The target member name, when the target is an archive member. - -`$<' - The name of the first dependency. - -`$?' - The names of all the dependencies that are newer than the target, - with spaces between them. For dependencies which are archive - members, only the member named is used (*note Archives::.). - -`$^' -`$+' - The names of all the dependencies, with spaces between them. For - dependencies which are archive members, only the member named is - used (*note Archives::.). The value of `$^' omits duplicate - dependencies, while `$+' retains them and preserves their order. - -`$*' - The stem with which an implicit rule matches (*note How Patterns - Match: Pattern Match.). - -`$(@D)' -`$(@F)' - The directory part and the file-within-directory part of `$@'. - -`$(*D)' -`$(*F)' - The directory part and the file-within-directory part of `$*'. - -`$(%D)' -`$(%F)' - The directory part and the file-within-directory part of `$%'. - -`$( tar-`sed -e '/version_string/!d' \ - -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ - -e q - version.c`.shar.Z - - dist: $(SRCS) $(AUX) - echo tar-`sed \ - -e '/version_string/!d' \ - -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ - -e q - version.c` > .fname - -rm -rf `cat .fname` - mkdir `cat .fname` - ln $(SRCS) $(AUX) `cat .fname` - -rm -rf `cat .fname` .fname - tar chZf `cat .fname`.tar.Z `cat .fname` - - tar.zoo: $(SRCS) $(AUX) - -rm -rf tmp.dir - -mkdir tmp.dir - -rm tar.zoo - for X in $(SRCS) $(AUX) ; do \ - echo $$X ; \ - sed 's/$$/^M/' $$X \ - > tmp.dir/$$X ; done - cd tmp.dir ; zoo aM ../tar.zoo * - -rm -rf tmp.dir - diff --git a/buildtools/windows/source/make/make.info-8 b/buildtools/windows/source/make/make.info-8 deleted file mode 100644 index f2c5def3abc..00000000000 --- a/buildtools/windows/source/make/make.info-8 +++ /dev/null @@ -1,896 +0,0 @@ -This is Info file make.info, produced by Makeinfo-1.55 from the input -file ./make.texinfo. - - This file documents the GNU Make utility, which determines -automatically which pieces of a large program need to be recompiled, -and issues the commands to recompile them. - - This is Edition 0.48, last updated 4 April 1995, of `The GNU Make -Manual', for `make', Version 3.73 Beta. - - Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95 Free -Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: make.info, Node: Concept Index, Next: Name Index, Prev: Complex Makefile, Up: Top - -Index of Concepts -***************** - -* Menu: - -* +, and define: Sequences. -* +=: Appending. -* ,v (RCS file extension): Catalogue of Rules. -* -, and define: Sequences. -* .C: Catalogue of Rules. -* .c: Catalogue of Rules. -* .cc: Catalogue of Rules. -* .ch: Catalogue of Rules. -* .def: Catalogue of Rules. -* .dvi: Catalogue of Rules. -* .F: Catalogue of Rules. -* .f: Catalogue of Rules. -* .info: Catalogue of Rules. -* .l: Catalogue of Rules. -* .ln: Catalogue of Rules. -* .mod: Catalogue of Rules. -* .o: Catalogue of Rules. -* .o: Catalogue of Rules. -* .p: Catalogue of Rules. -* .r: Catalogue of Rules. -* .S: Catalogue of Rules. -* .s: Catalogue of Rules. -* .sh: Catalogue of Rules. -* .sym: Catalogue of Rules. -* .tex: Catalogue of Rules. -* .texi: Catalogue of Rules. -* .texinfo: Catalogue of Rules. -* .txinfo: Catalogue of Rules. -* .w: Catalogue of Rules. -* .web: Catalogue of Rules. -* .y: Catalogue of Rules. -* :=: Setting. -* :=: Flavors. -* =: Flavors. -* =: Setting. -* @, and define: Sequences. -* #include: Automatic Dependencies. -* # (comments), in commands: Commands. -* # (comments), in makefile: Makefile Contents. -* $, in function call: Syntax of Functions. -* $, in rules: Rule Syntax. -* $, in variable name: Computed Names. -* $, in variable reference: Reference. -* %, in pattern rules: Pattern Intro. -* %, quoting in patsubst: Text Functions. -* %, quoting in vpath: Selective Search. -* %, quoting in static pattern: Static Usage. -* %, quoting with \ (backslash): Selective Search. -* %, quoting with \ (backslash): Static Usage. -* %, quoting with \ (backslash): Text Functions. -* * (wildcard character): Wildcards. -* -assume-new: Options Summary. -* -assume-new: Instead of Execution. -* -assume-new, and recursion: Options/Recursion. -* -assume-old: Avoiding Compilation. -* -assume-old: Options Summary. -* -assume-old, and recursion: Options/Recursion. -* -debug: Options Summary. -* -directory: Options Summary. -* -directory: Recursion. -* -directory, and -print-directory: -w Option. -* -directory, and recursion: Options/Recursion. -* -dry-run: Echoing. -* -dry-run: Instead of Execution. -* -dry-run: Options Summary. -* -environment-overrides: Options Summary. -* -file: Options Summary. -* -file: Makefile Arguments. -* -file: Makefile Names. -* -file, and recursion: Options/Recursion. -* -help: Options Summary. -* -ignore-errors: Errors. -* -ignore-errors: Options Summary. -* -include-dir: Options Summary. -* -include-dir: Include. -* -jobs: Parallel. -* -jobs: Options Summary. -* -jobs, and recursion: Options/Recursion. -* -just-print: Options Summary. -* -just-print: Instead of Execution. -* -just-print: Echoing. -* -keep-going: Options Summary. -* -keep-going: Errors. -* -keep-going: Testing. -* -load-average: Options Summary. -* -load-average: Parallel. -* -makefile: Options Summary. -* -makefile: Makefile Arguments. -* -makefile: Makefile Names. -* -max-load: Options Summary. -* -max-load: Parallel. -* -new-file: Instead of Execution. -* -new-file: Options Summary. -* -new-file, and recursion: Options/Recursion. -* -no-builtin-rules: Options Summary. -* -no-keep-going: Options Summary. -* -no-print-directory: -w Option. -* -no-print-directory: Options Summary. -* -old-file: Avoiding Compilation. -* -old-file: Options Summary. -* -old-file, and recursion: Options/Recursion. -* -print-data-base: Options Summary. -* -print-directory: Options Summary. -* -print-directory, and -directory: -w Option. -* -print-directory, and recursion: -w Option. -* -print-directory, disabling: -w Option. -* -question: Instead of Execution. -* -question: Options Summary. -* -quiet: Echoing. -* -quiet: Options Summary. -* -recon: Options Summary. -* -recon: Echoing. -* -recon: Instead of Execution. -* -silent: Options Summary. -* -silent: Echoing. -* -stop: Options Summary. -* -touch: Instead of Execution. -* -touch: Options Summary. -* -touch, and recursion: MAKE Variable. -* -version: Options Summary. -* -warn-undefined-variables: Options Summary. -* -what-if: Instead of Execution. -* -what-if: Options Summary. -* -b: Options Summary. -* -C: Options Summary. -* -C: Recursion. -* -C, and -w: -w Option. -* -C, and recursion: Options/Recursion. -* -d: Options Summary. -* -e: Options Summary. -* -e (shell flag): Automatic Dependencies. -* -f: Makefile Arguments. -* -f: Makefile Names. -* -f: Options Summary. -* -f, and recursion: Options/Recursion. -* -h: Options Summary. -* -I: Options Summary. -* -i: Options Summary. -* -i: Errors. -* -I: Include. -* -j: Options Summary. -* -j: Parallel. -* -j, and archive update: Archive Pitfalls. -* -j, and recursion: Options/Recursion. -* -k: Errors. -* -k: Testing. -* -k: Options Summary. -* -l: Options Summary. -* -l (library search): Libraries/Search. -* -l (load average): Parallel. -* -MM (to GNU compiler): Automatic Dependencies. -* -m: Options Summary. -* -M (to compiler): Automatic Dependencies. -* -n: Echoing. -* -n: Instead of Execution. -* -n: Options Summary. -* -o: Avoiding Compilation. -* -o: Options Summary. -* -o, and recursion: Options/Recursion. -* -p: Options Summary. -* -q: Options Summary. -* -q: Instead of Execution. -* -r: Options Summary. -* -s: Echoing. -* -s: Options Summary. -* -S: Options Summary. -* -t: Options Summary. -* -t: Instead of Execution. -* -t, and recursion: MAKE Variable. -* -v: Options Summary. -* -w: Options Summary. -* -W: Options Summary. -* -W: Instead of Execution. -* -w, and -C: -w Option. -* -W, and recursion: Options/Recursion. -* -w, and recursion: -w Option. -* -w, disabling: -w Option. -* - (in commands): Errors. -* .a (archives): Archive Suffix Rules. -* .d: Automatic Dependencies. -* .PRECIOUS intermediate files: Chained Rules. -* :: rules (double-colon): Double-Colon. -* ? (wildcard character): Wildcards. -* @ (in commands): Echoing. -* all (standard target): Goals. -* cd (shell command): Execution. -* cd (shell command): MAKE Variable. -* check (standard target): Goals. -* clean (standard target): Goals. -* clean target: Cleanup. -* clean target: Simple Makefile. -* clobber (standard target): Goals. -* distclean (standard target): Goals. -* dist (standard target): Goals. -* FORCE: Force Targets. -* install (standard target): Goals. -* lint, rule to run: Catalogue of Rules. -* lpr (shell command): Wildcard Examples. -* lpr (shell command): Empty Targets. -* make depend: Automatic Dependencies. -* mostlyclean (standard target): Goals. -* OBJECTS: Variables Simplify. -* objects: Variables Simplify. -* objs: Variables Simplify. -* OBJS: Variables Simplify. -* obj: Variables Simplify. -* OBJ: Variables Simplify. -* print (standard target): Goals. -* print target: Empty Targets. -* print target: Wildcard Examples. -* README: Makefile Names. -* realclean (standard target): Goals. -* rm (shell command): Phony Targets. -* rm (shell command): Errors. -* rm (shell command): Simple Makefile. -* rm (shell command): Wildcard Examples. -* sed (shell command): Automatic Dependencies. -* shar (standard target): Goals. -* TAGS (standard target): Goals. -* tar (standard target): Goals. -* test (standard target): Goals. -* touch (shell command): Empty Targets. -* touch (shell command): Wildcard Examples. -* VPATH, and implicit rules: Implicit/Search. -* VPATH, and link libraries: Libraries/Search. -* yacc: Sequences. -* [...] (wildcard characters): Wildcards. -* \ (backslash), for continuation lines: Simple Makefile. -* \ (backslash), in commands: Execution. -* \ (backslash), to quote %: Text Functions. -* \ (backslash), to quote %: Static Usage. -* \ (backslash), to quote %: Selective Search. -* __.SYMDEF: Archive Symbols. -* ~ (tilde): Wildcards. -* TeX, rule to run: Catalogue of Rules. -* appending to variables: Appending. -* ar: Implicit Variables. -* archive: Archives. -* archive member targets: Archive Members. -* archive symbol directory updating: Archive Symbols. -* archive, and -j: Archive Pitfalls. -* archive, and parallel execution: Archive Pitfalls. -* archive, suffix rule for: Archive Suffix Rules. -* Arg list too long: Options/Recursion. -* arguments of functions: Syntax of Functions. -* as: Implicit Variables. -* as: Catalogue of Rules. -* assembly, rule to compile: Catalogue of Rules. -* automatic generation of dependencies: Include. -* automatic generation of dependencies: Automatic Dependencies. -* automatic variables: Automatic. -* backquotes: Shell Function. -* backslash (\), for continuation lines: Simple Makefile. -* backslash (\), in commands: Execution. -* backslash (\), to quote %: Text Functions. -* backslash (\), to quote %: Selective Search. -* backslash (\), to quote %: Static Usage. -* basename: Filename Functions. -* broken pipe: Parallel. -* bugs, reporting: Bugs. -* built-in special targets: Special Targets. -* C++, rule to compile: Catalogue of Rules. -* C, rule to compile: Catalogue of Rules. -* cc: Implicit Variables. -* cc: Catalogue of Rules. -* chains of rules: Chained Rules. -* cleaning up: Cleanup. -* co: Implicit Variables. -* co: Catalogue of Rules. -* combining rules by dependency: Combine By Dependency. -* command line variable definitions, and recursion: Options/Recursion. -* command line variables: Overriding. -* commands: Rule Syntax. -* commands, backslash (\) in: Execution. -* commands, comments in: Commands. -* commands, echoing: Echoing. -* commands, empty: Empty Commands. -* commands, errors in: Errors. -* commands, execution: Execution. -* commands, execution in parallel: Parallel. -* commands, expansion: Shell Function. -* commands, how to write: Commands. -* commands, instead of executing: Instead of Execution. -* commands, introduction to: Rule Introduction. -* commands, quoting newlines in: Execution. -* commands, sequences of: Sequences. -* comments, in commands: Commands. -* comments, in makefile: Makefile Contents. -* compatibility: Features. -* compatibility in exporting: Variables/Recursion. -* compilation, testing: Testing. -* computed variable name: Computed Names. -* conditionals: Conditionals. -* continuation lines: Simple Makefile. -* conventions for makefiles: Makefile Conventions. -* ctangle: Implicit Variables. -* ctangle: Catalogue of Rules. -* cweave: Catalogue of Rules. -* cweave: Implicit Variables. -* deducing commands (implicit rules): make Deduces. -* default goal: Rules. -* default goal: How Make Works. -* default makefile name: Makefile Names. -* default rules, last-resort: Last Resort. -* defining variables verbatim: Defining. -* deletion of target files: Interrupts. -* deletion of target files: Errors. -* dependencies: Rule Syntax. -* dependencies, automatic generation: Automatic Dependencies. -* dependencies, automatic generation: Include. -* dependencies, introduction to: Rule Introduction. -* dependencies, list of all: Automatic. -* dependencies, list of changed: Automatic. -* dependencies, varying (static pattern): Static Pattern. -* dependency: Rules. -* dependency pattern, implicit: Pattern Intro. -* dependency pattern, static (not implicit): Static Usage. -* directive: Makefile Contents. -* directories, printing them: -w Option. -* directories, updating archive symbol: Archive Symbols. -* directory part: Filename Functions. -* directory search (VPATH): Directory Search. -* directory search (VPATH), and implicit rules: Implicit/Search. -* directory search (VPATH), and link libraries: Libraries/Search. -* directory search (VPATH), and shell commands: Commands/Search. -* dollar sign ($), in function call: Syntax of Functions. -* dollar sign ($), in rules: Rule Syntax. -* dollar sign ($), in variable name: Computed Names. -* dollar sign ($), in variable reference: Reference. -* double-colon rules: Double-Colon. -* duplicate words, removing: Text Functions. -* E2BIG: Options/Recursion. -* echoing of commands: Echoing. -* editor: Introduction. -* Emacs (M-x compile): Errors. -* empty commands: Empty Commands. -* empty targets: Empty Targets. -* environment: Environment. -* environment, SHELL in: Execution. -* environment, and recursion: Variables/Recursion. -* errors (in commands): Errors. -* errors with wildcards: Wildcard Pitfall. -* execution, in parallel: Parallel. -* execution, instead of: Instead of Execution. -* execution, of commands: Execution. -* exit status (errors): Errors. -* explicit rule, definition of: Makefile Contents. -* exporting variables: Variables/Recursion. -* f77: Catalogue of Rules. -* f77: Implicit Variables. -* features of GNU make: Features. -* features, missing: Missing. -* file name functions: Filename Functions. -* file name of makefile: Makefile Names. -* file name of makefile, how to specify: Makefile Names. -* file name prefix, adding: Filename Functions. -* file name suffix: Filename Functions. -* file name suffix, adding: Filename Functions. -* file name with wildcards: Wildcards. -* file name, basename of: Filename Functions. -* file name, directory part: Filename Functions. -* file name, nondirectory part: Filename Functions. -* files, assuming new: Instead of Execution. -* files, assuming old: Avoiding Compilation. -* files, avoiding recompilation of: Avoiding Compilation. -* files, intermediate: Chained Rules. -* filtering out words: Text Functions. -* filtering words: Text Functions. -* finding strings: Text Functions. -* flags: Options Summary. -* flags for compilers: Implicit Variables. -* flavors of variables: Flavors. -* force targets: Force Targets. -* Fortran, rule to compile: Catalogue of Rules. -* functions: Functions. -* functions, for file names: Filename Functions. -* functions, for text: Text Functions. -* functions, syntax of: Syntax of Functions. -* g++: Implicit Variables. -* g++: Catalogue of Rules. -* gcc: Catalogue of Rules. -* generating dependencies automatically: Include. -* generating dependencies automatically: Automatic Dependencies. -* get: Catalogue of Rules. -* get: Implicit Variables. -* globbing (wildcards): Wildcards. -* goal: How Make Works. -* goal, default: Rules. -* goal, default: How Make Works. -* goal, how to specify: Goals. -* home directory: Wildcards. -* IEEE Standard 1003.2: Overview. -* implicit rule: Implicit Rules. -* implicit rule, and VPATH: Implicit/Search. -* implicit rule, and directory search: Implicit/Search. -* implicit rule, definition of: Makefile Contents. -* implicit rule, how to use: Using Implicit. -* implicit rule, introduction to: make Deduces. -* implicit rule, predefined: Catalogue of Rules. -* implicit rule, search algorithm: Search Algorithm. -* including (MAKEFILES variable): MAKEFILES Variable. -* including other makefiles: Include. -* incompatibilities: Missing. -* Info, rule to format: Catalogue of Rules. -* intermediate files: Chained Rules. -* intermediate files, preserving: Chained Rules. -* interrupt: Interrupts. -* job slots: Parallel. -* job slots, and recursion: Options/Recursion. -* jobs, limiting based on load: Parallel. -* joining lists of words: Filename Functions. -* killing (interruption): Interrupts. -* last-resort default rules: Last Resort. -* ld: Catalogue of Rules. -* lex: Implicit Variables. -* lex: Catalogue of Rules. -* Lex, rule to run: Catalogue of Rules. -* libraries for linking, directory search: Libraries/Search. -* library archive, suffix rule for: Archive Suffix Rules. -* limiting jobs based on load: Parallel. -* link libraries, and directory search: Libraries/Search. -* linking, predefined rule for: Catalogue of Rules. -* lint: Catalogue of Rules. -* list of all dependencies: Automatic. -* list of changed dependencies: Automatic. -* load average: Parallel. -* loops in variable expansion: Flavors. -* m2c: Catalogue of Rules. -* macro: Using Variables. -* makefile: Introduction. -* makefile name: Makefile Names. -* makefile name, how to specify: Makefile Names. -* makefile rule parts: Rule Introduction. -* makefile, and MAKEFILES variable: MAKEFILES Variable. -* makefile, conventions for: Makefile Conventions. -* makefile, how make processes: How Make Works. -* makefile, how to write: Makefiles. -* makefile, including: Include. -* makefile, overriding: Overriding Makefiles. -* makefile, remaking of: Remaking Makefiles. -* makefile, simple: Simple Makefile. -* makeinfo: Catalogue of Rules. -* makeinfo: Implicit Variables. -* match-anything rule: Match-Anything Rules. -* match-anything rule, used to override: Overriding Makefiles. -* missing features: Missing. -* mistakes with wildcards: Wildcard Pitfall. -* modified variable reference: Substitution Refs. -* Modula-2, rule to compile: Catalogue of Rules. -* multiple rules for one target: Multiple Rules. -* multiple rules for one target (::): Double-Colon. -* multiple targets: Multiple Targets. -* multiple targets, in pattern rule: Pattern Intro. -* name of makefile: Makefile Names. -* name of makefile, how to specify: Makefile Names. -* nested variable reference: Computed Names. -* newline, quoting, in commands: Execution. -* newline, quoting, in makefile: Simple Makefile. -* nondirectory part: Filename Functions. -* old-fashioned suffix rules: Suffix Rules. -* options: Options Summary. -* options, and recursion: Options/Recursion. -* options, setting from environment: Options/Recursion. -* options, setting in makefiles: Options/Recursion. -* order of pattern rules: Pattern Intro. -* origin of variable: Origin Function. -* overriding makefiles: Overriding Makefiles. -* overriding variables with arguments: Overriding. -* overriding with override: Override Directive. -* parallel execution: Parallel. -* parallel execution, and archive update: Archive Pitfalls. -* parts of makefile rule: Rule Introduction. -* Pascal, rule to compile: Catalogue of Rules. -* pattern rule: Pattern Intro. -* pattern rules, order of: Pattern Intro. -* pattern rules, static (not implicit): Static Pattern. -* pattern rules, static, syntax of: Static Usage. -* pc: Implicit Variables. -* pc: Catalogue of Rules. -* phony targets: Phony Targets. -* pitfalls of wildcards: Wildcard Pitfall. -* portability: Features. -* POSIX: Overview. -* POSIX.2: Options/Recursion. -* precious targets: Special Targets. -* prefix, adding: Filename Functions. -* preserving intermediate files: Chained Rules. -* preserving with .PRECIOUS: Chained Rules. -* preserving with .PRECIOUS: Special Targets. -* printing directories: -w Option. -* printing of commands: Echoing. -* problems and bugs, reporting: Bugs. -* problems with wildcards: Wildcard Pitfall. -* processing a makefile: How Make Works. -* question mode: Instead of Execution. -* quoting %, in patsubst: Text Functions. -* quoting %, in vpath: Selective Search. -* quoting %, in static pattern: Static Usage. -* quoting newline, in commands: Execution. -* quoting newline, in makefile: Simple Makefile. -* Ratfor, rule to compile: Catalogue of Rules. -* RCS, rule to extract from: Catalogue of Rules. -* recompilation: Introduction. -* recompilation, avoiding: Avoiding Compilation. -* recording events with empty targets: Empty Targets. -* recursion: Recursion. -* recursion, and -C: Options/Recursion. -* recursion, and -f: Options/Recursion. -* recursion, and -j: Options/Recursion. -* recursion, and -o: Options/Recursion. -* recursion, and -t: MAKE Variable. -* recursion, and -W: Options/Recursion. -* recursion, and -w: -w Option. -* recursion, and MAKEFILES variable: MAKEFILES Variable. -* recursion, and MAKE variable: MAKE Variable. -* recursion, and command line variable definitions: Options/Recursion. -* recursion, and environment: Variables/Recursion. -* recursion, and options: Options/Recursion. -* recursion, and printing directories: -w Option. -* recursion, and variables: Variables/Recursion. -* recursion, level of: Variables/Recursion. -* recursive variable expansion: Using Variables. -* recursive variable expansion: Flavors. -* recursively expanded variables: Flavors. -* reference to variables: Reference. -* reference to variables: Advanced. -* relinking: How Make Works. -* remaking makefiles: Remaking Makefiles. -* removal of target files: Errors. -* removal of target files: Interrupts. -* removing duplicate words: Text Functions. -* removing, to clean up: Cleanup. -* reporting bugs: Bugs. -* rm: Implicit Variables. -* rule commands: Commands. -* rule dependencies: Rule Syntax. -* rule syntax: Rule Syntax. -* rule targets: Rule Syntax. -* rule, and $: Rule Syntax. -* rule, double-colon (::): Double-Colon. -* rule, explicit, definition of: Makefile Contents. -* rule, how to write: Rules. -* rule, implicit: Implicit Rules. -* rule, implicit, and VPATH: Implicit/Search. -* rule, implicit, and directory search: Implicit/Search. -* rule, implicit, chains of: Chained Rules. -* rule, implicit, definition of: Makefile Contents. -* rule, implicit, how to use: Using Implicit. -* rule, implicit, introduction to: make Deduces. -* rule, implicit, predefined: Catalogue of Rules. -* rule, introduction to: Rule Introduction. -* rule, multiple for one target: Multiple Rules. -* rule, no commands or dependencies: Force Targets. -* rule, pattern: Pattern Intro. -* rule, static pattern: Static Pattern. -* rule, static pattern versus implicit: Static versus Implicit. -* rule, with multiple targets: Multiple Targets. -* s. (SCCS file prefix): Catalogue of Rules. -* SCCS, rule to extract from: Catalogue of Rules. -* search algorithm, implicit rule: Search Algorithm. -* search path for dependencies (VPATH): Directory Search. -* search path for dependencies (VPATH), and implicit rules: Implicit/Search. -* search path for dependencies (VPATH), and link libraries: Libraries/Search. -* searching for strings: Text Functions. -* selecting words: Filename Functions. -* sequences of commands: Sequences. -* setting options from environment: Options/Recursion. -* setting options in makefiles: Options/Recursion. -* setting variables: Setting. -* several rules for one target: Multiple Rules. -* several targets in a rule: Multiple Targets. -* shell command: Simple Makefile. -* shell command, and directory search: Commands/Search. -* shell command, execution: Execution. -* shell command, function for: Shell Function. -* shell file name pattern (in include): Include. -* shell wildcards (in include): Include. -* signal: Interrupts. -* silent operation: Echoing. -* simple makefile: Simple Makefile. -* simple variable expansion: Using Variables. -* simplifying with variables: Variables Simplify. -* simply expanded variables: Flavors. -* sorting words: Text Functions. -* spaces, in variable values: Flavors. -* spaces, stripping: Text Functions. -* special targets: Special Targets. -* specifying makefile name: Makefile Names. -* standard input: Parallel. -* standards conformance: Overview. -* standards for makefiles: Makefile Conventions. -* static pattern rule: Static Pattern. -* static pattern rule, syntax of: Static Usage. -* static pattern rule, versus implicit: Static versus Implicit. -* stem: Pattern Match. -* stem: Static Usage. -* stem, variable for: Automatic. -* strings, searching for: Text Functions. -* stripping whitespace: Text Functions. -* sub-make: Variables/Recursion. -* subdirectories, recursion for: Recursion. -* substitution variable reference: Substitution Refs. -* suffix rule: Suffix Rules. -* suffix rule, for archive: Archive Suffix Rules. -* suffix, adding: Filename Functions. -* suffix, function to find: Filename Functions. -* suffix, substituting in variables: Substitution Refs. -* switches: Options Summary. -* symbol directories, updating archive: Archive Symbols. -* syntax of rules: Rule Syntax. -* tab character (in commands): Rule Syntax. -* tabs in rules: Rule Introduction. -* tangle: Implicit Variables. -* tangle: Catalogue of Rules. -* target: Rules. -* target pattern, implicit: Pattern Intro. -* target pattern, static (not implicit): Static Usage. -* target, deleting on error: Errors. -* target, deleting on interrupt: Interrupts. -* target, multiple in pattern rule: Pattern Intro. -* target, multiple rules for one: Multiple Rules. -* target, touching: Instead of Execution. -* targets: Rule Syntax. -* targets without a file: Phony Targets. -* targets, built-in special: Special Targets. -* targets, empty: Empty Targets. -* targets, force: Force Targets. -* targets, introduction to: Rule Introduction. -* targets, multiple: Multiple Targets. -* targets, phony: Phony Targets. -* terminal rule: Match-Anything Rules. -* testing compilation: Testing. -* tex: Catalogue of Rules. -* tex: Implicit Variables. -* texi2dvi: Catalogue of Rules. -* texi2dvi: Implicit Variables. -* Texinfo, rule to format: Catalogue of Rules. -* tilde (~): Wildcards. -* touching files: Instead of Execution. -* undefined variables, warning message: Options Summary. -* updating archive symbol directories: Archive Symbols. -* updating makefiles: Remaking Makefiles. -* value: Using Variables. -* value, how a variable gets it: Values. -* variable: Using Variables. -* variable definition: Makefile Contents. -* variables: Variables Simplify. -* variables, $ in name: Computed Names. -* variables, and implicit rule: Automatic. -* variables, appending to: Appending. -* variables, automatic: Automatic. -* variables, command line: Overriding. -* variables, command line, and recursion: Options/Recursion. -* variables, computed names: Computed Names. -* variables, defining verbatim: Defining. -* variables, environment: Variables/Recursion. -* variables, environment: Environment. -* variables, exporting: Variables/Recursion. -* variables, flavors: Flavors. -* variables, how they get their values: Values. -* variables, how to reference: Reference. -* variables, loops in expansion: Flavors. -* variables, modified reference: Substitution Refs. -* variables, nested references: Computed Names. -* variables, origin of: Origin Function. -* variables, overriding: Override Directive. -* variables, overriding with arguments: Overriding. -* variables, recursively expanded: Flavors. -* variables, setting: Setting. -* variables, simply expanded: Flavors. -* variables, spaces in values: Flavors. -* variables, substituting suffix in: Substitution Refs. -* variables, substitution reference: Substitution Refs. -* variables, warning for undefined: Options Summary. -* varying dependencies: Static Pattern. -* verbatim variable definition: Defining. -* vpath: Directory Search. -* weave: Catalogue of Rules. -* weave: Implicit Variables. -* Web, rule to run: Catalogue of Rules. -* what if: Instead of Execution. -* whitespace, in variable values: Flavors. -* whitespace, stripping: Text Functions. -* wildcard: Wildcards. -* wildcard pitfalls: Wildcard Pitfall. -* wildcard, function: Filename Functions. -* wildcard, in include: Include. -* wildcard, in archive member: Archive Members. -* words, extracting first: Filename Functions. -* words, filtering: Text Functions. -* words, filtering out: Text Functions. -* words, finding number: Filename Functions. -* words, iterating over: Foreach Function. -* words, joining lists: Filename Functions. -* words, removing duplicates: Text Functions. -* words, selecting: Filename Functions. -* writing rule commands: Commands. -* writing rules: Rules. -* yacc: Implicit Variables. -* yacc: Catalogue of Rules. -* Yacc, rule to run: Catalogue of Rules. - - -File: make.info, Node: Name Index, Prev: Concept Index, Up: Top - -Index of Functions, Variables, & Directives -******************************************* - -* Menu: - -* $%: Automatic. -* $(%D): Automatic. -* $(%F): Automatic. -* $(*D): Automatic. -* $(*F): Automatic. -* $( foo - -%: force - @@$(MAKE) -f Makefile $@@ -force: ; -@end example - -If you say @samp{make foo}, @code{make} will find @file{GNUmakefile}, -read it, and see that to make @file{foo}, it needs to run the command -@samp{frobnicate > foo}. If you say @samp{make bar}, @code{make} will -find no way to make @file{bar} in @file{GNUmakefile}, so it will use the -commands from the pattern rule: @samp{make -f Makefile bar}. If -@file{Makefile} provides a rule for updating @file{bar}, @code{make} -will apply the rule. And likewise for any other target that -@file{GNUmakefile} does not say how to make. - -The way this works is that the pattern rule has a pattern of just -@samp{%}, so it matches any target whatever. The rule specifies a -dependency @file{force}, to guarantee that the commands will be run even -if the target file already exists. We give @file{force} target empty -commands to prevent @code{make} from searching for an implicit rule to -build it---otherwise it would apply the same match-anything rule to -@file{force} itself and create a dependency loop! - -@node Rules, Commands, Makefiles, Top -@chapter Writing Rules -@cindex writing rules -@cindex rule, how to write -@cindex target -@cindex dependency - -A @dfn{rule} appears in the makefile and says when and how to remake -certain files, called the rule's @dfn{targets} (most often only one per rule). -It lists the other files that are the @dfn{dependencies} of the target, and -@dfn{commands} to use to create or update the target. - -@cindex default goal -@cindex goal, default -The order of rules is not significant, except for determining the -@dfn{default goal}: the target for @code{make} to consider, if you do -not otherwise specify one. The default goal is the target of the first -rule in the first makefile. If the first rule has multiple targets, -only the first target is taken as the default. There are two -exceptions: a target starting with a period is not a default unless it -contains one or more slashes, @samp{/}, as well; and, a target that -defines a pattern rule has no effect on the default goal. -(@xref{Pattern Rules, ,Defining and Redefining Pattern Rules}.) - -Therefore, we usually write the makefile so that the first rule is the -one for compiling the entire program or all the programs described by -the makefile (often with a target called @samp{all}). -@xref{Goals, ,Arguments to Specify the Goals}. - -@menu -* Rule Example:: An example explained. -* Rule Syntax:: General syntax explained. -* Wildcards:: Using wildcard characters such as `*'. -* Directory Search:: Searching other directories for source files. -* Phony Targets:: Using a target that is not a real file's name. -* Force Targets:: You can use a target without commands - or dependencies to mark other - targets as phony. -* Empty Targets:: When only the date matters and the - files are empty. -* Special Targets:: Targets with special built-in meanings. -* Multiple Targets:: When to make use of several targets in a rule. -* Multiple Rules:: How to use several rules with the same target. -* Static Pattern:: Static pattern rules apply to multiple targets - and can vary the dependencies according to - the target name. -* Double-Colon:: How to use a special kind of rule to allow - several independent rules for one target. -* Automatic Dependencies:: How to automatically generate rules giving - dependencies from the source files themselves. -@end menu - -@ifinfo -@node Rule Example, Rule Syntax, , Rules -@section Rule Example - -Here is an example of a rule: - -@example -foo.o : foo.c defs.h # module for twiddling the frobs - cc -c -g foo.c -@end example - -Its target is @file{foo.o} and its dependencies are @file{foo.c} and -@file{defs.h}. It has one command, which is @samp{cc -c -g foo.c}. -The command line starts with a tab to identify it as a command. - -This rule says two things: - -@itemize @bullet -@item -How to decide whether @file{foo.o} is out of date: it is out of date -if it does not exist, or if either @file{foo.c} or @file{defs.h} is -more recent than it. - -@item -How to update the file @file{foo.o}: by running @code{cc} as stated. -The command does not explicitly mention @file{defs.h}, but we presume -that @file{foo.c} includes it, and that that is why @file{defs.h} was -added to the dependencies. -@end itemize -@end ifinfo - -@node Rule Syntax, Wildcards, Rule Example, Rules -@section Rule Syntax - -@cindex rule syntax -@cindex syntax of rules -In general, a rule looks like this: - -@example -@var{targets} : @var{dependencies} - @var{command} - @dots{} -@end example - -@noindent -or like this: - -@example -@var{targets} : @var{dependencies} ; @var{command} - @var{command} - @dots{} -@end example - -@cindex targets -@cindex rule targets -The @var{targets} are file names, separated by spaces. Wildcard -characters may be used (@pxref{Wildcards, ,Using Wildcard Characters -in File Names}) and a name of the form @file{@var{a}(@var{m})} -represents member @var{m} in archive file @var{a} -(@pxref{Archive Members, ,Archive Members as Targets}). -Usually there is only one -target per rule, but occasionally there is a reason to have more -(@pxref{Multiple Targets, , Multiple Targets in a Rule}).@refill - -@cindex commands -@cindex tab character (in commands) -The @var{command} lines start with a tab character. The first command may -appear on the line after the dependencies, with a tab character, or may -appear on the same line, with a semicolon. Either way, the effect is the -same. @xref{Commands, ,Writing the Commands in Rules}. - -@cindex dollar sign (@code{$}), in rules -@cindex @code{$}, in rules -@cindex rule, and @code{$} -Because dollar signs are used to start variable references, if you really -want a dollar sign in a rule you must write two of them, @samp{$$} -(@pxref{Using Variables, ,How to Use Variables}). -You may split a long line by inserting a backslash -followed by a newline, but this is not required, as @code{make} places no -limit on the length of a line in a makefile. - -A rule tells @code{make} two things: when the targets are out of date, -and how to update them when necessary. - -@cindex dependencies -@cindex rule dependencies -The criterion for being out of date is specified in terms of the -@var{dependencies}, which consist of file names separated by spaces. -(Wildcards and archive members (@pxref{Archives}) are allowed here too.) -A target is out of date if it does not exist or if it is older than any -of the dependencies (by comparison of last-modification times). The -idea is that the contents of the target file are computed based on -information in the dependencies, so if any of the dependencies changes, -the contents of the existing target file are no longer necessarily -valid. - -How to update is specified by @var{commands}. These are lines to be -executed by the shell (normally @samp{sh}), but with some extra features -(@pxref{Commands, ,Writing the Commands in Rules}). - -@node Wildcards, Directory Search, Rule Syntax, Rules -@section Using Wildcard Characters in File Names -@cindex wildcard -@cindex file name with wildcards -@cindex globbing (wildcards) - -@cindex @code{*} (wildcard character) -@cindex @code{?} (wildcard character) -@cindex @code{[@dots{}]} (wildcard characters) -A single file name can specify many files using @dfn{wildcard characters}. -The wildcard characters in @code{make} are @samp{*}, @samp{?} and -@samp{[@dots{}]}, the same as in the Bourne shell. For example, @file{*.c} -specifies a list of all the files (in the working directory) whose names -end in @samp{.c}.@refill - -@cindex @code{~} (tilde) -@cindex tilde (@code{~}) -@cindex home directory -The character @samp{~} at the beginning of a file name also has special -significance. If alone, or followed by a slash, it represents your home -directory. For example @file{~/bin} expands to @file{/home/you/bin}. -If the @samp{~} is followed by a word, the string represents the home -directory of the user named by that word. For example @file{~john/bin} -expands to @file{/home/john/bin}.@refill - -Wildcard expansion happens automatically in targets, in dependencies, -and in commands (where the shell does the expansion). In other -contexts, wildcard expansion happens only if you request it explicitly -with the @code{wildcard} function. - -The special significance of a wildcard character can be turned off by -preceding it with a backslash. Thus, @file{foo\*bar} would refer to a -specific file whose name consists of @samp{foo}, an asterisk, and -@samp{bar}.@refill - -@menu -* Wildcard Examples:: Several examples -* Wildcard Pitfall:: Problems to avoid. -* Wildcard Function:: How to cause wildcard expansion where - it does not normally take place. -@end menu - -@node Wildcard Examples, Wildcard Pitfall, , Wildcards -@subsection Wildcard Examples - -Wildcards can be used in the commands of a rule, where they are expanded -by the shell. For example, here is a rule to delete all the object files: - -@example -@group -clean: - rm -f *.o -@end group -@end example -@cindex @code{rm} (shell command) - -Wildcards are also useful in the dependencies of a rule. With the -following rule in the makefile, @samp{make print} will print all the -@samp{.c} files that have changed since the last time you printed them: - -@example -print: *.c - lpr -p $? - touch print -@end example - -@cindex @code{print} target -@cindex @code{lpr} (shell command) -@cindex @code{touch} (shell command) -@noindent -This rule uses @file{print} as an empty target file; see @ref{Empty -Targets, ,Empty Target Files to Record Events}. (The automatic variable -@samp{$?} is used to print only those files that have changed; see -@ref{Automatic, ,Automatic Variables}.)@refill - -Wildcard expansion does not happen when you define a variable. Thus, if -you write this: - -@example -objects = *.o -@end example - -@noindent -then the value of the variable @code{objects} is the actual string -@samp{*.o}. However, if you use the value of @code{objects} in a target, -dependency or command, wildcard expansion will take place at that time. -To set @code{objects} to the expansion, instead use: - -@example -objects := $(wildcard *.o) -@end example - -@noindent -@xref{Wildcard Function}. - -@node Wildcard Pitfall, Wildcard Function, Wildcard Examples, Wildcards -@subsection Pitfalls of Using Wildcards -@cindex wildcard pitfalls -@cindex pitfalls of wildcards -@cindex mistakes with wildcards -@cindex errors with wildcards -@cindex problems with wildcards - -Now here is an example of a naive way of using wildcard expansion, that -does not do what you would intend. Suppose you would like to say that the -executable file @file{foo} is made from all the object files in the -directory, and you write this: - -@example -objects = *.o - -foo : $(objects) - cc -o foo $(CFLAGS) $(objects) -@end example - -@noindent -The value of @code{objects} is the actual string @samp{*.o}. Wildcard -expansion happens in the rule for @file{foo}, so that each @emph{existing} -@samp{.o} file becomes a dependency of @file{foo} and will be recompiled if -necessary. - -But what if you delete all the @samp{.o} files? When a wildcard matches -no files, it is left as it is, so then @file{foo} will depend on the -oddly-named file @file{*.o}. Since no such file is likely to exist, -@code{make} will give you an error saying it cannot figure out how to -make @file{*.o}. This is not what you want! - -Actually it is possible to obtain the desired result with wildcard -expansion, but you need more sophisticated techniques, including the -@code{wildcard} function and string substitution. -@ifinfo -@xref{Wildcard Function, ,The Function @code{wildcard}}. -@end ifinfo -@iftex -These are described in the following section. -@end iftex - -@node Wildcard Function, , Wildcard Pitfall, Wildcards -@subsection The Function @code{wildcard} -@findex wildcard - -Wildcard expansion happens automatically in rules. But wildcard expansion -does not normally take place when a variable is set, or inside the -arguments of a function. If you want to do wildcard expansion in such -places, you need to use the @code{wildcard} function, like this: - -@example -$(wildcard @var{pattern}@dots{}) -@end example - -@noindent -This string, used anywhere in a makefile, is replaced by a -space-separated list of names of existing files that match one of the -given file name patterns. If no existing file name matches a pattern, -then that pattern is omitted from the output of the @code{wildcard} -function. Note that this is different from how unmatched wildcards -behave in rules, where they are used verbatim rather than ignored -(@pxref{Wildcard Pitfall}). - -One use of the @code{wildcard} function is to get a list of all the C source -files in a directory, like this: - -@example -$(wildcard *.c) -@end example - -We can change the list of C source files into a list of object files by -replacing the @samp{.o} suffix with @samp{.c} in the result, like this: - -@example -$(patsubst %.c,%.o,$(wildcard *.c)) -@end example - -@noindent -(Here we have used another function, @code{patsubst}. -@xref{Text Functions, ,Functions for String Substitution and Analysis}.)@refill - -Thus, a makefile to compile all C source files in the directory and then -link them together could be written as follows: - -@example -objects := $(patsubst %.c,%.o,$(wildcard *.c)) - -foo : $(objects) - cc -o foo $(objects) -@end example - -@noindent -(This takes advantage of the implicit rule for compiling C programs, so -there is no need to write explicit rules for compiling the files. -@xref{Flavors, ,The Two Flavors of Variables}, for an explanation of -@samp{:=}, which is a variant of @samp{=}.) - -@node Directory Search, Phony Targets, Wildcards, Rules -@section Searching Directories for Dependencies -@vindex VPATH -@findex vpath -@cindex vpath -@cindex search path for dependencies (@code{VPATH}) -@cindex directory search (@code{VPATH}) - -For large systems, it is often desirable to put sources in a separate -directory from the binaries. The @dfn{directory search} features of -@code{make} facilitate this by searching several directories -automatically to find a dependency. When you redistribute the files -among directories, you do not need to change the individual rules, -just the search paths. - -@menu -* General Search:: Specifying a search path that applies - to every dependency. -* Selective Search:: Specifying a search path - for a specified class of names. -* Commands/Search:: How to write shell commands that work together - with search paths. -* Implicit/Search:: How search paths affect implicit rules. -* Libraries/Search:: Directory search for link libraries. -@end menu - -@node General Search, Selective Search, , Directory Search -@subsection @code{VPATH}: Search Path for All Dependencies -@vindex VPATH - -The value of the @code{make} variable @code{VPATH} specifies a list of -directories that @code{make} should search. Most often, the -directories are expected to contain dependency files that are not in the -current directory; however, @code{VPATH} specifies a search list that -@code{make} applies for all files, including files which are targets of -rules. - -Thus, if a file that is listed as a target or dependency does not exist -in the current directory, @code{make} searches the directories listed in -@code{VPATH} for a file with that name. If a file is found in one of -them, that file becomes the dependency. Rules may then specify the -names of source files in the dependencies as if they all existed in the -current directory. @xref{Commands/Search, ,Writing Shell Commands with -Directory Search}. - -In the @code{VPATH} variable, directory names are separated by colons or -blanks. The order in which directories are listed is the order followed -by @code{make} in its search. - -For example, - -@example -VPATH = src:../headers -@end example - -@noindent -specifies a path containing two directories, @file{src} and -@file{../headers}, which @code{make} searches in that order. - -With this value of @code{VPATH}, the following rule, - -@example -foo.o : foo.c -@end example - -@noindent -is interpreted as if it were written like this: - -@example -foo.o : src/foo.c -@end example - -@noindent -assuming the file @file{foo.c} does not exist in the current directory but -is found in the directory @file{src}. - -@node Selective Search, Commands/Search, General Search, Directory Search -@subsection The @code{vpath} Directive -@findex vpath - -Similar to the @code{VPATH} variable but more selective is the @code{vpath} -directive (note lower case), which allows you to specify a search path for a particular class -of file names, those that match a particular pattern. Thus you can supply -certain search directories for one class of file names and other directories -(or none) for other file names. - -There are three forms of the @code{vpath} directive: - -@table @code -@item vpath @var{pattern} @var{directories} -Specify the search path @var{directories} for file names that match -@var{pattern}. - -The search path, @var{directories}, is a list of directories to be -searched, separated by colons or blanks, just like the search path used -in the @code{VPATH} variable. - -@item vpath @var{pattern} -Clear out the search path associated with @var{pattern}. - -@c Extra blank line makes sure this gets two lines. -@item vpath - -Clear all search paths previously specified with @code{vpath} directives. -@end table - -A @code{vpath} pattern is a string containing a @samp{%} character. The -string must match the file name of a dependency that is being searched -for, the @samp{%} character matching any sequence of zero or more -characters (as in pattern rules; @pxref{Pattern Rules, ,Defining and -Redefining Pattern Rules}). For example, @code{%.h} matches files that -end in @code{.h}. (If there is no @samp{%}, the pattern must match the -dependency exactly, which is not useful very often.) - -@cindex @code{%}, quoting in @code{vpath} -@cindex @code{%}, quoting with @code{\} (backslash) -@cindex @code{\} (backslash), to quote @code{%} -@cindex backslash (@code{\}), to quote @code{%} -@cindex quoting @code{%}, in @code{vpath} -@samp{%} characters in a @code{vpath} directive's pattern can be quoted -with preceding backslashes (@samp{\}). Backslashes that would otherwise -quote @samp{%} characters can be quoted with more backslashes. -Backslashes that quote @samp{%} characters or other backslashes are -removed from the pattern before it is compared to file names. Backslashes -that are not in danger of quoting @samp{%} characters go unmolested.@refill - -When a dependency fails to exist in the current directory, if the -@var{pattern} in a @code{vpath} directive matches the name of the -dependency file, then the @var{directories} in that directive are searched -just like (and before) the directories in the @code{VPATH} variable. - -For example, - -@example -vpath %.h ../headers -@end example - -@noindent -tells @code{make} to look for any dependency whose name ends in @file{.h} -in the directory @file{../headers} if the file is not found in the current -directory. - -If several @code{vpath} patterns match the dependency file's name, then -@code{make} processes each matching @code{vpath} directive one by one, -searching all the directories mentioned in each directive. @code{make} -handles multiple @code{vpath} directives in the order in which they -appear in the makefile; multiple directives with the same pattern are -independent of each other. - -@need 750 -Thus, - -@example -@group -vpath %.c foo -vpath % blish -vpath %.c bar -@end group -@end example - -@noindent -will look for a file ending in @samp{.c} in @file{foo}, then -@file{blish}, then @file{bar}, while - -@example -@group -vpath %.c foo:bar -vpath % blish -@end group -@end example - -@noindent -will look for a file ending in @samp{.c} in @file{foo}, then -@file{bar}, then @file{blish}. - -@node Commands/Search, Implicit/Search, Selective Search, Directory Search -@subsection Writing Shell Commands with Directory Search -@cindex shell command, and directory search -@cindex directory search (@code{VPATH}), and shell commands - -When a dependency is found in another directory through directory search, -this cannot change the commands of the rule; they will execute as written. -Therefore, you must write the commands with care so that they will look for -the dependency in the directory where @code{make} finds it. - -This is done with the @dfn{automatic variables} such as @samp{$^} -(@pxref{Automatic, ,Automatic Variables}). -For instance, the value of @samp{$^} is a -list of all the dependencies of the rule, including the names of -the directories in which they were found, and the value of -@samp{$@@} is the target. Thus:@refill - -@example -foo.o : foo.c - cc -c $(CFLAGS) $^ -o $@@ -@end example - -@noindent -(The variable @code{CFLAGS} exists so you can specify flags for C -compilation by implicit rules; we use it here for consistency so it will -affect all C compilations uniformly; -@pxref{Implicit Variables, ,Variables Used by Implicit Rules}.) - -Often the dependencies include header files as well, which you do not -want to mention in the commands. The automatic variable @samp{$<} is -just the first dependency: - -@example -VPATH = src:../headers -foo.o : foo.c defs.h hack.h - cc -c $(CFLAGS) $< -o $@@ -@end example - -@node Implicit/Search, Libraries/Search, Commands/Search, Directory Search -@subsection Directory Search and Implicit Rules -@cindex @code{VPATH}, and implicit rules -@cindex directory search (@code{VPATH}), and implicit rules -@cindex search path for dependencies (@code{VPATH}), and implicit rules -@cindex implicit rule, and directory search -@cindex implicit rule, and @code{VPATH} -@cindex rule, implicit, and directory search -@cindex rule, implicit, and @code{VPATH} - -The search through the directories specified in @code{VPATH} or with -@code{vpath} also happens during consideration of implicit rules -(@pxref{Implicit Rules, ,Using Implicit Rules}). - -For example, when a file @file{foo.o} has no explicit rule, @code{make} -considers implicit rules, such as the built-in rule to compile -@file{foo.c} if that file exists. If such a file is lacking in the -current directory, the appropriate directories are searched for it. If -@file{foo.c} exists (or is mentioned in the makefile) in any of the -directories, the implicit rule for C compilation is applied. - -The commands of implicit rules normally use automatic variables as a -matter of necessity; consequently they will use the file names found by -directory search with no extra effort. - -@node Libraries/Search, , Implicit/Search, Directory Search -@subsection Directory Search for Link Libraries -@cindex link libraries, and directory search -@cindex libraries for linking, directory search -@cindex directory search (@code{VPATH}), and link libraries -@cindex @code{VPATH}, and link libraries -@cindex search path for dependencies (@code{VPATH}), and link libraries -@cindex @code{-l} (library search) - -Directory search applies in a special way to libraries used with the -linker. This special feature comes into play when you write a dependency -whose name is of the form @samp{-l@var{name}}. (You can tell something -strange is going on here because the dependency is normally the name of a -file, and the @emph{file name} of the library looks like -@file{lib@var{name}.a}, not like @samp{-l@var{name}}.)@refill - -When a dependency's name has the form @samp{-l@var{name}}, @code{make} -handles it specially by searching for the file @file{lib@var{name}.a} in -the current directory, in directories specified by matching @code{vpath} -search paths and the @code{VPATH} search path, and then in the -directories @file{/lib}, @file{/usr/lib}, and @file{@var{prefix}/lib} -(normally @file{/usr/local/lib}). - -For example, - -@example -@group -foo : foo.c -lcurses - cc $^ -o $@@ -@end group -@end example - -@noindent -would cause the command @samp{cc foo.c /usr/lib/libcurses.a -o foo} to -be executed when @file{foo} is older than @file{foo.c} or than -@file{/usr/lib/libcurses.a}.@refill - -@node Phony Targets, Force Targets, Directory Search, Rules -@section Phony Targets -@cindex phony targets -@cindex targets, phony -@cindex targets without a file - -A phony target is one that is not really the name of a file. It is just a -name for some commands to be executed when you make an explicit request. -There are two reasons to use a phony target: to avoid a conflict with -a file of the same name, and to improve performance. - -If you write a rule whose commands will not create the target file, the -commands will be executed every time the target comes up for remaking. -Here is an example: - -@example -@group -clean: - rm *.o temp -@end group -@end example - -@noindent -Because the @code{rm} command does not create a file named @file{clean}, -probably no such file will ever exist. Therefore, the @code{rm} command -will be executed every time you say @samp{make clean}. -@cindex @code{rm} (shell command) - -@findex .PHONY -The phony target will cease to work if anything ever does create a file -named @file{clean} in this directory. Since it has no dependencies, the -file @file{clean} would inevitably be considered up to date, and its -commands would not be executed. To avoid this problem, you can explicitly -declare the target to be phony, using the special target @code{.PHONY} -(@pxref{Special Targets, ,Special Built-in Target Names}) as follows: - -@example -.PHONY : clean -@end example - -@noindent -Once this is done, @samp{make clean} will run the commands regardless of -whether there is a file named @file{clean}. - -Since it knows that phony targets do not name actual files that could be -remade from other files, @code{make} skips the implicit rule search for -phony targets (@pxref{Implicit Rules}). This is why declaring a target -phony is good for performance, even if you are not worried about the -actual file existing. - -Thus, you first write the line that states that @code{clean} is a -phony target, then you write the rule, like this: - -@example -@group -.PHONY: clean -clean: - rm *.o temp -@end group -@end example - -A phony target should not be a dependency of a real target file; if it -is, its commands are run every time @code{make} goes to update that -file. As long as a phony target is never a dependency of a real -target, the phony target commands will be executed only when the phony -target is a specified goal (@pxref{Goals, ,Arguments to Specify the -Goals}). - -Phony targets can have dependencies. When one directory contains multiple -programs, it is most convenient to describe all of the programs in one -makefile @file{./Makefile}. Since the target remade by default will be the -first one in the makefile, it is common to make this a phony target named -@samp{all} and give it, as dependencies, all the individual programs. For -example: - -@example -all : prog1 prog2 prog3 -.PHONY : all - -prog1 : prog1.o utils.o - cc -o prog1 prog1.o utils.o - -prog2 : prog2.o - cc -o prog2 prog2.o - -prog3 : prog3.o sort.o utils.o - cc -o prog3 prog3.o sort.o utils.o -@end example - -@noindent -Now you can say just @samp{make} to remake all three programs, or specify -as arguments the ones to remake (as in @samp{make prog1 prog3}). - -When one phony target is a dependency of another, it serves as a subroutine -of the other. For example, here @samp{make cleanall} will delete the -object files, the difference files, and the file @file{program}: - -@example -.PHONY: cleanall cleanobj cleandiff - -cleanall : cleanobj cleandiff - rm program - -cleanobj : - rm *.o - -cleandiff : - rm *.diff -@end example - -@node Force Targets, Empty Targets, Phony Targets, Rules -@section Rules without Commands or Dependencies -@cindex force targets -@cindex targets, force -@cindex @code{FORCE} -@cindex rule, no commands or dependencies - -If a rule has no dependencies or commands, and the target of the rule -is a nonexistent file, then @code{make} imagines this target to have -been updated whenever its rule is run. This implies that all targets -depending on this one will always have their commands run. - -An example will illustrate this: - -@example -@group -clean: FORCE - rm $(objects) -FORCE: -@end group -@end example - -Here the target @samp{FORCE} satisfies the special conditions, so the -target @file{clean} that depends on it is forced to run its commands. -There is nothing special about the name @samp{FORCE}, but that is one name -commonly used this way. - -As you can see, using @samp{FORCE} this way has the same results as using -@samp{.PHONY: clean}. - -Using @samp{.PHONY} is more explicit and more efficient. However, -other versions of @code{make} do not support @samp{.PHONY}; thus -@samp{FORCE} appears in many makefiles. @xref{Phony Targets}. - -@node Empty Targets, Special Targets, Force Targets, Rules -@section Empty Target Files to Record Events -@cindex empty targets -@cindex targets, empty -@cindex recording events with empty targets - -The @dfn{empty target} is a variant of the phony target; it is used to hold -commands for an action that you request explicitly from time to time. -Unlike a phony target, this target file can really exist; but the file's -contents do not matter, and usually are empty. - -The purpose of the empty target file is to record, with its -last-modification time, when the rule's commands were last executed. It -does so because one of the commands is a @code{touch} command to update the -target file. - -The empty target file must have some dependencies. When you ask to remake -the empty target, the commands are executed if any dependency is more -recent than the target; in other words, if a dependency has changed since -the last time you remade the target. Here is an example: - -@example -print: foo.c bar.c - lpr -p $? - touch print -@end example -@cindex @code{print} target -@cindex @code{lpr} (shell command) -@cindex @code{touch} (shell command) - -@noindent -With this rule, @samp{make print} will execute the @code{lpr} command if -either source file has changed since the last @samp{make print}. The -automatic variable @samp{$?} is used to print only those files that have -changed (@pxref{Automatic, ,Automatic Variables}). - -@node Special Targets, Multiple Targets, Empty Targets, Rules -@section Special Built-in Target Names -@cindex special targets -@cindex built-in special targets -@cindex targets, built-in special - -Certain names have special meanings if they appear as targets. - -@table @code -@findex .PHONY -@item .PHONY - -The dependencies of the special target @code{.PHONY} are considered to -be phony targets. When it is time to consider such a target, -@code{make} will run its commands unconditionally, regardless of -whether a file with that name exists or what its last-modification -time is. @xref{Phony Targets, ,Phony Targets}. - -@findex .SUFFIXES -@item .SUFFIXES - -The dependencies of the special target @code{.SUFFIXES} are the list -of suffixes to be used in checking for suffix rules. -@xref{Suffix Rules, , Old-Fashioned Suffix Rules}. - -@findex .DEFAULT -@item .DEFAULT - -The commands specified for @code{.DEFAULT} are used for any target for -which no rules are found (either explicit rules or implicit rules). -@xref{Last Resort}. If @code{.DEFAULT} commands are specified, every -file mentioned as a dependency, but not as a target in a rule, will have -these commands executed on its behalf. @xref{Search Algorithm, -,Implicit Rule Search Algorithm}. - -@findex .PRECIOUS -@item .PRECIOUS -@cindex precious targets -@cindex preserving with @code{.PRECIOUS} - -The targets which @code{.PRECIOUS} depends on are given the following -special treatment: if @code{make} is killed or interrupted during the -execution of their commands, the target is not deleted. -@xref{Interrupts, ,Interrupting or Killing @code{make}}. -Also, if the target is an intermediate file, it will not be deleted -after it is no longer needed, as is normally done. -@xref{Chained Rules, ,Chains of Implicit Rules}. - -You can also list the target pattern of an implicit rule (such as -@samp{%.o}) as a dependency file of the special target @code{.PRECIOUS} -to preserve intermediate files created by rules whose target patterns -match that file's name. - -@findex .IGNORE -@item .IGNORE - -If you specify dependencies for @code{.IGNORE}, then @code{make} will -ignore errors in execution of the commands run for those particular -files. The commands for @code{.IGNORE} are not meaningful. - -If mentioned as a target with no dependencies, @code{.IGNORE} says to -ignore errors in execution of commands for all files. This usage of -@samp{.IGNORE} is supported only for historical compatibility. Since -this affects every command in the makefile, it is not very useful; we -recommend you use the more selective ways to ignore errors in specific -commands. @xref{Errors, ,Errors in Commands}. - -@findex .SILENT -@item .SILENT - -If you specify dependencies for @code{.SILENT}, then @code{make} will -not the print commands to remake those particular files before executing -them. The commands for @code{.SILENT} are not meaningful. - -If mentioned as a target with no dependencies, @code{.SILENT} says not -to print any commands before executing them. This usage of -@samp{.SILENT} is supported only for historical compatibility. We -recommend you use the more selective ways to silence specific commands. -@xref{Echoing, ,Command Echoing}. If you want to silence all commands -for a particular run of @code{make}, use the @samp{-s} or -@w{@samp{--silent}} option (@pxref{Options Summary}). - -@findex .EXPORT_ALL_VARIABLES -@item .EXPORT_ALL_VARIABLES - -Simply by being mentioned as a target, this tells @code{make} to -export all variables to child processes by default. -@xref{Variables/Recursion, ,Communicating Variables to a -Sub-@code{make}}. -@end table - -Any defined implicit rule suffix also counts as a special target if it -appears as a target, and so does the concatenation of two suffixes, such -as @samp{.c.o}. These targets are suffix rules, an obsolete way of -defining implicit rules (but a way still widely used). In principle, any -target name could be special in this way if you break it in two and add -both pieces to the suffix list. In practice, suffixes normally begin with -@samp{.}, so these special target names also begin with @samp{.}. -@xref{Suffix Rules, ,Old-Fashioned Suffix Rules}. - -@node Multiple Targets, Multiple Rules, Special Targets, Rules -@section Multiple Targets in a Rule -@cindex multiple targets -@cindex several targets in a rule -@cindex targets, multiple -@cindex rule, with multiple targets - -A rule with multiple targets is equivalent to writing many rules, each with -one target, and all identical aside from that. The same commands apply to -all the targets, but their effects may vary because you can substitute the -actual target name into the command using @samp{$@@}. The rule contributes -the same dependencies to all the targets also. - -This is useful in two cases. - -@itemize @bullet -@item -You want just dependencies, no commands. For example: - -@example -kbd.o command.o files.o: command.h -@end example - -@noindent -gives an additional dependency to each of the three object files -mentioned. - -@item -Similar commands work for all the targets. The commands do not need -to be absolutely identical, since the automatic variable @samp{$@@} -can be used to substitute the particular target to be remade into the -commands (@pxref{Automatic, ,Automatic Variables}). For example: - -@example -@group -bigoutput littleoutput : text.g - generate text.g -$(subst output,,$@@) > $@@ -@end group -@end example -@findex subst - -@noindent -is equivalent to - -@example -bigoutput : text.g - generate text.g -big > bigoutput -littleoutput : text.g - generate text.g -little > littleoutput -@end example - -@noindent -Here we assume the hypothetical program @code{generate} makes two -types of output, one if given @samp{-big} and one if given -@samp{-little}. -@xref{Text Functions, ,Functions for String Substitution and Analysis}, -for an explanation of the @code{subst} function. -@end itemize - -Suppose you would like to vary the dependencies according to the target, -much as the variable @samp{$@@} allows you to vary the commands. -You cannot do this with multiple targets in an ordinary rule, but you can -do it with a @dfn{static pattern rule}. -@xref{Static Pattern, ,Static Pattern Rules}. - -@node Multiple Rules, Static Pattern, Multiple Targets, Rules -@section Multiple Rules for One Target -@cindex multiple rules for one target -@cindex several rules for one target -@cindex rule, multiple for one target -@cindex target, multiple rules for one - -One file can be the target of several rules. All the dependencies -mentioned in all the rules are merged into one list of dependencies for -the target. If the target is older than any dependency from any rule, -the commands are executed. - -There can only be one set of commands to be executed for a file. -If more than one rule gives commands for the same file, -@code{make} uses the last set given and prints an error message. -(As a special case, if the file's name begins with a dot, no -error message is printed. This odd behavior is only for -compatibility with other implementations of @code{make}.) -There is no reason to -write your makefiles this way; that is why @code{make} gives you -an error message.@refill - -An extra rule with just dependencies can be used to give a few extra -dependencies to many files at once. For example, one usually has a -variable named @code{objects} containing a list of all the compiler output -files in the system being made. An easy way to say that all of them must -be recompiled if @file{config.h} changes is to write the following: - -@example -objects = foo.o bar.o -foo.o : defs.h -bar.o : defs.h test.h -$(objects) : config.h -@end example - -This could be inserted or taken out without changing the rules that really -specify how to make the object files, making it a convenient form to use if -you wish to add the additional dependency intermittently. - -Another wrinkle is that the additional dependencies could be specified with -a variable that you set with a command argument to @code{make} -(@pxref{Overriding, ,Overriding Variables}). For example, - -@example -@group -extradeps= -$(objects) : $(extradeps) -@end group -@end example - -@noindent -means that the command @samp{make extradeps=foo.h} will consider -@file{foo.h} as a dependency of each object file, but plain @samp{make} -will not. - -If none of the explicit rules for a target has commands, then @code{make} -searches for an applicable implicit rule to find some commands -@pxref{Implicit Rules, ,Using Implicit Rules}). - -@node Static Pattern, Double-Colon, Multiple Rules, Rules -@section Static Pattern Rules -@cindex static pattern rule -@cindex rule, static pattern -@cindex pattern rules, static (not implicit) -@cindex varying dependencies -@cindex dependencies, varying (static pattern) - -@dfn{Static pattern rules} are rules which specify multiple targets and -construct the dependency names for each target based on the target name. -They are more general than ordinary rules with multiple targets because the -targets do not have to have identical dependencies. Their dependencies must -be @emph{analogous}, but not necessarily @emph{identical}. - -@menu -* Static Usage:: The syntax of static pattern rules. -* Static versus Implicit:: When are they better than implicit rules? -@end menu - -@node Static Usage, Static versus Implicit, , Static Pattern -@subsection Syntax of Static Pattern Rules -@cindex static pattern rule, syntax of -@cindex pattern rules, static, syntax of - -Here is the syntax of a static pattern rule: - -@example -@var{targets} @dots{}: @var{target-pattern}: @var{dep-patterns} @dots{} - @var{commands} - @dots{} -@end example - -@noindent -The @var{targets} list specifies the targets that the rule applies to. -The targets can contain wildcard characters, just like the targets of -ordinary rules (@pxref{Wildcards, ,Using Wildcard Characters in File -Names}). - -@cindex target pattern, static (not implicit) -@cindex stem -The @var{target-pattern} and @var{dep-patterns} say how to compute the -dependencies of each target. Each target is matched against the -@var{target-pattern} to extract a part of the target name, called the -@dfn{stem}. This stem is substituted into each of the @var{dep-patterns} -to make the dependency names (one from each @var{dep-pattern}). - -Each pattern normally contains the character @samp{%} just once. When the -@var{target-pattern} matches a target, the @samp{%} can match any part of -the target name; this part is called the @dfn{stem}. The rest of the -pattern must match exactly. For example, the target @file{foo.o} matches -the pattern @samp{%.o}, with @samp{foo} as the stem. The targets -@file{foo.c} and @file{foo.out} do not match that pattern.@refill - -@cindex dependency pattern, static (not implicit) -The dependency names for each target are made by substituting the stem -for the @samp{%} in each dependency pattern. For example, if one -dependency pattern is @file{%.c}, then substitution of the stem -@samp{foo} gives the dependency name @file{foo.c}. It is legitimate -to write a dependency pattern that does not contain @samp{%}; then this -dependency is the same for all targets. - -@cindex @code{%}, quoting in static pattern -@cindex @code{%}, quoting with @code{\} (backslash) -@cindex @code{\} (backslash), to quote @code{%} -@cindex backslash (@code{\}), to quote @code{%} -@cindex quoting @code{%}, in static pattern -@samp{%} characters in pattern rules can be quoted with preceding -backslashes (@samp{\}). Backslashes that would otherwise quote @samp{%} -characters can be quoted with more backslashes. Backslashes that quote -@samp{%} characters or other backslashes are removed from the pattern -before it is compared to file names or has a stem substituted into it. -Backslashes that are not in danger of quoting @samp{%} characters go -unmolested. For example, the pattern @file{the\%weird\\%pattern\\} has -@samp{the%weird\} preceding the operative @samp{%} character, and -@samp{pattern\\} following it. The final two backslashes are left alone -because they cannot affect any @samp{%} character.@refill - -Here is an example, which compiles each of @file{foo.o} and @file{bar.o} -from the corresponding @file{.c} file: - -@example -@group -objects = foo.o bar.o - -$(objects): %.o: %.c - $(CC) -c $(CFLAGS) $< -o $@@ -@end group -@end example - -@noindent -Here @samp{$<} is the automatic variable that holds the name of the -dependency and @samp{$@@} is the automatic variable that holds the name -of the target; see @ref{Automatic, , Automatic Variables}. - -Each target specified must match the target pattern; a warning is issued -for each target that does not. If you have a list of files, only some of -which will match the pattern, you can use the @code{filter} function to -remove nonmatching file names (@pxref{Text Functions, ,Functions for String Substitution and Analysis}): - -@example -files = foo.elc bar.o lose.o - -$(filter %.o,$(files)): %.o: %.c - $(CC) -c $(CFLAGS) $< -o $@@ -$(filter %.elc,$(files)): %.elc: %.el - emacs -f batch-byte-compile $< -@end example - -@noindent -In this example the result of @samp{$(filter %.o,$(files))} is -@file{bar.o lose.o}, and the first static pattern rule causes each of -these object files to be updated by compiling the corresponding C source -file. The result of @w{@samp{$(filter %.elc,$(files))}} is -@file{foo.elc}, so that file is made from @file{foo.el}.@refill - -Another example shows how to use @code{$*} in static pattern rules: -@vindex $*@r{, and static pattern} - -@example -@group -bigoutput littleoutput : %output : text.g - generate text.g -$* > $@@ -@end group -@end example - -@noindent -When the @code{generate} command is run, @code{$*} will expand to the -stem, either @samp{big} or @samp{little}. - -@node Static versus Implicit, , Static Usage, Static Pattern -@subsection Static Pattern Rules versus Implicit Rules -@cindex rule, static pattern versus implicit -@cindex static pattern rule, versus implicit - -A static pattern rule has much in common with an implicit rule defined as a -pattern rule (@pxref{Pattern Rules, ,Defining and Redefining Pattern Rules}). -Both have a pattern for the target and patterns for constructing the -names of dependencies. The difference is in how @code{make} decides -@emph{when} the rule applies. - -An implicit rule @emph{can} apply to any target that matches its pattern, -but it @emph{does} apply only when the target has no commands otherwise -specified, and only when the dependencies can be found. If more than one -implicit rule appears applicable, only one applies; the choice depends on -the order of rules. - -By contrast, a static pattern rule applies to the precise list of targets -that you specify in the rule. It cannot apply to any other target and it -invariably does apply to each of the targets specified. If two conflicting -rules apply, and both have commands, that's an error. - -The static pattern rule can be better than an implicit rule for these -reasons: - -@itemize @bullet -@item -You may wish to override the usual implicit rule for a few -files whose names cannot be categorized syntactically but -can be given in an explicit list. - -@item -If you cannot be sure of the precise contents of the directories -you are using, you may not be sure which other irrelevant files -might lead @code{make} to use the wrong implicit rule. The choice -might depend on the order in which the implicit rule search is done. -With static pattern rules, there is no uncertainty: each rule applies -to precisely the targets specified. -@end itemize - -@node Double-Colon, Automatic Dependencies, Static Pattern, Rules -@section Double-Colon Rules -@cindex double-colon rules -@cindex rule, double-colon (@code{::}) -@cindex multiple rules for one target (@code{::}) -@cindex @code{::} rules (double-colon) - -@dfn{Double-colon} rules are rules written with @samp{::} instead of -@samp{:} after the target names. They are handled differently from -ordinary rules when the same target appears in more than one rule. - -When a target appears in multiple rules, all the rules must be the same -type: all ordinary, or all double-colon. If they are double-colon, each of -them is independent of the others. Each double-colon rule's commands are -executed if the target is older than any dependencies of that rule. This -can result in executing none, any, or all of the double-colon rules. - -Double-colon rules with the same target are in fact completely separate -from one another. Each double-colon rule is processed individually, just -as rules with different targets are processed. - -The double-colon rules for a target are executed in the order they appear -in the makefile. However, the cases where double-colon rules really make -sense are those where the order of executing the commands would not matter. - -Double-colon rules are somewhat obscure and not often very useful; they -provide a mechanism for cases in which the method used to update a target -differs depending on which dependency files caused the update, and such -cases are rare. - -Each double-colon rule should specify commands; if it does not, an -implicit rule will be used if one applies. -@xref{Implicit Rules, ,Using Implicit Rules}. - -@node Automatic Dependencies, , Double-Colon, Rules -@section Generating Dependencies Automatically -@cindex dependencies, automatic generation -@cindex automatic generation of dependencies -@cindex generating dependencies automatically - -In the makefile for a program, many of the rules you need to write often -say only that some object file depends on some header -file. For example, if @file{main.c} uses @file{defs.h} via an -@code{#include}, you would write: - -@example -main.o: defs.h -@end example - -@noindent -You need this rule so that @code{make} knows that it must remake -@file{main.o} whenever @file{defs.h} changes. You can see that for a -large program you would have to write dozens of such rules in your -makefile. And, you must always be very careful to update the makefile -every time you add or remove an @code{#include}. -@cindex @code{#include} - -@cindex @code{-M} (to compiler) -To avoid this hassle, most modern C compilers can write these rules for -you, by looking at the @code{#include} lines in the source files. -Usually this is done with the @samp{-M} option to the compiler. -For example, the command: - -@example -cc -M main.c -@end example - -@noindent -generates the output: - -@example -main.o : main.c defs.h -@end example - -@noindent -Thus you no longer have to write all those rules yourself. -The compiler will do it for you. - -Note that such a dependency constitutes mentioning @file{main.o} in a -makefile, so it can never be considered an intermediate file by implicit -rule search. This means that @code{make} won't ever remove the file -after using it; @pxref{Chained Rules, ,Chains of Implicit Rules}. - -@cindex @code{make depend} -With old @code{make} programs, it was traditional practice to use this -compiler feature to generate dependencies on demand with a command like -@samp{make depend}. That command would create a file @file{depend} -containing all the automatically-generated dependencies; then the -makefile could use @code{include} to read them in (@pxref{Include}). - -In GNU @code{make}, the feature of remaking makefiles makes this -practice obsolete---you need never tell @code{make} explicitly to -regenerate the dependencies, because it always regenerates any makefile -that is out of date. @xref{Remaking Makefiles}. - -The practice we recommend for automatic dependency generation is to have -one makefile corresponding to each source file. For each source file -@file{@var{name}.c} there is a makefile @file{@var{name}.d} which lists -what files the object file @file{@var{name}.o} depends on. That way -only the source files that have changed need to be rescanned to produce -the new dependencies. - -Here is the pattern rule to generate a file of dependencies (i.e., a makefile) -called @file{@var{name}.d} from a C source file called @file{@var{name}.c}: - -@example -@group -%.d: %.c - $(SHELL) -ec '$(CC) -M $(CPPFLAGS) $< \ - | sed '\''s/$*\\.o[ :]*/& $@@/g'\'' > $@@' -@end group -@end example - -@noindent -@xref{Pattern Rules}, for information on defining pattern rules. The -@samp{-e} flag to the shell makes it exit immediately if the -@code{$(CC)} command fails (exits with a nonzero status). Normally the -shell exits with the status of the last command in the pipeline -(@code{sed} in this case), so @code{make} would not notice a nonzero -status from the compiler. -@cindex @code{-e} (shell flag) - -@cindex @code{-MM} (to GNU compiler) -With the GNU C compiler, you may wish to use the @samp{-MM} flag instead -of @samp{-M}. This omits dependencies on system header files. -@xref{Preprocessor Options, , Options Controlling the Preprocessor, -gcc.info, Using GNU CC}, for details. - -@cindex @code{sed} (shell command) -The purpose of the @code{sed} command is to translate (for example): - -@example -main.o : main.c defs.h -@end example - -@noindent -into: - -@example -main.o main.d : main.c defs.h -@end example - -@noindent -@cindex @code{.d} -This makes each @samp{.d} file depend on all the source and header files -that the corresponding @samp{.o} file depends on. @code{make} then -knows it must regenerate the dependencies whenever any of the source or -header files changes. - -Once you've defined the rule to remake the @samp{.d} files, -you then use the @code{include} directive to read them all in. -@xref{Include}. For example: - -@example -@group -sources = foo.c bar.c - -include $(sources:.c=.d) -@end group -@end example - -@noindent -(This example uses a substitution variable reference to translate the -list of source files @samp{foo.c bar.c} into a list of dependency -makefiles, @samp{foo.d bar.d}. @xref{Substitution Refs}, for full -information on substitution references.) Since the @samp{.d} files are -makefiles like any others, @code{make} will remake them as necessary -with no further work from you. @xref{Remaking Makefiles}. - -@node Commands, Using Variables, Rules, Top -@chapter Writing the Commands in Rules -@cindex commands, how to write -@cindex rule commands -@cindex writing rule commands - -The commands of a rule consist of shell command lines to be executed one -by one. Each command line must start with a tab, except that the first -command line may be attached to the target-and-dependencies line with a -semicolon in between. Blank lines and lines of just comments may appear -among the command lines; they are ignored. (But beware, an apparently -``blank'' line that begins with a tab is @emph{not} blank! It is an -empty command; @pxref{Empty Commands}.) - -Users use many different shell programs, but commands in makefiles are -always interpreted by @file{/bin/sh} unless the makefile specifies -otherwise. @xref{Execution, ,Command Execution}. - -@cindex comments, in commands -@cindex commands, comments in -@cindex @code{#} (comments), in commands -The shell that is in use determines whether comments can be written on -command lines, and what syntax they use. When the shell is -@file{/bin/sh}, a @samp{#} starts a comment that extends to the end of -the line. The @samp{#} does not have to be at the beginning of a line. -Text on a line before a @samp{#} is not part of the comment. - -@menu -* Echoing:: How to control when commands are echoed. -* Execution:: How commands are executed. -* Parallel:: How commands can be executed in parallel. -* Errors:: What happens after a command execution error. -* Interrupts:: What happens when a command is interrupted. -* Recursion:: Invoking @code{make} from makefiles. -* Sequences:: Defining canned sequences of commands. -* Empty Commands:: Defining useful, do-nothing commands. -@end menu - -@node Echoing, Execution, , Commands -@section Command Echoing -@cindex echoing of commands -@cindex silent operation -@cindex @code{@@} (in commands) -@cindex commands, echoing -@cindex printing of commands - -Normally @code{make} prints each command line before it is executed. -We call this @dfn{echoing} because it gives the appearance that you -are typing the commands yourself. - -When a line starts with @samp{@@}, the echoing of that line is suppressed. -The @samp{@@} is discarded before the command is passed to the shell. -Typically you would use this for a command whose only effect is to print -something, such as an @code{echo} command to indicate progress through -the makefile: - -@example -@@echo About to make distribution files -@end example - -@cindex @code{-n} -@cindex @code{--just-print} -@cindex @code{--dry-run} -@cindex @code{--recon} -When @code{make} is given the flag @samp{-n} or @samp{--just-print}, -echoing is all that happens, no execution. @xref{Options Summary, -,Summary of Options}. In this case and only this case, even the -commands starting with @samp{@@} are printed. This flag is useful for -finding out which commands @code{make} thinks are necessary without -actually doing them. - -@cindex @code{-s} -@cindex @code{--silent} -@cindex @code{--quiet} -@findex .SILENT -The @samp{-s} or @samp{--silent} -flag to @code{make} prevents all echoing, as if all commands -started with @samp{@@}. A rule in the makefile for the special target -@code{.SILENT} without dependencies has the same effect -(@pxref{Special Targets, ,Special Built-in Target Names}). -@code{.SILENT} is essentially obsolete since @samp{@@} is more flexible.@refill - -@node Execution, Parallel, Echoing, Commands -@section Command Execution -@cindex commands, execution -@cindex execution, of commands -@cindex shell command, execution -@vindex SHELL @r{(command execution)} - -When it is time to execute commands to update a target, they are executed -by making a new subshell for each line. (In practice, @code{make} may -take shortcuts that do not affect the results.) - -@cindex @code{cd} (shell command) -@strong{Please note:} this implies that shell commands such as -@code{cd} that set variables local to each process will not affect the -following command lines. If you want to use @code{cd} to affect the -next command, put the two on a single line with a semicolon between -them. Then @code{make} will consider them a single command and pass -them, together, to a shell which will execute them in sequence. For -example: - -@example -foo : bar/lose - cd bar; gobble lose > ../foo -@end example - -@cindex commands, backslash (@code{\}) in -@cindex commands, quoting newlines in -@cindex backslash (@code{\}), in commands -@cindex @code{\} (backslash), in commands -@cindex quoting newline, in commands -@cindex newline, quoting, in commands -If you would like to split a single shell command into multiple lines of -text, you must use a backslash at the end of all but the last subline. -Such a sequence of lines is combined into a single line, by deleting the -backslash-newline sequences, before passing it to the shell. Thus, the -following is equivalent to the preceding example: - -@example -@group -foo : bar/lose - cd bar; \ - gobble lose > ../foo -@end group -@end example - -@vindex SHELL -The program used as the shell is taken from the variable @code{SHELL}. -By default, the program @file{/bin/sh} is used. - -@cindex environment, @code{SHELL} in -Unlike most variables, the variable @code{SHELL} is never set from the -environment. This is because the @code{SHELL} environment variable is -used to specify your personal choice of shell program for interactive -use. It would be very bad for personal choices like this to affect -the functioning of makefiles. @xref{Environment, ,Variables from the -Environment}. - -@node Parallel, Errors, Execution, Commands -@section Parallel Execution -@cindex commands, execution in parallel -@cindex parallel execution -@cindex execution, in parallel -@cindex job slots -@cindex @code{-j} -@cindex @code{--jobs} - -GNU @code{make} knows how to execute several commands at once. -Normally, @code{make} will execute only one command at a time, waiting -for it to finish before executing the next. However, the @samp{-j} or -@samp{--jobs} option tells @code{make} to execute many commands -simultaneously.@refill - -If the @samp{-j} option is followed by an integer, this is the number of -commands to execute at once; this is called the number of @dfn{job slots}. -If there is nothing looking like an integer after the @samp{-j} option, -there is no limit on the number of job slots. The default number of job -slots is one, which means serial execution (one thing at a time). - -One unpleasant consequence of running several commands simultaneously is -that output from all of the commands comes when the commands send it, so -messages from different commands may be interspersed. - -Another problem is that two processes cannot both take input from the -same device; so to make sure that only one command tries to take input -from the terminal at once, @code{make} will invalidate the standard -input streams of all but one running command. This means that -attempting to read from standard input will usually be a fatal error (a -@samp{Broken pipe} signal) for most child processes if there are -several. -@cindex broken pipe -@cindex standard input - -It is unpredictable which command will have a valid standard input stream -(which will come from the terminal, or wherever you redirect the standard -input of @code{make}). The first command run will always get it first, and -the first command started after that one finishes will get it next, and so -on. - -We will change how this aspect of @code{make} works if we find a better -alternative. In the mean time, you should not rely on any command using -standard input at all if you are using the parallel execution feature; but -if you are not using this feature, then standard input works normally in -all commands. - -If a command fails (is killed by a signal or exits with a nonzero -status), and errors are not ignored for that command -(@pxref{Errors, ,Errors in Commands}), -the remaining command lines to remake the same target will not be run. -If a command fails and the @samp{-k} or @samp{--keep-going} -option was not given -(@pxref{Options Summary, ,Summary of Options}), -@code{make} aborts execution. If make -terminates for any reason (including a signal) with child processes -running, it waits for them to finish before actually exiting.@refill - -@cindex load average -@cindex limiting jobs based on load -@cindex jobs, limiting based on load -@cindex @code{-l} (load average) -@cindex @code{--max-load} -@cindex @code{--load-average} -When the system is heavily loaded, you will probably want to run fewer jobs -than when it is lightly loaded. You can use the @samp{-l} option to tell -@code{make} to limit the number of jobs to run at once, based on the load -average. The @samp{-l} or @samp{--max-load} -option is followed by a floating-point number. For -example, - -@example --l 2.5 -@end example - -@noindent -will not let @code{make} start more than one job if the load average is -above 2.5. The @samp{-l} option with no following number removes the -load limit, if one was given with a previous @samp{-l} option.@refill - -More precisely, when @code{make} goes to start up a job, and it already has -at least one job running, it checks the current load average; if it is not -lower than the limit given with @samp{-l}, @code{make} waits until the load -average goes below that limit, or until all the other jobs finish. - -By default, there is no load limit. - -@node Errors, Interrupts, Parallel, Commands -@section Errors in Commands -@cindex errors (in commands) -@cindex commands, errors in -@cindex exit status (errors) - -After each shell command returns, @code{make} looks at its exit status. -If the command completed successfully, the next command line is executed -in a new shell; after the last command line is finished, the rule is -finished. - -If there is an error (the exit status is nonzero), @code{make} gives up on -the current rule, and perhaps on all rules. - -Sometimes the failure of a certain command does not indicate a problem. -For example, you may use the @code{mkdir} command to ensure that a -directory exists. If the directory already exists, @code{mkdir} will -report an error, but you probably want @code{make} to continue regardless. - -@cindex @code{-} (in commands) -To ignore errors in a command line, write a @samp{-} at the beginning of -the line's text (after the initial tab). The @samp{-} is discarded before -the command is passed to the shell for execution. - -For example, - -@example -@group -clean: - -rm -f *.o -@end group -@end example -@cindex @code{rm} (shell command) - -@noindent -This causes @code{rm} to continue even if it is unable to remove a file. - -@cindex @code{-i} -@cindex @code{--ignore-errors} -@findex .IGNORE -When you run @code{make} with the @samp{-i} or @samp{--ignore-errors} -flag, errors are ignored in all commands of all rules. A rule in the -makefile for the special target @code{.IGNORE} has the same effect, if -there are no dependencies. These ways of ignoring errors are obsolete -because @samp{-} is more flexible. - -When errors are to be ignored, because of either a @samp{-} or the -@samp{-i} flag, @code{make} treats an error return just like success, -except that it prints out a message that tells you the status code -the command exited with, and says that the error has been ignored. - -When an error happens that @code{make} has not been told to ignore, -it implies that the current target cannot be correctly remade, and neither -can any other that depends on it either directly or indirectly. No further -commands will be executed for these targets, since their preconditions -have not been achieved. - - -@cindex @code{-k} -@cindex @code{--keep-going} -Normally @code{make} gives up immediately in this circumstance, returning a -nonzero status. However, if the @samp{-k} or @samp{--keep-going} -flag is specified, @code{make} -continues to consider the other dependencies of the pending targets, -remaking them if necessary, before it gives up and returns nonzero status. -For example, after an error in compiling one object file, @samp{make -k} -will continue compiling other object files even though it already knows -that linking them will be impossible. @xref{Options Summary, ,Summary of Options}. - -The usual behavior assumes that your purpose is to get the specified -targets up to date; once @code{make} learns that this is impossible, it -might as well report the failure immediately. The @samp{-k} option says -that the real purpose is to test as many of the changes made in the -program as possible, perhaps to find several independent problems so -that you can correct them all before the next attempt to compile. This -is why Emacs' @code{compile} command passes the @samp{-k} flag by -default. -@cindex Emacs (@code{M-x compile}) - -@findex .DELETE_ON_ERROR -@cindex deletion of target files -@cindex removal of target files -@cindex target, deleting on error -Usually when a command fails, if it has changed the target file at all, -the file is corrupted and cannot be used---or at least it is not -completely updated. Yet the file's timestamp says that it is now up to -date, so the next time @code{make} runs, it will not try to update that -file. The situation is just the same as when the command is killed by a -signal; @pxref{Interrupts}. So generally the right thing to do is to -delete the target file if the command fails after beginning to change -the file. @code{make} will do this if @code{.DELETE_ON_ERROR} appears -as a target. This is almost always what you want @code{make} to do, but -it is not historical practice; so for compatibility, you must explicitly -request it. - -@node Interrupts, Recursion, Errors, Commands -@section Interrupting or Killing @code{make} -@cindex interrupt -@cindex signal -@cindex deletion of target files -@cindex removal of target files -@cindex target, deleting on interrupt -@cindex killing (interruption) - -If @code{make} gets a fatal signal while a command is executing, it may -delete the target file that the command was supposed to update. This is -done if the target file's last-modification time has changed since -@code{make} first checked it. - -The purpose of deleting the target is to make sure that it is remade from -scratch when @code{make} is next run. Why is this? Suppose you type -@kbd{Ctrl-c} while a compiler is running, and it has begun to write an -object file @file{foo.o}. The @kbd{Ctrl-c} kills the compiler, resulting -in an incomplete file whose last-modification time is newer than the source -file @file{foo.c}. But @code{make} also receives the @kbd{Ctrl-c} signal -and deletes this incomplete file. If @code{make} did not do this, the next -invocation of @code{make} would think that @file{foo.o} did not require -updating---resulting in a strange error message from the linker when it -tries to link an object file half of which is missing. - -@findex .PRECIOUS -You can prevent the deletion of a target file in this way by making the -special target @code{.PRECIOUS} depend on it. Before remaking a target, -@code{make} checks to see whether it appears on the dependencies of -@code{.PRECIOUS}, and thereby decides whether the target should be deleted -if a signal happens. Some reasons why you might do this are that the -target is updated in some atomic fashion, or exists only to record a -modification-time (its contents do not matter), or must exist at all -times to prevent other sorts of trouble. - -@node Recursion, Sequences, Interrupts, Commands -@section Recursive Use of @code{make} -@cindex recursion -@cindex subdirectories, recursion for - -Recursive use of @code{make} means using @code{make} as a command in a -makefile. This technique is useful when you want separate makefiles for -various subsystems that compose a larger system. For example, suppose you -have a subdirectory @file{subdir} which has its own makefile, and you would -like the containing directory's makefile to run @code{make} on the -subdirectory. You can do it by writing this: - -@example -subsystem: - cd subdir; $(MAKE) -@end example - -@noindent -or, equivalently, this (@pxref{Options Summary, ,Summary of Options}): - -@example -subsystem: - $(MAKE) -C subdir -@end example -@cindex @code{-C} -@cindex @code{--directory} - -You can write recursive @code{make} commands just by copying this example, -but there are many things to know about how they work and why, and about -how the sub-@code{make} relates to the top-level @code{make}. - -@menu -* MAKE Variable:: The special effects of using @samp{$(MAKE)}. -* Variables/Recursion:: How to communicate variables to a sub-@code{make}. -* Options/Recursion:: How to communicate options to a sub-@code{make}. -* -w Option:: How the @samp{-w} or @samp{--print-directory} option - helps debug use of recursive @code{make} commands. -@end menu - -@node MAKE Variable, Variables/Recursion, , Recursion -@subsection How the @code{MAKE} Variable Works -@vindex MAKE -@cindex recursion, and @code{MAKE} variable - -Recursive @code{make} commands should always use the variable @code{MAKE}, -not the explicit command name @samp{make}, as shown here: - -@example -@group -subsystem: - cd subdir; $(MAKE) -@end group -@end example - -The value of this variable is the file name with which @code{make} was -invoked. If this file name was @file{/bin/make}, then the command executed -is @samp{cd subdir; /bin/make}. If you use a special version of -@code{make} to run the top-level makefile, the same special version will be -executed for recursive invocations. -@cindex @code{cd} (shell command) - -As a special feature, using the variable @code{MAKE} in the commands of -a rule alters the effects of the @samp{-t} (@samp{--touch}), @samp{-n} -(@samp{--just-print}), or @samp{-q} (@w{@samp{--question}}) option. -Using the @code{MAKE} variable has the same effect as using a @samp{+} -character at the beginning of the command line. @xref{Instead of -Execution, ,Instead of Executing the Commands}.@refill - -Consider the command @samp{make -t} in the above example. (The -@samp{-t} option marks targets as up to date without actually running -any commands; see @ref{Instead of Execution}.) Following the usual -definition of @samp{-t}, a @samp{make -t} command in the example would -create a file named @file{subsystem} and do nothing else. What you -really want it to do is run @samp{@w{cd subdir;} @w{make -t}}; but that would -require executing the command, and @samp{-t} says not to execute -commands.@refill -@cindex @code{-t}, and recursion -@cindex recursion, and @code{-t} -@cindex @code{--touch}, and recursion - -The special feature makes this do what you want: whenever a command -line of a rule contains the variable @code{MAKE}, the flags @samp{-t}, -@samp{-n} and @samp{-q} do not apply to that line. Command lines -containing @code{MAKE} are executed normally despite the presence of a -flag that causes most commands not to be run. The usual -@code{MAKEFLAGS} mechanism passes the flags to the sub-@code{make} -(@pxref{Options/Recursion, ,Communicating Options to a -Sub-@code{make}}), so your request to touch the files, or print the -commands, is propagated to the subsystem.@refill - -@node Variables/Recursion, Options/Recursion, MAKE Variable, Recursion -@subsection Communicating Variables to a Sub-@code{make} -@cindex sub-@code{make} -@cindex environment, and recursion -@cindex exporting variables -@cindex variables, environment -@cindex variables, exporting -@cindex recursion, and environment -@cindex recursion, and variables - -Variable values of the top-level @code{make} can be passed to the -sub-@code{make} through the environment by explicit request. These -variables are defined in the sub-@code{make} as defaults, but do not -override what is specified in the makefile used by the sub-@code{make} -makefile unless you use the @samp{-e} switch (@pxref{Options Summary, -,Summary of Options}).@refill - -To pass down, or @dfn{export}, a variable, @code{make} adds the variable -and its value to the environment for running each command. The -sub-@code{make}, in turn, uses the environment to initialize its table -of variable values. @xref{Environment, ,Variables from the -Environment}. - -Except by explicit request, @code{make} exports a variable only if it -is either defined in the environment initially or set on the command -line, and if its name consists only of letters, numbers, and underscores. -Some shells cannot cope with environment variable names consisting of -characters other than letters, numbers, and underscores. - -The special variables @code{SHELL} and @code{MAKEFLAGS} are always -exported (unless you unexport them). -@code{MAKEFILES} is exported if you set it to anything. - -@code{make} automatically passes down variable values that were defined -on the command line, by putting them in the @code{MAKEFLAGS} variable. -@iftex -See the next section. -@end iftex -@ifinfo -@xref{Options/Recursion}. -@end ifinfo - -Variables are @emph{not} normally passed down if they were created by -default by @code{make} (@pxref{Implicit Variables, ,Variables Used by -Implicit Rules}). The sub-@code{make} will define these for -itself.@refill - -@findex export -If you want to export specific variables to a sub-@code{make}, use the -@code{export} directive, like this: - -@example -export @var{variable} @dots{} -@end example - -@noindent -@findex unexport -If you want to @emph{prevent} a variable from being exported, use the -@code{unexport} directive, like this: - -@example -unexport @var{variable} @dots{} -@end example - -@noindent -As a convenience, you can define a variable and export it at the same -time by doing: - -@example -export @var{variable} = value -@end example - -@noindent -has the same result as: - -@example -@var{variable} = value -export @var{variable} -@end example - -@noindent -and - -@example -export @var{variable} := value -@end example - -@noindent -has the same result as: - -@example -@var{variable} := value -export @var{variable} -@end example - -Likewise, - -@example -export @var{variable} += value -@end example - -@noindent -is just like: - -@example -@var{variable} += value -export @var{variable} -@end example - -@noindent -@xref{Appending, ,Appending More Text to Variables}. - -You may notice that the @code{export} and @code{unexport} directives -work in @code{make} in the same way they work in the shell, @code{sh}. - -If you want all variables to be exported by default, you can use -@code{export} by itself: - -@example -export -@end example - -@noindent -This tells @code{make} that variables which are not explicitly mentioned -in an @code{export} or @code{unexport} directive should be exported. -Any variable given in an @code{unexport} directive will still @emph{not} -be exported. If you use @code{export} by itself to export variables by -default, variables whose names contain characters other than -alphanumerics and underscores will not be exported unless specifically -mentioned in an @code{export} directive.@refill - -@findex .EXPORT_ALL_VARIABLES -The behavior elicited by an @code{export} directive by itself was the -default in older versions of GNU @code{make}. If your makefiles depend -on this behavior and you want to be compatible with old versions of -@code{make}, you can write a rule for the special target -@code{.EXPORT_ALL_VARIABLES} instead of using the @code{export} directive. -This will be ignored by old @code{make}s, while the @code{export} -directive will cause a syntax error.@refill -@cindex compatibility in exporting - -Likewise, you can use @code{unexport} by itself to tell @code{make} -@emph{not} to export variables by default. Since this is the default -behavior, you would only need to do this if @code{export} had been used -by itself earlier (in an included makefile, perhaps). You -@strong{cannot} use @code{export} and @code{unexport} by themselves to -have variables exported for some commands and not for others. The last -@code{export} or @code{unexport} directive that appears by itself -determines the behavior for the entire run of @code{make}.@refill - -@vindex MAKELEVEL -@cindex recursion, level of -As a special feature, the variable @code{MAKELEVEL} is changed when it -is passed down from level to level. This variable's value is a string -which is the depth of the level as a decimal number. The value is -@samp{0} for the top-level @code{make}; @samp{1} for a sub-@code{make}, -@samp{2} for a sub-sub-@code{make}, and so on. The incrementation -happens when @code{make} sets up the environment for a command.@refill - -The main use of @code{MAKELEVEL} is to test it in a conditional -directive (@pxref{Conditionals, ,Conditional Parts of Makefiles}); this -way you can write a makefile that behaves one way if run recursively and -another way if run directly by you.@refill - -@vindex MAKEFILES -You can use the variable @code{MAKEFILES} to cause all sub-@code{make} -commands to use additional makefiles. The value of @code{MAKEFILES} is -a whitespace-separated list of file names. This variable, if defined in -the outer-level makefile, is passed down through the environment; then -it serves as a list of extra makefiles for the sub-@code{make} to read -before the usual or specified ones. @xref{MAKEFILES Variable, ,The -Variable @code{MAKEFILES}}.@refill - -@node Options/Recursion, -w Option, Variables/Recursion, Recursion -@subsection Communicating Options to a Sub-@code{make} -@cindex options, and recursion -@cindex recursion, and options - -@vindex MAKEFLAGS -Flags such as @samp{-s} and @samp{-k} are passed automatically to the -sub-@code{make} through the variable @code{MAKEFLAGS}. This variable is -set up automatically by @code{make} to contain the flag letters that -@code{make} received. Thus, if you do @w{@samp{make -ks}} then -@code{MAKEFLAGS} gets the value @samp{ks}.@refill - -As a consequence, every sub-@code{make} gets a value for @code{MAKEFLAGS} -in its environment. In response, it takes the flags from that value and -processes them as if they had been given as arguments. -@xref{Options Summary, ,Summary of Options}. - -@cindex command line variable definitions, and recursion -@cindex variables, command line, and recursion -@cindex recursion, and command line variable definitions -Likewise variables defined on the command line are passed to the -sub-@code{make} through @code{MAKEFLAGS}. Words in the value of -@code{MAKEFLAGS} that contain @samp{=}, @code{make} treats as variable -definitions just as if they appeared on the command line. -@xref{Overriding, ,Overriding Variables}. - -@cindex @code{-C}, and recursion -@cindex @code{-f}, and recursion -@cindex @code{-o}, and recursion -@cindex @code{-W}, and recursion -@cindex @code{--directory}, and recursion -@cindex @code{--file}, and recursion -@cindex @code{--old-file}, and recursion -@cindex @code{--assume-old}, and recursion -@cindex @code{--assume-new}, and recursion -@cindex @code{--new-file}, and recursion -@cindex recursion, and @code{-C} -@cindex recursion, and @code{-f} -@cindex recursion, and @code{-o} -@cindex recursion, and @code{-W} -The options @samp{-C}, @samp{-f}, @samp{-o}, and @samp{-W} are not put -into @code{MAKEFLAGS}; these options are not passed down.@refill - -@cindex @code{-j}, and recursion -@cindex @code{--jobs}, and recursion -@cindex recursion, and @code{-j} -@cindex job slots, and recursion -The @samp{-j} option is a special case (@pxref{Parallel, ,Parallel Execution}). -If you set it to some numeric value, @samp{-j 1} is always put into -@code{MAKEFLAGS} instead of the value you specified. This is because if -the @w{@samp{-j}} option were passed down to sub-@code{make}s, you would -get many more jobs running in parallel than you asked for. If you give -@samp{-j} with no numeric argument, meaning to run as many jobs as -possible in parallel, this is passed down, since multiple infinities are -no more than one.@refill - -If you do not want to pass the other flags down, you must change the -value of @code{MAKEFLAGS}, like this: - -@example -MAKEFLAGS= -subsystem: - cd subdir; $(MAKE) -@end example - -or like this: - -@example -subsystem: - cd subdir; $(MAKE) MAKEFLAGS= -@end example - -@vindex MAKEOVERRIDES -The command line variable definitions really appear in the variable -@code{MAKEOVERRIDES}, and @code{MAKEFLAGS} contains a reference to this -variable. If you do want to pass flags down normally, but don't want to -pass down the command line variable definitions, you can reset -@code{MAKEOVERRIDES} to empty, like this: - -@example -MAKEOVERRIDES = -@end example - -@noindent -@cindex Arg list too long -@cindex E2BIG -This is not usually useful to do. However, some systems have a small -fixed limit on the size of the environment, and putting so much -information in into the value of @code{MAKEFLAGS} can exceed it. -If you see the error message @samp{Arg list too long}, this may be the problem. -@findex .POSIX -@cindex POSIX.2 -(For strict compliance with POSIX.2, changing @code{MAKEOVERRIDES} does -not affect @code{MAKEFLAGS} if the special target @samp{.POSIX} appears -in the makefile. You probably do not care about this.) - -@vindex MFLAGS -A similar variable @code{MFLAGS} exists also, for historical -compatibility. It has the same value as @code{MAKEFLAGS} except that it -does not contain the command line variable definitions, and it always -begins with a hyphen unless it is empty (@code{MAKEFLAGS} begins with a -hyphen only when it begins with an option that has no single-letter -version, such as @samp{--warn-undefined-variables}). @code{MFLAGS} was -traditionally used explicitly in the recursive @code{make} command, like -this: - -@example -subsystem: - cd subdir; $(MAKE) $(MFLAGS) -@end example - -@noindent -but now @code{MAKEFLAGS} makes this usage redundant. If you want your -makefiles to be compatible with old @code{make} programs, use this -technique; it will work fine with more modern @code{make} versions too. - -@cindex setting options from environment -@cindex options, setting from environment -@cindex setting options in makefiles -@cindex options, setting in makefiles -The @code{MAKEFLAGS} variable can also be useful if you want to have -certain options, such as @samp{-k} (@pxref{Options Summary, ,Summary of -Options}), set each time you run @code{make}. You simply put a value for -@code{MAKEFLAGS} in your environment. You can also set @code{MAKEFLAGS} in -a makefile, to specify additional flags that should also be in effect for -that makefile. (Note that you cannot use @code{MFLAGS} this way. That -variable is set only for compatibility; @code{make} does not interpret a -value you set for it in any way.) - -When @code{make} interprets the value of @code{MAKEFLAGS} (either from the -environment or from a makefile), it first prepends a hyphen if the value -does not already begin with one. Then it chops the value into words -separated by blanks, and parses these words as if they were options given -on the command line (except that @samp{-C}, @samp{-f}, @samp{-h}, -@samp{-o}, @samp{-W}, and their long-named versions are ignored; and there -is no error for an invalid option). - -If you do put @code{MAKEFLAGS} in your environment, you should be sure not -to include any options that will drastically affect the actions of -@code{make} and undermine the purpose of makefiles and of @code{make} -itself. For instance, the @samp{-t}, @samp{-n}, and @samp{-q} options, if -put in one of these variables, could have disastrous consequences and would -certainly have at least surprising and probably annoying effects.@refill - -@node -w Option, , Options/Recursion, Recursion -@subsection The @samp{--print-directory} Option -@cindex directories, printing them -@cindex printing directories -@cindex recursion, and printing directories - -If you use several levels of recursive @code{make} invocations, the -@samp{-w} or @w{@samp{--print-directory}} option can make the output a -lot easier to understand by showing each directory as @code{make} -starts processing it and as @code{make} finishes processing it. For -example, if @samp{make -w} is run in the directory @file{/u/gnu/make}, -@code{make} will print a line of the form:@refill - -@example -make: Entering directory `/u/gnu/make'. -@end example - -@noindent -before doing anything else, and a line of the form: - -@example -make: Leaving directory `/u/gnu/make'. -@end example - -@noindent -when processing is completed. - -@cindex @code{-C}, and @code{-w} -@cindex @code{--directory}, and @code{--print-directory} -@cindex recursion, and @code{-w} -@cindex @code{-w}, and @code{-C} -@cindex @code{-w}, and recursion -@cindex @code{--print-directory}, and @code{--directory} -@cindex @code{--print-directory}, and recursion -@cindex @code{--no-print-directory} -@cindex @code{--print-directory}, disabling -@cindex @code{-w}, disabling -Normally, you do not need to specify this option because @samp{make} -does it for you: @samp{-w} is turned on automatically when you use the -@samp{-C} option, and in sub-@code{make}s. @code{make} will not -automatically turn on @samp{-w} if you also use @samp{-s}, which says to -be silent, or if you use @samp{--no-print-directory} to explicitly -disable it. - -@node Sequences, Empty Commands, Recursion, Commands -@section Defining Canned Command Sequences -@cindex sequences of commands -@cindex commands, sequences of - -When the same sequence of commands is useful in making various targets, you -can define it as a canned sequence with the @code{define} directive, and -refer to the canned sequence from the rules for those targets. The canned -sequence is actually a variable, so the name must not conflict with other -variable names. - -Here is an example of defining a canned sequence of commands: - -@example -define run-yacc -yacc $(firstword $^) -mv y.tab.c $@@ -endef -@end example -@cindex @code{yacc} - -@noindent -Here @code{run-yacc} is the name of the variable being defined; -@code{endef} marks the end of the definition; the lines in between are the -commands. The @code{define} directive does not expand variable references -and function calls in the canned sequence; the @samp{$} characters, -parentheses, variable names, and so on, all become part of the value of the -variable you are defining. -@xref{Defining, ,Defining Variables Verbatim}, -for a complete explanation of @code{define}. - -The first command in this example runs Yacc on the first dependency of -whichever rule uses the canned sequence. The output file from Yacc is -always named @file{y.tab.c}. The second command moves the output to the -rule's target file name. - -To use the canned sequence, substitute the variable into the commands of a -rule. You can substitute it like any other variable -(@pxref{Reference, ,Basics of Variable References}). -Because variables defined by @code{define} are recursively expanded -variables, all the variable references you wrote inside the @code{define} -are expanded now. For example: - -@example -foo.c : foo.y - $(run-yacc) -@end example - -@noindent -@samp{foo.y} will be substituted for the variable @samp{$^} when it occurs in -@code{run-yacc}'s value, and @samp{foo.c} for @samp{$@@}.@refill - -This is a realistic example, but this particular one is not needed in -practice because @code{make} has an implicit rule to figure out these -commands based on the file names involved -(@pxref{Implicit Rules, ,Using Implicit Rules}). - -@cindex @@, and @code{define} -@cindex -, and @code{define} -@cindex +, and @code{define} -In command execution, each line of a canned sequence is treated just as -if the line appeared on its own in the rule, preceded by a tab. In -particular, @code{make} invokes a separate subshell for each line. You -can use the special prefix characters that affect command lines -(@samp{@@}, @samp{-}, and @samp{+}) on each line of a canned sequence. -@xref{Commands, ,Writing the Commands in Rules}. -For example, using this canned sequence: - -@example -define frobnicate -@@echo "frobnicating target $@@" -frob-step-1 $< -o $@@-step-1 -frob-step-2 $@@-step-1 -o $@@ -endef -@end example - -@noindent -@code{make} will not echo the first line, the @code{echo} command. -But it @emph{will} echo the following two command lines. - -On the other hand, prefix characters on the command line that refers to -a canned sequence apply to every line in the sequence. So the rule: - -@example -frob.out: frob.in - @@$(frobnicate) -@end example - -@noindent -does not echo @emph{any} commands. -(@xref{Echoing, ,Command Echoing}, for a full explanation of @samp{@@}.) - -@node Empty Commands, , Sequences, Commands -@section Using Empty Commands -@cindex empty commands -@cindex commands, empty - -It is sometimes useful to define commands which do nothing. This is done -simply by giving a command that consists of nothing but whitespace. For -example: - -@example -target: ; -@end example - -@noindent -defines an empty command string for @file{target}. You could also use a -line beginning with a tab character to define an empty command string, -but this would be confusing because such a line looks empty. - -@findex .DEFAULT@r{, and empty commands} -You may be wondering why you would want to define a command string that -does nothing. The only reason this is useful is to prevent a target -from getting implicit commands (from implicit rules or the -@code{.DEFAULT} special target; @pxref{Implicit Rules} and -@pxref{Last Resort, ,Defining Last-Resort Default Rules}).@refill - -You may be inclined to define empty command strings for targets that are -not actual files, but only exist so that their dependencies can be -remade. However, this is not the best way to do that, because the -dependencies may not be remade properly if the target file actually does exist. -@xref{Phony Targets, ,Phony Targets}, for a better way to do this. - -@node Using Variables, Conditionals, Commands, Top -@chapter How to Use Variables -@cindex variable -@cindex value -@cindex recursive variable expansion -@cindex simple variable expansion - -A @dfn{variable} is a name defined in a makefile to represent a string -of text, called the variable's @dfn{value}. These values are -substituted by explicit request into targets, dependencies, commands, -and other parts of the makefile. (In some other versions of @code{make}, -variables are called @dfn{macros}.) -@cindex macro - -Variables and functions in all parts of a makefile are expanded when -read, except for the shell commands in rules, the right-hand sides of -variable definitions using @samp{=}, and the bodies of variable -definitions using the @code{define} directive.@refill - -Variables can represent lists of file names, options to pass to compilers, -programs to run, directories to look in for source files, directories to -write output in, or anything else you can imagine. - -A variable name may be any sequence of characters not containing @samp{:}, -@samp{#}, @samp{=}, or leading or trailing whitespace. However, -variable names containing characters other than letters, numbers, and -underscores should be avoided, as they may be given special meanings in the -future, and with some shells they cannot be passed through the environment to a -sub-@code{make} -(@pxref{Variables/Recursion, ,Communicating Variables to a Sub-@code{make}}). - -Variable names are case-sensitive. The names @samp{foo}, @samp{FOO}, -and @samp{Foo} all refer to different variables. - -It is traditional to use upper case letters in variable names, but we -recommend using lower case letters for variable names that serve internal -purposes in the makefile, and reserving upper case for parameters that -control implicit rules or for parameters that the user should override with -command options (@pxref{Overriding, ,Overriding Variables}). - -A few variables have names that are a single punctuation character or -just a few characters. These are the @dfn{automatic variables}, and -they have particular specialized uses. @xref{Automatic, ,Automatic Variables}. - -@menu -* Reference:: How to use the value of a variable. -* Flavors:: Variables come in two flavors. -* Advanced:: Advanced features for referencing a variable. -* Values:: All the ways variables get their values. -* Setting:: How to set a variable in the makefile. -* Appending:: How to append more text to the old value - of a variable. -* Override Directive:: How to set a variable in the makefile even if - the user has set it with a command argument. -* Defining:: An alternate way to set a variable - to a verbatim string. -* Environment:: Variable values can come from the environment. -* Automatic:: Some special variables have predefined - meanings for use with implicit rules. -@end menu - -@node Reference, Flavors, , Using Variables -@section Basics of Variable References -@cindex variables, how to reference -@cindex reference to variables -@cindex @code{$}, in variable reference -@cindex dollar sign (@code{$}), in variable reference - -To substitute a variable's value, write a dollar sign followed by the name -of the variable in parentheses or braces: either @samp{$(foo)} or -@samp{$@{foo@}} is a valid reference to the variable @code{foo}. This -special significance of @samp{$} is why you must write @samp{$$} to have -the effect of a single dollar sign in a file name or command. - -Variable references can be used in any context: targets, dependencies, -commands, most directives, and new variable values. Here is an -example of a common case, where a variable holds the names of all the -object files in a program: - -@example -@group -objects = program.o foo.o utils.o -program : $(objects) - cc -o program $(objects) - -$(objects) : defs.h -@end group -@end example - -Variable references work by strict textual substitution. Thus, the rule - -@example -@group -foo = c -prog.o : prog.$(foo) - $(foo)$(foo) -$(foo) prog.$(foo) -@end group -@end example - -@noindent -could be used to compile a C program @file{prog.c}. Since spaces before -the variable value are ignored in variable assignments, the value of -@code{foo} is precisely @samp{c}. (Don't actually write your makefiles -this way!) - -A dollar sign followed by a character other than a dollar sign, -open-parenthesis or open-brace treats that single character as the -variable name. Thus, you could reference the variable @code{x} with -@samp{$x}. However, this practice is strongly discouraged, except in -the case of the automatic variables (@pxref{Automatic, ,Automatic Variables}). - -@node Flavors, Advanced, Reference, Using Variables -@section The Two Flavors of Variables -@cindex flavors of variables -@cindex recursive variable expansion -@cindex variables, flavors -@cindex recursively expanded variables -@cindex variables, recursively expanded - -There are two ways that a variable in GNU @code{make} can have a value; -we call them the two @dfn{flavors} of variables. The two flavors are -distinguished in how they are defined and in what they do when expanded. - -@cindex = -The first flavor of variable is a @dfn{recursively expanded} variable. -Variables of this sort are defined by lines using @samp{=} -(@pxref{Setting, ,Setting Variables}) or by the @code{define} directive -(@pxref{Defining, ,Defining Variables Verbatim}). The value you specify -is installed verbatim; if it contains references to other variables, -these references are expanded whenever this variable is substituted (in -the course of expanding some other string). When this happens, it is -called @dfn{recursive expansion}.@refill - -For example, - -@example -foo = $(bar) -bar = $(ugh) -ugh = Huh? - -all:;echo $(foo) -@end example - -@noindent -will echo @samp{Huh?}: @samp{$(foo)} expands to @samp{$(bar)} which -expands to @samp{$(ugh)} which finally expands to @samp{Huh?}.@refill - -This flavor of variable is the only sort supported by other versions of -@code{make}. It has its advantages and its disadvantages. An advantage -(most would say) is that: - -@example -CFLAGS = $(include_dirs) -O -include_dirs = -Ifoo -Ibar -@end example - -@noindent -will do what was intended: when @samp{CFLAGS} is expanded in a command, -it will expand to @samp{-Ifoo -Ibar -O}. A major disadvantage is that you -cannot append something on the end of a variable, as in - -@example -CFLAGS = $(CFLAGS) -O -@end example - -@noindent -because it will cause an infinite loop in the variable expansion. -(Actually @code{make} detects the infinite loop and reports an error.) -@cindex loops in variable expansion -@cindex variables, loops in expansion - -Another disadvantage is that any functions -(@pxref{Functions, ,Functions for Transforming Text}) -referenced in the definition will be executed every time the variable is -expanded. This makes @code{make} run slower; worse, it causes the -@code{wildcard} and @code{shell} functions to give unpredictable results -because you cannot easily control when they are called, or even how many -times. - -To avoid all the problems and inconveniences of recursively expanded -variables, there is another flavor: simply expanded variables. - -@cindex simply expanded variables -@cindex variables, simply expanded -@cindex := -@dfn{Simply expanded variables} are defined by lines using @samp{:=} -(@pxref{Setting, ,Setting Variables}). -The value of a simply expanded variable is scanned -once and for all, expanding any references to other variables and -functions, when the variable is defined. The actual value of the simply -expanded variable is the result of expanding the text that you write. -It does not contain any references to other variables; it contains their -values @emph{as of the time this variable was defined}. Therefore, - -@example -x := foo -y := $(x) bar -x := later -@end example - -@noindent -is equivalent to - -@example -y := foo bar -x := later -@end example - -When a simply expanded variable is referenced, its value is substituted -verbatim. - -Here is a somewhat more complicated example, illustrating the use of -@samp{:=} in conjunction with the @code{shell} function. -(@xref{Shell Function, , The @code{shell} Function}.) This example -also shows use of the variable @code{MAKELEVEL}, which is changed -when it is passed down from level to level. -(@xref{Variables/Recursion, , Communicating Variables to a -Sub-@code{make}}, for information about @code{MAKELEVEL}.) - -@vindex MAKELEVEL -@vindex MAKE -@example -@group -ifeq (0,$@{MAKELEVEL@}) -cur-dir := $(shell pwd) -whoami := $(shell whoami) -host-type := $(shell arch) -MAKE := $@{MAKE@} host-type=$@{host-type@} whoami=$@{whoami@} -endif -@end group -@end example - -@noindent -An advantage of this use of @samp{:=} is that a typical -`descend into a directory' command then looks like this: - -@example -@group -$@{subdirs@}: - $@{MAKE@} cur-dir=$@{cur-dir@}/$@@ -C $@@ all -@end group -@end example - -Simply expanded variables generally make complicated makefile programming -more predictable because they work like variables in most programming -languages. They allow you to redefine a variable using its own value (or -its value processed in some way by one of the expansion functions) and to -use the expansion functions much more efficiently -(@pxref{Functions, ,Functions for Transforming Text}). - -@cindex spaces, in variable values -@cindex whitespace, in variable values -@cindex variables, spaces in values -You can also use them to introduce controlled leading whitespace into -variable values. Leading whitespace characters are discarded from your -input before substitution of variable references and function calls; -this means you can include leading spaces in a variable value by -protecting them with variable references, like this: - -@example -nullstring := -space := $(nullstring) # end of the line -@end example - -@noindent -Here the value of the variable @code{space} is precisely one space. The -comment @w{@samp{# end of the line}} is included here just for clarity. -Since trailing space characters are @emph{not} stripped from variable -values, just a space at the end of the line would have the same effect -(but be rather hard to read). If you put whitespace at the end of a -variable value, it is a good idea to put a comment like that at the end -of the line to make your intent clear. Conversely, if you do @emph{not} -want any whitespace characters at the end of your variable value, you -must remember not to put a random comment on the end of the line after -some whitespace, such as this: - -@example -dir := /foo/bar # directory to put the frobs in -@end example - -@noindent -Here the value of the variable @code{dir} is @w{@samp{/foo/bar }} -(with four trailing spaces), which was probably not the intention. -(Imagine something like @w{@samp{$(dir)/file}} with this definition!) - -@node Advanced, Values, Flavors, Using Variables -@section Advanced Features for Reference to Variables -@cindex reference to variables - -This section describes some advanced features you can use to reference -variables in more flexible ways. - -@menu -* Substitution Refs:: Referencing a variable with - substitutions on the value. -* Computed Names:: Computing the name of the variable to refer to. -@end menu - -@node Substitution Refs, Computed Names, , Advanced -@subsection Substitution References -@cindex modified variable reference -@cindex substitution variable reference -@cindex variables, modified reference -@cindex variables, substitution reference - -@cindex variables, substituting suffix in -@cindex suffix, substituting in variables -A @dfn{substitution reference} substitutes the value of a variable with -alterations that you specify. It has the form -@samp{$(@var{var}:@var{a}=@var{b})} (or -@samp{$@{@var{var}:@var{a}=@var{b}@}}) and its meaning is to take the value -of the variable @var{var}, replace every @var{a} at the end of a word with -@var{b} in that value, and substitute the resulting string. - -When we say ``at the end of a word'', we mean that @var{a} must appear -either followed by whitespace or at the end of the value in order to be -replaced; other occurrences of @var{a} in the value are unaltered. For -example:@refill - -@example -foo := a.o b.o c.o -bar := $(foo:.o=.c) -@end example - -@noindent -sets @samp{bar} to @samp{a.c b.c c.c}. @xref{Setting, ,Setting Variables}. - -A substitution reference is actually an abbreviation for use of the -@code{patsubst} expansion function (@pxref{Text Functions, ,Functions for String Substitution and Analysis}). We provide -substitution references as well as @code{patsubst} for compatibility with -other implementations of @code{make}. - -@findex patsubst -Another type of substitution reference lets you use the full power of -the @code{patsubst} function. It has the same form -@samp{$(@var{var}:@var{a}=@var{b})} described above, except that now -@var{a} must contain a single @samp{%} character. This case is -equivalent to @samp{$(patsubst @var{a},@var{b},$(@var{var}))}. -@xref{Text Functions, ,Functions for String Substitution and Analysis}, -for a description of the @code{patsubst} function.@refill - -@example -@group -@exdent For example: - -foo := a.o b.o c.o -bar := $(foo:%.o=%.c) -@end group -@end example - -@noindent -sets @samp{bar} to @samp{a.c b.c c.c}. - -@node Computed Names, , Substitution Refs, Advanced -@subsection Computed Variable Names -@cindex nested variable reference -@cindex computed variable name -@cindex variables, computed names -@cindex variables, nested references -@cindex variables, @samp{$} in name -@cindex @code{$}, in variable name -@cindex dollar sign (@code{$}), in variable name - -Computed variable names are a complicated concept needed only for -sophisticated makefile programming. For most purposes you need not -consider them, except to know that making a variable with a dollar sign -in its name might have strange results. However, if you are the type -that wants to understand everything, or you are actually interested in -what they do, read on. - -Variables may be referenced inside the name of a variable. This is -called a @dfn{computed variable name} or a @dfn{nested variable -reference}. For example, - -@example -x = y -y = z -a := $($(x)) -@end example - -@noindent -defines @code{a} as @samp{z}: the @samp{$(x)} inside @samp{$($(x))} expands -to @samp{y}, so @samp{$($(x))} expands to @samp{$(y)} which in turn expands -to @samp{z}. Here the name of the variable to reference is not stated -explicitly; it is computed by expansion of @samp{$(x)}. The reference -@samp{$(x)} here is nested within the outer variable reference. - -The previous example shows two levels of nesting, but any number of levels -is possible. For example, here are three levels: - -@example -x = y -y = z -z = u -a := $($($(x))) -@end example - -@noindent -Here the innermost @samp{$(x)} expands to @samp{y}, so @samp{$($(x))} -expands to @samp{$(y)} which in turn expands to @samp{z}; now we have -@samp{$(z)}, which becomes @samp{u}. - -References to recursively-expanded variables within a variable name are -reexpanded in the usual fashion. For example: - -@example -x = $(y) -y = z -z = Hello -a := $($(x)) -@end example - -@noindent -defines @code{a} as @samp{Hello}: @samp{$($(x))} becomes @samp{$($(y))} -which becomes @samp{$(z)} which becomes @samp{Hello}. - -Nested variable references can also contain modified references and -function invocations (@pxref{Functions, ,Functions for Transforming Text}), -just like any other reference. -For example, using the @code{subst} function -(@pxref{Text Functions, ,Functions for String Substitution and Analysis}): - -@example -@group -x = variable1 -variable2 := Hello -y = $(subst 1,2,$(x)) -z = y -a := $($($(z))) -@end group -@end example - -@noindent -eventually defines @code{a} as @samp{Hello}. It is doubtful that anyone -would ever want to write a nested reference as convoluted as this one, but -it works: @samp{$($($(z)))} expands to @samp{$($(y))} which becomes -@samp{$($(subst 1,2,$(x)))}. This gets the value @samp{variable1} from -@code{x} and changes it by substitution to @samp{variable2}, so that the -entire string becomes @samp{$(variable2)}, a simple variable reference -whose value is @samp{Hello}.@refill - -A computed variable name need not consist entirely of a single variable -reference. It can contain several variable references, as well as some -invariant text. For example, - -@example -@group -a_dirs := dira dirb -1_dirs := dir1 dir2 -@end group - -@group -a_files := filea fileb -1_files := file1 file2 -@end group - -@group -ifeq "$(use_a)" "yes" -a1 := a -else -a1 := 1 -endif -@end group - -@group -ifeq "$(use_dirs)" "yes" -df := dirs -else -df := files -endif - -dirs := $($(a1)_$(df)) -@end group -@end example - -@noindent -will give @code{dirs} the same value as @code{a_dirs}, @code{1_dirs}, -@code{a_files} or @code{1_files} depending on the settings of @code{use_a} -and @code{use_dirs}.@refill - -Computed variable names can also be used in substitution references: - -@example -@group -a_objects := a.o b.o c.o -1_objects := 1.o 2.o 3.o - -sources := $($(a1)_objects:.o=.c) -@end group -@end example - -@noindent -defines @code{sources} as either @samp{a.c b.c c.c} or @samp{1.c 2.c 3.c}, -depending on the value of @code{a1}. - -The only restriction on this sort of use of nested variable references -is that they cannot specify part of the name of a function to be called. -This is because the test for a recognized function name is done before -the expansion of nested references. For example, - -@example -@group -ifdef do_sort -func := sort -else -func := strip -endif -@end group - -@group -bar := a d b g q c -@end group - -@group -foo := $($(func) $(bar)) -@end group -@end example - -@noindent -attempts to give @samp{foo} the value of the variable @samp{sort a d b g -q c} or @samp{strip a d b g q c}, rather than giving @samp{a d b g q c} -as the argument to either the @code{sort} or the @code{strip} function. -This restriction could be removed in the future if that change is shown -to be a good idea. - -You can also use computed variable names in the left-hand side of a -variable assignment, or in a @code{define} directive, as in: - -@example -dir = foo -$(dir)_sources := $(wildcard $(dir)/*.c) -define $(dir)_print -lpr $($(dir)_sources) -endef -@end example - -@noindent -This example defines the variables @samp{dir}, @samp{foo_sources}, and -@samp{foo_print}. - -Note that @dfn{nested variable references} are quite different from -@dfn{recursively expanded variables} -(@pxref{Flavors, ,The Two Flavors of Variables}), though both are -used together in complex ways when doing makefile programming.@refill - -@node Values, Setting, Advanced, Using Variables -@section How Variables Get Their Values -@cindex variables, how they get their values -@cindex value, how a variable gets it - -Variables can get values in several different ways: - -@itemize @bullet -@item -You can specify an overriding value when you run @code{make}. -@xref{Overriding, ,Overriding Variables}. - -@item -You can specify a value in the makefile, either -with an assignment (@pxref{Setting, ,Setting Variables}) or with a -verbatim definition (@pxref{Defining, ,Defining Variables Verbatim}).@refill - -@item -Variables in the environment become @code{make} variables. -@xref{Environment, ,Variables from the Environment}. - -@item -Several @dfn{automatic} variables are given new values for each rule. -Each of these has a single conventional use. -@xref{Automatic, ,Automatic Variables}. - -@item -Several variables have constant initial values. -@xref{Implicit Variables, ,Variables Used by Implicit Rules}. -@end itemize - -@node Setting, Appending, Values, Using Variables -@section Setting Variables -@cindex setting variables -@cindex variables, setting -@cindex = -@cindex := - -To set a variable from the makefile, write a line starting with the -variable name followed by @samp{=} or @samp{:=}. Whatever follows the -@samp{=} or @samp{:=} on the line becomes the value. For example, - -@example -objects = main.o foo.o bar.o utils.o -@end example - -@noindent -defines a variable named @code{objects}. Whitespace around the variable -name and immediately after the @samp{=} is ignored. - -Variables defined with @samp{=} are @dfn{recursively expanded} variables. -Variables defined with @samp{:=} are @dfn{simply expanded} variables; these -definitions can contain variable references which will be expanded before -the definition is made. @xref{Flavors, ,The Two Flavors of Variables}. - -The variable name may contain function and variable references, which -are expanded when the line is read to find the actual variable name to use. - -There is no limit on the length of the value of a variable except the -amount of swapping space on the computer. When a variable definition is -long, it is a good idea to break it into several lines by inserting -backslash-newline at convenient places in the definition. This will not -affect the functioning of @code{make}, but it will make the makefile easier -to read. - -Most variable names are considered to have the empty string as a value if -you have never set them. Several variables have built-in initial values -that are not empty, but you can set them in the usual ways -(@pxref{Implicit Variables, ,Variables Used by Implicit Rules}). -Several special variables are set -automatically to a new value for each rule; these are called the -@dfn{automatic} variables (@pxref{Automatic, ,Automatic Variables}). - -@node Appending, Override Directive, Setting, Using Variables -@section Appending More Text to Variables -@cindex += -@cindex appending to variables -@cindex variables, appending to - -Often it is useful to add more text to the value of a variable already defined. -You do this with a line containing @samp{+=}, like this: - -@example -objects += another.o -@end example - -@noindent -This takes the value of the variable @code{objects}, and adds the text -@samp{another.o} to it (preceded by a single space). Thus: - -@example -objects = main.o foo.o bar.o utils.o -objects += another.o -@end example - -@noindent -sets @code{objects} to @samp{main.o foo.o bar.o utils.o another.o}. - -Using @samp{+=} is similar to: - -@example -objects = main.o foo.o bar.o utils.o -objects := $(objects) another.o -@end example - -@noindent -but differs in ways that become important when you use more complex values. - -When the variable in question has not been defined before, @samp{+=} -acts just like normal @samp{=}: it defines a recursively-expanded -variable. However, when there @emph{is} a previous definition, exactly -what @samp{+=} does depends on what flavor of variable you defined -originally. @xref{Flavors, ,The Two Flavors of Variables}, for an -explanation of the two flavors of variables. - -When you add to a variable's value with @samp{+=}, @code{make} acts -essentially as if you had included the extra text in the initial -definition of the variable. If you defined it first with @samp{:=}, -making it a simply-expanded variable, @samp{+=} adds to that -simply-expanded definition, and expands the new text before appending it -to the old value just as @samp{:=} does -(@pxref{Setting, ,Setting Variables}, for a full explanation of @samp{:=}). -In fact, - -@example -variable := value -variable += more -@end example - -@noindent -is exactly equivalent to: - -@noindent -@example -variable := value -variable := $(variable) more -@end example - -On the other hand, when you use @samp{+=} with a variable that you defined -first to be recursively-expanded using plain @samp{=}, @code{make} does -something a bit different. Recall that when you define a -recursively-expanded variable, @code{make} does not expand the value you set -for variable and function references immediately. Instead it stores the text -verbatim, and saves these variable and function references to be expanded -later, when you refer to the new variable (@pxref{Flavors, ,The Two Flavors -of Variables}). When you use @samp{+=} on a recursively-expanded variable, -it is this unexpanded text to which @code{make} appends the new text you -specify. - -@example -@group -variable = value -variable += more -@end group -@end example - -@noindent -is roughly equivalent to: - -@example -@group -temp = value -variable = $(temp) more -@end group -@end example - -@noindent -except that of course it never defines a variable called @code{temp}. -The importance of this comes when the variable's old value contains -variable references. Take this common example: - -@example -CFLAGS = $(includes) -O -@dots{} -CFLAGS += -pg # enable profiling -@end example - -@noindent -The first line defines the @code{CFLAGS} variable with a reference to another -variable, @code{includes}. (@code{CFLAGS} is used by the rules for C -compilation; @pxref{Catalogue of Rules, ,Catalogue of Implicit Rules}.) -Using @samp{=} for the definition makes @code{CFLAGS} a recursively-expanded -variable, meaning @w{@samp{$(includes) -O}} is @emph{not} expanded when -@code{make} processes the definition of @code{CFLAGS}. Thus, @code{includes} -need not be defined yet for its value to take effect. It only has to be -defined before any reference to @code{CFLAGS}. If we tried to append to the -value of @code{CFLAGS} without using @samp{+=}, we might do it like this: - -@example -CFLAGS := $(CFLAGS) -pg # enable profiling -@end example - -@noindent -This is pretty close, but not quite what we want. Using @samp{:=} -redefines @code{CFLAGS} as a simply-expanded variable; this means -@code{make} expands the text @w{@samp{$(CFLAGS) -pg}} before setting the -variable. If @code{includes} is not yet defined, we get @w{@samp{ -O --pg}}, and a later definition of @code{includes} will have no effect. -Conversely, by using @samp{+=} we set @code{CFLAGS} to the -@emph{unexpanded} value @w{@samp{$(includes) -O -pg}}. Thus we preserve -the reference to @code{includes}, so if that variable gets defined at -any later point, a reference like @samp{$(CFLAGS)} still uses its -value. - -@node Override Directive, Defining, Appending, Using Variables -@section The @code{override} Directive -@findex override -@cindex overriding with @code{override} -@cindex variables, overriding - -If a variable has been set with a command argument -(@pxref{Overriding, ,Overriding Variables}), -then ordinary assignments in the makefile are ignored. If you want to set -the variable in the makefile even though it was set with a command -argument, you can use an @code{override} directive, which is a line that -looks like this:@refill - -@example -override @var{variable} = @var{value} -@end example - -@noindent -or - -@example -override @var{variable} := @var{value} -@end example - -To append more text to a variable defined on the command line, use: - -@example -override @var{variable} += @var{more text} -@end example - -@noindent -@xref{Appending, ,Appending More Text to Variables}. - -The @code{override} directive was not invented for escalation in the war -between makefiles and command arguments. It was invented so you can alter -and add to values that the user specifies with command arguments. - -For example, suppose you always want the @samp{-g} switch when you run the -C compiler, but you would like to allow the user to specify the other -switches with a command argument just as usual. You could use this -@code{override} directive: - -@example -override CFLAGS += -g -@end example - -You can also use @code{override} directives with @code{define} directives. -This is done as you might expect: - -@example -override define foo -bar -endef -@end example - -@noindent -@iftex -See the next section for information about @code{define}. -@end iftex -@ifinfo -@xref{Defining, ,Defining Variables Verbatim}. -@end ifinfo - -@node Defining, Environment, Override Directive, Using Variables -@section Defining Variables Verbatim -@findex define -@findex endef -@cindex verbatim variable definition -@cindex defining variables verbatim -@cindex variables, defining verbatim - -Another way to set the value of a variable is to use the @code{define} -directive. This directive has an unusual syntax which allows newline -characters to be included in the value, which is convenient for defining -canned sequences of commands -(@pxref{Sequences, ,Defining Canned Command Sequences}). - -The @code{define} directive is followed on the same line by the name of the -variable and nothing more. The value to give the variable appears on the -following lines. The end of the value is marked by a line containing just -the word @code{endef}. Aside from this difference in syntax, @code{define} -works just like @samp{=}: it creates a recursively-expanded variable -(@pxref{Flavors, ,The Two Flavors of Variables}). -The variable name may contain function and variable references, which -are expanded when the directive is read to find the actual variable name -to use. - -@example -define two-lines -echo foo -echo $(bar) -endef -@end example - -The value in an ordinary assignment cannot contain a newline; but the -newlines that separate the lines of the value in a @code{define} become -part of the variable's value (except for the final newline which precedes -the @code{endef} and is not considered part of the value).@refill - -@need 800 -The previous example is functionally equivalent to this: - -@example -two-lines = echo foo; echo $(bar) -@end example - -@noindent -since two commands separated by semicolon behave much like two separate -shell commands. However, note that using two separate lines means -@code{make} will invoke the shell twice, running an independent subshell -for each line. @xref{Execution, ,Command Execution}. - -If you want variable definitions made with @code{define} to take -precedence over command-line variable definitions, you can use the -@code{override} directive together with @code{define}: - -@example -override define two-lines -foo -$(bar) -endef -@end example - -@noindent -@xref{Override Directive, ,The @code{override} Directive}. - -@node Environment, , Defining, Using Variables -@section Variables from the Environment - -@cindex variables, environment -@cindex environment -Variables in @code{make} can come from the environment in which -@code{make} is run. Every environment variable that @code{make} sees when -it starts up is transformed into a @code{make} variable with the same name -and value. But an explicit assignment in the makefile, or with a command -argument, overrides the environment. (If the @samp{-e} flag is specified, -then values from the environment override assignments in the makefile. -@xref{Options Summary, ,Summary of Options}. -But this is not recommended practice.) - -Thus, by setting the variable @code{CFLAGS} in your environment, you can -cause all C compilations in most makefiles to use the compiler switches you -prefer. This is safe for variables with standard or conventional meanings -because you know that no makefile will use them for other things. (But -this is not totally reliable; some makefiles set @code{CFLAGS} explicitly -and therefore are not affected by the value in the environment.) - -When @code{make} is invoked recursively, variables defined in the -outer invocation can be passed to inner invocations through the -environment (@pxref{Recursion, ,Recursive Use of @code{make}}). By -default, only variables that came from the environment or the command -line are passed to recursive invocations. You can use the -@code{export} directive to pass other variables. -@xref{Variables/Recursion, , Communicating Variables to a -Sub-@code{make}}, for full details. - -Other use of variables from the environment is not recommended. It is not -wise for makefiles to depend for their functioning on environment variables -set up outside their control, since this would cause different users to get -different results from the same makefile. This is against the whole -purpose of most makefiles. - -Such problems would be especially likely with the variable @code{SHELL}, -which is normally present in the environment to specify the user's choice -of interactive shell. It would be very undesirable for this choice to -affect @code{make}. So @code{make} ignores the environment value of -@code{SHELL}.@refill - -@node Conditionals, Functions, Using Variables, Top -@chapter Conditional Parts of Makefiles - -@cindex conditionals -A @dfn{conditional} causes part of a makefile to be obeyed or ignored -depending on the values of variables. Conditionals can compare the -value of one variable to another, or the value of a variable to -a constant string. Conditionals control what @code{make} actually -``sees'' in the makefile, so they @emph{cannot} be used to control shell -commands at the time of execution.@refill - -@menu -* Conditional Example:: Example of a conditional -* Conditional Syntax:: The syntax of conditionals. -* Testing Flags:: Conditionals that test flags. -@end menu - -@node Conditional Example, Conditional Syntax, , Conditionals -@section Example of a Conditional - -The following example of a conditional tells @code{make} to use one set -of libraries if the @code{CC} variable is @samp{gcc}, and a different -set of libraries otherwise. It works by controlling which of two -command lines will be used as the command for a rule. The result is -that @samp{CC=gcc} as an argument to @code{make} changes not only which -compiler is used but also which libraries are linked. - -@example -libs_for_gcc = -lgnu -normal_libs = - -foo: $(objects) -ifeq ($(CC),gcc) - $(CC) -o foo $(objects) $(libs_for_gcc) -else - $(CC) -o foo $(objects) $(normal_libs) -endif -@end example - -This conditional uses three directives: one @code{ifeq}, one @code{else} -and one @code{endif}. - -The @code{ifeq} directive begins the conditional, and specifies the -condition. It contains two arguments, separated by a comma and surrounded -by parentheses. Variable substitution is performed on both arguments and -then they are compared. The lines of the makefile following the -@code{ifeq} are obeyed if the two arguments match; otherwise they are -ignored. - -The @code{else} directive causes the following lines to be obeyed if the -previous conditional failed. In the example above, this means that the -second alternative linking command is used whenever the first alternative -is not used. It is optional to have an @code{else} in a conditional. - -The @code{endif} directive ends the conditional. Every conditional must -end with an @code{endif}. Unconditional makefile text follows. - -As this example illustrates, conditionals work at the textual level: -the lines of the conditional are treated as part of the makefile, or -ignored, according to the condition. This is why the larger syntactic -units of the makefile, such as rules, may cross the beginning or the -end of the conditional. - -When the variable @code{CC} has the value @samp{gcc}, the above example has -this effect: - -@example -foo: $(objects) - $(CC) -o foo $(objects) $(libs_for_gcc) -@end example - -@noindent -When the variable @code{CC} has any other value, the effect is this: - -@example -foo: $(objects) - $(CC) -o foo $(objects) $(normal_libs) -@end example - -Equivalent results can be obtained in another way by conditionalizing a -variable assignment and then using the variable unconditionally: - -@example -libs_for_gcc = -lgnu -normal_libs = - -ifeq ($(CC),gcc) - libs=$(libs_for_gcc) -else - libs=$(normal_libs) -endif - -foo: $(objects) - $(CC) -o foo $(objects) $(libs) -@end example - -@node Conditional Syntax, Testing Flags, Conditional Example, Conditionals -@section Syntax of Conditionals -@findex ifdef -@findex ifeq -@findex ifndef -@findex ifneq -@findex else -@findex endif - -The syntax of a simple conditional with no @code{else} is as follows: - -@example -@var{conditional-directive} -@var{text-if-true} -endif -@end example - -@noindent -The @var{text-if-true} may be any lines of text, to be considered as part -of the makefile if the condition is true. If the condition is false, no -text is used instead. - -The syntax of a complex conditional is as follows: - -@example -@var{conditional-directive} -@var{text-if-true} -else -@var{text-if-false} -endif -@end example - -@noindent -If the condition is true, @var{text-if-true} is used; otherwise, -@var{text-if-false} is used instead. The @var{text-if-false} can be any -number of lines of text. - -The syntax of the @var{conditional-directive} is the same whether the -conditional is simple or complex. There are four different directives that -test different conditions. Here is a table of them: - -@table @code -@item ifeq (@var{arg1}, @var{arg2}) -@itemx ifeq '@var{arg1}' '@var{arg2}' -@itemx ifeq "@var{arg1}" "@var{arg2}" -@itemx ifeq "@var{arg1}" '@var{arg2}' -@itemx ifeq '@var{arg1}' "@var{arg2}" -Expand all variable references in @var{arg1} and @var{arg2} and -compare them. If they are identical, the @var{text-if-true} is -effective; otherwise, the @var{text-if-false}, if any, is effective. - -Often you want to test if a variable has a non-empty value. When the -value results from complex expansions of variables and functions, -expansions you would consider empty may actually contain whitespace -characters and thus are not seen as empty. However, you can use the -@code{strip} function (@pxref{Text Functions}) to avoid interpreting -whitespace as a non-empty value. For example: - -@example -@group -ifeq ($(strip $(foo)),) -@var{text-if-empty} -endif -@end group -@end example - -@noindent -will evaluate @var{text-if-empty} even if the expansion of -@code{$(foo)} contains whitespace characters. - -@item ifneq (@var{arg1}, @var{arg2}) -@itemx ifneq '@var{arg1}' '@var{arg2}' -@itemx ifneq "@var{arg1}" "@var{arg2}" -@itemx ifneq "@var{arg1}" '@var{arg2}' -@itemx ifneq '@var{arg1}' "@var{arg2}" -Expand all variable references in @var{arg1} and @var{arg2} and -compare them. If they are different, the @var{text-if-true} is -effective; otherwise, the @var{text-if-false}, if any, is effective. - -@item ifdef @var{variable-name} -If the variable @var{variable-name} has a non-empty value, the -@var{text-if-true} is effective; otherwise, the @var{text-if-false}, -if any, is effective. Variables that have never been defined have an -empty value. - -Note that @code{ifdef} only tests whether a variable has a value. It -does not expand the variable to see if that value is nonempty. -Consequently, tests using @code{ifdef} return true for all definitions -except those like @code{foo =}. To test for an empty value, use -@w{@code{ifeq ($(foo),)}}. For example, - -@example -bar = -foo = $(bar) -ifdef foo -frobozz = yes -else -frobozz = no -endif -@end example - -@noindent -sets @samp{frobozz} to @samp{yes}, while: - -@example -foo = -ifdef foo -frobozz = yes -else -frobozz = no -endif -@end example - -@noindent -sets @samp{frobozz} to @samp{no}. - -@item ifndef @var{variable-name} -If the variable @var{variable-name} has an empty value, the -@var{text-if-true} is effective; otherwise, the @var{text-if-false}, -if any, is effective. -@end table - -Extra spaces are allowed and ignored at the beginning of the conditional -directive line, but a tab is not allowed. (If the line begins with a tab, -it will be considered a command for a rule.) Aside from this, extra spaces -or tabs may be inserted with no effect anywhere except within the directive -name or within an argument. A comment starting with @samp{#} may appear at -the end of the line. - -The other two directives that play a part in a conditional are @code{else} -and @code{endif}. Each of these directives is written as one word, with no -arguments. Extra spaces are allowed and ignored at the beginning of the -line, and spaces or tabs at the end. A comment starting with @samp{#} may -appear at the end of the line. - -Conditionals affect which lines of the makefile @code{make} uses. If -the condition is true, @code{make} reads the lines of the -@var{text-if-true} as part of the makefile; if the condition is false, -@code{make} ignores those lines completely. It follows that syntactic -units of the makefile, such as rules, may safely be split across the -beginning or the end of the conditional.@refill - -@code{make} evaluates conditionals when it reads a makefile. -Consequently, you cannot use automatic variables in the tests of -conditionals because they are not defined until commands are run -(@pxref{Automatic, , Automatic Variables}). - -To prevent intolerable confusion, it is not permitted to start a -conditional in one makefile and end it in another. However, you may -write an @code{include} directive within a conditional, provided you do -not attempt to terminate the conditional inside the included file. - -@node Testing Flags, , Conditional Syntax, Conditionals -@section Conditionals that Test Flags - -You can write a conditional that tests @code{make} command flags such as -@samp{-t} by using the variable @code{MAKEFLAGS} together with the -@code{findstring} function -(@pxref{Text Functions, , Functions for String Substitution and Analysis}). -This is useful when @code{touch} is not enough to make a file appear up -to date. - -The @code{findstring} function determines whether one string appears as a -substring of another. If you want to test for the @samp{-t} flag, -use @samp{t} as the first string and the value of @code{MAKEFLAGS} as -the other. - -For example, here is how to arrange to use @samp{ranlib -t} to finish -marking an archive file up to date: - -@example -archive.a: @dots{} -ifneq (,$(findstring t,$(MAKEFLAGS))) - +touch archive.a - +ranlib -t archive.a -else - ranlib archive.a -endif -@end example - -@noindent -The @samp{+} prefix marks those command lines as ``recursive'' so -that they will be executed despite use of the @samp{-t} flag. -@xref{Recursion, ,Recursive Use of @code{make}}. - -@node Functions, Running, Conditionals, Top -@chapter Functions for Transforming Text -@cindex functions - -@dfn{Functions} allow you to do text processing in the makefile to compute -the files to operate on or the commands to use. You use a function in a -@dfn{function call}, where you give the name of the function and some text -(the @dfn{arguments}) for the function to operate on. The result of the -function's processing is substituted into the makefile at the point of the -call, just as a variable might be substituted. - -@menu -* Syntax of Functions:: How to write a function call. -* Text Functions:: General-purpose text manipulation functions. -* Filename Functions:: Functions for manipulating file names. -* Foreach Function:: Repeat some text with controlled variation. -* Origin Function:: Find where a variable got its value. -* Shell Function:: Substitute the output of a shell command. -@end menu - -@node Syntax of Functions, Text Functions, , Functions -@section Function Call Syntax -@cindex @code{$}, in function call -@cindex dollar sign (@code{$}), in function call -@cindex arguments of functions -@cindex functions, syntax of - -A function call resembles a variable reference. It looks like this: - -@example -$(@var{function} @var{arguments}) -@end example - -@noindent -or like this: - -@example -$@{@var{function} @var{arguments}@} -@end example - -Here @var{function} is a function name; one of a short list of names that -are part of @code{make}. There is no provision for defining new functions. - -The @var{arguments} are the arguments of the function. They are -separated from the function name by one or more spaces or tabs, and if -there is more than one argument, then they are separated by commas. -Such whitespace and commas are not part of an argument's value. The -delimiters which you use to surround the function call, whether -parentheses or braces, can appear in an argument only in matching pairs; -the other kind of delimiters may appear singly. If the arguments -themselves contain other function calls or variable references, it is -wisest to use the same kind of delimiters for all the references; write -@w{@samp{$(subst a,b,$(x))}}, not @w{@samp{$(subst a,b,$@{x@})}}. This -is because it is clearer, and because only one type of delimiter is -matched to find the end of the reference. - -The text written for each argument is processed by substitution of -variables and function calls to produce the argument value, which -is the text on which the function acts. The substitution is done in the -order in which the arguments appear. - -Commas and unmatched parentheses or braces cannot appear in the text of an -argument as written; leading spaces cannot appear in the text of the first -argument as written. These characters can be put into the argument value -by variable substitution. First define variables @code{comma} and -@code{space} whose values are isolated comma and space characters, then -substitute these variables where such characters are wanted, like this: - -@example -@group -comma:= , -empty:= -space:= $(empty) $(empty) -foo:= a b c -bar:= $(subst $(space),$(comma),$(foo)) -# @r{bar is now `a,b,c'.} -@end group -@end example - -@noindent -Here the @code{subst} function replaces each space with a comma, through -the value of @code{foo}, and substitutes the result. - -@node Text Functions, Filename Functions, Syntax of Functions, Functions -@section Functions for String Substitution and Analysis -@cindex functions, for text - -Here are some functions that operate on strings: - -@table @code -@item $(subst @var{from},@var{to},@var{text}) -@findex subst -Performs a textual replacement on the text @var{text}: each occurrence -of @var{from} is replaced by @var{to}. The result is substituted for -the function call. For example, - -@example -$(subst ee,EE,feet on the street) -@end example - -substitutes the string @samp{fEEt on the strEEt}. - -@item $(patsubst @var{pattern},@var{replacement},@var{text}) -@findex patsubst -Finds whitespace-separated words in @var{text} that match -@var{pattern} and replaces them with @var{replacement}. Here -@var{pattern} may contain a @samp{%} which acts as a wildcard, -matching any number of any characters within a word. If -@var{replacement} also contains a @samp{%}, the @samp{%} is replaced -by the text that matched the @samp{%} in @var{pattern}.@refill - -@cindex @code{%}, quoting in @code{patsubst} -@cindex @code{%}, quoting with @code{\} (backslash) -@cindex @code{\} (backslash), to quote @code{%} -@cindex backslash (@code{\}), to quote @code{%} -@cindex quoting @code{%}, in @code{patsubst} -@samp{%} characters in @code{patsubst} function invocations can be -quoted with preceding backslashes (@samp{\}). Backslashes that would -otherwise quote @samp{%} characters can be quoted with more backslashes. -Backslashes that quote @samp{%} characters or other backslashes are -removed from the pattern before it is compared file names or has a stem -substituted into it. Backslashes that are not in danger of quoting -@samp{%} characters go unmolested. For example, the pattern -@file{the\%weird\\%pattern\\} has @samp{the%weird\} preceding the -operative @samp{%} character, and @samp{pattern\\} following it. The -final two backslashes are left alone because they cannot affect any -@samp{%} character.@refill - -Whitespace between words is folded into single space characters; -leading and trailing whitespace is discarded. - -For example, - -@example -$(patsubst %.c,%.o,x.c.c bar.c) -@end example - -@noindent -produces the value @samp{x.c.o bar.o}. - -Substitution references (@pxref{Substitution Refs, ,Substitution -References}) are a simpler way to get the effect of the @code{patsubst} -function: - -@example -$(@var{var}:@var{pattern}=@var{replacement}) -@end example - -@noindent -is equivalent to - -@example -$(patsubst @var{pattern},@var{replacement},$(@var{var})) -@end example - -The second shorthand simplifies one of the most common uses of -@code{patsubst}: replacing the suffix at the end of file names. - -@example -$(@var{var}:@var{suffix}=@var{replacement}) -@end example - -@noindent -is equivalent to - -@example -$(patsubst %@var{suffix},%@var{replacement},$(@var{var})) -@end example - -@noindent -For example, you might have a list of object files: - -@example -objects = foo.o bar.o baz.o -@end example - -@noindent -To get the list of corresponding source files, you could simply write: - -@example -$(objects:.o=.c) -@end example - -@noindent -instead of using the general form: - -@example -$(patsubst %.o,%.c,$(objects)) -@end example - -@item $(strip @var{string}) -@cindex stripping whitespace -@cindex whitespace, stripping -@cindex spaces, stripping -@findex strip -Removes leading and trailing whitespace from @var{string} and replaces -each internal sequence of one or more whitespace characters with a -single space. Thus, @samp{$(strip a b c )} results in @w{@samp{a b c}}. - -The function @code{strip} can be very useful when used in conjunction -with conditionals. When comparing something with the empty string -@samp{} using @code{ifeq} or @code{ifneq}, you usually want a string of -just whitespace to match the empty string (@pxref{Conditionals}). - -Thus, the following may fail to have the desired results: - -@example -.PHONY: all -ifneq "$(needs_made)" "" -all: $(needs_made) -else -all:;@@echo 'Nothing to make!' -endif -@end example - -@noindent -Replacing the variable reference @w{@samp{$(needs_made)}} with the -function call @w{@samp{$(strip $(needs_made))}} in the @code{ifneq} -directive would make it more robust.@refill - -@item $(findstring @var{find},@var{in}) -@findex findstring -@cindex searching for strings -@cindex finding strings -@cindex strings, searching for -Searches @var{in} for an occurrence of @var{find}. If it occurs, the -value is @var{find}; otherwise, the value is empty. You can use this -function in a conditional to test for the presence of a specific -substring in a given string. Thus, the two examples, - -@example -$(findstring a,a b c) -$(findstring a,b c) -@end example - -@noindent -produce the values @samp{a} and @samp{} (the empty string), -respectively. @xref{Testing Flags}, for a practical application of -@code{findstring}.@refill - -@need 750 -@findex filter -@cindex filtering words -@cindex words, filtering -@item $(filter @var{pattern}@dots{},@var{text}) -Removes all whitespace-separated words in @var{text} that do -@emph{not} match any of the @var{pattern} words, returning only -matching words. The patterns are written using @samp{%}, just like -the patterns used in the @code{patsubst} function above.@refill - -The @code{filter} function can be used to separate out different types -of strings (such as file names) in a variable. For example: - -@example -sources := foo.c bar.c baz.s ugh.h -foo: $(sources) - cc $(filter %.c %.s,$(sources)) -o foo -@end example - -@noindent -says that @file{foo} depends of @file{foo.c}, @file{bar.c}, -@file{baz.s} and @file{ugh.h} but only @file{foo.c}, @file{bar.c} and -@file{baz.s} should be specified in the command to the -compiler.@refill - -@item $(filter-out @var{pattern}@dots{},@var{text}) -@findex filter-out -@cindex filtering out words -@cindex words, filtering out -Removes all whitespace-separated words in @var{text} that @emph{do} -match the @var{pattern} words, returning only the words that @emph{do -not} match. This is the exact opposite of the @code{filter} -function.@refill - -For example, given: - -@example -@group -objects=main1.o foo.o main2.o bar.o -mains=main1.o main2.o -@end group -@end example - -@noindent -the following generates a list which contains all the object files not -in @samp{mains}: - -@example -$(filter-out $(mains),$(objects)) -@end example - -@need 1500 -@findex sort -@cindex sorting words -@item $(sort @var{list}) -Sorts the words of @var{list} in lexical order, removing duplicate -words. The output is a list of words separated by single spaces. -Thus, - -@example -$(sort foo bar lose) -@end example - -@noindent -returns the value @samp{bar foo lose}. - -@cindex removing duplicate words -@cindex duplicate words, removing -@cindex words, removing duplicates -Incidentally, since @code{sort} removes duplicate words, you can use -it for this purpose even if you don't care about the sort order. -@end table - -Here is a realistic example of the use of @code{subst} and -@code{patsubst}. Suppose that a makefile uses the @code{VPATH} variable -to specify a list of directories that @code{make} should search for -dependency files -(@pxref{General Search, , @code{VPATH} Search Path for All Dependencies}). -This example shows how to -tell the C compiler to search for header files in the same list of -directories.@refill - -The value of @code{VPATH} is a list of directories separated by colons, -such as @samp{src:../headers}. First, the @code{subst} function is used to -change the colons to spaces: - -@example -$(subst :, ,$(VPATH)) -@end example - -@noindent -This produces @samp{src ../headers}. Then @code{patsubst} is used to turn -each directory name into a @samp{-I} flag. These can be added to the -value of the variable @code{CFLAGS}, which is passed automatically to the C -compiler, like this: - -@example -override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH))) -@end example - -@noindent -The effect is to append the text @samp{-Isrc -I../headers} to the -previously given value of @code{CFLAGS}. The @code{override} directive is -used so that the new value is assigned even if the previous value of -@code{CFLAGS} was specified with a command argument (@pxref{Override -Directive, , The @code{override} Directive}). - -@node Filename Functions, Foreach Function, Text Functions, Functions -@section Functions for File Names -@cindex functions, for file names -@cindex file name functions - -Several of the built-in expansion functions relate specifically to -taking apart file names or lists of file names. - -Each of the following functions performs a specific transformation on a -file name. The argument of the function is regarded as a series of file -names, separated by whitespace. (Leading and trailing whitespace is -ignored.) Each file name in the series is transformed in the same way and -the results are concatenated with single spaces between them. - -@table @code -@item $(dir @var{names}@dots{}) -@findex dir -@cindex directory part -@cindex file name, directory part -Extracts the directory-part of each file name in @var{names}. The -directory-part of the file name is everything up through (and -including) the last slash in it. If the file name contains no slash, -the directory part is the string @samp{./}. For example, - -@example -$(dir src/foo.c hacks) -@end example - -@noindent -produces the result @samp{src/ ./}. - -@item $(notdir @var{names}@dots{}) -@findex notdir -@cindex file name, nondirectory part -@cindex nondirectory part -Extracts all but the directory-part of each file name in @var{names}. -If the file name contains no slash, it is left unchanged. Otherwise, -everything through the last slash is removed from it. - -A file name that ends with a slash becomes an empty string. This is -unfortunate, because it means that the result does not always have the -same number of whitespace-separated file names as the argument had; -but we do not see any other valid alternative. - -For example, - -@example -$(notdir src/foo.c hacks) -@end example - -@noindent -produces the result @samp{foo.c hacks}. - -@item $(suffix @var{names}@dots{}) -@findex suffix -@cindex suffix, function to find -@cindex file name suffix -Extracts the suffix of each file name in @var{names}. If the file name -contains a period, the suffix is everything starting with the last -period. Otherwise, the suffix is the empty string. This frequently -means that the result will be empty when @var{names} is not, and if -@var{names} contains multiple file names, the result may contain fewer -file names. - -For example, - -@example -$(suffix src/foo.c hacks) -@end example - -@noindent -produces the result @samp{.c}. - -@item $(basename @var{names}@dots{}) -@findex basename -@cindex basename -@cindex file name, basename of -Extracts all but the suffix of each file name in @var{names}. If the -file name contains a period, the basename is everything starting up to -(and not including) the last period. Otherwise, the basename is the -entire file name. For example, - -@example -$(basename src/foo.c hacks) -@end example - -@noindent -produces the result @samp{src/foo hacks}. - -@c plural convention with dots (be consistent) -@item $(addsuffix @var{suffix},@var{names}@dots{}) -@findex addsuffix -@cindex suffix, adding -@cindex file name suffix, adding -The argument @var{names} is regarded as a series of names, separated -by whitespace; @var{suffix} is used as a unit. The value of -@var{suffix} is appended to the end of each individual name and the -resulting larger names are concatenated with single spaces between -them. For example, - -@example -$(addsuffix .c,foo bar) -@end example - -@noindent -produces the result @samp{foo.c bar.c}. - -@item $(addprefix @var{prefix},@var{names}@dots{}) -@findex addprefix -@cindex prefix, adding -@cindex file name prefix, adding -The argument @var{names} is regarded as a series of names, separated -by whitespace; @var{prefix} is used as a unit. The value of -@var{prefix} is prepended to the front of each individual name and the -resulting larger names are concatenated with single spaces between -them. For example, - -@example -$(addprefix src/,foo bar) -@end example - -@noindent -produces the result @samp{src/foo src/bar}. - -@item $(join @var{list1},@var{list2}) -@findex join -@cindex joining lists of words -@cindex words, joining lists -Concatenates the two arguments word by word: the two first words (one -from each argument) concatenated form the first word of the result, the -two second words form the second word of the result, and so on. So the -@var{n}th word of the result comes from the @var{n}th word of each -argument. If one argument has more words that the other, the extra -words are copied unchanged into the result. - -For example, @samp{$(join a b,.c .o)} produces @samp{a.c b.o}. - -Whitespace between the words in the lists is not preserved; it is -replaced with a single space. - -This function can merge the results of the @code{dir} and -@code{notdir} functions, to produce the original list of files which -was given to those two functions.@refill - -@item $(word @var{n},@var{text}) -@findex word -@cindex words, selecting -@cindex selecting words -Returns the @var{n}th word of @var{text}. The legitimate values of -@var{n} start from 1. If @var{n} is bigger than the number of words -in @var{text}, the value is empty. For example, - -@example -$(word 2, foo bar baz) -@end example - -@noindent -returns @samp{bar}. - -@c Following item phrased to prevent overfull hbox. --RJC 17 Jul 92 -@item $(words @var{text}) -@findex words -@cindex words, finding number -Returns the number of words in @var{text}. -Thus, the last word of @var{text} is -@w{@code{$(word $(words @var{text}),@var{text})}}.@refill - -@item $(firstword @var{names}@dots{}) -@findex firstword -@cindex words, extracting first -The argument @var{names} is regarded as a series of names, separated -by whitespace. The value is the first name in the series. The rest -of the names are ignored. - -For example, - -@example -$(firstword foo bar) -@end example - -@noindent -produces the result @samp{foo}. Although @code{$(firstword -@var{text})} is the same as @code{$(word 1,@var{text})}, the -@code{firstword} function is retained for its simplicity.@refill - -@item $(wildcard @var{pattern}) -@findex wildcard -@cindex wildcard, function -The argument @var{pattern} is a file name pattern, typically containing -wildcard characters (as in shell file name patterns). The result of -@code{wildcard} is a space-separated list of the names of existing files -that match the pattern. -@xref{Wildcards, ,Using Wildcard Characters in File Names}. -@end table - -@node Foreach Function, Origin Function, Filename Functions, Functions -@section The @code{foreach} Function -@findex foreach -@cindex words, iterating over - -The @code{foreach} function is very different from other functions. It -causes one piece of text to be used repeatedly, each time with a different -substitution performed on it. It resembles the @code{for} command in the -shell @code{sh} and the @code{foreach} command in the C-shell @code{csh}. - -The syntax of the @code{foreach} function is: - -@example -$(foreach @var{var},@var{list},@var{text}) -@end example - -@noindent -The first two arguments, @var{var} and @var{list}, are expanded before -anything else is done; note that the last argument, @var{text}, is -@strong{not} expanded at the same time. Then for each word of the expanded -value of @var{list}, the variable named by the expanded value of @var{var} -is set to that word, and @var{text} is expanded. Presumably @var{text} -contains references to that variable, so its expansion will be different -each time. - -The result is that @var{text} is expanded as many times as there are -whitespace-separated words in @var{list}. The multiple expansions of -@var{text} are concatenated, with spaces between them, to make the result -of @code{foreach}. - -This simple example sets the variable @samp{files} to the list of all files -in the directories in the list @samp{dirs}: - -@example -dirs := a b c d -files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)) -@end example - -Here @var{text} is @samp{$(wildcard $(dir)/*)}. The first repetition -finds the value @samp{a} for @code{dir}, so it produces the same result -as @samp{$(wildcard a/*)}; the second repetition produces the result -of @samp{$(wildcard b/*)}; and the third, that of @samp{$(wildcard c/*)}. - -This example has the same result (except for setting @samp{dirs}) as -the following example: - -@example -files := $(wildcard a/* b/* c/* d/*) -@end example - -When @var{text} is complicated, you can improve readability by giving it -a name, with an additional variable: - -@example -find_files = $(wildcard $(dir)/*) -dirs := a b c d -files := $(foreach dir,$(dirs),$(find_files)) -@end example - -@noindent -Here we use the variable @code{find_files} this way. We use plain @samp{=} -to define a recursively-expanding variable, so that its value contains an -actual function call to be reexpanded under the control of @code{foreach}; -a simply-expanded variable would not do, since @code{wildcard} would be -called only once at the time of defining @code{find_files}. - -The @code{foreach} function has no permanent effect on the variable -@var{var}; its value and flavor after the @code{foreach} function call are -the same as they were beforehand. The other values which are taken from -@var{list} are in effect only temporarily, during the execution of -@code{foreach}. The variable @var{var} is a simply-expanded variable -during the execution of @code{foreach}. If @var{var} was undefined -before the @code{foreach} function call, it is undefined after the call. -@xref{Flavors, ,The Two Flavors of Variables}.@refill - -You must take care when using complex variable expressions that result in -variable names because many strange things are valid variable names, but -are probably not what you intended. For example, - -@smallexample -files := $(foreach Esta escrito en espanol!,b c ch,$(find_files)) -@end smallexample - -@noindent -might be useful if the value of @code{find_files} references the variable -whose name is @samp{Esta escrito en espanol!} (es un nombre bastante largo, -no?), but it is more likely to be a mistake. - -@node Origin Function, Shell Function, Foreach Function, Functions -@section The @code{origin} Function -@findex origin -@cindex variables, origin of -@cindex origin of variable - -The @code{origin} function is unlike most other functions in that it does -not operate on the values of variables; it tells you something @emph{about} -a variable. Specifically, it tells you where it came from. - -The syntax of the @code{origin} function is: - -@example -$(origin @var{variable}) -@end example - -Note that @var{variable} is the @emph{name} of a variable to inquire about; -not a @emph{reference} to that variable. Therefore you would not normally -use a @samp{$} or parentheses when writing it. (You can, however, use a -variable reference in the name if you want the name not to be a constant.) - -The result of this function is a string telling you how the variable -@var{variable} was defined: - -@table @samp -@item undefined - -if @var{variable} was never defined. - -@item default - -if @var{variable} has a default definition, as is usual with @code{CC} -and so on. @xref{Implicit Variables, ,Variables Used by Implicit Rules}. -Note that if you have redefined a default variable, the @code{origin} -function will return the origin of the later definition. - -@item environment - -if @var{variable} was defined as an environment variable and the -@samp{-e} option is @emph{not} turned on (@pxref{Options Summary, ,Summary of Options}). - -@item environment override - -if @var{variable} was defined as an environment variable and the -@w{@samp{-e}} option @emph{is} turned on (@pxref{Options Summary, -,Summary of Options}).@refill - -@item file - -if @var{variable} was defined in a makefile. - -@item command line - -if @var{variable} was defined on the command line. - -@item override - -if @var{variable} was defined with an @code{override} directive in a -makefile (@pxref{Override Directive, ,The @code{override} Directive}). - -@item automatic - -if @var{variable} is an automatic variable defined for the -execution of the commands for each rule -(@pxref{Automatic, , Automatic Variables}). -@end table - -This information is primarily useful (other than for your curiosity) to -determine if you want to believe the value of a variable. For example, -suppose you have a makefile @file{foo} that includes another makefile -@file{bar}. You want a variable @code{bletch} to be defined in @file{bar} -if you run the command @w{@samp{make -f bar}}, even if the environment contains -a definition of @code{bletch}. However, if @file{foo} defined -@code{bletch} before including @file{bar}, you do not want to override that -definition. This could be done by using an @code{override} directive in -@file{foo}, giving that definition precedence over the later definition in -@file{bar}; unfortunately, the @code{override} directive would also -override any command line definitions. So, @file{bar} could -include:@refill - -@example -@group -ifdef bletch -ifeq "$(origin bletch)" "environment" -bletch = barf, gag, etc. -endif -endif -@end group -@end example - -@noindent -If @code{bletch} has been defined from the environment, this will redefine -it. - -If you want to override a previous definition of @code{bletch} if it came -from the environment, even under @samp{-e}, you could instead write: - -@example -@group -ifneq "$(findstring environment,$(origin bletch))" "" -bletch = barf, gag, etc. -endif -@end group -@end example - -Here the redefinition takes place if @samp{$(origin bletch)} returns either -@samp{environment} or @samp{environment override}. -@xref{Text Functions, , Functions for String Substitution and Analysis}. - -@node Shell Function, , Origin Function, Functions -@section The @code{shell} Function -@findex shell -@cindex commands, expansion -@cindex backquotes -@cindex shell command, function for - -The @code{shell} function is unlike any other function except the -@code{wildcard} function -(@pxref{Wildcard Function, ,The Function @code{wildcard}}) in that it -communicates with the world outside of @code{make}. - -The @code{shell} function performs the same function that backquotes -(@samp{`}) perform in most shells: it does @dfn{command expansion}. This -means that it takes an argument that is a shell command and returns the -output of the command. The only processing @code{make} does on the result, -before substituting it into the surrounding text, is to convert newlines to -spaces.@refill - -The commands run by calls to the @code{shell} function are run when the -function calls are expanded. In most cases, this is when the makefile is -read in. The exception is that function calls in the commands of the rules -are expanded when the commands are run, and this applies to @code{shell} -function calls like all others. - -Here are some examples of the use of the @code{shell} function: - -@example -contents := $(shell cat foo) -@end example - -@noindent -sets @code{contents} to the contents of the file @file{foo}, with a space -(rather than a newline) separating each line. - -@example -files := $(shell echo *.c) -@end example - -@noindent -sets @code{files} to the expansion of @samp{*.c}. Unless @code{make} is -using a very strange shell, this has the same result as -@w{@samp{$(wildcard *.c)}}.@refill - -@node Running, Implicit Rules, Functions, Top -@chapter How to Run @code{make} - -A makefile that says how to recompile a program can be used in more -than one way. The simplest use is to recompile every file that is out -of date. Usually, makefiles are written so that if you run -@code{make} with no arguments, it does just that. - -But you might want to update only some of the files; you might want to use -a different compiler or different compiler options; you might want just to -find out which files are out of date without changing them. - -By giving arguments when you run @code{make}, you can do any of these -things and many others. - -The exit status of @code{make} is always one of three values: -@table @code -@item 0 -The exit status is zero if @code{make} is successful. -@item 2 -The exit status is two if @code{make} encounters any errors. -It will print messages describing the particular errors. -@item 1 -The exit status is one if you use the @samp{-q} flag and @code{make} -determines that some target is not already up to date. -@xref{Instead of Execution, ,Instead of Executing the Commands}. -@end table - -@menu -* Makefile Arguments:: How to specify which makefile to use. -* Goals:: How to use goal arguments to specify which - parts of the makefile to use. -* Instead of Execution:: How to use mode flags to specify what - kind of thing to do with the commands - in the makefile other than simply - execute them. -* Avoiding Compilation:: How to avoid recompiling certain files. -* Overriding:: How to override a variable to specify - an alternate compiler and other things. -* Testing:: How to proceed past some errors, to - test compilation. -* Options Summary:: Summary of Options -@end menu - -@node Makefile Arguments, Goals, , Running -@section Arguments to Specify the Makefile -@cindex @code{--file} -@cindex @code{--makefile} -@cindex @code{-f} - -The way to specify the name of the makefile is with the @samp{-f} or -@samp{--file} option (@samp{--makefile} also works). For example, -@samp{-f altmake} says to use the file @file{altmake} as the makefile. - -If you use the @samp{-f} flag several times and follow each @samp{-f} -with an argument, all the specified files are used jointly as -makefiles. - -If you do not use the @samp{-f} or @samp{--file} flag, the default is -to try @file{GNUmakefile}, @file{makefile}, and @file{Makefile}, in -that order, and use the first of these three which exists or can be made -(@pxref{Makefiles, ,Writing Makefiles}).@refill - -@node Goals, Instead of Execution, Makefile Arguments, Running -@section Arguments to Specify the Goals -@cindex goal, how to specify - -The @dfn{goals} are the targets that @code{make} should strive ultimately -to update. Other targets are updated as well if they appear as -dependencies of goals, or dependencies of dependencies of goals, etc. - -By default, the goal is the first target in the makefile (not counting -targets that start with a period). Therefore, makefiles are usually -written so that the first target is for compiling the entire program or -programs they describe. If the first rule in the makefile has several -targets, only the first target in the rule becomes the default goal, not -the whole list. - -You can specify a different goal or goals with arguments to @code{make}. -Use the name of the goal as an argument. If you specify several goals, -@code{make} processes each of them in turn, in the order you name them. - -Any target in the makefile may be specified as a goal (unless it -starts with @samp{-} or contains an @samp{=}, in which case it will be -parsed as a switch or variable definition, respectively). Even -targets not in the makefile may be specified, if @code{make} can find -implicit rules that say how to make them. - -One use of specifying a goal is if you want to compile only a part of -the program, or only one of several programs. Specify as a goal each -file that you wish to remake. For example, consider a directory containing -several programs, with a makefile that starts like this: - -@example -.PHONY: all -all: size nm ld ar as -@end example - -If you are working on the program @code{size}, you might want to say -@w{@samp{make size}} so that only the files of that program are recompiled. - -Another use of specifying a goal is to make files that are not normally -made. For example, there may be a file of debugging output, or a -version of the program that is compiled specially for testing, which has -a rule in the makefile but is not a dependency of the default goal. - -Another use of specifying a goal is to run the commands associated with -a phony target (@pxref{Phony Targets}) or empty target (@pxref{Empty -Targets, ,Empty Target Files to Record Events}). Many makefiles contain -a phony target named @file{clean} which deletes everything except source -files. Naturally, this is done only if you request it explicitly with -@w{@samp{make clean}}. Following is a list of typical phony and empty -target names. @xref{Standard Targets}, for a detailed list of all the -standard target names which GNU software packages use. - -@table @file -@item all -@cindex @code{all} @r{(standard target)} -Make all the top-level targets the makefile knows about. - -@item clean -@cindex @code{clean} @r{(standard target)} -Delete all files that are normally created by running @code{make}. - -@item mostlyclean -@cindex @code{mostlyclean} @r{(standard target)} -Like @samp{clean}, but may refrain from deleting a few files that people -normally don't want to recompile. For example, the @samp{mostlyclean} -target for GCC does not delete @file{libgcc.a}, because recompiling it -is rarely necessary and takes a lot of time. - -@item distclean -@cindex @code{distclean} @r{(standard target)} -@itemx realclean -@cindex @code{realclean} @r{(standard target)} -@itemx clobber -@cindex @code{clobber} @r{(standard target)} -Any of these targets might be defined to delete @emph{more} files than -@samp{clean} does. For example, this would delete configuration files -or links that you would normally create as preparation for compilation, -even if the makefile itself cannot create these files. - -@item install -@cindex @code{install} @r{(standard target)} -Copy the executable file into a directory that users typically search -for commands; copy any auxiliary files that the executable uses into -the directories where it will look for them. - -@item print -@cindex @code{print} @r{(standard target)} -Print listings of the source files that have changed. - -@item tar -@cindex @code{tar} @r{(standard target)} -Create a tar file of the source files. - -@item shar -@cindex @code{shar} @r{(standard target)} -Create a shell archive (shar file) of the source files. - -@item dist -@cindex @code{dist} @r{(standard target)} -Create a distribution file of the source files. This might -be a tar file, or a shar file, or a compressed version of one of the -above, or even more than one of the above. - -@item TAGS -@cindex @code{TAGS} @r{(standard target)} -Update a tags table for this program. - -@item check -@cindex @code{check} @r{(standard target)} -@itemx test -@cindex @code{test} @r{(standard target)} -Perform self tests on the program this makefile builds. -@end table - -@node Instead of Execution, Avoiding Compilation, Goals, Running -@section Instead of Executing the Commands -@cindex execution, instead of -@cindex commands, instead of executing - -The makefile tells @code{make} how to tell whether a target is up to date, -and how to update each target. But updating the targets is not always -what you want. Certain options specify other activities for @code{make}. - -@comment Extra blank lines make it print better. -@table @samp -@item -n -@itemx --just-print -@itemx --dry-run -@itemx --recon -@cindex @code{--just-print} -@cindex @code{--dry-run} -@cindex @code{--recon} -@cindex @code{-n} - -``No-op''. The activity is to print what commands would be used to make -the targets up to date, but not actually execute them. - -@item -t -@itemx --touch -@cindex @code{--touch} -@cindex touching files -@cindex target, touching -@cindex @code{-t} - -``Touch''. The activity is to mark the targets as up to date without -actually changing them. In other words, @code{make} pretends to compile -the targets but does not really change their contents. - -@item -q -@itemx --question -@cindex @code{--question} -@cindex @code{-q} -@cindex question mode - -``Question''. The activity is to find out silently whether the targets -are up to date already; but execute no commands in either case. In other -words, neither compilation nor output will occur. - -@item -W @var{file} -@itemx --what-if=@var{file} -@itemx --assume-new=@var{file} -@itemx --new-file=@var{file} -@cindex @code{--what-if} -@cindex @code{-W} -@cindex @code{--assume-new} -@cindex @code{--new-file} -@cindex what if -@cindex files, assuming new - -``What if''. Each @samp{-W} flag is followed by a file name. The given -files' modification times are recorded by @code{make} as being the present -time, although the actual modification times remain the same. -You can use the @samp{-W} flag in conjunction with the @samp{-n} flag -to see what would happen if you were to modify specific files.@refill -@end table - -With the @samp{-n} flag, @code{make} prints the commands that it would -normally execute but does not execute them. - -With the @samp{-t} flag, @code{make} ignores the commands in the rules -and uses (in effect) the command @code{touch} for each target that needs to -be remade. The @code{touch} command is also printed, unless @samp{-s} or -@code{.SILENT} is used. For speed, @code{make} does not actually invoke -the program @code{touch}. It does the work directly. - -With the @samp{-q} flag, @code{make} prints nothing and executes no -commands, but the exit status code it returns is zero if and only if the -targets to be considered are already up to date. If the exit status is -one, then some updating needs to be done. If @code{make} encounters an -error, the exit status is two, so you can distinguish an error from a -target that is not up to date. - -It is an error to use more than one of these three flags in the same -invocation of @code{make}. - -The @samp{-n}, @samp{-t}, and @samp{-q} options do not affect command -lines that begin with @samp{+} characters or contain the strings -@samp{$(MAKE)} or @samp{$@{MAKE@}}. Note that only the line containing -the @samp{+} character or the strings @samp{$(MAKE)} or @samp{$@{MAKE@}} -is run regardless of these options. Other lines in the same rule are -not run unless they too begin with @samp{+} or contain @samp{$(MAKE)} or -@samp{$@{MAKE@}} (@xref{MAKE Variable, ,How the @code{MAKE} Variable Works}.) - -The @samp{-W} flag provides two features: - -@itemize @bullet -@item -If you also use the @samp{-n} or @samp{-q} flag, you can see what -@code{make} would do if you were to modify some files. - -@item -Without the @samp{-n} or @samp{-q} flag, when @code{make} is actually -executing commands, the @samp{-W} flag can direct @code{make} to act -as if some files had been modified, without actually modifying the -files.@refill -@end itemize - -Note that the options @samp{-p} and @samp{-v} allow you to obtain other -information about @code{make} or about the makefiles in use -(@pxref{Options Summary, ,Summary of Options}).@refill - -@node Avoiding Compilation, Overriding, Instead of Execution, Running -@section Avoiding Recompilation of Some Files -@cindex @code{-o} -@cindex @code{--old-file} -@cindex @code{--assume-old} -@cindex files, assuming old -@cindex files, avoiding recompilation of -@cindex recompilation, avoiding - -Sometimes you may have changed a source file but you do not want to -recompile all the files that depend on it. For example, suppose you add a -macro or a declaration to a header file that many other files depend on. -Being conservative, @code{make} assumes that any change in the header file -requires recompilation of all dependent files, but you know that they do not -need to be recompiled and you would rather not waste the time waiting for -them to compile. - -If you anticipate the problem before changing the header file, you can -use the @samp{-t} flag. This flag tells @code{make} not to run the -commands in the rules, but rather to mark the target up to date by -changing its last-modification date. You would follow this procedure: - -@enumerate -@item -Use the command @samp{make} to recompile the source files that really -need recompilation. - -@item -Make the changes in the header files. - -@item -Use the command @samp{make -t} to mark all the object files as -up to date. The next time you run @code{make}, the changes in the -header files will not cause any recompilation. -@end enumerate - -If you have already changed the header file at a time when some files -do need recompilation, it is too late to do this. Instead, you can -use the @w{@samp{-o @var{file}}} flag, which marks a specified file as -``old'' (@pxref{Options Summary, ,Summary of Options}). This means -that the file itself will not be remade, and nothing else will be -remade on its account. Follow this procedure: - -@enumerate -@item -Recompile the source files that need compilation for reasons independent -of the particular header file, with @samp{make -o @var{headerfile}}. -If several header files are involved, use a separate @samp{-o} option -for each header file. - -@item -Touch all the object files with @samp{make -t}. -@end enumerate - -@node Overriding, Testing, Avoiding Compilation, Running -@section Overriding Variables -@cindex overriding variables with arguments -@cindex variables, overriding with arguments -@cindex command line variables -@cindex variables, command line - -An argument that contains @samp{=} specifies the value of a variable: -@samp{@var{v}=@var{x}} sets the value of the variable @var{v} to @var{x}. -If you specify a value in this way, all ordinary assignments of the same -variable in the makefile are ignored; we say they have been -@dfn{overridden} by the command line argument. - -The most common way to use this facility is to pass extra flags to -compilers. For example, in a properly written makefile, the variable -@code{CFLAGS} is included in each command that runs the C compiler, so a -file @file{foo.c} would be compiled something like this: - -@example -cc -c $(CFLAGS) foo.c -@end example - -Thus, whatever value you set for @code{CFLAGS} affects each compilation -that occurs. The makefile probably specifies the usual value for -@code{CFLAGS}, like this: - -@example -CFLAGS=-g -@end example - -Each time you run @code{make}, you can override this value if you -wish. For example, if you say @samp{make CFLAGS='-g -O'}, each C -compilation will be done with @samp{cc -c -g -O}. (This illustrates -how you can use quoting in the shell to enclose spaces and other -special characters in the value of a variable when you override it.) - -The variable @code{CFLAGS} is only one of many standard variables that -exist just so that you can change them this way. @xref{Implicit -Variables, , Variables Used by Implicit Rules}, for a complete list. - -You can also program the makefile to look at additional variables of your -own, giving the user the ability to control other aspects of how the -makefile works by changing the variables. - -When you override a variable with a command argument, you can define either -a recursively-expanded variable or a simply-expanded variable. The -examples shown above make a recursively-expanded variable; to make a -simply-expanded variable, write @samp{:=} instead of @samp{=}. But, unless -you want to include a variable reference or function call in the -@emph{value} that you specify, it makes no difference which kind of -variable you create. - -There is one way that the makefile can change a variable that you have -overridden. This is to use the @code{override} directive, which is a line -that looks like this: @samp{override @var{variable} = @var{value}} -(@pxref{Override Directive, ,The @code{override} Directive}). - -@node Testing, Options Summary, Overriding, Running -@section Testing the Compilation of a Program -@cindex testing compilation -@cindex compilation, testing - -Normally, when an error happens in executing a shell command, @code{make} -gives up immediately, returning a nonzero status. No further commands are -executed for any target. The error implies that the goal cannot be -correctly remade, and @code{make} reports this as soon as it knows. - -When you are compiling a program that you have just changed, this is not -what you want. Instead, you would rather that @code{make} try compiling -every file that can be tried, to show you as many compilation errors -as possible. - -@cindex @code{-k} -@cindex @code{--keep-going} -On these occasions, you should use the @samp{-k} or -@samp{--keep-going} flag. This tells @code{make} to continue to -consider the other dependencies of the pending targets, remaking them -if necessary, before it gives up and returns nonzero status. For -example, after an error in compiling one object file, @samp{make -k} -will continue compiling other object files even though it already -knows that linking them will be impossible. In addition to continuing -after failed shell commands, @samp{make -k} will continue as much as -possible after discovering that it does not know how to make a target -or dependency file. This will always cause an error message, but -without @samp{-k}, it is a fatal error (@pxref{Options Summary, -,Summary of Options}).@refill - -The usual behavior of @code{make} assumes that your purpose is to get the -goals up to date; once @code{make} learns that this is impossible, it might -as well report the failure immediately. The @samp{-k} flag says that the -real purpose is to test as much as possible of the changes made in the -program, perhaps to find several independent problems so that you can -correct them all before the next attempt to compile. This is why Emacs' -@kbd{M-x compile} command passes the @samp{-k} flag by default. - -@node Options Summary, , Testing, Running -@section Summary of Options -@cindex options -@cindex flags -@cindex switches - -Here is a table of all the options @code{make} understands: - -@table @samp -@item -b -@cindex @code{-b} -@itemx -m -@cindex @code{-m} -These options are ignored for compatibility with other versions of @code{make}. - -@item -C @var{dir} -@cindex @code{-C} -@itemx --directory=@var{dir} -@cindex @code{--directory} -Change to directory @var{dir} before reading the makefiles. If multiple -@samp{-C} options are specified, each is interpreted relative to the -previous one: @samp{-C / -C etc} is equivalent to @samp{-C /etc}. -This is typically used with recursive invocations of @code{make} -(@pxref{Recursion, ,Recursive Use of @code{make}}). - -@item -d -@cindex @code{-d} -@itemx --debug -@cindex @code{--debug} -@c Extra blank line here makes the table look better. - -Print debugging information in addition to normal processing. The -debugging information says which files are being considered for -remaking, which file-times are being compared and with what results, -which files actually need to be remade, which implicit rules are -considered and which are applied---everything interesting about how -@code{make} decides what to do. - -@item -e -@cindex @code{-e} -@itemx --environment-overrides -@cindex @code{--environment-overrides} -Give variables taken from the environment precedence -over variables from makefiles. -@xref{Environment, ,Variables from the Environment}. - -@item -f @var{file} -@cindex @code{-f} -@itemx --file=@var{file} -@cindex @code{--file} -@itemx --makefile=@var{file} -@cindex @code{--makefile} -Read the file named @var{file} as a makefile. -@xref{Makefiles, ,Writing Makefiles}. - -@item -h -@cindex @code{-h} -@itemx --help -@cindex @code{--help} -@c Extra blank line here makes the table look better. - -Remind you of the options that @code{make} understands and then exit. - -@item -i -@cindex @code{-i} -@itemx --ignore-errors -@cindex @code{--ignore-errors} -Ignore all errors in commands executed to remake files. -@xref{Errors, ,Errors in Commands}. - -@item -I @var{dir} -@cindex @code{-I} -@itemx --include-dir=@var{dir} -@cindex @code{--include-dir} -Specifies a directory @var{dir} to search for included makefiles. -@xref{Include, ,Including Other Makefiles}. If several @samp{-I} -options are used to specify several directories, the directories are -searched in the order specified. - -@item -j [@var{jobs}] -@cindex @code{-j} -@itemx --jobs=[@var{jobs}] -@cindex @code{--jobs} -Specifies the number of jobs (commands) to run simultaneously. With no -argument, @code{make} runs as many jobs simultaneously as possible. If -there is more than one @samp{-j} option, the last one is effective. -@xref{Parallel, ,Parallel Execution}, -for more information on how commands are run. - -@item -k -@cindex @code{-k} -@itemx --keep-going -@cindex @code{--keep-going} -Continue as much as possible after an error. While the target that -failed, and those that depend on it, cannot be remade, the other -dependencies of these targets can be processed all the same. -@xref{Testing, ,Testing the Compilation of a Program}. - -@item -l [@var{load}] -@cindex @code{-l} -@itemx --load-average[=@var{load}] -@cindex @code{--load-average} -@itemx --max-load[=@var{load}] -@cindex @code{--max-load} -Specifies that no new jobs (commands) should be started if there are -other jobs running and the load average is at least @var{load} (a -floating-point number). With no argument, removes a previous load -limit. @xref{Parallel, ,Parallel Execution}. - -@item -n -@cindex @code{-n} -@itemx --just-print -@cindex @code{--just-print} -@itemx --dry-run -@cindex @code{--dry-run} -@itemx --recon -@cindex @code{--recon} -@c Extra blank line here makes the table look better. - -Print the commands that would be executed, but do not execute them. -@xref{Instead of Execution, ,Instead of Executing the Commands}. - -@item -o @var{file} -@cindex @code{-o} -@itemx --old-file=@var{file} -@cindex @code{--old-file} -@itemx --assume-old=@var{file} -@cindex @code{--assume-old} -Do not remake the file @var{file} even if it is older than its -dependencies, and do not remake anything on account of changes in -@var{file}. Essentially the file is treated as very old and its rules -are ignored. @xref{Avoiding Compilation, ,Avoiding Recompilation of -Some Files}.@refill - -@item -p -@cindex @code{-p} -@itemx --print-data-base -@cindex @code{--print-data-base} -Print the data base (rules and variable values) that results from -reading the makefiles; then execute as usual or as otherwise -specified. This also prints the version information given by -the @samp{-v} switch (see below). To print the data base without -trying to remake any files, use @w{@samp{make -p -f /dev/null}}. - -@item -q -@cindex @code{-q} -@itemx --question -@cindex @code{--question} -``Question mode''. Do not run any commands, or print anything; just -return an exit status that is zero if the specified targets are already -up to date, one if any remaking is required, or two if an error is -encountered. @xref{Instead of Execution, ,Instead of Executing the -Commands}.@refill - -@item -r -@cindex @code{-r} -@itemx --no-builtin-rules -@cindex @code{--no-builtin-rules} -Eliminate use of the built-in implicit rules (@pxref{Implicit Rules, -,Using Implicit Rules}). You can still define your own by writing -pattern rules (@pxref{Pattern Rules, ,Defining and Redefining Pattern -Rules}). The @samp{-r} option also clears out the default list of -suffixes for suffix rules (@pxref{Suffix Rules, ,Old-Fashioned Suffix -Rules}). But you can still define your own suffixes with a rule for -@code{.SUFFIXES}, and then define your own suffix rules. - -@item -s -@cindex @code{-s} -@itemx --silent -@cindex @code{--silent} -@itemx --quiet -@cindex @code{--quiet} -@c Extra blank line here makes the table look better. - -Silent operation; do not print the commands as they are executed. -@xref{Echoing, ,Command Echoing}. - -@item -S -@cindex @code{-S} -@itemx --no-keep-going -@cindex @code{--no-keep-going} -@itemx --stop -@cindex @code{--stop} -@c Extra blank line here makes the table look better. - -Cancel the effect of the @samp{-k} option. This is never necessary -except in a recursive @code{make} where @samp{-k} might be inherited -from the top-level @code{make} via @code{MAKEFLAGS} -(@pxref{Recursion, ,Recursive Use of @code{make}}) -or if you set @samp{-k} in @code{MAKEFLAGS} in your environment.@refill - -@item -t -@cindex @code{-t} -@itemx --touch -@cindex @code{--touch} -@c Extra blank line here makes the table look better. - -Touch files (mark them up to date without really changing them) -instead of running their commands. This is used to pretend that the -commands were done, in order to fool future invocations of -@code{make}. @xref{Instead of Execution, ,Instead of Executing the Commands}. - -@item -v -@cindex @code{-v} -@itemx --version -@cindex @code{--version} -Print the version of the @code{make} program plus a copyright, a list -of authors, and a notice that there is no warranty; then exit. - -@item -w -@cindex @code{-w} -@itemx --print-directory -@cindex @code{--print-directory} -Print a message containing the working directory both before and after -executing the makefile. This may be useful for tracking down errors -from complicated nests of recursive @code{make} commands. -@xref{Recursion, ,Recursive Use of @code{make}}. (In practice, you -rarely need to specify this option since @samp{make} does it for you; -see @ref{-w Option, ,The @samp{--print-directory} Option}.) - -@itemx --no-print-directory -@cindex @code{--no-print-directory} -Disable printing of the working directory under @code{-w}. -This option is useful when @code{-w} is turned on automatically, -but you do not want to see the extra messages. -@xref{-w Option, ,The @samp{--print-directory} Option}. - -@item -W @var{file} -@cindex @code{-W} -@itemx --what-if=@var{file} -@cindex @code{--what-if} -@itemx --new-file=@var{file} -@cindex @code{--new-file} -@itemx --assume-new=@var{file} -@cindex @code{--assume-new} -Pretend that the target @var{file} has just been modified. When used -with the @samp{-n} flag, this shows you what would happen if you were -to modify that file. Without @samp{-n}, it is almost the same as -running a @code{touch} command on the given file before running -@code{make}, except that the modification time is changed only in the -imagination of @code{make}. -@xref{Instead of Execution, ,Instead of Executing the Commands}. - -@item --warn-undefined-variables -@cindex @code{--warn-undefined-variables} -@cindex variables, warning for undefined -@cindex undefined variables, warning message -Issue a warning message whenever @code{make} sees a reference to an -undefined variable. This can be helpful when you are trying to debug -makefiles which use variables in complex ways. -@end table - -@node Implicit Rules, Archives, Running, Top -@chapter Using Implicit Rules -@cindex implicit rule -@cindex rule, implicit - -Certain standard ways of remaking target files are used very often. For -example, one customary way to make an object file is from a C source file -using the C compiler, @code{cc}. - -@dfn{Implicit rules} tell @code{make} how to use customary techniques so -that you do not have to specify them in detail when you want to use -them. For example, there is an implicit rule for C compilation. File -names determine which implicit rules are run. For example, C -compilation typically takes a @file{.c} file and makes a @file{.o} file. -So @code{make} applies the implicit rule for C compilation when it sees -this combination of file name endings.@refill - -A chain of implicit rules can apply in sequence; for example, @code{make} -will remake a @file{.o} file from a @file{.y} file by way of a @file{.c} file. -@iftex -@xref{Chained Rules, ,Chains of Implicit Rules}. -@end iftex - -The built-in implicit rules use several variables in their commands so -that, by changing the values of the variables, you can change the way the -implicit rule works. For example, the variable @code{CFLAGS} controls the -flags given to the C compiler by the implicit rule for C compilation. -@iftex -@xref{Implicit Variables, ,Variables Used by Implicit Rules}. -@end iftex - -You can define your own implicit rules by writing @dfn{pattern rules}. -@iftex -@xref{Pattern Rules, ,Defining and Redefining Pattern Rules}. -@end iftex - -@dfn{Suffix rules} are a more limited way to define implicit rules. -Pattern rules are more general and clearer, but suffix rules are -retained for compatibility. -@iftex -@xref{Suffix Rules, ,Old-Fashioned Suffix Rules}. -@end iftex - -@menu -* Using Implicit:: How to use an existing implicit rule - to get the commands for updating a file. -* Catalogue of Rules:: A list of built-in implicit rules. -* Implicit Variables:: How to change what predefined rules do. -* Chained Rules:: How to use a chain of implicit rules. -* Pattern Rules:: How to define new implicit rules. -* Last Resort:: How to defining commands for rules - which cannot find any. -* Suffix Rules:: The old-fashioned style of implicit rule. -* Search Algorithm:: The precise algorithm for applying - implicit rules. -@end menu - -@node Using Implicit, Catalogue of Rules, , Implicit Rules -@section Using Implicit Rules -@cindex implicit rule, how to use -@cindex rule, implicit, how to use - -To allow @code{make} to find a customary method for updating a target file, -all you have to do is refrain from specifying commands yourself. Either -write a rule with no command lines, or don't write a rule at all. Then -@code{make} will figure out which implicit rule to use based on which -kind of source file exists or can be made. - -For example, suppose the makefile looks like this: - -@example -foo : foo.o bar.o - cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS) -@end example - -@noindent -Because you mention @file{foo.o} but do not give a rule for it, @code{make} -will automatically look for an implicit rule that tells how to update it. -This happens whether or not the file @file{foo.o} currently exists. - -If an implicit rule is found, it can supply both commands and one or -more dependencies (the source files). You would want to write a rule -for @file{foo.o} with no command lines if you need to specify additional -dependencies, such as header files, that the implicit rule cannot -supply. - -Each implicit rule has a target pattern and dependency patterns. There may -be many implicit rules with the same target pattern. For example, numerous -rules make @samp{.o} files: one, from a @samp{.c} file with the C compiler; -another, from a @samp{.p} file with the Pascal compiler; and so on. The rule -that actually applies is the one whose dependencies exist or can be made. -So, if you have a file @file{foo.c}, @code{make} will run the C compiler; -otherwise, if you have a file @file{foo.p}, @code{make} will run the Pascal -compiler; and so on. - -Of course, when you write the makefile, you know which implicit rule you -want @code{make} to use, and you know it will choose that one because you -know which possible dependency files are supposed to exist. -@xref{Catalogue of Rules, ,Catalogue of Implicit Rules}, -for a catalogue of all the predefined implicit rules. - -Above, we said an implicit rule applies if the required dependencies ``exist -or can be made''. A file ``can be made'' if it is mentioned explicitly in -the makefile as a target or a dependency, or if an implicit rule can be -recursively found for how to make it. When an implicit dependency is the -result of another implicit rule, we say that @dfn{chaining} is occurring. -@xref{Chained Rules, ,Chains of Implicit Rules}. - -In general, @code{make} searches for an implicit rule for each target, and -for each double-colon rule, that has no commands. A file that is mentioned -only as a dependency is considered a target whose rule specifies nothing, -so implicit rule search happens for it. @xref{Search Algorithm, ,Implicit Rule Search Algorithm}, for the -details of how the search is done. - -Note that explicit dependencies do not influence implicit rule search. -For example, consider this explicit rule: - -@example -foo.o: foo.p -@end example - -@noindent -The dependency on @file{foo.p} does not necessarily mean that -@code{make} will remake @file{foo.o} according to the implicit rule to -make an object file, a @file{.o} file, from a Pascal source file, a -@file{.p} file. For example, if @file{foo.c} also exists, the implicit -rule to make an object file from a C source file is used instead, -because it appears before the Pascal rule in the list of predefined -implicit rules (@pxref{Catalogue of Rules, , Catalogue of Implicit -Rules}). - -If you do not want an implicit rule to be used for a target that has no -commands, you can give that target empty commands by writing a semicolon -(@pxref{Empty Commands, ,Defining Empty Commands}). - -@node Catalogue of Rules, Implicit Variables, Using Implicit, Implicit Rules -@section Catalogue of Implicit Rules -@cindex implicit rule, predefined -@cindex rule, implicit, predefined - -Here is a catalogue of predefined implicit rules which are always -available unless the makefile explicitly overrides or cancels them. -@xref{Canceling Rules, ,Canceling Implicit Rules}, for information on -canceling or overriding an implicit rule. The @samp{-r} or -@samp{--no-builtin-rules} option cancels all predefined rules. - -Not all of these rules will always be defined, even when the @samp{-r} -option is not given. Many of the predefined implicit rules are -implemented in @code{make} as suffix rules, so which ones will be -defined depends on the @dfn{suffix list} (the list of dependencies of -the special target @code{.SUFFIXES}). The default suffix list is: -@code{.out}, @code{.a}, @code{.ln}, @code{.o}, @code{.c}, @code{.cc}, -@code{.C}, @code{.p}, @code{.f}, @code{.F}, @code{.r}, @code{.y}, -@code{.l}, @code{.s}, @code{.S}, @code{.mod}, @code{.sym}, @code{.def}, -@code{.h}, @code{.info}, @code{.dvi}, @code{.tex}, @code{.texinfo}, -@code{.texi}, @code{.txinfo}, @code{.w}, @code{.ch} @code{.web}, -@code{.sh}, @code{.elc}, @code{.el}. All of the implicit rules -described below whose dependencies have one of these suffixes are -actually suffix rules. If you modify the suffix list, the only -predefined suffix rules in effect will be those named by one or two of -the suffixes that are on the list you specify; rules whose suffixes fail -to be on the list are disabled. @xref{Suffix Rules, ,Old-Fashioned -Suffix Rules}, for full details on suffix rules. - -@table @asis -@item Compiling C programs -@cindex C, rule to compile -@pindex cc -@pindex gcc -@pindex .o -@pindex .c -@file{@var{n}.o} is made automatically from @file{@var{n}.c} with -a command of the form @samp{$(CC) -c $(CPPFLAGS) $(CFLAGS)}.@refill - -@item Compiling C++ programs -@cindex C++, rule to compile -@pindex g++ -@pindex .C -@pindex .cc -@file{@var{n}.o} is made automatically from @file{@var{n}.cc} or -@file{@var{n}.C} with a command of the form @samp{$(CXX) -c $(CPPFLAGS) -$(CXXFLAGS)}. We encourage you to use the suffix @samp{.cc} for C++ -source files instead of @samp{.C}.@refill - -@item Compiling Pascal programs -@cindex Pascal, rule to compile -@pindex pc -@pindex .p -@file{@var{n}.o} is made automatically from @file{@var{n}.p} -with the command @samp{$(PC) -c $(PFLAGS)}.@refill - -@item Compiling Fortran and Ratfor programs -@cindex Fortran, rule to compile -@cindex Ratfor, rule to compile -@pindex f77 -@pindex .f -@pindex .r -@pindex .F -@file{@var{n}.o} is made automatically from @file{@var{n}.r}, -@file{@var{n}.F} or @file{@var{n}.f} by running the -Fortran compiler. The precise command used is as follows:@refill - -@table @samp -@item .f -@samp{$(FC) -c $(FFLAGS)}. -@item .F -@samp{$(FC) -c $(FFLAGS) $(CPPFLAGS)}. -@item .r -@samp{$(FC) -c $(FFLAGS) $(RFLAGS)}. -@end table - -@item Preprocessing Fortran and Ratfor programs -@file{@var{n}.f} is made automatically from @file{@var{n}.r} or -@file{@var{n}.F}. This rule runs just the preprocessor to convert a -Ratfor or preprocessable Fortran program into a strict Fortran -program. The precise command used is as follows:@refill - -@table @samp -@item .F -@samp{$(FC) -F $(CPPFLAGS) $(FFLAGS)}. -@item .r -@samp{$(FC) -F $(FFLAGS) $(RFLAGS)}. -@end table - -@item Compiling Modula-2 programs -@cindex Modula-2, rule to compile -@pindex m2c -@pindex .sym -@pindex .def -@pindex .mod -@file{@var{n}.sym} is made from @file{@var{n}.def} with a command -of the form @samp{$(M2C) $(M2FLAGS) $(DEFFLAGS)}. @file{@var{n}.o} -is made from @file{@var{n}.mod}; the form is: -@w{@samp{$(M2C) $(M2FLAGS) $(MODFLAGS)}}.@refill - -@need 1200 -@item Assembling and preprocessing assembler programs -@cindex assembly, rule to compile -@pindex as -@pindex .s -@file{@var{n}.o} is made automatically from @file{@var{n}.s} by -running the assembler, @code{as}. The precise command is -@samp{$(AS) $(ASFLAGS)}.@refill - -@pindex .S -@file{@var{n}.s} is made automatically from @file{@var{n}.S} by -running the C preprocessor, @code{cpp}. The precise command is -@w{@samp{$(CPP) $(CPPFLAGS)}}. - -@item Linking a single object file -@cindex linking, predefined rule for -@pindex ld -@pindex .o -@file{@var{n}} is made automatically from @file{@var{n}.o} by running -the linker (usually called @code{ld}) via the C compiler. The precise -command used is @w{@samp{$(CC) $(LDFLAGS) @var{n}.o $(LOADLIBES)}}. - -This rule does the right thing for a simple program with only one -source file. It will also do the right thing if there are multiple -object files (presumably coming from various other source files), one -of which has a name matching that of the executable file. Thus, - -@example -x: y.o z.o -@end example - -@noindent -when @file{x.c}, @file{y.c} and @file{z.c} all exist will execute: - -@example -@group -cc -c x.c -o x.o -cc -c y.c -o y.o -cc -c z.c -o z.o -cc x.o y.o z.o -o x -rm -f x.o -rm -f y.o -rm -f z.o -@end group -@end example - -@noindent -In more complicated cases, such as when there is no object file whose -name derives from the executable file name, you must write an explicit -command for linking. - -Each kind of file automatically made into @samp{.o} object files will -be automatically linked by using the compiler (@samp{$(CC)}, -@samp{$(FC)} or @samp{$(PC)}; the C compiler @samp{$(CC)} is used to -assemble @samp{.s} files) without the @samp{-c} option. This could be -done by using the @samp{.o} object files as intermediates, but it is -faster to do the compiling and linking in one step, so that's how it's -done.@refill - -@item Yacc for C programs -@pindex yacc -@cindex Yacc, rule to run -@pindex .y -@file{@var{n}.c} is made automatically from @file{@var{n}.y} by -running Yacc with the command @samp{$(YACC) $(YFLAGS)}. - -@item Lex for C programs -@pindex lex -@cindex Lex, rule to run -@pindex .l -@file{@var{n}.c} is made automatically from @file{@var{n}.l} by -by running Lex. The actual command is @samp{$(LEX) $(LFLAGS)}. - -@item Lex for Ratfor programs -@file{@var{n}.r} is made automatically from @file{@var{n}.l} by -by running Lex. The actual command is @samp{$(LEX) $(LFLAGS)}. - -The convention of using the same suffix @samp{.l} for all Lex files -regardless of whether they produce C code or Ratfor code makes it -impossible for @code{make} to determine automatically which of the two -languages you are using in any particular case. If @code{make} is -called upon to remake an object file from a @samp{.l} file, it must -guess which compiler to use. It will guess the C compiler, because -that is more common. If you are using Ratfor, make sure @code{make} -knows this by mentioning @file{@var{n}.r} in the makefile. Or, if you -are using Ratfor exclusively, with no C files, remove @samp{.c} from -the list of implicit rule suffixes with:@refill - -@example -@group -.SUFFIXES: -.SUFFIXES: .o .r .f .l @dots{} -@end group -@end example - -@item Making Lint Libraries from C, Yacc, or Lex programs -@pindex lint -@cindex @code{lint}, rule to run -@pindex .ln -@file{@var{n}.ln} is made from @file{@var{n}.c} by running @code{lint}. -The precise command is @w{@samp{$(LINT) $(LINTFLAGS) $(CPPFLAGS) -i}}. -The same command is used on the C code produced from -@file{@var{n}.y} or @file{@var{n}.l}.@refill - -@item @TeX{} and Web -@cindex @TeX{}, rule to run -@cindex Web, rule to run -@pindex tex -@pindex cweave -@pindex weave -@pindex tangle -@pindex ctangle -@pindex .dvi -@pindex .tex -@pindex .web -@pindex .w -@pindex .ch -@file{@var{n}.dvi} is made from @file{@var{n}.tex} with the command -@samp{$(TEX)}. @file{@var{n}.tex} is made from @file{@var{n}.web} with -@samp{$(WEAVE)}, or from @file{@var{n}.w} (and from @file{@var{n}.ch} if -it exists or can be made) with @samp{$(CWEAVE)}. @file{@var{n}.p} is -made from @file{@var{n}.web} with @samp{$(TANGLE)} and @file{@var{n}.c} -is made from @file{@var{n}.w} (and from @file{@var{n}.ch} if it exists -or can be made) with @samp{$(CTANGLE)}.@refill - -@item Texinfo and Info -@cindex Texinfo, rule to format -@cindex Info, rule to format -@pindex texi2dvi -@pindex makeinfo -@pindex .texinfo -@pindex .info -@pindex .texi -@pindex .txinfo -@file{@var{n}.dvi} is made from @file{@var{n}.texinfo}, -@file{@var{n}.texi}, or @file{@var{n}.txinfo}, with the command -@w{@samp{$(TEXI2DVI) $(TEXI2DVI_FLAGS)}}. @file{@var{n}.info} is made from -@file{@var{n}.texinfo}, @file{@var{n}.texi}, or @file{@var{n}.txinfo}, with -the command @w{@samp{$(MAKEINFO) $(MAKEINFO_FLAGS)}}. - -@item RCS -@cindex RCS, rule to extract from -@pindex co -@pindex ,v @r{(RCS file extension)} -Any file @file{@var{n}} is extracted if necessary from an RCS file -named either @file{@var{n},v} or @file{RCS/@var{n},v}. The precise -command used is @w{@samp{$(CO) $(COFLAGS)}}. @file{@var{n}} will not be -extracted from RCS if it already exists, even if the RCS file is -newer. The rules for RCS are terminal -(@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}), -so RCS files cannot be generated from another source; they must -actually exist.@refill - -@item SCCS -@cindex SCCS, rule to extract from -@pindex get -@pindex s. @r{(SCCS file prefix)} -Any file @file{@var{n}} is extracted if necessary from an SCCS file -named either @file{s.@var{n}} or @file{SCCS/s.@var{n}}. The precise -command used is @w{@samp{$(GET) $(GFLAGS)}}. The rules for SCCS are -terminal (@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}), -so SCCS files cannot be generated from another source; they must -actually exist.@refill - -@pindex .sh -For the benefit of SCCS, a file @file{@var{n}} is copied from -@file{@var{n}.sh} and made executable (by everyone). This is for -shell scripts that are checked into SCCS. Since RCS preserves the -execution permission of a file, you do not need to use this feature -with RCS.@refill - -We recommend that you avoid using of SCCS. RCS is widely held to be -superior, and is also free. By choosing free software in place of -comparable (or inferior) proprietary software, you support the free -software movement. -@end table - -Usually, you want to change only the variables listed in the table -above, which are documented in the following section. - -However, the commands in built-in implicit rules actually use -variables such as @code{COMPILE.c}, @code{LINK.p}, and -@code{PREPROCESS.S}, whose values contain the commands listed above. - -@code{make} follows the convention that the rule to compile a -@file{.@var{x}} source file uses the variable @code{COMPILE.@var{x}}. -Similarly, the rule to produce an executable from a @file{.@var{x}} -file uses @code{LINK.@var{x}}; and the rule to preprocess a -@file{.@var{x}} file uses @code{PREPROCESS.@var{x}}. - -@vindex OUTPUT_OPTION -Every rule that produces an object file uses the variable -@code{OUTPUT_OPTION}. @code{make} defines this variable either to -contain @samp{-o $@@}, or to be empty, depending on a compile-time -option. You need the @samp{-o} option to ensure that the output goes -into the right file when the source file is in a different directory, -as when using @code{VPATH} (@pxref{Directory Search}). However, -compilers on some systems do not accept a @samp{-o} switch for object -files. If you use such a system, and use @code{VPATH}, some -compilations will put their output in the wrong place. -A possible workaround for this problem is to give @code{OUTPUT_OPTION} -the value @w{@samp{; mv $*.o $@@}}. - -@node Implicit Variables, Chained Rules, Catalogue of Rules, Implicit Rules -@section Variables Used by Implicit Rules -@cindex flags for compilers - -The commands in built-in implicit rules make liberal use of certain -predefined variables. You can alter these variables in the makefile, -with arguments to @code{make}, or in the environment to alter how the -implicit rules work without redefining the rules themselves. - -For example, the command used to compile a C source file actually says -@samp{$(CC) -c $(CFLAGS) $(CPPFLAGS)}. The default values of the variables -used are @samp{cc} and nothing, resulting in the command @samp{cc -c}. By -redefining @samp{CC} to @samp{ncc}, you could cause @samp{ncc} to be -used for all C compilations performed by the implicit rule. By redefining -@samp{CFLAGS} to be @samp{-g}, you could pass the @samp{-g} option to -each compilation. @emph{All} implicit rules that do C compilation use -@samp{$(CC)} to get the program name for the compiler and @emph{all} -include @samp{$(CFLAGS)} among the arguments given to the compiler.@refill - -The variables used in implicit rules fall into two classes: those that are -names of programs (like @code{CC}) and those that contain arguments for the -programs (like @code{CFLAGS}). (The ``name of a program'' may also contain -some command arguments, but it must start with an actual executable program -name.) If a variable value contains more than one argument, separate them -with spaces. - -Here is a table of variables used as names of programs in built-in rules: - -@table @code -@item AR -@vindex AR -Archive-maintaining program; default @samp{ar}. -@pindex ar - -@item AS -@vindex AS -Program for doing assembly; default @samp{as}. -@pindex as - -@item CC -@vindex CC -Program for compiling C programs; default @samp{cc}. -@pindex cc - -@item CXX -@vindex CXX -Program for compiling C++ programs; default @samp{g++}. -@pindex g++ - -@item CO -@vindex CO -Program for extracting a file from RCS; default @samp{co}. -@pindex co - -@item CPP -@vindex CPP -Program for running the C preprocessor, with results to standard output; -default @samp{$(CC) -E}. - -@item FC -@vindex FC -Program for compiling or preprocessing Fortran and Ratfor programs; -default @samp{f77}. -@pindex f77 - -@item GET -@vindex GET -Program for extracting a file from SCCS; default @samp{get}. -@pindex get - -@item LEX -@vindex LEX -Program to use to turn Lex grammars into C programs or Ratfor programs; -default @samp{lex}. -@pindex lex - -@item PC -@vindex PC -Program for compiling Pascal programs; default @samp{pc}. -@pindex pc - -@item YACC -@vindex YACC -Program to use to turn Yacc grammars into C programs; default @samp{yacc}. -@pindex yacc - -@item YACCR -@vindex YACCR -Program to use to turn Yacc grammars into Ratfor -programs; default @samp{yacc -r}. - -@item MAKEINFO -@vindex MAKEINFO -Program to convert a Texinfo source file into an Info file; default -@samp{makeinfo}. -@pindex makeinfo - -@item TEX -@vindex TEX -Program to make @TeX{} @sc{dvi} files from @TeX{} source; -default @samp{tex}. -@pindex tex - -@item TEXI2DVI -@vindex TEXI2DVI -Program to make @TeX{} @sc{dvi} files from Texinfo source; -default @samp{texi2dvi}. -@pindex texi2dvi - -@item WEAVE -@vindex WEAVE -Program to translate Web into @TeX{}; default @samp{weave}. -@pindex weave - -@item CWEAVE -@vindex CWEAVE -Program to translate C Web into @TeX{}; default @samp{cweave}. -@pindex cweave - -@item TANGLE -@vindex TANGLE -Program to translate Web into Pascal; default @samp{tangle}. -@pindex tangle - -@item CTANGLE -@vindex CTANGLE -Program to translate C Web into C; default @samp{ctangle}. -@pindex ctangle - -@item RM -@vindex RM -Command to remove a file; default @samp{rm -f}. -@pindex rm -@end table - -Here is a table of variables whose values are additional arguments for the -programs above. The default values for all of these is the empty -string, unless otherwise noted. - -@table @code -@item ARFLAGS -@vindex ARFLAGS -Flags to give the archive-maintaining program; default @samp{rv}. - -@item ASFLAGS -@vindex ASFLAGS -Extra flags to give to the assembler (when explicitly -invoked on a @samp{.s} or @samp{.S} file). - -@item CFLAGS -@vindex CFLAGS -Extra flags to give to the C compiler. - -@item CXXFLAGS -@vindex CXXFLAGS -Extra flags to give to the C++ compiler. - -@item COFLAGS -@vindex COFLAGS -Extra flags to give to the RCS @code{co} program. - -@item CPPFLAGS -@vindex CPPFLAGS -Extra flags to give to the C preprocessor and programs -that use it (the C and Fortran compilers). - -@item FFLAGS -@vindex FFLAGS -Extra flags to give to the Fortran compiler. - -@item GFLAGS -@vindex GFLAGS -Extra flags to give to the SCCS @code{get} program. - -@item LDFLAGS -@vindex LDFLAGS -Extra flags to give to compilers when they are -supposed to invoke the linker, @samp{ld}. - -@item LFLAGS -@vindex LFLAGS -Extra flags to give to Lex. - -@item PFLAGS -@vindex PFLAGS -Extra flags to give to the Pascal compiler. - -@item RFLAGS -@vindex RFLAGS -Extra flags to give to the Fortran compiler for Ratfor programs. - -@item YFLAGS -@vindex YFLAGS -Extra flags to give to Yacc. -@end table - -@node Chained Rules, Pattern Rules, Implicit Variables, Implicit Rules -@section Chains of Implicit Rules - -@cindex chains of rules -@cindex rule, implicit, chains of -Sometimes a file can be made by a sequence of implicit rules. For example, -a file @file{@var{n}.o} could be made from @file{@var{n}.y} by running -first Yacc and then @code{cc}. Such a sequence is called a @dfn{chain}. - -If the file @file{@var{n}.c} exists, or is mentioned in the makefile, no -special searching is required: @code{make} finds that the object file can -be made by C compilation from @file{@var{n}.c}; later on, when considering -how to make @file{@var{n}.c}, the rule for running Yacc is -used. Ultimately both @file{@var{n}.c} and @file{@var{n}.o} are -updated.@refill - -@cindex intermediate files -@cindex files, intermediate -However, even if @file{@var{n}.c} does not exist and is not mentioned, -@code{make} knows how to envision it as the missing link between -@file{@var{n}.o} and @file{@var{n}.y}! In this case, @file{@var{n}.c} is -called an @dfn{intermediate file}. Once @code{make} has decided to use the -intermediate file, it is entered in the data base as if it had been -mentioned in the makefile, along with the implicit rule that says how to -create it.@refill - -Intermediate files are remade using their rules just like all other -files. The difference is that the intermediate file is deleted when -@code{make} is finished. Therefore, the intermediate file which did not -exist before @code{make} also does not exist after @code{make}. The -deletion is reported to you by printing a @samp{rm -f} command that -shows what @code{make} is doing. (You can list the target pattern of an -implicit rule (such as @samp{%.o}) as a dependency of the special -target @code{.PRECIOUS} to preserve intermediate files made by implicit -rules whose target patterns match that file's name; -see @ref{Interrupts}.)@refill -@cindex intermediate files, preserving -@cindex preserving intermediate files -@cindex preserving with @code{.PRECIOUS} -@cindex @code{.PRECIOUS} intermediate files - -A chain can involve more than two implicit rules. For example, it is -possible to make a file @file{foo} from @file{RCS/foo.y,v} by running RCS, -Yacc and @code{cc}. Then both @file{foo.y} and @file{foo.c} are -intermediate files that are deleted at the end.@refill - -No single implicit rule can appear more than once in a chain. This means -that @code{make} will not even consider such a ridiculous thing as making -@file{foo} from @file{foo.o.o} by running the linker twice. This -constraint has the added benefit of preventing any infinite loop in the -search for an implicit rule chain. - -There are some special implicit rules to optimize certain cases that would -otherwise be handled by rule chains. For example, making @file{foo} from -@file{foo.c} could be handled by compiling and linking with separate -chained rules, using @file{foo.o} as an intermediate file. But what -actually happens is that a special rule for this case does the compilation -and linking with a single @code{cc} command. The optimized rule is used in -preference to the step-by-step chain because it comes earlier in the -ordering of rules. - -@node Pattern Rules, Last Resort, Chained Rules, Implicit Rules -@section Defining and Redefining Pattern Rules - -You define an implicit rule by writing a @dfn{pattern rule}. A pattern -rule looks like an ordinary rule, except that its target contains the -character @samp{%} (exactly one of them). The target is considered a -pattern for matching file names; the @samp{%} can match any nonempty -substring, while other characters match only themselves. The dependencies -likewise use @samp{%} to show how their names relate to the target name. - -Thus, a pattern rule @samp{%.o : %.c} says how to make any file -@file{@var{stem}.o} from another file @file{@var{stem}.c}.@refill - -Note that expansion using @samp{%} in pattern rules occurs -@strong{after} any variable or function expansions, which take place -when the makefile is read. @xref{Using Variables, , How to Use -Variables}, and @ref{Functions, ,Functions for Transforming Text}. - -@menu -* Pattern Intro:: An introduction to pattern rules. -* Pattern Examples:: Examples of pattern rules. -* Automatic:: How to use automatic variables in the - commands of implicit rules. -* Pattern Match:: How patterns match. -* Match-Anything Rules:: Precautions you should take prior to - defining rules that can match any - target file whatever. -* Canceling Rules:: How to override or cancel built-in rules. -@end menu - -@node Pattern Intro, Pattern Examples, , Pattern Rules -@subsection Introduction to Pattern Rules -@cindex pattern rule -@cindex rule, pattern - -A pattern rule contains the character @samp{%} (exactly one of them) -in the target; otherwise, it looks exactly like an ordinary rule. The -target is a pattern for matching file names; the @samp{%} matches any -nonempty substring, while other characters match only themselves. -@cindex target pattern, implicit -@cindex @code{%}, in pattern rules - -For example, @samp{%.c} as a pattern matches any file name that ends in -@samp{.c}. @samp{s.%.c} as a pattern matches any file name that starts -with @samp{s.}, ends in @samp{.c} and is at least five characters long. -(There must be at least one character to match the @samp{%}.) The substring -that the @samp{%} matches is called the @dfn{stem}.@refill - -@samp{%} in a dependency of a pattern rule stands for the same stem -that was matched by the @samp{%} in the target. In order for -the pattern rule to apply, its target pattern must match the file name -under consideration, and its dependency patterns must name files that -exist or can be made. These files become dependencies of the target. -@cindex dependency pattern, implicit - -Thus, a rule of the form - -@example -%.o : %.c ; @var{command}@dots{} -@end example - -@noindent -specifies how to make a file @file{@var{n}.o}, with another file -@file{@var{n}.c} as its dependency, provided that @file{@var{n}.c} -exists or can be made. - -There may also be dependencies that do not use @samp{%}; such a dependency -attaches to every file made by this pattern rule. These unvarying -dependencies are useful occasionally. - -A pattern rule need not have any dependencies that contain @samp{%}, or -in fact any dependencies at all. Such a rule is effectively a general -wildcard. It provides a way to make any file that matches the target -pattern. @xref{Last Resort}. - -@c !!! The end of of this paragraph should be rewritten. --bob -Pattern rules may have more than one target. Unlike normal rules, this -does not act as many different rules with the same dependencies and -commands. If a pattern rule has multiple targets, @code{make} knows that -the rule's commands are responsible for making all of the targets. The -commands are executed only once to make all the targets. When searching -for a pattern rule to match a target, the target patterns of a rule other -than the one that matches the target in need of a rule are incidental: -@code{make} worries only about giving commands and dependencies to the file -presently in question. However, when this file's commands are run, the -other targets are marked as having been updated themselves. -@cindex multiple targets, in pattern rule -@cindex target, multiple in pattern rule - -The order in which pattern rules appear in the makefile is important -since this is the order in which they are considered. -Of equally applicable -rules, only the first one found is used. The rules you write take precedence -over those that are built in. Note however, that a rule whose -dependencies actually exist or are mentioned always takes priority over a -rule with dependencies that must be made by chaining other implicit rules. -@cindex pattern rules, order of -@cindex order of pattern rules - -@node Pattern Examples, Automatic, Pattern Intro, Pattern Rules -@subsection Pattern Rule Examples - -Here are some examples of pattern rules actually predefined in -@code{make}. First, the rule that compiles @samp{.c} files into @samp{.o} -files:@refill - -@example -%.o : %.c - $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@@ -@end example - -@noindent -defines a rule that can make any file @file{@var{x}.o} from -@file{@var{x}.c}. The command uses the automatic variables @samp{$@@} and -@samp{$<} to substitute the names of the target file and the source file -in each case where the rule applies (@pxref{Automatic, ,Automatic Variables}).@refill - -Here is a second built-in rule: - -@example -% :: RCS/%,v - $(CO) $(COFLAGS) $< -@end example - -@noindent -defines a rule that can make any file @file{@var{x}} whatsoever from a -corresponding file @file{@var{x},v} in the subdirectory @file{RCS}. Since -the target is @samp{%}, this rule will apply to any file whatever, provided -the appropriate dependency file exists. The double colon makes the rule -@dfn{terminal}, which means that its dependency may not be an intermediate -file (@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}).@refill - -@need 500 -This pattern rule has two targets: - -@example -@group -%.tab.c %.tab.h: %.y - bison -d $< -@end group -@end example - -@noindent -@c The following paragraph is rewritten to avoid overfull hboxes -This tells @code{make} that the command @samp{bison -d @var{x}.y} will -make both @file{@var{x}.tab.c} and @file{@var{x}.tab.h}. If the file -@file{foo} depends on the files @file{parse.tab.o} and @file{scan.o} -and the file @file{scan.o} depends on the file @file{parse.tab.h}, -when @file{parse.y} is changed, the command @samp{bison -d parse.y} -will be executed only once, and the dependencies of both -@file{parse.tab.o} and @file{scan.o} will be satisfied. (Presumably -the file @file{parse.tab.o} will be recompiled from @file{parse.tab.c} -and the file @file{scan.o} from @file{scan.c}, while @file{foo} is -linked from @file{parse.tab.o}, @file{scan.o}, and its other -dependencies, and it will execute happily ever after.)@refill - -@node Automatic, Pattern Match, Pattern Examples, Pattern Rules -@subsection Automatic Variables -@cindex automatic variables -@cindex variables, automatic -@cindex variables, and implicit rule - -Suppose you are writing a pattern rule to compile a @samp{.c} file into a -@samp{.o} file: how do you write the @samp{cc} command so that it operates -on the right source file name? You cannot write the name in the command, -because the name is different each time the implicit rule is applied. - -What you do is use a special feature of @code{make}, the @dfn{automatic -variables}. These variables have values computed afresh for each rule that -is executed, based on the target and dependencies of the rule. In this -example, you would use @samp{$@@} for the object file name and @samp{$<} -for the source file name. - -Here is a table of automatic variables: - -@table @code -@vindex $@@ -@vindex @@ @r{(automatic variable)} -@item $@@ -The file name of the target of the rule. If the target is an archive -member, then @samp{$@@} is the name of the archive file. In a pattern -rule that has multiple targets (@pxref{Pattern Intro, ,Introduction to -Pattern Rules}), @samp{$@@} is the name of whichever target caused the -rule's commands to be run. - -@vindex $% -@vindex % @r{(automatic variable)} -@item $% -The target member name, when the target is an archive member. -@xref{Archives}. For example, if the target is @file{foo.a(bar.o)} then -@samp{$%} is @file{bar.o} and @samp{$@@} is @file{foo.a}. @samp{$%} is -empty when the target is not an archive member. - -@vindex $< -@vindex < @r{(automatic variable)} -@item $< -The name of the first dependency. If the target got its commands from -an implicit rule, this will be the first dependency added by the -implicit rule (@pxref{Implicit Rules}). - -@vindex $? -@vindex ? @r{(automatic variable)} -@item $? -The names of all the dependencies that are newer than the target, with -spaces between them. For dependencies which are archive members, only -the member named is used (@pxref{Archives}). -@cindex dependencies, list of changed -@cindex list of changed dependencies - -@vindex $^ -@vindex ^ @r{(automatic variable)} -@item $^ -The names of all the dependencies, with spaces between them. For -dependencies which are archive members, only the member named is used -(@pxref{Archives}). A target has only one dependency on each other file -it depends on, no matter how many times each file is listed as a -dependency. So if you list a dependency more than once for a target, -the value of @code{$^} contains just one copy of the name. -@cindex dependencies, list of all -@cindex list of all dependencies - -@vindex $+ -@vindex + @r{(automatic variable)} -@item $+ -This is like @samp{$^}, but dependencies listed more than once are -duplicated in the order they were listed in the makefile. This is -primarily useful for use in linking commands where it is meaningful to -repeat library file names in a particular order. - -@vindex $* -@vindex * @r{(automatic variable)} -@item $* -The stem with which an implicit rule matches (@pxref{Pattern Match, ,How -Patterns Match}). If the target is @file{dir/a.foo.b} and the target -pattern is @file{a.%.b} then the stem is @file{dir/foo}. The stem is -useful for constructing names of related files.@refill -@cindex stem, variable for - -In a static pattern rule, the stem is part of the file name that matched -the @samp{%} in the target pattern. - -In an explicit rule, there is no stem; so @samp{$*} cannot be determined -in that way. Instead, if the target name ends with a recognized suffix -(@pxref{Suffix Rules, ,Old-Fashioned Suffix Rules}), @samp{$*} is set to -the target name minus the suffix. For example, if the target name is -@samp{foo.c}, then @samp{$*} is set to @samp{foo}, since @samp{.c} is a -suffix. GNU @code{make} does this bizarre thing only for compatibility -with other implementations of @code{make}. You should generally avoid -using @samp{$*} except in implicit rules or static pattern rules.@refill - -If the target name in an explicit rule does not end with a recognized -suffix, @samp{$*} is set to the empty string for that rule. -@end table - -@samp{$?} is useful even in explicit rules when you wish to operate on only -the dependencies that have changed. For example, suppose that an archive -named @file{lib} is supposed to contain copies of several object files. -This rule copies just the changed object files into the archive: - -@example -@group -lib: foo.o bar.o lose.o win.o - ar r lib $? -@end group -@end example - -Of the variables listed above, four have values that are single file -names, and two have values that are lists of file names. These six have -variants that get just the file's directory name or just the file name -within the directory. The variant variables' names are formed by -appending @samp{D} or @samp{F}, respectively. These variants are -semi-obsolete in GNU @code{make} since the functions @code{dir} and -@code{notdir} can be used to get a similar effect (@pxref{Filename -Functions, , Functions for File Names}). Note, however, that the -@samp{F} variants all omit the trailing slash which always appears in -the output of the @code{dir} function. Here is a table of the variants: - -@table @samp -@vindex $(@@D) -@vindex @@D @r{(automatic variable)} -@item $(@@D) -The directory part of the file name of the target, with the trailing -slash removed. If the value of @samp{$@@} is @file{dir/foo.o} then -@samp{$(@@D)} is @file{dir}. This value is @file{.} if @samp{$@@} does -not contain a slash. - -@vindex $(@@F) -@vindex @@F @r{(automatic variable)} -@item $(@@F) -The file-within-directory part of the file name of the target. If the -value of @samp{$@@} is @file{dir/foo.o} then @samp{$(@@F)} is -@file{foo.o}. @samp{$(@@F)} is equivalent to @samp{$(notdir $@@)}. - -@vindex $(*D) -@vindex *D @r{(automatic variable)} -@item $(*D) -@vindex $(*F) -@vindex *F @r{(automatic variable)} -@itemx $(*F) -The directory part and the file-within-directory -part of the stem; @file{dir} and @file{foo} in this example. - -@vindex $(%D) -@vindex %D @r{(automatic variable)} -@item $(%D) -@vindex $(%F) -@vindex %F @r{(automatic variable)} -@itemx $(%F) -The directory part and the file-within-directory part of the target -archive member name. This makes sense only for archive member targets -of the form @file{@var{archive}(@var{member})} and is useful only when -@var{member} may contain a directory name. (@xref{Archive Members, -,Archive Members as Targets}.) - -@vindex $( tar-`sed -e '/version_string/!d' \ - -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ - -e q - version.c`.shar.Z -@end group - -@group -dist: $(SRCS) $(AUX) - echo tar-`sed \ - -e '/version_string/!d' \ - -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ - -e q - version.c` > .fname - -rm -rf `cat .fname` - mkdir `cat .fname` - ln $(SRCS) $(AUX) `cat .fname` - -rm -rf `cat .fname` .fname - tar chZf `cat .fname`.tar.Z `cat .fname` -@end group - -@group -tar.zoo: $(SRCS) $(AUX) - -rm -rf tmp.dir - -mkdir tmp.dir - -rm tar.zoo - for X in $(SRCS) $(AUX) ; do \ - echo $$X ; \ - sed 's/$$/^M/' $$X \ - > tmp.dir/$$X ; done - cd tmp.dir ; zoo aM ../tar.zoo * - -rm -rf tmp.dir -@end group -@end example - -@node Concept Index, Name Index, Complex Makefile, Top -@unnumbered Index of Concepts - -@printindex cp - -@node Name Index, , Concept Index, Top -@unnumbered Index of Functions, Variables, & Directives - -@printindex fn - -@summarycontents -@contents -@bye diff --git a/buildtools/windows/source/make/make.toc b/buildtools/windows/source/make/make.toc deleted file mode 100644 index 311573ce690..00000000000 --- a/buildtools/windows/source/make/make.toc +++ /dev/null @@ -1,118 +0,0 @@ -\chapentry {Overview of \code {make}}{1}{1} -\secentry {How to Read This Manual}{1}{1}{1} -\secentry {Problems and Bugs}{1}{2}{2} -\chapentry {An Introduction to Makefiles}{2}{5} -\secentry {What a Rule Looks Like}{2}{1}{5} -\secentry {A Simple Makefile}{2}{2}{6} -\secentry {How \code {make} Processes a Makefile}{2}{3}{8} -\secentry {Variables Make Makefiles Simpler}{2}{4}{9} -\secentry {Letting \code {make} Deduce the Commands}{2}{5}{10} -\secentry {Another Style of Makefile}{2}{6}{11} -\secentry {Rules for Cleaning the Directory}{2}{7}{12} -\chapentry {Writing Makefiles}{3}{13} -\secentry {What Makefiles Contain}{3}{1}{13} -\secentry {What Name to Give Your Makefile}{3}{2}{14} -\secentry {Including Other Makefiles}{3}{3}{14} -\secentry {The Variable \code {MAKEFILES}}{3}{4}{16} -\secentry {How Makefiles Are Remade}{3}{5}{16} -\secentry {Overriding Part of Another Makefile}{3}{6}{18} -\chapentry {Writing Rules}{4}{19} -\secentry {Rule Syntax}{4}{1}{19} -\secentry {Using Wildcard Characters in File Names}{4}{2}{20} -\subsecentry {Wildcard Examples}{4}{2}{1}{21} -\subsecentry {Pitfalls of Using Wildcards}{4}{2}{2}{22} -\subsecentry {The Function \code {wildcard}}{4}{2}{3}{22} -\secentry {Searching Directories for Dependencies}{4}{3}{23} -\subsecentry {\code {VPATH}: Search Path for All Dependencies}{4}{3}{1}{23} -\subsecentry {The \code {vpath} Directive}{4}{3}{2}{24} -\subsecentry {Writing Shell Commands with Directory Search}{4}{3}{3}{26} -\subsecentry {Directory Search and Implicit Rules}{4}{3}{4}{27} -\subsecentry {Directory Search for Link Libraries}{4}{3}{5}{27} -\secentry {Phony Targets}{4}{4}{28} -\secentry {Rules without Commands or Dependencies}{4}{5}{30} -\secentry {Empty Target Files to Record Events}{4}{6}{30} -\secentry {Special Built-in Target Names}{4}{7}{31} -\secentry {Multiple Targets in a Rule}{4}{8}{32} -\secentry {Multiple Rules for One Target}{4}{9}{33} -\secentry {Static Pattern Rules}{4}{10}{34} -\subsecentry {Syntax of Static Pattern Rules}{4}{10}{1}{34} -\subsecentry {Static Pattern Rules versus Implicit Rules}{4}{10}{2}{36} -\secentry {Double-Colon Rules}{4}{11}{37} -\secentry {Generating Dependencies Automatically}{4}{12}{37} -\chapentry {Writing the Commands in Rules}{5}{41} -\secentry {Command Echoing}{5}{1}{41} -\secentry {Command Execution}{5}{2}{42} -\secentry {Parallel Execution}{5}{3}{42} -\secentry {Errors in Commands}{5}{4}{44} -\secentry {Interrupting or Killing \code {make}}{5}{5}{45} -\secentry {Recursive Use of \code {make}}{5}{6}{46} -\subsecentry {How the \code {MAKE} Variable Works}{5}{6}{1}{46} -\subsecentry {Communicating Variables to a Sub-\code {make}}{5}{6}{2}{47} -\subsecentry {Communicating Options to a Sub-\code {make}}{5}{6}{3}{50} -\subsecentry {The \samp {--print-directory} Option}{5}{6}{4}{52} -\secentry {Defining Canned Command Sequences}{5}{7}{52} -\secentry {Using Empty Commands}{5}{8}{54} -\chapentry {How to Use Variables}{6}{55} -\secentry {Basics of Variable References}{6}{1}{55} -\secentry {The Two Flavors of Variables}{6}{2}{56} -\secentry {Advanced Features for Reference to Variables}{6}{3}{59} -\subsecentry {Substitution References}{6}{3}{1}{59} -\subsecentry {Computed Variable Names}{6}{3}{2}{60} -\secentry {How Variables Get Their Values}{6}{4}{63} -\secentry {Setting Variables}{6}{5}{63} -\secentry {Appending More Text to Variables}{6}{6}{64} -\secentry {The \code {override} Directive}{6}{7}{66} -\secentry {Defining Variables Verbatim}{6}{8}{67} -\secentry {Variables from the Environment}{6}{9}{68} -\chapentry {Conditional Parts of Makefiles}{7}{71} -\secentry {Example of a Conditional}{7}{1}{71} -\secentry {Syntax of Conditionals}{7}{2}{72} -\secentry {Conditionals that Test Flags}{7}{3}{75} -\chapentry {Functions for Transforming Text}{8}{77} -\secentry {Function Call Syntax}{8}{1}{77} -\secentry {Functions for String Substitution and Analysis}{8}{2}{78} -\secentry {Functions for File Names}{8}{3}{81} -\secentry {The \code {foreach} Function}{8}{4}{83} -\secentry {The \code {origin} Function}{8}{5}{85} -\secentry {The \code {shell} Function}{8}{6}{87} -\chapentry {How to Run \code {make}}{9}{89} -\secentry {Arguments to Specify the Makefile}{9}{1}{89} -\secentry {Arguments to Specify the Goals}{9}{2}{90} -\secentry {Instead of Executing the Commands}{9}{3}{91} -\secentry {Avoiding Recompilation of Some Files}{9}{4}{93} -\secentry {Overriding Variables}{9}{5}{94} -\secentry {Testing the Compilation of a Program}{9}{6}{95} -\secentry {Summary of Options}{9}{7}{95} -\chapentry {Using Implicit Rules}{10}{101} -\secentry {Using Implicit Rules}{10}{1}{101} -\secentry {Catalogue of Implicit Rules}{10}{2}{103} -\secentry {Variables Used by Implicit Rules}{10}{3}{106} -\secentry {Chains of Implicit Rules}{10}{4}{108} -\secentry {Defining and Redefining Pattern Rules}{10}{5}{109} -\subsecentry {Introduction to Pattern Rules}{10}{5}{1}{110} -\subsecentry {Pattern Rule Examples}{10}{5}{2}{111} -\subsecentry {Automatic Variables}{10}{5}{3}{112} -\subsecentry {How Patterns Match}{10}{5}{4}{114} -\subsecentry {Match-Anything Pattern Rules}{10}{5}{5}{115} -\subsecentry {Canceling Implicit Rules}{10}{5}{6}{116} -\secentry {Defining Last-Resort Default Rules}{10}{6}{116} -\secentry {Old-Fashioned Suffix Rules}{10}{7}{117} -\secentry {Implicit Rule Search Algorithm}{10}{8}{119} -\chapentry {Using \code {make} to Update Archive Files}{11}{121} -\secentry {Archive Members as Targets}{11}{1}{121} -\secentry {Implicit Rule for Archive Member Targets}{11}{2}{122} -\subsecentry {Updating Archive Symbol Directories}{11}{2}{1}{123} -\secentry {Dangers When Using Archives}{11}{3}{123} -\secentry {Suffix Rules for Archive Files}{11}{4}{124} -\chapentry {Features of GNU \code {make}}{12}{125} -\chapentry {Incompatibilities and Missing Features}{13}{129} -\chapentry {Makefile Conventions}{14}{131} -\secentry {General Conventions for Makefiles}{14}{1}{131} -\secentry {Utilities in Makefiles}{14}{2}{132} -\secentry {Standard Targets for Users}{14}{3}{133} -\secentry {Variables for Specifying Commands}{14}{4}{136} -\secentry {Variables for Installation Directories}{14}{5}{138} -\chapentry {Quick Reference}{Appendix{} \char65}{143} -\chapentry {Complex Makefile Example}{Appendix{} \char66}{149} -\unnumbchapentry {Index of Concepts}{155} -\unnumbchapentry {Index of Functions, Variables, & Directives}{165} diff --git a/buildtools/windows/source/make/misc.c b/buildtools/windows/source/make/misc.c deleted file mode 100644 index f2ffc3898a8..00000000000 --- a/buildtools/windows/source/make/misc.c +++ /dev/null @@ -1,739 +0,0 @@ -/* Miscellaneous generic support functions for GNU Make. -Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "dep.h" - - -/* Compare strings *S1 and *S2. - Return negative if the first is less, positive if it is greater, - zero if they are equal. */ - -int -alpha_compare (const void *elem1, const void *elem2) -{ - char **s1 = (char **)elem1; - char **s2 = (char **)elem2; - if (**s1 != **s2) - return **s1 - **s2; - return strcmp (*s1, *s2); -} - -/* Discard each backslash-newline combination from LINE. - Backslash-backslash-newline combinations become backslash-newlines. - This is done by copying the text at LINE into itself. */ - -void -collapse_continuations (line) - char *line; -{ - register char *in, *out, *p; - register int backslash; - register unsigned int bs_write; - - in = index (line, '\n'); - if (in == 0) - return; - - out = in; - if (out > line) - while (out[-1] == '\\') - --out; - - while (*in != '\0') - { - /* BS_WRITE gets the number of quoted backslashes at - the end just before IN, and BACKSLASH gets nonzero - if the next character is quoted. */ - backslash = 0; - bs_write = 0; - for (p = in - 1; p >= line && *p == '\\'; --p) - { - if (backslash) - ++bs_write; - backslash = !backslash; - - /* It should be impossible to go back this far without exiting, - but if we do, we can't get the right answer. */ - if (in == out - 1) - abort (); - } - - /* Output the appropriate number of backslashes. */ - while (bs_write-- > 0) - *out++ = '\\'; - - /* Skip the newline. */ - ++in; - - /* If the newline is quoted, discard following whitespace - and any preceding whitespace; leave just one space. */ - if (backslash) - { - in = next_token (in); - while (out > line && isblank (out[-1])) - --out; - *out++ = ' '; - } - else - /* If the newline isn't quoted, put it in the output. */ - *out++ = '\n'; - - /* Now copy the following line to the output. - Stop when we find backslashes followed by a newline. */ - while (*in != '\0') - if (*in == '\\') - { - p = in + 1; - while (*p == '\\') - ++p; - if (*p == '\n') - { - in = p; - break; - } - while (in < p) - *out++ = *in++; - } - else - *out++ = *in++; - } - - *out = '\0'; -} - - -/* Remove comments from LINE. - This is done by copying the text at LINE onto itself. */ - -void -remove_comments (line) - char *line; -{ - char *comment; - - comment = find_char_unquote (line, "#", 0); - - if (comment != 0) - /* Cut off the line at the #. */ - *comment = '\0'; -} - -/* Print N spaces (used by DEBUGPR for target-depth). */ - -void -print_spaces (n) - register unsigned int n; -{ - while (n-- > 0) - putchar (' '); -} - - -/* Return a newly-allocated string whose contents - concatenate those of s1, s2, s3. */ - -char * -concat (s1, s2, s3) - register char *s1, *s2, *s3; -{ - register unsigned int len1, len2, len3; - register char *result; - - len1 = *s1 != '\0' ? strlen (s1) : 0; - len2 = *s2 != '\0' ? strlen (s2) : 0; - len3 = *s3 != '\0' ? strlen (s3) : 0; - - result = (char *) xmalloc (len1 + len2 + len3 + 1); - - if (*s1 != '\0') - bcopy (s1, result, len1); - if (*s2 != '\0') - bcopy (s2, result + len1, len2); - if (*s3 != '\0') - bcopy (s3, result + len1 + len2, len3); - *(result + len1 + len2 + len3) = '\0'; - - return result; -} - -/* Print a message on stdout. */ - -void -message (s1, s2, s3, s4, s5, s6) - char *s1, *s2, *s3, *s4, *s5, *s6; -{ - if (makelevel == 0) - printf ("%s: ", program); - else - printf ("%s[%u]: ", program, makelevel); - printf (s1, s2, s3, s4, s5, s6); - putchar ('\n'); - fflush (stdout); -} - -/* Print an error message and exit. */ - -/* VARARGS1 */ -void -fatal (s1, s2, s3, s4, s5, s6) - char *s1, *s2, *s3, *s4, *s5, *s6; -{ - if (makelevel == 0) - fprintf (stderr, "%s: *** ", program); - else - fprintf (stderr, "%s[%u]: *** ", program, makelevel); - fprintf (stderr, s1, s2, s3, s4, s5, s6); - fputs (". Stop.\n", stderr); - - die (2); -} - -/* Print error message. `s1' is printf control string, `s2' is arg for it. */ - -/* VARARGS1 */ - -void -error (s1, s2, s3, s4, s5, s6) - char *s1, *s2, *s3, *s4, *s5, *s6; -{ - if (makelevel == 0) - fprintf (stderr, "%s: ", program); - else - fprintf (stderr, "%s[%u]: ", program, makelevel); - fprintf (stderr, s1, s2, s3, s4, s5, s6); - putc ('\n', stderr); - fflush (stderr); -} - -void -makefile_error (file, lineno, s1, s2, s3, s4, s5, s6) - char *file; - unsigned int lineno; - char *s1, *s2, *s3, *s4, *s5, *s6; -{ - fprintf (stderr, "%s:%u: ", file, lineno); - fprintf (stderr, s1, s2, s3, s4, s5, s6); - putc ('\n', stderr); - fflush (stderr); -} - -void -makefile_fatal (file, lineno, s1, s2, s3, s4, s5, s6) - char *file; - unsigned int lineno; - char *s1, *s2, *s3, *s4, *s5, *s6; -{ - fprintf (stderr, "%s:%u: *** ", file, lineno); - fprintf (stderr, s1, s2, s3, s4, s5, s6); - fputs (". Stop.\n", stderr); - - die (2); -} - -#ifndef HAVE_STRERROR - -#undef strerror - -char * -strerror (errnum) - int errnum; -{ - extern int errno, sys_nerr; - extern char *sys_errlist[]; - static char buf[] = "Unknown error 12345678901234567890"; - - if (errno < sys_nerr) - return sys_errlist[errnum]; - - sprintf (buf, "Unknown error %d", errnum); - return buf; -} -#endif - -/* Print an error message from errno. */ - -void -perror_with_name (str, name) - char *str, *name; -{ - error ("%s%s: %s", str, name, strerror (errno)); -} - -/* Print an error message from errno and exit. */ - -void -pfatal_with_name (name) - char *name; -{ - fatal ("%s: %s", name, strerror (errno)); - - /* NOTREACHED */ -} - -/* Like malloc but get fatal error if memory is exhausted. */ - -#undef xmalloc -#undef xrealloc - -char * -xmalloc (size) - unsigned int size; -{ - char *result = (char *) malloc (size); - if (result == 0) - fatal ("virtual memory exhausted"); - return result; -} - - -char * -xrealloc (ptr, size) - char *ptr; - unsigned int size; -{ - char *result = (char *) realloc (ptr, size); - if (result == 0) - fatal ("virtual memory exhausted"); - return result; -} - -char * -savestring (str, length) - char *str; - unsigned int length; -{ - register char *out = (char *) xmalloc (length + 1); - if (length > 0) - bcopy (str, out, length); - out[length] = '\0'; - return out; -} - -/* Search string BIG (length BLEN) for an occurrence of - string SMALL (length SLEN). Return a pointer to the - beginning of the first occurrence, or return nil if none found. */ - -char * -sindex (big, blen, small, slen) - char *big; - unsigned int blen; - char *small; - unsigned int slen; -{ - register unsigned int b; - - if (blen < 1) - blen = strlen (big); - if (slen < 1) - slen = strlen (small); - - for (b = 0; b < blen; ++b) - if (big[b] == *small && !strncmp (&big[b + 1], small + 1, slen - 1)) - return (&big[b]); - - return 0; -} - -/* Limited INDEX: - Search through the string STRING, which ends at LIMIT, for the character C. - Returns a pointer to the first occurrence, or nil if none is found. - Like INDEX except that the string searched ends where specified - instead of at the first null. */ - -char * -lindex (s, limit, c) - register char *s, *limit; - int c; -{ - while (s < limit) - if (*s++ == c) - return s - 1; - - return 0; -} - -/* Return the address of the first whitespace or null in the string S. */ - -char * -end_of_token (s) - char *s; -{ - while (*s != '\0' && !isblank (*s)) - ++s; - return s; -} - -/* Return the address of the first nonwhitespace or null in the string S. */ - -char * -next_token (s) - char *s; -{ - register char *p = s; - - while (isblank (*p)) - ++p; - return p; -} - -/* Find the next token in PTR; return the address of it, and store the - length of the token into *LENGTHPTR if LENGTHPTR is not nil. */ - -char * -find_next_token (ptr, lengthptr) - char **ptr; - unsigned int *lengthptr; -{ - char *p = next_token (*ptr); - char *end; - - if (*p == '\0') - return 0; - - *ptr = end = end_of_token (p); - if (lengthptr != 0) - *lengthptr = end - p; - return p; -} - -/* Copy a chain of `struct dep', making a new chain - with the same contents as the old one. */ - -struct dep * -copy_dep_chain (d) - register struct dep *d; -{ - register struct dep *c; - struct dep *firstnew = 0; - struct dep *lastnew; - - while (d != 0) - { - c = (struct dep *) xmalloc (sizeof (struct dep)); - bcopy ((char *) d, (char *) c, sizeof (struct dep)); - if (c->name != 0) - c->name = savestring (c->name, strlen (c->name)); - c->next = 0; - if (firstnew == 0) - firstnew = lastnew = c; - else - lastnew = lastnew->next = c; - - d = d->next; - } - - return firstnew; -} - -#ifdef iAPX286 -/* The losing compiler on this machine can't handle this macro. */ - -char * -dep_name (dep) - struct dep *dep; -{ - return dep->name == 0 ? dep->file->name : dep->name; -} -#endif - -#ifdef GETLOADAVG_PRIVILEGED - -#ifdef POSIX - -/* Hopefully if a system says it's POSIX.1 and has the setuid and setgid - functions, they work as POSIX.1 says. Some systems (Alpha OSF/1 1.2, - for example) which claim to be POSIX.1 also have the BSD setreuid and - setregid functions, but they don't work as in BSD and only the POSIX.1 - way works. */ - -#undef HAVE_SETREUID -#undef HAVE_SETREGID - -#else /* Not POSIX. */ - -/* Some POSIX.1 systems have the seteuid and setegid functions. In a - POSIX-like system, they are the best thing to use. However, some - non-POSIX systems have them too but they do not work in the POSIX style - and we must use setreuid and setregid instead. */ - -#undef HAVE_SETEUID -#undef HAVE_SETEGID - -#endif /* POSIX. */ - -#ifndef HAVE_UNISTD_H -extern int getuid (), getgid (), geteuid (), getegid (); -extern int setuid (), setgid (); -#ifdef HAVE_SETEUID -extern int seteuid (); -#else -#ifdef HAVE_SETREUID -extern int setreuid (); -#endif /* Have setreuid. */ -#endif /* Have seteuid. */ -#ifdef HAVE_SETEGID -extern int setegid (); -#else -#ifdef HAVE_SETREGID -extern int setregid (); -#endif /* Have setregid. */ -#endif /* Have setegid. */ -#endif /* No . */ - -/* Keep track of the user and group IDs for user- and make- access. */ -static int user_uid = -1, user_gid = -1, make_uid = -1, make_gid = -1; -#define access_inited (user_uid != -1) -static enum { make, user } current_access; - - -/* Under -d, write a message describing the current IDs. */ - -static void -log_access (flavor) - char *flavor; -{ - if (! debug_flag) - return; - - /* All the other debugging messages go to stdout, - but we write this one to stderr because it might be - run in a child fork whose stdout is piped. */ - - fprintf (stderr, "%s access: user %d (real %d), group %d (real %d)\n", - flavor, geteuid (), getuid (), getegid (), getgid ()); - fflush (stderr); -} - - -static void -init_access () -{ - user_uid = getuid (); - user_gid = getgid (); - - make_uid = geteuid (); - make_gid = getegid (); - - /* Do these ever fail? */ - if (user_uid == -1 || user_gid == -1 || make_uid == -1 || make_gid == -1) - pfatal_with_name ("get{e}[gu]id"); - - log_access ("Initialized"); - - current_access = make; -} - -#endif /* GETLOADAVG_PRIVILEGED */ - -/* Give the process appropriate permissions for access to - user data (i.e., to stat files, or to spawn a child process). */ -void -user_access () -{ -#ifdef GETLOADAVG_PRIVILEGED - - if (!access_inited) - init_access (); - - if (current_access == user) - return; - - /* We are in "make access" mode. This means that the effective user and - group IDs are those of make (if it was installed setuid or setgid). - We now want to set the effective user and group IDs to the real IDs, - which are the IDs of the process that exec'd make. */ - -#ifdef HAVE_SETEUID - - /* Modern systems have the seteuid/setegid calls which set only the - effective IDs, which is ideal. */ - - if (seteuid (user_uid) < 0) - pfatal_with_name ("user_access: seteuid"); - -#else /* Not HAVE_SETEUID. */ - -#ifndef HAVE_SETREUID - - /* System V has only the setuid/setgid calls to set user/group IDs. - There is an effective ID, which can be set by setuid/setgid. - It can be set (unless you are root) only to either what it already is - (returned by geteuid/getegid, now in make_uid/make_gid), - the real ID (return by getuid/getgid, now in user_uid/user_gid), - or the saved set ID (what the effective ID was before this set-ID - executable (make) was exec'd). */ - - if (setuid (user_uid) < 0) - pfatal_with_name ("user_access: setuid"); - -#else /* HAVE_SETREUID. */ - - /* In 4BSD, the setreuid/setregid calls set both the real and effective IDs. - They may be set to themselves or each other. So you have two alternatives - at any one time. If you use setuid/setgid, the effective will be set to - the real, leaving only one alternative. Using setreuid/setregid, however, - you can toggle between your two alternatives by swapping the values in a - single setreuid or setregid call. */ - - if (setreuid (make_uid, user_uid) < 0) - pfatal_with_name ("user_access: setreuid"); - -#endif /* Not HAVE_SETREUID. */ -#endif /* HAVE_SETEUID. */ - -#ifdef HAVE_SETEGID - if (setegid (user_gid) < 0) - pfatal_with_name ("user_access: setegid"); -#else -#ifndef HAVE_SETREGID - if (setgid (user_gid) < 0) - pfatal_with_name ("user_access: setgid"); -#else - if (setregid (make_gid, user_gid) < 0) - pfatal_with_name ("user_access: setregid"); -#endif -#endif - - current_access = user; - - log_access ("User"); - -#endif /* GETLOADAVG_PRIVILEGED */ -} - -/* Give the process appropriate permissions for access to - make data (i.e., the load average). */ -void -make_access () -{ -#ifdef GETLOADAVG_PRIVILEGED - - if (!access_inited) - init_access (); - - if (current_access == make) - return; - - /* See comments in user_access, above. */ - -#ifdef HAVE_SETEUID - if (seteuid (make_uid) < 0) - pfatal_with_name ("make_access: seteuid"); -#else -#ifndef HAVE_SETREUID - if (setuid (make_uid) < 0) - pfatal_with_name ("make_access: setuid"); -#else - if (setreuid (user_uid, make_uid) < 0) - pfatal_with_name ("make_access: setreuid"); -#endif -#endif - -#ifdef HAVE_SETEGID - if (setegid (make_gid) < 0) - pfatal_with_name ("make_access: setegid"); -#else -#ifndef HAVE_SETREGID - if (setgid (make_gid) < 0) - pfatal_with_name ("make_access: setgid"); -#else - if (setregid (user_gid, make_gid) < 0) - pfatal_with_name ("make_access: setregid"); -#endif -#endif - - current_access = make; - - log_access ("Make"); - -#endif /* GETLOADAVG_PRIVILEGED */ -} - -/* Give the process appropriate permissions for a child process. - This is like user_access, but you can't get back to make_access. */ -void -child_access () -{ -#ifdef GETLOADAVG_PRIVILEGED - - if (!access_inited) - abort (); - - /* Set both the real and effective UID and GID to the user's. - They cannot be changed back to make's. */ - -#ifndef HAVE_SETREUID - if (setuid (user_uid) < 0) - pfatal_with_name ("child_access: setuid"); -#else - if (setreuid (user_uid, user_uid) < 0) - pfatal_with_name ("child_access: setreuid"); -#endif - -#ifndef HAVE_SETREGID - if (setgid (user_gid) < 0) - pfatal_with_name ("child_access: setgid"); -#else - if (setregid (user_gid, user_gid) < 0) - pfatal_with_name ("child_access: setregid"); -#endif - - log_access ("Child"); - -#endif /* GETLOADAVG_PRIVILEGED */ -} - -#ifdef NEED_GET_PATH_MAX -unsigned int -get_path_max () -{ - static unsigned int value; - - if (value == 0) - { - long int x = pathconf ("/", _PC_PATH_MAX); - if (x > 0) - value = x; - else - return MAXPATHLEN; - } - - return value; -} -#endif - -/* On some systems, stat can return EINTR. */ - -int -safe_stat (name, buf) - char *name; - struct stat *buf; -{ - int ret; - -#ifdef EINTR - do -#endif - ret = stat (name, buf); -#ifdef EINTR - while (ret < 0 && errno == EINTR); -#endif - - return ret; -} diff --git a/buildtools/windows/source/make/mkinstalldirs b/buildtools/windows/source/make/mkinstalldirs deleted file mode 100644 index 0801ec2c966..00000000000 --- a/buildtools/windows/source/make/mkinstalldirs +++ /dev/null @@ -1,32 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman -# Created: 1993-05-16 -# Last modified: 1994-03-25 -# Public domain - -errstatus=0 - -for file in ${1+"$@"} ; do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` - shift - - pathcomp= - for d in ${1+"$@"} ; do - pathcomp="$pathcomp$d" - case "$pathcomp" in - -* ) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" 1>&2 - mkdir "$pathcomp" || errstatus=$? - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# mkinstalldirs ends here diff --git a/buildtools/windows/source/make/read.c b/buildtools/windows/source/make/read.c deleted file mode 100644 index 026c892739e..00000000000 --- a/buildtools/windows/source/make/read.c +++ /dev/null @@ -1,2069 +0,0 @@ -/* Reading and parsing of makefiles for GNU Make. -Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "commands.h" -#include "dep.h" -#include "file.h" -#include "variable.h" - -/* This is POSIX.2, but most systems using -DPOSIX probably don't have it. */ -#ifdef HAVE_GLOB_H -#include -#else -#include "glob/glob.h" -#endif - -#ifndef NETSCAPE -#include -struct passwd *getpwnam (); -#endif - -static int read_makefile (); -static unsigned int readline (), do_define (); -static int conditional_line (); -static void record_files (); -static char *find_semicolon (); - - -/* A `struct linebuffer' is a structure which holds a line of text. - `readline' reads a line from a stream into a linebuffer - and works regardless of the length of the line. */ - -struct linebuffer - { - /* Note: This is the number of bytes malloc'ed for `buffer' - It does not indicate `buffer's real length. - Instead, a null char indicates end-of-string. */ - unsigned int size; - char *buffer; - }; - -#define initbuffer(lb) (lb)->buffer = (char *) xmalloc ((lb)->size = 200) -#define freebuffer(lb) free ((lb)->buffer) - - -/* A `struct conditionals' contains the information describing - all the active conditionals in a makefile. - - The global variable `conditionals' contains the conditionals - information for the current makefile. It is initialized from - the static structure `toplevel_conditionals' and is later changed - to new structures for included makefiles. */ - -struct conditionals - { - unsigned int if_cmds; /* Depth of conditional nesting. */ - unsigned int allocated; /* Elts allocated in following arrays. */ - char *ignoring; /* Are we ignoring or interepreting? */ - char *seen_else; /* Have we already seen an `else'? */ - }; - -static struct conditionals toplevel_conditionals; -static struct conditionals *conditionals = &toplevel_conditionals; - - -/* Default directories to search for include files in */ - -static char *default_include_directories[] = - { -#ifndef NETSCAPE - INCLUDEDIR, - "/usr/gnu/include", - "/usr/local/include", - "/usr/include", -#endif - 0 - }; - -/* List of directories to search for include files in */ - -static char **include_directories; - -/* Maximum length of an element of the above. */ - -static unsigned int max_incl_len; - -/* The filename and pointer to line number of the - makefile currently being read in. */ - -char *reading_filename; -unsigned int *reading_lineno_ptr; - -/* The chain of makefiles read by read_makefile. */ - -static struct dep *read_makefiles = 0; - -/* Read in all the makefiles and return the chain of their names. */ - -struct dep * -read_all_makefiles (makefiles) - char **makefiles; -{ - unsigned int num_makefiles = 0; - - if (debug_flag) - puts ("Reading makefiles..."); - - /* If there's a non-null variable MAKEFILES, its value is a list of - files to read first thing. But don't let it prevent reading the - default makefiles and don't let the default goal come from there. */ - - { - char *value; - char *name, *p; - unsigned int length; - - { - /* Turn off --warn-undefined-variables while we expand MAKEFILES. */ - int save = warn_undefined_variables_flag; - warn_undefined_variables_flag = 0; - - value = allocated_variable_expand ("$(MAKEFILES)"); - - warn_undefined_variables_flag = save; - } - - /* Set NAME to the start of next token and LENGTH to its length. - MAKEFILES is updated for finding remaining tokens. */ - p = value; - while ((name = find_next_token (&p, &length)) != 0) - { - if (*p != '\0') - *p++ = '\0'; - (void) read_makefile (name, - RM_NO_DEFAULT_GOAL | RM_INCLUDED | RM_DONTCARE); - } - - free (value); - } - - /* Read makefiles specified with -f switches. */ - - if (makefiles != 0) - while (*makefiles != 0) - { - struct dep *tail = read_makefiles; - register struct dep *d; - - if (! read_makefile (*makefiles, 0)) - perror_with_name ("", *makefiles); - - /* Find the right element of read_makefiles. */ - d = read_makefiles; - while (d->next != tail) - d = d->next; - - /* Use the storage read_makefile allocates. */ - *makefiles = dep_name (d); - ++num_makefiles; - ++makefiles; - } - - /* If there were no -f switches, try the default names. */ - - if (num_makefiles == 0) - { - static char *default_makefiles[] = - { "GNUmakefile", "makefile", "Makefile", 0 }; - register char **p = default_makefiles; - while (*p != 0 && !file_exists_p (*p)) - ++p; - - if (*p != 0) - { - if (! read_makefile (*p, 0)) - perror_with_name ("", *p); - } - else - { - /* No default makefile was found. Add the default makefiles to the - `read_makefiles' chain so they will be updated if possible. */ - struct dep *tail = read_makefiles; - for (p = default_makefiles; *p != 0; ++p) - { - struct dep *d = (struct dep *) xmalloc (sizeof (struct dep)); - d->name = 0; - d->file = enter_file (*p); - d->file->dontcare = 1; - /* Tell update_goal_chain to bail out as soon as this file is - made, and main not to die if we can't make this file. */ - d->changed = RM_DONTCARE; - if (tail == 0) - read_makefiles = d; - else - tail->next = d; - tail = d; - } - if (tail != 0) - tail->next = 0; - } - } - - return read_makefiles; -} - -/* Read file FILENAME as a makefile and add its contents to the data base. - - FLAGS contains bits as above. - - FILENAME is added to the `read_makefiles' chain. - - Returns 1 if a file was found and read, 0 if not. */ - -static int -read_makefile (filename, flags) - char *filename; - int flags; -{ - static char *collapsed = 0; - static unsigned int collapsed_length = 0; - register FILE *infile; - struct linebuffer lb; - unsigned int commands_len = 200; - char *commands = (char *) xmalloc (200); - unsigned int commands_idx = 0; - unsigned int commands_started; - register char *p; - char *p2; - int ignoring = 0, in_ignored_define = 0; - int no_targets = 0; /* Set when reading a rule without targets. */ - char *passed_filename = filename; - - struct nameseq *filenames = 0; - struct dep *deps; - unsigned int lineno = 1; - unsigned int nlines = 0; - int two_colon; - char *pattern = 0, *pattern_percent; - - int makefile_errno; - -#define record_waiting_files() \ - do \ - { \ - if (filenames != 0) \ - record_files (filenames, pattern, pattern_percent, deps, \ - commands_started, commands, commands_idx, \ - two_colon, filename, lineno, \ - !(flags & RM_NO_DEFAULT_GOAL)); \ - filenames = 0; \ - commands_idx = 0; \ - pattern = 0; \ - } while (0) - -#ifdef lint /* Suppress `used before set' messages. */ - two_colon = 0; -#endif - - if (debug_flag) - { - printf ("Reading makefile `%s'", filename); - if (flags & RM_NO_DEFAULT_GOAL) - printf (" (no default goal)"); - if (flags & RM_INCLUDED) - printf (" (search path)"); - if (flags & RM_DONTCARE) - printf (" (don't care)"); - if (flags & RM_NO_TILDE) - printf (" (no ~ expansion)"); - puts ("..."); - } - - /* First, get a stream to read. */ - - /* Expand ~ in FILENAME unless it came from `include', - in which case it was already done. */ - if (!(flags & RM_NO_TILDE) && filename[0] == '~') - { - char *expanded = tilde_expand (filename); - if (expanded != 0) - filename = expanded; - } - - infile = fopen (filename, "r"); - /* Save the error code so we print the right message later. */ - makefile_errno = errno; - - /* If the makefile wasn't found and it's either a makefile from - the `MAKEFILES' variable or an included makefile, - search the included makefile search path for this makefile. */ - - if (infile == 0 && (flags & RM_INCLUDED) && *filename != '/') - { - register unsigned int i; - for (i = 0; include_directories[i] != 0; ++i) - { - char *name = concat (include_directories[i], "/", filename); - infile = fopen (name, "r"); - if (infile == 0) - free (name); - else - { - filename = name; - break; - } - } - } - - /* Add FILENAME to the chain of read makefiles. */ - deps = (struct dep *) xmalloc (sizeof (struct dep)); - deps->next = read_makefiles; - read_makefiles = deps; - deps->name = 0; - deps->file = lookup_file (filename); - if (deps->file == 0) - { - deps->file = enter_file (savestring (filename, strlen (filename))); - if (flags & RM_DONTCARE) - deps->file->dontcare = 1; - } - if (filename != passed_filename) - free (filename); - filename = deps->file->name; - deps->changed = flags; - deps = 0; - - /* If the makefile can't be found at all, give up entirely. */ - - if (infile == 0) - { - /* If we did some searching, errno has the error from the last - attempt, rather from FILENAME itself. Restore it in case the - caller wants to use it in a message. */ - errno = makefile_errno; - return 0; - } - - reading_filename = filename; - reading_lineno_ptr = &lineno; - - /* Loop over lines in the file. - The strategy is to accumulate target names in FILENAMES, dependencies - in DEPS and commands in COMMANDS. These are used to define a rule - when the start of the next rule (or eof) is encountered. */ - - initbuffer (&lb); - - while (!feof (infile)) - { - lineno += nlines; - nlines = readline (&lb, infile, filename, lineno); - - /* Check for a shell command line first. - If it is not one, we can stop treating tab specially. */ - if (lb.buffer[0] == '\t') - { - /* This line is a probably shell command. */ - unsigned int len; - - if (no_targets) - /* Ignore the commands in a rule with no targets. */ - continue; - - /* If there is no preceding rule line, don't treat this line - as a command, even though it begins with a tab character. - SunOS 4 make appears to behave this way. */ - - if (filenames != 0) - { - if (ignoring) - /* Yep, this is a shell command, and we don't care. */ - continue; - - /* Append this command line to the line being accumulated. */ - p = lb.buffer; - if (commands_idx == 0) - commands_started = lineno; - len = strlen (p); - if (len + 1 + commands_idx > commands_len) - { - commands_len = (len + 1 + commands_idx) * 2; - commands = (char *) xrealloc (commands, commands_len); - } - bcopy (p, &commands[commands_idx], len); - commands_idx += len; - commands[commands_idx++] = '\n'; - - continue; - } - } - - /* This line is not a shell command line. Don't worry about tabs. */ - - if (collapsed_length < lb.size) - { - collapsed_length = lb.size; - if (collapsed != 0) - free (collapsed); - collapsed = (char *) xmalloc (collapsed_length); - } - strcpy (collapsed, lb.buffer); - /* Collapse continuation lines. */ - collapse_continuations (collapsed); - remove_comments (collapsed); - - /* strncmp is first to avoid dereferencing out into space. */ -#define word1eq(s, l) (!strncmp (s, p, l) \ - && (p[l] == '\0' || isblank (p[l]))) - p = collapsed; - while (isspace (*p)) - ++p; - if (*p == '\0') - /* This line is completely empty. */ - continue; - - /* We must first check for conditional and `define' directives before - ignoring anything, since they control what we will do with - following lines. */ - - if (!in_ignored_define - && (word1eq ("ifdef", 5) || word1eq ("ifndef", 6) - || word1eq ("ifeq", 4) || word1eq ("ifneq", 5) - || word1eq ("else", 4) || word1eq ("endif", 5))) - { - int i = conditional_line (p, filename, lineno); - if (i >= 0) - ignoring = i; - else - makefile_fatal (filename, lineno, - "invalid syntax in conditional"); - continue; - } - else if (word1eq ("endef", 5)) - { - if (in_ignored_define) - in_ignored_define = 0; - else - makefile_fatal (filename, lineno, "extraneous `endef'"); - continue; - } - else if (word1eq ("define", 6)) - { - if (ignoring) - in_ignored_define = 1; - else - { - p2 = next_token (p + 6); - /* Let the variable name be the whole rest of the line, - with trailing blanks stripped (comments have already been - removed), so it could be a complex variable/function - reference that might contain blanks. */ - p = index (p2, '\0'); - while (isblank (p[-1])) - --p; - lineno = do_define (p2, p - p2, o_file, - lineno, infile, filename); - } - continue; - } - else if (word1eq ("override", 8)) - { - p2 = next_token (p + 8); - if (p2 == 0) - makefile_error (filename, lineno, "empty `override' directive"); - if (!strncmp (p2, "define", 6) && (isblank (p2[6]) || p2[6] == '\0')) - { - if (ignoring) - in_ignored_define = 1; - else - { - p2 = next_token (p2 + 6); - /* Let the variable name be the whole rest of the line, - with trailing blanks stripped (comments have already been - removed), so it could be a complex variable/function - reference that might contain blanks. */ - p = index (p2, '\0'); - while (isblank (p[-1])) - --p; - lineno = do_define (p2, p - p2, o_override, - lineno, infile, filename); - } - } - else if (!ignoring - && !try_variable_definition (filename, lineno, - p2, o_override)) - makefile_error (filename, lineno, "empty `override' directive"); - - continue; - } - - if (ignoring) - /* Ignore the line. We continue here so conditionals - can appear in the middle of a rule. */ - continue; - else if (word1eq ("export", 6)) - { - struct variable *v; - p2 = next_token (p + 6); - if (*p2 == '\0') - export_all_variables = 1; - v = try_variable_definition (filename, lineno, p2, o_file); - if (v != 0) - v->export = v_export; - else - { - unsigned int len; - for (p = find_next_token (&p2, &len); p != 0; - p = find_next_token (&p2, &len)) - { - v = lookup_variable (p, len); - if (v == 0) - v = define_variable (p, len, "", o_file, 0); - v->export = v_export; - } - } - } - else if (word1eq ("unexport", 8)) - { - unsigned int len; - struct variable *v; - p2 = next_token (p + 8); - if (*p2 == '\0') - export_all_variables = 0; - for (p = find_next_token (&p2, &len); p != 0; - p = find_next_token (&p2, &len)) - { - v = lookup_variable (p, len); - if (v == 0) - v = define_variable (p, len, "", o_file, 0); - v->export = v_noexport; - } - } - else if (word1eq ("include", 7) || word1eq ("-include", 8)) - { - /* We have found an `include' line specifying a nested - makefile to be read at this point. */ - struct conditionals *save, new_conditionals; - struct nameseq *files; - /* "-include" (vs "include") says no - error if the file does not exist. */ - int noerror = p[0] == '-'; - - p = allocated_variable_expand (next_token (p + (noerror ? 9 : 8))); - if (*p == '\0') - { - makefile_error (filename, lineno, - "no file name for `%sinclude'", - noerror ? "-" : ""); - continue; - } - - /* Parse the list of file names. */ - p2 = p; - files = multi_glob (parse_file_seq (&p2, '\0', - sizeof (struct nameseq), - 1), - sizeof (struct nameseq)); - free (p); - - /* Save the state of conditionals and start - the included makefile with a clean slate. */ - save = conditionals; - bzero ((char *) &new_conditionals, sizeof new_conditionals); - conditionals = &new_conditionals; - - /* Record the rules that are waiting so they will determine - the default goal before those in the included makefile. */ - record_waiting_files (); - - /* Read each included makefile. */ - while (files != 0) - { - struct nameseq *next = files->next; - char *name = files->name; - free (files); - files = next; - - if (! read_makefile (name, (RM_INCLUDED | RM_NO_TILDE - | (noerror ? RM_DONTCARE : 0))) - && ! noerror) - makefile_error (filename, lineno, - "%s: %s", name, strerror (errno)); - } - - /* Free any space allocated by conditional_line. */ - if (conditionals->ignoring) - free (conditionals->ignoring); - if (conditionals->seen_else) - free (conditionals->seen_else); - - /* Restore state. */ - conditionals = save; - reading_filename = filename; - reading_lineno_ptr = &lineno; - } - else if (word1eq ("vpath", 5)) - { - char *pattern; - unsigned int len; - p2 = variable_expand (p + 5); - p = find_next_token (&p2, &len); - if (p != 0) - { - pattern = savestring (p, len); - p = find_next_token (&p2, &len); - /* No searchpath means remove all previous - selective VPATH's with the same pattern. */ - } - else - /* No pattern means remove all previous selective VPATH's. */ - pattern = 0; - construct_vpath_list (pattern, p); - if (pattern != 0) - free (pattern); - } -#undef word1eq - else if (try_variable_definition (filename, lineno, p, o_file)) - /* This line has been dealt with. */ - ; - else if (lb.buffer[0] == '\t') - { - p = collapsed; /* Ignore comments. */ - while (isblank (*p)) - ++p; - if (*p == '\0') - /* The line is completely blank; that is harmless. */ - continue; - /* This line starts with a tab but was not caught above - because there was no preceding target, and the line - might have been usable as a variable definition. - But now it is definitely lossage. */ - makefile_fatal (filename, lineno, - "commands commence before first target"); - } - else - { - /* This line describes some target files. */ - - char *cmdleft; - - /* Record the previous rule. */ - - record_waiting_files (); - - /* Look for a semicolon in the unexpanded line. */ - cmdleft = find_semicolon (lb.buffer); - if (cmdleft != 0) - /* Found one. Cut the line short there before expanding it. */ - *cmdleft = '\0'; - - collapse_continuations (lb.buffer); - - /* Expand variable and function references before doing anything - else so that special characters can be inside variables. */ - p = variable_expand (lb.buffer); - - if (cmdleft == 0) - /* Look for a semicolon in the expanded line. */ - cmdleft = find_semicolon (p); - - if (cmdleft != 0) - /* Cut the line short at the semicolon. */ - *cmdleft = '\0'; - - /* Remove comments from the line. */ - remove_comments (p); - - p2 = next_token (p); - if (*p2 == '\0') - { - if (cmdleft != 0) - makefile_fatal (filename, lineno, - "missing rule before commands"); - else - /* This line contained a variable reference that - expanded to nothing but whitespace. */ - continue; - } - else if (*p2 == ':') - { - /* We accept and ignore rules without targets for - compatibility with SunOS 4 make. */ - no_targets = 1; - continue; - } - - filenames = multi_glob (parse_file_seq (&p2, ':', - sizeof (struct nameseq), - 1), - sizeof (struct nameseq)); - if (*p2++ == '\0') - makefile_fatal (filename, lineno, "missing separator"); - /* Is this a one-colon or two-colon entry? */ - two_colon = *p2 == ':'; - if (two_colon) - p2++; - - /* We have some targets, so don't ignore the following commands. */ - no_targets = 0; - - /* Is this a static pattern rule: `target: %targ: %dep; ...'? */ - p = index (p2, ':'); - while (p != 0 && p[-1] == '\\') - { - register char *q = &p[-1]; - register int backslash = 0; - while (*q-- == '\\') - backslash = !backslash; - if (backslash) - p = index (p + 1, ':'); - else - break; - } -#if defined(__MSDOS__) || defined(NETSCAPE) - /* For MS-DOS and WIN32, skip a "C:\..." or a "C:/...". */ - while (p != 0 && (p[1] == '\\' || p[1] == '/') - && isalpha (p[-1]) && (p[-2] == ':' || isspace (p[-2]))) - p = index (p + 1, ':'); -#endif - if (p != 0) - { - struct nameseq *target; - target = parse_file_seq (&p2, ':', sizeof (struct nameseq), 1); - ++p2; - if (target == 0) - makefile_fatal (filename, lineno, "missing target pattern"); - else if (target->next != 0) - makefile_fatal (filename, lineno, "multiple target patterns"); - pattern = target->name; - pattern_percent = find_percent (pattern); - if (pattern_percent == 0) - makefile_fatal (filename, lineno, - "target pattern contains no `%%'"); - } - else - pattern = 0; - - /* Parse the dependencies. */ - deps = (struct dep *) - multi_glob (parse_file_seq (&p2, '\0', sizeof (struct dep), 1), - sizeof (struct dep)); - - commands_idx = 0; - if (cmdleft != 0) - { - /* Semicolon means rest of line is a command. */ - unsigned int len = strlen (cmdleft + 1); - - commands_started = lineno; - - /* Add this command line to the buffer. */ - if (len + 2 > commands_len) - { - commands_len = (len + 2) * 2; - commands = (char *) xrealloc (commands, commands_len); - } - bcopy (cmdleft + 1, commands, len); - commands_idx += len; - commands[commands_idx++] = '\n'; - } - - continue; - } - - /* We get here except in the case that we just read a rule line. - Record now the last rule we read, so following spurious - commands are properly diagnosed. */ - record_waiting_files (); - no_targets = 0; - } - - if (conditionals->if_cmds) - makefile_fatal (filename, lineno, "missing `endif'"); - - /* At eof, record the last rule. */ - record_waiting_files (); - - freebuffer (&lb); - free ((char *) commands); - fclose (infile); - - reading_filename = 0; - reading_lineno_ptr = 0; - - return 1; -} - -/* Execute a `define' directive. - The first line has already been read, and NAME is the name of - the variable to be defined. The following lines remain to be read. - LINENO, INFILE and FILENAME refer to the makefile being read. - The value returned is LINENO, updated for lines read here. */ - -static unsigned int -do_define (name, namelen, origin, lineno, infile, filename) - char *name; - unsigned int namelen; - enum variable_origin origin; - unsigned int lineno; - FILE *infile; - char *filename; -{ - struct linebuffer lb; - unsigned int nlines = 0; - unsigned int length = 100; - char *definition = (char *) xmalloc (100); - register unsigned int idx = 0; - register char *p; - - /* Expand the variable name. */ - char *var = (char *) alloca (namelen + 1); - bcopy (name, var, namelen); - var[namelen] = '\0'; - var = variable_expand (var); - - initbuffer (&lb); - while (!feof (infile)) - { - lineno += nlines; - nlines = readline (&lb, infile, filename, lineno); - - collapse_continuations (lb.buffer); - - p = next_token (lb.buffer); - if ((p[5] == '\0' || isblank (p[5])) && !strncmp (p, "endef", 5)) - { - p += 5; - remove_comments (p); - if (*next_token (p) != '\0') - makefile_error (filename, lineno, - "Extraneous text after `endef' directive"); - /* Define the variable. */ - if (idx == 0) - definition[0] = '\0'; - else - definition[idx - 1] = '\0'; - (void) define_variable (var, strlen (var), definition, origin, 1); - free (definition); - freebuffer (&lb); - return lineno; - } - else - { - unsigned int len = strlen (lb.buffer); - - /* Increase the buffer size if necessary. */ - if (idx + len + 1 > length) - { - length = (idx + len) * 2; - definition = (char *) xrealloc (definition, length + 1); - } - - bcopy (lb.buffer, &definition[idx], len); - idx += len; - /* Separate lines with a newline. */ - definition[idx++] = '\n'; - } - } - - /* No `endef'!! */ - makefile_fatal (filename, lineno, "missing `endef', unterminated `define'"); - - /* NOTREACHED */ - return 0; -} - -/* Interpret conditional commands "ifdef", "ifndef", "ifeq", - "ifneq", "else" and "endif". - LINE is the input line, with the command as its first word. - - FILENAME and LINENO are the filename and line number in the - current makefile. They are used for error messages. - - Value is -1 if the line is invalid, - 0 if following text should be interpreted, - 1 if following text should be ignored. */ - -static int -conditional_line (line, filename, lineno) - char *line; - char *filename; - unsigned int lineno; -{ - int notdef; - char *cmdname; - register unsigned int i; - - if (*line == 'i') - { - /* It's an "if..." command. */ - notdef = line[2] == 'n'; - if (notdef) - { - cmdname = line[3] == 'd' ? "ifndef" : "ifneq"; - line += cmdname[3] == 'd' ? 7 : 6; - } - else - { - cmdname = line[2] == 'd' ? "ifdef" : "ifeq"; - line += cmdname[2] == 'd' ? 6 : 5; - } - } - else - { - /* It's an "else" or "endif" command. */ - notdef = line[1] == 'n'; - cmdname = notdef ? "endif" : "else"; - line += notdef ? 5 : 4; - } - - line = next_token (line); - - if (*cmdname == 'e') - { - if (*line != '\0') - makefile_error (filename, lineno, - "Extraneous text after `%s' directive", - cmdname); - /* "Else" or "endif". */ - if (conditionals->if_cmds == 0) - makefile_fatal (filename, lineno, "extraneous `%s'", cmdname); - /* NOTDEF indicates an `endif' command. */ - if (notdef) - --conditionals->if_cmds; - else if (conditionals->seen_else[conditionals->if_cmds - 1]) - makefile_fatal (filename, lineno, "only one `else' per conditional"); - else - { - /* Toggle the state of ignorance. */ - conditionals->ignoring[conditionals->if_cmds - 1] - = !conditionals->ignoring[conditionals->if_cmds - 1]; - /* Record that we have seen an `else' in this conditional. - A second `else' will be erroneous. */ - conditionals->seen_else[conditionals->if_cmds - 1] = 1; - } - for (i = 0; i < conditionals->if_cmds; ++i) - if (conditionals->ignoring[i]) - return 1; - return 0; - } - - if (conditionals->allocated == 0) - { - conditionals->allocated = 5; - conditionals->ignoring = (char *) xmalloc (conditionals->allocated); - conditionals->seen_else = (char *) xmalloc (conditionals->allocated); - } - - ++conditionals->if_cmds; - if (conditionals->if_cmds > conditionals->allocated) - { - conditionals->allocated += 5; - conditionals->ignoring = (char *) - xrealloc (conditionals->ignoring, conditionals->allocated); - conditionals->seen_else = (char *) - xrealloc (conditionals->seen_else, conditionals->allocated); - } - - /* Record that we have seen an `if...' but no `else' so far. */ - conditionals->seen_else[conditionals->if_cmds - 1] = 0; - - /* Search through the stack to see if we're already ignoring. */ - for (i = 0; i < conditionals->if_cmds - 1; ++i) - if (conditionals->ignoring[i]) - { - /* We are already ignoring, so just push a level - to match the next "else" or "endif", and keep ignoring. - We don't want to expand variables in the condition. */ - conditionals->ignoring[conditionals->if_cmds - 1] = 1; - return 1; - } - - if (cmdname[notdef ? 3 : 2] == 'd') - { - /* "Ifdef" or "ifndef". */ - struct variable *v; - register char *p = end_of_token (line); - i = p - line; - p = next_token (p); - if (*p != '\0') - return -1; - v = lookup_variable (line, i); - conditionals->ignoring[conditionals->if_cmds - 1] - = (v != 0 && *v->value != '\0') == notdef; - } - else - { - /* "Ifeq" or "ifneq". */ - char *s1, *s2; - unsigned int len; - char termin = *line == '(' ? ',' : *line; - - if (termin != ',' && termin != '"' && termin != '\'') - return -1; - - s1 = ++line; - /* Find the end of the first string. */ - if (termin == ',') - { - register int count = 0; - for (; *line != '\0'; ++line) - if (*line == '(') - ++count; - else if (*line == ')') - --count; - else if (*line == ',' && count <= 0) - break; - } - else - while (*line != '\0' && *line != termin) - ++line; - - if (*line == '\0') - return -1; - - *line++ = '\0'; - - s2 = variable_expand (s1); - /* We must allocate a new copy of the expanded string because - variable_expand re-uses the same buffer. */ - len = strlen (s2); - s1 = (char *) alloca (len + 1); - bcopy (s2, s1, len + 1); - - if (termin != ',') - /* Find the start of the second string. */ - line = next_token (line); - - termin = termin == ',' ? ')' : *line; - if (termin != ')' && termin != '"' && termin != '\'') - return -1; - - /* Find the end of the second string. */ - if (termin == ')') - { - register int count = 0; - s2 = next_token (line); - for (line = s2; *line != '\0'; ++line) - { - if (*line == '(') - ++count; - else if (*line == ')') - if (count <= 0) - break; - else - --count; - } - } - else - { - ++line; - s2 = line; - while (*line != '\0' && *line != termin) - ++line; - } - - if (*line == '\0') - return -1; - - *line = '\0'; - line = next_token (++line); - if (*line != '\0') - makefile_error (filename, lineno, - "Extraneous text after `%s' directive", - cmdname); - - s2 = variable_expand (s2); - conditionals->ignoring[conditionals->if_cmds - 1] - = streq (s1, s2) == notdef; - } - - /* Search through the stack to see if we're ignoring. */ - for (i = 0; i < conditionals->if_cmds; ++i) - if (conditionals->ignoring[i]) - return 1; - return 0; -} - -/* Remove duplicate dependencies in CHAIN. */ - -void -uniquize_deps (chain) - struct dep *chain; -{ - register struct dep *d; - - /* Make sure that no dependencies are repeated. This does not - really matter for the purpose of updating targets, but it - might make some names be listed twice for $^ and $?. */ - - for (d = chain; d != 0; d = d->next) - { - struct dep *last, *next; - - last = d; - next = d->next; - while (next != 0) - if (streq (dep_name (d), dep_name (next))) - { - struct dep *n = next->next; - last->next = n; - if (next->name != 0 && next->name != d->name) - free (next->name); - if (next != d) - free ((char *) next); - next = n; - } - else - { - last = next; - next = next->next; - } - } -} - -/* Record a description line for files FILENAMES, - with dependencies DEPS, commands to execute described - by COMMANDS and COMMANDS_IDX, coming from FILENAME:COMMANDS_STARTED. - TWO_COLON is nonzero if a double colon was used. - If not nil, PATTERN is the `%' pattern to make this - a static pattern rule, and PATTERN_PERCENT is a pointer - to the `%' within it. - - The links of FILENAMES are freed, and so are any names in it - that are not incorporated into other data structures. */ - -static void -record_files (filenames, pattern, pattern_percent, deps, commands_started, - commands, commands_idx, two_colon, filename, lineno, set_default) - struct nameseq *filenames; - char *pattern, *pattern_percent; - struct dep *deps; - unsigned int commands_started; - char *commands; - unsigned int commands_idx; - int two_colon; - char *filename; - unsigned int lineno; - int set_default; -{ - struct nameseq *nextf; - int implicit = 0; - unsigned int max_targets, target_idx; - char **targets = 0, **target_percents = 0; - struct commands *cmds; - - if (commands_idx > 0) - { - cmds = (struct commands *) xmalloc (sizeof (struct commands)); - cmds->filename = filename; - cmds->lineno = commands_started; - cmds->commands = savestring (commands, commands_idx); - cmds->command_lines = 0; - } - else - cmds = 0; - - for (; filenames != 0; filenames = nextf) - { - register char *name = filenames->name; - register struct file *f; - register struct dep *d; - struct dep *this; - char *implicit_percent; - - nextf = filenames->next; - free ((char *) filenames); - - implicit_percent = find_percent (name); - implicit |= implicit_percent != 0; - - if (implicit && pattern != 0) - makefile_fatal (filename, lineno, - "mixed implicit and static pattern rules"); - - if (implicit && implicit_percent == 0) - makefile_fatal (filename, lineno, "mixed implicit and normal rules"); - - if (implicit) - { - if (targets == 0) - { - max_targets = 5; - targets = (char **) xmalloc (5 * sizeof (char *)); - target_percents = (char **) xmalloc (5 * sizeof (char *)); - target_idx = 0; - } - else if (target_idx == max_targets - 1) - { - max_targets += 5; - targets = (char **) xrealloc ((char *) targets, - max_targets * sizeof (char *)); - target_percents - = (char **) xrealloc ((char *) target_percents, - max_targets * sizeof (char *)); - } - targets[target_idx] = name; - target_percents[target_idx] = implicit_percent; - ++target_idx; - continue; - } - - /* If there are multiple filenames, copy the chain DEPS - for all but the last one. It is not safe for the same deps - to go in more than one place in the data base. */ - this = nextf != 0 ? copy_dep_chain (deps) : deps; - - if (pattern != 0) - /* If this is an extended static rule: - `targets: target%pattern: dep%pattern; cmds', - translate each dependency pattern into a plain filename - using the target pattern and this target's name. */ - if (!pattern_matches (pattern, pattern_percent, name)) - { - /* Give a warning if the rule is meaningless. */ - makefile_error (filename, lineno, - "target `%s' doesn't match the target pattern", - name); - this = 0; - } - else - { - /* We use patsubst_expand to do the work of translating - the target pattern, the target's name and the dependencies' - patterns into plain dependency names. */ - char *buffer = variable_expand (""); - - for (d = this; d != 0; d = d->next) - { - char *o; - char *percent = find_percent (d->name); - if (percent == 0) - continue; - o = patsubst_expand (buffer, name, pattern, d->name, - pattern_percent, percent); - free (d->name); - d->name = savestring (buffer, o - buffer); - } - } - - if (!two_colon) - { - /* Single-colon. Combine these dependencies - with others in file's existing record, if any. */ - f = enter_file (name); - - if (f->double_colon) - makefile_fatal (filename, lineno, - "target file `%s' has both : and :: entries", - f->name); - - /* If CMDS == F->CMDS, this target was listed in this rule - more than once. Just give a warning since this is harmless. */ - if (cmds != 0 && cmds == f->cmds) - makefile_error - (filename, lineno, - "target `%s' given more than once in the same rule.", - f->name); - - /* Check for two single-colon entries both with commands. - Check is_target so that we don't lose on files such as .c.o - whose commands were preinitialized. */ - else if (cmds != 0 && f->cmds != 0 && f->is_target) - { - makefile_error (cmds->filename, cmds->lineno, - "warning: overriding commands for target `%s'", - f->name); - makefile_error (f->cmds->filename, f->cmds->lineno, - "warning: ignoring old commands for target `%s'", - f->name); - } - - f->is_target = 1; - - /* Defining .DEFAULT with no deps or cmds clears it. */ - if (f == default_file && this == 0 && cmds == 0) - f->cmds = 0; - if (cmds != 0) - f->cmds = cmds; - /* Defining .SUFFIXES with no dependencies - clears out the list of suffixes. */ - if (f == suffix_file && this == 0) - { - d = f->deps; - while (d != 0) - { - struct dep *nextd = d->next; - free (d->name); - free (d); - d = nextd; - } - f->deps = 0; - } - else if (f->deps != 0) - { - /* Add the file's old deps and the new ones in THIS together. */ - - struct dep *firstdeps, *moredeps; - if (cmds != 0) - { - /* This is the rule with commands, so put its deps first. - The rationale behind this is that $< expands to the - first dep in the chain, and commands use $< expecting - to get the dep that rule specifies. */ - firstdeps = this; - moredeps = f->deps; - } - else - { - /* Append the new deps to the old ones. */ - firstdeps = f->deps; - moredeps = this; - } - - if (firstdeps == 0) - firstdeps = moredeps; - else - { - d = firstdeps; - while (d->next != 0) - d = d->next; - d->next = moredeps; - } - - f->deps = firstdeps; - } - else - f->deps = this; - - /* If this is a static pattern rule, set the file's stem to - the part of its name that matched the `%' in the pattern, - so you can use $* in the commands. */ - if (pattern != 0) - { - static char *percent = "%"; - char *buffer = variable_expand (""); - char *o = patsubst_expand (buffer, name, pattern, percent, - pattern_percent, percent); - f->stem = savestring (buffer, o - buffer); - } - } - else - { - /* Double-colon. Make a new record - even if the file already has one. */ - f = lookup_file (name); - /* Check for both : and :: rules. Check is_target so - we don't lose on default suffix rules or makefiles. */ - if (f != 0 && f->is_target && !f->double_colon) - makefile_fatal (filename, lineno, - "target file `%s' has both : and :: entries", - f->name); - f = enter_file (name); - /* If there was an existing entry and it was a double-colon - entry, enter_file will have returned a new one, making it the - prev pointer of the old one, and setting its double_colon - pointer to the first one. */ - if (f->double_colon == 0) - /* This is the first entry for this name, so we must - set its double_colon pointer to itself. */ - f->double_colon = f; - f->is_target = 1; - f->deps = this; - f->cmds = cmds; - } - - /* Free name if not needed further. */ - if (f != 0 && name != f->name - && (name < f->name || name > f->name + strlen (f->name))) - { - free (name); - name = f->name; - } - - /* See if this is first target seen whose name does - not start with a `.', unless it contains a slash. */ - if (default_goal_file == 0 && set_default - && (*name != '.' || index (name, '/') != 0)) - { - int reject = 0; - - /* If this file is a suffix, don't - let it be the default goal file. */ - - for (d = suffix_file->deps; d != 0; d = d->next) - { - register struct dep *d2; - if (*dep_name (d) != '.' && streq (name, dep_name (d))) - { - reject = 1; - break; - } - for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next) - { - register unsigned int len = strlen (dep_name (d2)); - if (strncmp (name, dep_name (d2), len)) - continue; - if (streq (name + len, dep_name (d))) - { - reject = 1; - break; - } - } - if (reject) - break; - } - - if (!reject) - default_goal_file = f; - } - } - - if (implicit) - { - targets[target_idx] = 0; - target_percents[target_idx] = 0; - create_pattern_rule (targets, target_percents, two_colon, deps, cmds, 1); - free ((char *) target_percents); - } -} - -/* Search STRING for an unquoted STOPCHAR or blank (if BLANK is nonzero). - Backslashes quote STOPCHAR, blanks if BLANK is nonzero, and backslash. - Quoting backslashes are removed from STRING by compacting it into - itself. Returns a pointer to the first unquoted STOPCHAR if there is - one, or nil if there are none. */ - -char * -find_char_unquote (string, stopchars, blank) - char *string; - char *stopchars; - int blank; -{ - unsigned int string_len = strlen (string); - register char *p = string; - - while (1) - { - while (*p != '\0' && index (stopchars, *p) == 0 - && (!blank || !isblank (*p))) - ++p; - if (*p == '\0') - break; - - if (p > string && p[-1] == '\\') - { - /* Search for more backslashes. */ - register int i = -2; - while (&p[i] >= string && p[i] == '\\') - --i; - ++i; - /* The number of backslashes is now -I. - Copy P over itself to swallow half of them. */ - bcopy (&p[i / 2], &p[i], (string_len - (p - string)) - (i / 2) + 1); - p += i / 2; - if (i % 2 == 0) - /* All the backslashes quoted each other; the STOPCHAR was - unquoted. */ - return p; - - /* The STOPCHAR was quoted by a backslash. Look for another. */ - } - else - /* No backslash in sight. */ - return p; - } - - /* Never hit a STOPCHAR or blank (with BLANK nonzero). */ - return 0; -} - -/* Search PATTERN for an unquoted %. */ - -char * -find_percent (pattern) - char *pattern; -{ - return find_char_unquote (pattern, "%", 0); -} - -/* Search STRING for an unquoted ; that is not after an unquoted #. */ - -static char * -find_semicolon (string) - char *string; -{ - char *match = find_char_unquote (string, ";#", 0); - if (match != 0 && *match == '#') - /* We found a comment before a semicolon. No match. */ - match = 0; - return match; -} - -/* Parse a string into a sequence of filenames represented as a - chain of struct nameseq's in reverse order and return that chain. - - The string is passed as STRINGP, the address of a string pointer. - The string pointer is updated to point at the first character - not parsed, which either is a null char or equals STOPCHAR. - - SIZE is how big to construct chain elements. - This is useful if we want them actually to be other structures - that have room for additional info. - - If STRIP is nonzero, strip `./'s off the beginning. */ - -struct nameseq * -parse_file_seq (stringp, stopchar, size, strip) - char **stringp; - char stopchar; - unsigned int size; - int strip; -{ - register struct nameseq *new = 0; - register struct nameseq *new1; -#ifndef NO_ARCHIVES - register struct nameseq *lastnew1; -#endif - register char *p = *stringp; - char *q; - char *name; - char stopchars[2]; - stopchars[0] = stopchar; - stopchars[1] = '\0'; - - while (1) - { - /* Skip whitespace; see if any more names are left. */ - p = next_token (p); - if (*p == '\0') - break; - if (*p == stopchar) - break; - /* Yes, find end of next name. */ - q = p; - p = find_char_unquote (q, stopchars, 1); -#if defined(__MSDOS__) || defined(NETSCAPE) - /* For MS-DOS, skip a "C:\...". */ - if (stopchar == ':' && p != 0 && p - q == 1 && *p == ':' - && (p[1] == '\\' || p[1] == '/') && isalpha (p[-1])) - p = find_char_unquote (p + 1, stopchars, 1); -#endif - if (p == 0) - p = q + strlen (q); - - if (strip) - /* Skip leading `./'s. */ - while (p - q > 2 && q[0] == '.' && q[1] == '/') - { - q += 2; /* Skip "./". */ - while (q < p && *q == '/') - /* Skip following slashes: ".//foo" is "foo", not "/foo". */ - ++q; - } - - /* Extract the filename just found, and skip it. */ - - if (q == p) - /* ".///" was stripped to "". */ - name = savestring ("./", 2); - else - name = savestring (q, p - q); - - /* Add it to the front of the chain. */ - new1 = (struct nameseq *) xmalloc (size); - new1->name = name; - new1->next = new; - new = new1; - } - -#ifndef NO_ARCHIVES - - /* Look for multi-word archive references. - They are indicated by a elt ending with an unmatched `)' and - an elt further down the chain (i.e., previous in the file list) - with an unmatched `(' (e.g., "lib(mem"). */ - - new1 = new; - lastnew1 = 0; - while (new1 != 0) - if (new1->name[0] != '(' /* Don't catch "(%)" and suchlike. */ - && new1->name[strlen (new1->name) - 1] == ')' - && index (new1->name, '(') == 0) - { - /* NEW1 ends with a `)' but does not contain a `('. - Look back for an elt with an opening `(' but no closing `)'. */ - - struct nameseq *n = new1->next, *lastn = new1; - char *paren; - while (n != 0 && (paren = index (n->name, '(')) == 0) - { - lastn = n; - n = n->next; - } - if (n != 0 - /* Ignore something starting with `(', as that cannot actually - be an archive-member reference (and treating it as such - results in an empty file name, which causes much lossage). */ - && n->name[0] != '(') - { - /* N is the first element in the archive group. - Its name looks like "lib(mem" (with no closing `)'). */ - - char *libname; - - /* Copy "lib(" into LIBNAME. */ - ++paren; - libname = (char *) alloca (paren - n->name + 1); - bcopy (n->name, libname, paren - n->name); - libname[paren - n->name] = '\0'; - - if (*paren == '\0') - { - /* N was just "lib(", part of something like "lib( a b)". - Edit it out of the chain and free its storage. */ - lastn->next = n->next; - free (n->name); - free ((char *) n); - /* LASTN->next is the new stopping elt for the loop below. */ - n = lastn->next; - } - else - { - /* Replace N's name with the full archive reference. */ - name = concat (libname, paren, ")"); - free (n->name); - n->name = name; - } - - if (new1->name[1] == '\0') - { - /* NEW1 is just ")", part of something like "lib(a b )". - Omit it from the chain and free its storage. */ - if (lastnew1 == 0) - new = new1->next; - else - lastnew1->next = new1->next; - lastn = new1; - new1 = new1->next; - free (lastn->name); - free ((char *) lastn); - } - else - { - /* Replace also NEW1->name, which already has closing `)'. */ - name = concat (libname, new1->name, ""); - free (new1->name); - new1->name = name; - new1 = new1->next; - } - - /* Trace back from NEW1 (the end of the list) until N - (the beginning of the list), rewriting each name - with the full archive reference. */ - - while (new1 != n) - { - name = concat (libname, new1->name, ")"); - free (new1->name); - new1->name = name; - lastnew1 = new1; - new1 = new1->next; - } - } - else - { - /* No frobnication happening. Just step down the list. */ - lastnew1 = new1; - new1 = new1->next; - } - } - else - { - lastnew1 = new1; - new1 = new1->next; - } - -#endif - - *stringp = p; - return new; -} - -/* Read a line of text from STREAM into LINEBUFFER. - Combine continuation lines into one line. - Return the number of actual lines read (> 1 if hacked continuation lines). - */ - -static unsigned int -readline (linebuffer, stream, filename, lineno) - struct linebuffer *linebuffer; - FILE *stream; - char *filename; - unsigned int lineno; -{ - char *buffer = linebuffer->buffer; - register char *p = linebuffer->buffer; - register char *end = p + linebuffer->size; - register int len, lastlen = 0; - register char *p2; - register unsigned int nlines = 0; - register int backslash; - - *p = '\0'; - - while (fgets (p, end - p, stream) != 0) - { - len = strlen (p); - if (len == 0) - { - /* This only happens when the first thing on the line is a '\0'. - It is a pretty hopeless case, but (wonder of wonders) Athena - lossage strikes again! (xmkmf puts NULs in its makefiles.) - There is nothing really to be done; we synthesize a newline so - the following line doesn't appear to be part of this line. */ - makefile_error (filename, lineno, - "warning: NUL character seen; rest of line ignored"); - p[0] = '\n'; - len = 1; - } - - p += len; - if (p[-1] != '\n') - { - /* Probably ran out of buffer space. */ - register unsigned int p_off = p - buffer; - linebuffer->size *= 2; - buffer = (char *) xrealloc (buffer, linebuffer->size); - p = buffer + p_off; - end = buffer + linebuffer->size; - linebuffer->buffer = buffer; - *p = '\0'; - lastlen = len; - continue; - } - - ++nlines; - - if (len == 1 && p > buffer) - /* P is pointing at a newline and it's the beginning of - the buffer returned by the last fgets call. However, - it is not necessarily the beginning of a line if P is - pointing past the beginning of the holding buffer. - If the buffer was just enlarged (right before the newline), - we must account for that, so we pretend that the two lines - were one line. */ - len += lastlen; - lastlen = len; - backslash = 0; - for (p2 = p - 2; --len > 0; --p2) - { - if (*p2 == '\\') - backslash = !backslash; - else - break; - } - - if (!backslash) - { - p[-1] = '\0'; - break; - } - - if (end - p <= 1) - { - /* Enlarge the buffer. */ - register unsigned int p_off = p - buffer; - linebuffer->size *= 2; - buffer = (char *) xrealloc (buffer, linebuffer->size); - p = buffer + p_off; - end = buffer + linebuffer->size; - linebuffer->buffer = buffer; - } - } - - if (ferror (stream)) - pfatal_with_name (filename); - - return nlines; -} - -/* Construct the list of include directories - from the arguments and the default list. */ - -void -construct_include_path (arg_dirs) - char **arg_dirs; -{ - register unsigned int i; - struct stat stbuf; - - /* Table to hold the dirs. */ - - register unsigned int defsize = (sizeof (default_include_directories) - / sizeof (default_include_directories[0])); - register unsigned int max = 5; - register char **dirs = (char **) xmalloc ((5 + defsize) * sizeof (char *)); - register unsigned int idx = 0; - - /* First consider any dirs specified with -I switches. - Ignore dirs that don't exist. */ - - if (arg_dirs != 0) - while (*arg_dirs != 0) - { - char *dir = *arg_dirs++; - - if (dir[0] == '~') - { - char *expanded = tilde_expand (dir); - if (expanded != 0) - dir = expanded; - } - - if (safe_stat (dir, &stbuf) == 0 && S_ISDIR (stbuf.st_mode)) - { - if (idx == max - 1) - { - max += 5; - dirs = (char **) - xrealloc ((char *) dirs, (max + defsize) * sizeof (char *)); - } - dirs[idx++] = dir; - } - else if (dir != arg_dirs[-1]) - free (dir); - } - - /* Now add at the end the standard default dirs. */ - - for (i = 0; default_include_directories[i] != 0; ++i) - if (safe_stat (default_include_directories[i], &stbuf) == 0 - && S_ISDIR (stbuf.st_mode)) - dirs[idx++] = default_include_directories[i]; - - dirs[idx] = 0; - - /* Now compute the maximum length of any name in it. */ - - max_incl_len = 0; - for (i = 0; i < idx; ++i) - { - unsigned int len = strlen (dirs[i]); - /* If dir name is written with a trailing slash, discard it. */ - if (dirs[i][len - 1] == '/') - /* We can't just clobber a null in because it may have come from - a literal string and literal strings may not be writable. */ - dirs[i] = savestring (dirs[i], len - 1); - if (len > max_incl_len) - max_incl_len = len; - } - - include_directories = dirs; -} - -/* Expand ~ or ~USER at the beginning of NAME. - Return a newly malloc'd string or 0. */ - -char * -tilde_expand (name) - char *name; -{ -#ifndef NETSCAPE - if (name[1] == '/' || name[1] == '\0') - { - extern char *getenv (); - char *home_dir; - int is_variable; - - { - /* Turn off --warn-undefined-variables while we expand HOME. */ - int save = warn_undefined_variables_flag; - warn_undefined_variables_flag = 0; - - home_dir = allocated_variable_expand ("$(HOME)"); - - warn_undefined_variables_flag = save; - } - - is_variable = home_dir[0] != '\0'; - if (!is_variable) - { - free (home_dir); - home_dir = getenv ("HOME"); - } - if (home_dir == 0 || home_dir[0] == '\0') - { - extern char *getlogin (); - char *name = getlogin (); - home_dir = 0; - if (name != 0) - { - struct passwd *p = getpwnam (name); - if (p != 0) - home_dir = p->pw_dir; - } - } - if (home_dir != 0) - { - char *new = concat (home_dir, "", name + 1); - if (is_variable) - free (home_dir); - return new; - } - } - else - { - struct passwd *pwent; - char *userend = index (name + 1, '/'); - if (userend != 0) - *userend = '\0'; - pwent = getpwnam (name + 1); - if (pwent != 0) - { - if (userend == 0) - return savestring (pwent->pw_dir, strlen (pwent->pw_dir)); - else - return concat (pwent->pw_dir, "/", userend + 1); - } - else if (userend != 0) - *userend = '/'; - } -#endif - return 0; -} - -/* Given a chain of struct nameseq's describing a sequence of filenames, - in reverse of the intended order, return a new chain describing the - result of globbing the filenames. The new chain is in forward order. - The links of the old chain are freed or used in the new chain. - Likewise for the names in the old chain. - - SIZE is how big to construct chain elements. - This is useful if we want them actually to be other structures - that have room for additional info. */ - -struct nameseq * -multi_glob (chain, size) - struct nameseq *chain; - unsigned int size; -{ - register struct nameseq *new = 0; - register struct nameseq *old; - struct nameseq *nexto; - - for (old = chain; old != 0; old = nexto) - { - glob_t gl; -#ifndef NO_ARCHIVES - char *memname; -#endif - - nexto = old->next; - - if (old->name[0] == '~') - { - char *newname = tilde_expand (old->name); - if (newname != 0) - { - free (old->name); - old->name = newname; - } - } - -#ifndef NO_ARCHIVES - if (ar_name (old->name)) - { - /* OLD->name is an archive member reference. - Replace it with the archive file name, - and save the member name in MEMNAME. - We will glob on the archive name and then - reattach MEMNAME later. */ - char *arname; - ar_parse_name (old->name, &arname, &memname); - free (old->name); - old->name = arname; - } - else - memname = 0; -#endif - - switch (glob (old->name, GLOB_NOCHECK, NULL, &gl)) - { - case 0: /* Success. */ - { - register int i = gl.gl_pathc; - while (i-- > 0) - { -#ifndef NO_ARCHIVES - if (memname != 0) - { - /* Try to glob on MEMNAME within the archive. */ - struct nameseq *found - = ar_glob (gl.gl_pathv[i], memname, size); - if (found == 0) - { - /* No matches. Use MEMNAME as-is. */ - struct nameseq *elt - = (struct nameseq *) xmalloc (size); - unsigned int alen = strlen (gl.gl_pathv[i]); - unsigned int mlen = strlen (memname); - elt->name = (char *) xmalloc (alen + 1 + mlen + 2); - bcopy (gl.gl_pathv[i], elt->name, alen); - elt->name[alen] = '('; - bcopy (memname, &elt->name[alen + 1], mlen); - elt->name[alen + 1 + mlen] = ')'; - elt->name[alen + 1 + mlen + 1] = '\0'; - elt->next = new; - new = elt; - } - else - { - /* Find the end of the FOUND chain. */ - struct nameseq *f = found; - while (f->next != 0) - f = f->next; - - /* Attach the chain being built to the end of the FOUND - chain, and make FOUND the new NEW chain. */ - f->next = new; - new = found; - } - - free (memname); - } - else -#endif - { - struct nameseq *elt = (struct nameseq *) xmalloc (size); - elt->name = savestring (gl.gl_pathv[i], - strlen (gl.gl_pathv[i])); - elt->next = new; - new = elt; - } - } - globfree (&gl); - free (old->name); - free (old); - break; - } - - case GLOB_NOSPACE: - fatal ("virtual memory exhausted"); - break; - - default: - old->next = new; - new = old; - break; - } - } - - return new; -} diff --git a/buildtools/windows/source/make/remake.c b/buildtools/windows/source/make/remake.c deleted file mode 100644 index c80c5d59fc0..00000000000 --- a/buildtools/windows/source/make/remake.c +++ /dev/null @@ -1,1086 +0,0 @@ -/* Basic dependency engine for GNU Make. -Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "commands.h" -#include "job.h" -#include "dep.h" -#include "file.h" -#include - -#ifdef HAVE_FCNTL_H -#include -#else -#include -#endif - -#if defined(NETSCAPE) -#include -#endif - -extern int try_implicit_rule (); - - -/* Incremented when a command is started (under -n, when one would be). */ -unsigned int commands_started = 0; - -static int update_file (), update_file_1 (), check_dep (), touch_file (); -static void remake_file (); -static time_t name_mtime (); -static int library_search (); -extern time_t f_mtime (); - -/* Remake all the goals in the `struct dep' chain GOALS. Return -1 if nothing - was done, 0 if all goals were updated successfully, or 1 if a goal failed. - If MAKEFILES is nonzero, these goals are makefiles, so -t, -q, and -n should - be disabled for them unless they were also command-line targets, and we - should only make one goal at a time and return as soon as one goal whose - `changed' member is nonzero is successfully made. */ - -int -update_goal_chain (goals, makefiles) - register struct dep *goals; - int makefiles; -{ - int t = touch_flag, q = question_flag, n = just_print_flag; - unsigned int j = job_slots; - int status = -1; - -#define MTIME(file) (makefiles ? file_mtime_no_search (file) \ - : file_mtime (file)) - - /* Duplicate the chain so we can remove things from it. */ - - goals = copy_dep_chain (goals); - - { - /* Clear the `changed' flag of each goal in the chain. - We will use the flag below to notice when any commands - have actually been run for a target. When no commands - have been run, we give an "up to date" diagnostic. */ - - struct dep *g; - for (g = goals; g != 0; g = g->next) - g->changed = 0; - } - - if (makefiles) - /* Only run one job at a time. */ - job_slots = 1; - - /* Update all the goals until they are all finished. */ - - while (goals != 0) - { - register struct dep *g, *lastgoal; - - /* Start jobs that are waiting for the load to go down. */ - - start_waiting_jobs (); - - /* Wait for a child to die. */ - - reap_children (1, 0); - - lastgoal = 0; - g = goals; - while (g != 0) - { - /* Iterate over all double-colon entries for this file. */ - struct file *file = g->file; - int stop, any_not_updated = 0; - for (file = g->file->double_colon ? g->file->double_colon : g->file; - file != NULL; - file = file->prev) - { - unsigned int ocommands_started; - int x; - time_t mtime = MTIME (file); - check_renamed (file); - - if (makefiles) - { - if (file->cmd_target) - { - touch_flag = t; - question_flag = q; - just_print_flag = n; - } - else - touch_flag = question_flag = just_print_flag = 0; - } - - /* Save the old value of `commands_started' so we can compare - later. It will be incremented when any commands are - actually run. */ - ocommands_started = commands_started; - - x = update_file (file, makefiles ? 1 : 0); - check_renamed (file); - - /* Set the goal's `changed' flag if any commands were started - by calling update_file above. We check this flag below to - decide when to give an "up to date" diagnostic. */ - g->changed += commands_started - ocommands_started; - - stop = 0; - if (x != 0 || file->updated) - { - /* If STATUS was not already 1, set it to 1 if - updating failed, or to 0 if updating succeeded. - Leave STATUS as it is if no updating was done. */ - - if (status < 1) - { - if (file->update_status != 0) - { - /* Updating failed, or -q triggered. - The STATUS value tells our caller which. */ - status = file->update_status; - /* If -q just triggered, stop immediately. - It doesn't matter how much more we run, - since we already know the answer to return. */ - stop = (!keep_going_flag && !question_flag - && !makefiles); - } - else if (MTIME (file) != mtime) - { - /* Updating was done. If this is a makefile and - just_print_flag or question_flag is set - (meaning -n or -q was given and this file was - specified as a command-line target), don't - change STATUS. If STATUS is changed, we will - get re-exec'd, and fall into an infinite loop. */ - if (!makefiles - || (!just_print_flag && !question_flag)) - status = 0; - if (makefiles && file->dontcare) - /* This is a default makefile. Stop remaking. */ - stop = 1; - } - } - } - - /* Keep track if any double-colon entry is not finished. - When they are all finished, the goal is finished. */ - any_not_updated |= !file->updated; - - if (stop) - break; - } - - /* Reset FILE since it is null at the end of the loop. */ - file = g->file; - - if (stop || !any_not_updated) - { - /* If we have found nothing whatever to do for the goal, - print a message saying nothing needs doing. */ - - if (!makefiles - /* If the update_status is zero, we updated successfully - or not at all. G->changed will have been set above if - any commands were actually started for this goal. */ - && file->update_status == 0 && !g->changed - /* Never give a message under -s or -q. */ - && !silent_flag && !question_flag) - { - if (file->phony || file->cmds == 0) - message ("Nothing to be done for `%s'.", - file->name); - else - message ("`%s' is up to date.", file->name); - fflush (stdout); - } - - /* This goal is finished. Remove it from the chain. */ - if (lastgoal == 0) - goals = g->next; - else - lastgoal->next = g->next; - - /* Free the storage. */ - free ((char *) g); - - g = lastgoal == 0 ? goals : lastgoal->next; - - if (stop) - break; - } - else - { - lastgoal = g; - g = g->next; - } - } - } - - if (makefiles) - { - touch_flag = t; - question_flag = q; - just_print_flag = n; - job_slots = j; - } - - return status; -} - -/* If FILE is not up to date, execute the commands for it. - Return 0 if successful, 1 if unsuccessful; - but with some flag settings, just call `exit' if unsuccessful. - - DEPTH is the depth in recursions of this function. - We increment it during the consideration of our dependencies, - then decrement it again after finding out whether this file - is out of date. - - If there are multiple double-colon entries for FILE, - each is considered in turn. */ - -static int -update_file (file, depth) - struct file *file; - unsigned int depth; -{ - register int status = 0; - register struct file *f; - - for (f = file->double_colon ? file->double_colon : file; f != 0; f = f->prev) - { - status |= update_file_1 (f, depth); - check_renamed (f); - - if (status != 0 && !keep_going_flag) - return status; - - switch (f->command_state) - { - case cs_finished: - /* The file is done being remade. */ - break; - - case cs_running: - case cs_deps_running: - /* Don't run the other :: rules for this - file until this rule is finished. */ - return 0; - - default: - assert (f->command_state == cs_running); - break; - } - } - - return status; -} - -/* Consider a single `struct file' and update it as appropriate. */ - -static int -update_file_1 (file, depth) - struct file *file; - unsigned int depth; -{ - register time_t this_mtime; - int noexist, must_make, deps_changed; - int dep_status = 0; - register struct dep *d, *lastd; - int running = 0; - - DEBUGPR ("Considering target file `%s'.\n"); - - if (file->updated) - { - if (file->update_status > 0) - { - DEBUGPR ("Recently tried and failed to update file `%s'.\n"); - return file->update_status; - } - - DEBUGPR ("File `%s' was considered already.\n"); - return 0; - } - - switch (file->command_state) - { - case cs_not_started: - case cs_deps_running: - break; - case cs_running: - DEBUGPR ("Still updating file `%s'.\n"); - return 0; - case cs_finished: - DEBUGPR ("Finished updating file `%s'.\n"); - return file->update_status; - default: - abort (); - } - - ++depth; - - /* Notice recursive update of the same file. */ - file->updating = 1; - - /* Looking at the file's modtime beforehand allows the possibility - that its name may be changed by a VPATH search, and thus it may - not need an implicit rule. If this were not done, the file - might get implicit commands that apply to its initial name, only - to have that name replaced with another found by VPATH search. */ - - this_mtime = file_mtime (file); - check_renamed (file); - noexist = this_mtime == (time_t) -1; - if (noexist) - DEBUGPR ("File `%s' does not exist.\n"); - - must_make = noexist; - - /* If file was specified as a target with no commands, - come up with some default commands. */ - - if (!file->phony && file->cmds == 0 && !file->tried_implicit) - { - if (try_implicit_rule (file, depth)) - DEBUGPR ("Found an implicit rule for `%s'.\n"); - else - DEBUGPR ("No implicit rule found for `%s'.\n"); - file->tried_implicit = 1; - } - if (file->cmds == 0 && !file->is_target - && default_file != 0 && default_file->cmds != 0) - { - DEBUGPR ("Using default commands for `%s'.\n"); - file->cmds = default_file->cmds; - } - - /* Update all non-intermediate files we depend on, if necessary, - and see whether any of them is more recent than this file. */ - - lastd = 0; - d = file->deps; - while (d != 0) - { - time_t mtime; - - check_renamed (d->file); - - mtime = file_mtime (d->file); - check_renamed (d->file); - - if (d->file->updating) - { - error ("Circular %s <- %s dependency dropped.", - file->name, d->file->name); - if (lastd == 0) - { - file->deps = d->next; - free ((char *) d); - d = file->deps; - } - else - { - lastd->next = d->next; - free ((char *) d); - d = lastd->next; - } - continue; - } - - d->file->parent = file; - dep_status |= check_dep (d->file, depth, this_mtime, &must_make); - check_renamed (d->file); - - { - register struct file *f = d->file; - if (f->double_colon) - f = f->double_colon; - do - { - running |= (f->command_state == cs_running - || f->command_state == cs_deps_running); - f = f->prev; - } - while (f != 0); - } - - if (dep_status != 0 && !keep_going_flag) - break; - - if (!running) - d->changed = file_mtime (d->file) != mtime; - - lastd = d; - d = d->next; - } - - /* Now we know whether this target needs updating. - If it does, update all the intermediate files we depend on. */ - - if (must_make) - { - for (d = file->deps; d != 0; d = d->next) - if (d->file->intermediate) - { - time_t mtime = file_mtime (d->file); - check_renamed (d->file); - d->file->parent = file; - dep_status |= update_file (d->file, depth); - check_renamed (d->file); - - { - register struct file *f = d->file; - if (f->double_colon) - f = f->double_colon; - do - { - running |= (f->command_state == cs_running - || f->command_state == cs_deps_running); - f = f->prev; - } - while (f != 0); - } - - if (dep_status != 0 && !keep_going_flag) - break; - - if (!running) - d->changed = ((file->phony && file->cmds != 0) - || file_mtime (d->file) != mtime); - } - } - - file->updating = 0; - - DEBUGPR ("Finished dependencies of target file `%s'.\n"); - - if (running) - { - set_command_state (file, cs_deps_running); - --depth; - DEBUGPR ("The dependencies of `%s' are being made.\n"); - return 0; - } - - /* If any dependency failed, give up now. */ - - if (dep_status != 0) - { - file->update_status = dep_status; - notice_finished_file (file); - - depth--; - - DEBUGPR ("Giving up on target file `%s'.\n"); - - if (depth == 0 && keep_going_flag - && !just_print_flag && !question_flag) - error ("Target `%s' not remade because of errors.", file->name); - - return dep_status; - } - - if (file->command_state == cs_deps_running) - /* The commands for some deps were running on the last iteration, but - they have finished now. Reset the command_state to not_started to - simplify later bookkeeping. It is important that we do this only - when the prior state was cs_deps_running, because that prior state - was definitely propagated to FILE's also_make's by set_command_state - (called above), but in another state an also_make may have - independently changed to finished state, and we would confuse that - file's bookkeeping (updated, but not_started is bogus state). */ - set_command_state (file, cs_not_started); - - /* Now record which dependencies are more - recent than this file, so we can define $?. */ - - deps_changed = 0; - for (d = file->deps; d != 0; d = d->next) - { - time_t d_mtime = file_mtime (d->file); - check_renamed (d->file); - -#if 1 /* %%% In version 4, remove this code completely to - implement not remaking deps if their deps are newer - than their parents. */ - if (d_mtime == (time_t) -1 && !d->file->intermediate) - /* We must remake if this dep does not - exist and is not intermediate. */ - must_make = 1; -#endif - - /* Set DEPS_CHANGED if this dep actually changed. */ - deps_changed |= d->changed; - - /* Set D->changed if either this dep actually changed, - or its dependent, FILE, is older or does not exist. */ - d->changed |= noexist || d_mtime > this_mtime; - - if (debug_flag && !noexist) - { - print_spaces (depth); - if (d_mtime == (time_t) -1) - printf ("Dependency `%s' does not exist.\n", dep_name (d)); - else - printf ("Dependency `%s' is %s than dependent `%s'.\n", - dep_name (d), d->changed ? "newer" : "older", file->name); - fflush (stdout); - } - } - - /* Here depth returns to the value it had when we were called. */ - depth--; - - if (file->double_colon && file->deps == 0) - { - must_make = 1; - DEBUGPR ("Target `%s' is double-colon and has no dependencies.\n"); - } - else if (!noexist && file->is_target && !deps_changed && file->cmds == 0) - { - must_make = 0; - DEBUGPR ("No commands for `%s' and no dependencies actually changed.\n"); - } - - if (!must_make) - { - DEBUGPR ("No need to remake target `%s'.\n"); - notice_finished_file (file); - return 0; - } - - DEBUGPR ("Must remake target `%s'.\n"); - - /* Now, take appropriate actions to remake the file. */ - remake_file (file); - - if (file->command_state != cs_finished) - { - DEBUGPR ("Commands of `%s' are being run.\n"); - return 0; - } - - switch (file->update_status) - { - case 2: - DEBUGPR ("Failed to remake target file `%s'.\n"); - break; - case 0: - DEBUGPR ("Successfully remade target file `%s'.\n"); - break; - case 1: - DEBUGPR ("Target file `%s' needs remade under -q.\n"); - break; - default: - assert (file->update_status >= 0 && file->update_status <= 2); - break; - } - - file->updated = 1; - return file->update_status; -} - -/* Set FILE's `updated' flag and re-check its mtime and the mtime's of all - files listed in its `also_make' member. Under -t, this function also - touches FILE. - - On return, FILE->update_status will no longer be -1 if it was. */ - -void -notice_finished_file (file) - register struct file *file; -{ - struct dep *d; - int ran = file->command_state == cs_running; - - file->command_state = cs_finished; - file->updated = 1; - - if (touch_flag - /* The update status will be: - -1 if this target was not remade; - 0 if 0 or more commands (+ or ${MAKE}) were run and won; - 1 if some commands were run and lost. - We touch the target if it has commands which either were not run - or won when they ran (i.e. status is 0). */ - && file->update_status == 0) - { - if (file->cmds != 0 && file->cmds->any_recurse) - { - /* If all the command lines were recursive, - we don't want to do the touching. */ - unsigned int i; - for (i = 0; i < file->cmds->ncommand_lines; ++i) - if (!(file->cmds->lines_flags[i] & COMMANDS_RECURSE)) - goto have_nonrecursing; - } - else - { - have_nonrecursing: - if (file->phony) - file->update_status = 0; - else - /* Should set file's modification date and do nothing else. */ - file->update_status = touch_file (file); - } - } - - if (ran && !file->phony) - { - struct file *f; - - if (just_print_flag || question_flag - || (file->is_target && file->cmds == 0)) - file->last_mtime = NEW_MTIME; - else - file->last_mtime = 0; - - /* Propagate the change of modification time to all the double-colon - entries for this file. */ - for (f = file->double_colon; f != 0; f = f->next) - f->last_mtime = file->last_mtime; - } - - if (ran && file->update_status != -1) - /* We actually tried to update FILE, which has - updated its also_make's as well (if it worked). - If it didn't work, it wouldn't work again for them. - So mark them as updated with the same status. */ - for (d = file->also_make; d != 0; d = d->next) - { - d->file->command_state = cs_finished; - d->file->updated = 1; - d->file->update_status = file->update_status; - - if (ran && !d->file->phony) - /* Fetch the new modification time. - We do this instead of just invalidating the cached time - so that a vpath_search can happen. Otherwise, it would - never be done because the target is already updated. */ - (void) f_mtime (d->file, 0); - } - else if (file->update_status == -1) - /* Nothing was done for FILE, but it needed nothing done. - So mark it now as "succeeded". */ - file->update_status = 0; -} - -/* Check whether another file (whose mtime is THIS_MTIME) - needs updating on account of a dependency which is file FILE. - If it does, store 1 in *MUST_MAKE_PTR. - In the process, update any non-intermediate files - that FILE depends on (including FILE itself). - Return nonzero if any updating failed. */ - -static int -check_dep (file, depth, this_mtime, must_make_ptr) - struct file *file; - unsigned int depth; - time_t this_mtime; - int *must_make_ptr; -{ - register struct dep *d; - int dep_status = 0; - - ++depth; - file->updating = 1; - - if (!file->intermediate) - /* If this is a non-intermediate file, update it and record - whether it is newer than THIS_MTIME. */ - { - time_t mtime; - dep_status = update_file (file, depth); - check_renamed (file); - mtime = file_mtime (file); - check_renamed (file); - if (mtime == (time_t) -1 || mtime > this_mtime) - *must_make_ptr = 1; - } - else - { - /* FILE is an intermediate file. - Update all non-intermediate files we depend on, if necessary, - and see whether any of them is more recent than the file - on whose behalf we are checking. */ - register struct dep *lastd; - lastd = 0; - d = file->deps; - while (d != 0) - { - if (d->file->updating) - { - error ("Circular %s <- %s dependency dropped.", - file->name, d->file->name); - if (lastd == 0) - { - file->deps = d->next; - free ((char *) d); - d = file->deps; - } - else - { - lastd->next = d->next; - free ((char *) d); - d = lastd->next; - } - continue; - } - - d->file->parent = file; - dep_status |= check_dep (d->file, depth, this_mtime, must_make_ptr); - check_renamed (d->file); - if (dep_status != 0 && !keep_going_flag) - break; - - if (d->file->command_state == cs_running - || d->file->command_state == cs_deps_running) - /* Record that some of FILE's dependencies are still being made. - This tells the upper levels to wait on processing it until - the commands are finished. */ - set_command_state (file, cs_deps_running); - - lastd = d; - d = d->next; - } - } - - file->updating = 0; - return dep_status; -} - -/* Touch FILE. Return zero if successful, one if not. */ - -#define TOUCH_ERROR(call) return (perror_with_name (call, file->name), 1) - -static int -touch_file (file) - register struct file *file; -{ - if (!silent_flag) - { - printf ("touch %s\n", file->name); - fflush (stdout); - } - -#ifndef NO_ARCHIVES - if (ar_name (file->name)) - return ar_touch (file->name); - else -#endif - { - int fd = open (file->name, O_RDWR | O_CREAT, 0666); - - if (fd < 0) - TOUCH_ERROR ("touch: open: "); - else - { - struct stat statbuf; - char buf; - int status; - -#ifdef EINTR - do -#endif - status = fstat (fd, &statbuf); -#ifdef EINTR - while (status < 0 && errno == EINTR); -#endif - if (status < 0) - TOUCH_ERROR ("touch: fstat: "); - /* Rewrite character 0 same as it already is. */ - if (read (fd, &buf, 1) < 0) - TOUCH_ERROR ("touch: read: "); - if (lseek (fd, 0L, 0) < 0L) - TOUCH_ERROR ("touch: lseek: "); - if (write (fd, &buf, 1) < 0) - TOUCH_ERROR ("touch: write: "); - /* If file length was 0, we just - changed it, so change it back. */ - if (statbuf.st_size == 0) - { - (void) close (fd); - fd = open (file->name, O_RDWR | O_TRUNC, 0666); - if (fd < 0) - TOUCH_ERROR ("touch: open: "); - } - (void) close (fd); - } - } - - return 0; -} - -/* Having checked and updated the dependencies of FILE, - do whatever is appropriate to remake FILE itself. - Return the status from executing FILE's commands. */ - -static void -remake_file (file) - struct file *file; -{ - if (file->cmds == 0) - { - if (file->phony) - /* Phony target. Pretend it succeeded. */ - file->update_status = 0; - else if (file->is_target) - /* This is a nonexistent target file we cannot make. - Pretend it was successfully remade. */ - file->update_status = 0; - else - { - /* This is a dependency file we cannot remake. Fail. */ - static const char msg_noparent[] - = "%sNo rule to make target `%s'%s"; - static const char msg_parent[] - = "%sNo rule to make target `%s', needed by `%s'%s"; - if (keep_going_flag || file->dontcare) - { - if (!file->dontcare) - { - if (file->parent == 0) - error (msg_noparent, "*** ", file->name, "."); - else - error (msg_parent, "*** ", - file->name, file->parent->name, "."); - } - file->update_status = 2; - } - else - { - if (file->parent == 0) - fatal (msg_noparent, "", file->name, ""); - else - fatal (msg_parent, "", file->name, file->parent->name, ""); - } - } - } - else - { - chop_commands (file->cmds); - - if (!touch_flag || file->cmds->any_recurse) - { - execute_file_commands (file); - return; - } - else - /* This tells notice_finished_file it is ok to touch the file. */ - file->update_status = 0; - } - - /* This does the touching under -t. */ - notice_finished_file (file); -} - -/* Return the mtime of a file, given a `struct file'. - Caches the time in the struct file to avoid excess stat calls. - - If the file is not found, and SEARCH is nonzero, VPATH searching and - replacement is done. If that fails, a library (-lLIBNAME) is tried and - the library's actual name (/lib/libLIBNAME.a, etc.) is substituted into - FILE. */ - -time_t -f_mtime (file, search) - register struct file *file; - int search; -{ - time_t mtime; - - /* File's mtime is not known; must get it from the system. */ - -#ifndef NO_ARCHIVES - if (ar_name (file->name)) - { - /* This file is an archive-member reference. */ - - char *arname, *memname; - struct file *arfile; - int arname_used = 0; - - /* Find the archive's name. */ - ar_parse_name (file->name, &arname, &memname); - - /* Find the modification time of the archive itself. - Also allow for its name to be changed via VPATH search. */ - arfile = lookup_file (arname); - if (arfile == 0) - { - arfile = enter_file (arname); - arname_used = 1; - } - mtime = f_mtime (arfile, search); - check_renamed (arfile); - if (search && strcmp (arfile->name, arname)) - { - /* The archive's name has changed. - Change the archive-member reference accordingly. */ - - unsigned int arlen, memlen; - - if (!arname_used) - { - free (arname); - arname_used = 1; - } - - arname = arfile->name; - arlen = strlen (arname); - memlen = strlen (memname); - - free (file->name); - - file->name = (char *) xmalloc (arlen + 1 + memlen + 2); - bcopy (arname, file->name, arlen); - file->name[arlen] = '('; - bcopy (memname, file->name + arlen + 1, memlen); - file->name[arlen + 1 + memlen] = ')'; - file->name[arlen + 1 + memlen + 1] = '\0'; - } - - if (!arname_used) - free (arname); - free (memname); - - if (mtime == (time_t) -1) - /* The archive doesn't exist, so it's members don't exist either. */ - return (time_t) -1; - - mtime = ar_member_date (file->name); - } - else -#endif - { - mtime = name_mtime (file->name); - - if (mtime == (time_t) -1 && search) - { - /* If name_mtime failed, search VPATH. */ - char *name = file->name; - if (vpath_search (&name, &mtime) - /* Last resort, is it a library (-lxxx)? */ - || (name[0] == '-' && name[1] == 'l' - && library_search (&name, &mtime))) - { - if (mtime != 0) - /* vpath_search and library_search store zero in MTIME - if they didn't need to do a stat call for their work. */ - file->last_mtime = mtime; - rename_file (file, name); - check_renamed (file); - return file_mtime (file); - } - } - } - - /* Store the mtime into all the entries for this file. */ - if (file->double_colon) - file = file->double_colon; - do - { - file->last_mtime = mtime; - file = file->prev; - } while (file != 0); - - return mtime; -} - - -/* Return the mtime of the file or archive-member reference NAME. */ - -static time_t -name_mtime (name) - register char *name; -{ - struct stat st; - - if (safe_stat (name, &st) < 0) - return (time_t) -1; - - return (time_t) st.st_mtime; -} - - -/* Search for a library file specified as -lLIBNAME, searching for a - suitable library file in the system library directories and the VPATH - directories. */ - -static int -library_search (lib, mtime_ptr) - char **lib; - time_t *mtime_ptr; -{ - static char *dirs[] = - { -#ifndef NETSCAPE - "/lib", - "/usr/lib", -#endif - LIBDIR, /* Defined by configuration. */ - 0 - }; - - char *libname = &(*lib)[2]; /* Name without the `-l'. */ - time_t mtime; - - /* Buffer to construct possible names in. */ - char *buf = xmalloc (sizeof (LIBDIR) + 8 + strlen (libname) + 4 + 2 + 1); - char *file, **dp; - - /* Look first for `libNAME.a' in the current directory. */ - - sprintf (buf, "lib%s.a", libname); - mtime = name_mtime (buf); - if (mtime != (time_t) -1) - { - *lib = buf; - if (mtime_ptr != 0) - *mtime_ptr = mtime; - return 1; - } - - /* Now try VPATH search on that. */ - - file = buf; - if (vpath_search (&file, mtime_ptr)) - { - free (buf); - *lib = file; - return 1; - } - - /* Now try the standard set of directories. */ - - for (dp = dirs; *dp != 0; ++dp) - { - sprintf (buf, "%s/lib%s.a", *dp, libname); - mtime = name_mtime (buf); - if (mtime != (time_t) -1) - { - *lib = buf; - if (mtime_ptr != 0) - *mtime_ptr = mtime; - return 1; - } - } - - free (buf); - return 0; -} diff --git a/buildtools/windows/source/make/remote-cstms.c b/buildtools/windows/source/make/remote-cstms.c deleted file mode 100644 index 6aa2c966a25..00000000000 --- a/buildtools/windows/source/make/remote-cstms.c +++ /dev/null @@ -1,270 +0,0 @@ -/* GNU Make remote job exportation interface to the Customs daemon. - THIS CODE IS NOT SUPPORTED BY THE GNU PROJECT. - Please do not send bug reports or questions about it to - the Make maintainers. - -Copyright (C) 1988, 1989, 1992, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "commands.h" -#include "job.h" -#include -#include - -#define __STRICT_BSD__ /* Don't make conflicting declarations. */ -#include "customs.h" - - -char *remote_description = "Customs"; - -/* File name of the Customs `export' client command. - A full path name can be used to avoid some path-searching overhead. */ -#define EXPORT_COMMAND "/usr/local/bin/export" - -/* ExportPermit gotten by start_remote_job_p, and used by start_remote_job. */ -static ExportPermit permit; - -/* Normalized path name of the current directory. */ -static char *normalized_cwd; - -/* Return nonzero if the next job should be done remotely. */ - -int -start_remote_job_p () -{ - static int inited = 0; - int status; - - /* Allow the user to turn off job exportation - (useful while he is debugging Customs, for example). */ - if (getenv ("GNU_MAKE_NO_CUSTOMS") != 0) - return 0; - - if (!inited) - { - /* For secure Customs, make is installed setuid root and - Customs requires a privileged source port be used. */ - make_access (); - - /* Ping the daemon once to see if it is there. */ - inited = Customs_Ping () == RPC_SUCCESS ? 1 : -1; - - /* Return to normal user access. */ - user_access (); - - if (starting_directory == 0) - /* main couldn't figure it out. */ - inited = -1; - else - { - /* Normalize the current directory path name to something - that should work on all machines exported to. */ - - normalized_cwd = (char *) xmalloc (GET_PATH_MAX); - strcpy (normalized_cwd, starting_directory); - if (Customs_NormPath (normalized_cwd, GET_PATH_MAX) < 0) - /* Path normalization failure means using Customs - won't work, but it's not really an error. */ - inited = -1; - } - } - - if (inited < 0) - return 0; - - status = Customs_Host (EXPORT_SAME, &permit); - if (status != RPC_SUCCESS) - { - if (debug_flag) - printf ("Customs won't export: %s\n", Rpc_ErrorMessage (status)); - return 0; - } - - return !CUSTOMS_FAIL (&permit.addr); -} - -/* Start a remote job running the command in ARGV, with environment from - ENVP. It gets standard input from STDIN_FD. On failure, return - nonzero. On success, return zero, and set *USED_STDIN to nonzero if it - will actually use STDIN_FD, zero if not, set *ID_PTR to a unique - identification, and set *IS_REMOTE to nonzero if the job is remote, zero - if it is local (meaning *ID_PTR is a process ID). */ - -int -start_remote_job (argv, envp, stdin_fd, is_remote, id_ptr, used_stdin) - char **argv, **envp; - int stdin_fd; - int *is_remote; - int *id_ptr; - int *used_stdin; -{ - extern int vfork (), execve (); - char waybill[MAX_DATA_SIZE], msg[128]; - struct timeval timeout; - struct sockaddr_in sin; - int len; - int retsock, retport, sock; - Rpc_Stat status; - int pid; - - /* Create the return socket. */ - retsock = Rpc_UdpCreate (True, 0); - if (retsock < 0) - { - error ("exporting: Couldn't create return socket."); - return 1; - } - - /* Get the return socket's port number. */ - len = sizeof (sin); - if (getsockname (retsock, (struct sockaddr *) &sin, &len) < 0) - { - (void) close (retsock); - perror_with_name ("exporting: ", "getsockname"); - return 1; - } - retport = sin.sin_port; - - /* Create the TCP socket for talking to the remote child. */ - sock = Rpc_TcpCreate (False, 0); - - /* Create a WayBill to give to the server. */ - len = Customs_MakeWayBill (&permit, normalized_cwd, argv[0], argv, - envp, retport, waybill); - - /* Modify the waybill as if the remote child had done `child_access ()'. */ - { - WayBill *wb = (WayBill *) waybill; - wb->euid = wb->ruid; - wb->rgid = wb->rgid; - } - - /* Send the request to the server, timing out in 20 seconds. */ - timeout.tv_usec = 0; - timeout.tv_sec = 20; - sin.sin_family = AF_INET; - sin.sin_port = htons (Customs_Port ()); - sin.sin_addr = permit.addr; - status = Rpc_Call (sock, &sin, (Rpc_Proc) CUSTOMS_IMPORT, - len, (Rpc_Opaque) waybill, - sizeof(msg), (Rpc_Opaque) msg, - 1, &timeout); - if (status != RPC_SUCCESS) - { - (void) close (retsock); - (void) close (sock); - error ("exporting: %s", Rpc_ErrorMessage (status)); - return 1; - } - else if (msg[0] != 'O' || msg[1] != 'k' || msg[2] != '\0') - { - (void) close (retsock); - (void) close (sock); - error ("CUSTOMS_IMPORT: %s", msg); - return 1; - } - else if (debug_flag) - { - struct hostent *host = gethostbyaddr (&permit.addr, sizeof (permit.addr), - AF_INET); - printf ("Job exported to %s ID %u\n", - host == 0 ? inet_ntoa (permit.addr) : host->h_name, - permit.id); - } - - fflush (stdout); - fflush (stderr); - - pid = vfork (); - if (pid < 0) - { - /* The fork failed! */ - perror_with_name ("vfork", ""); - return 1; - } - else if (pid == 0) - { - /* Child side. Run `export' to handle the connection. */ - static char sock_buf[20], retsock_buf[20], id_buf[20]; - static char *new_argv[6] = - { EXPORT_COMMAND, "-id", sock_buf, retsock_buf, id_buf, 0 }; - - /* Set up the arguments. */ - (void) sprintf (sock_buf, "%d", sock); - (void) sprintf (retsock_buf, "%d", retsock); - (void) sprintf (id_buf, "%x", permit.id); - - /* Get the right stdin. */ - if (stdin_fd != 0) - (void) dup2 (stdin_fd, 0); - - /* Unblock signals in the child. */ - unblock_sigs (); - - /* Run the command. */ - exec_command (new_argv, envp); - } - - /* Parent side. Return the `export' process's ID. */ - (void) close (retsock); - (void) close (sock); - *is_remote = 0; - *id_ptr = pid; - return 0; -} - -/* Get the status of a dead remote child. Block waiting for one to die - if BLOCK is nonzero. Set *EXIT_CODE_PTR to the exit status, *SIGNAL_PTR - to the termination signal or zero if it exited normally, and *COREDUMP_PTR - nonzero if it dumped core. Return the ID of the child that died, - 0 if we would have to block and !BLOCK, or < 0 if there were none. */ - -int -remote_status (exit_code_ptr, signal_ptr, coredump_ptr, block) - int *exit_code_ptr, *signal_ptr, *coredump_ptr; - int block; -{ - return -1; -} - -/* Block asynchronous notification of remote child death. - If this notification is done by raising the child termination - signal, do not block that signal. */ -void -block_remote_children () -{ - return; -} - -/* Restore asynchronous notification of remote child death. - If this is done by raising the child termination signal, - do not unblock that signal. */ -void -unblock_remote_children () -{ - return; -} - -/* Send signal SIG to child ID. Return 0 if successful, -1 if not. */ -int -remote_kill (id, sig) - int id; - int sig; -{ - return -1; -} diff --git a/buildtools/windows/source/make/remote-stub.c b/buildtools/windows/source/make/remote-stub.c deleted file mode 100644 index 24a860b2e27..00000000000 --- a/buildtools/windows/source/make/remote-stub.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Template for the remote job exportation interface to GNU Make. -Copyright (C) 1988, 1989, 1992, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "commands.h" - - -char *remote_description = 0; - - -/* Return nonzero if the next job should be done remotely. */ - -int -start_remote_job_p () -{ - return 0; -} - -/* Start a remote job running the command in ARGV, - with environment from ENVP. It gets standard input from STDIN_FD. On - failure, return nonzero. On success, return zero, and set *USED_STDIN - to nonzero if it will actually use STDIN_FD, zero if not, set *ID_PTR to - a unique identification, and set *IS_REMOTE to zero if the job is local, - nonzero if it is remote (meaning *ID_PTR is a process ID). */ - -int -start_remote_job (argv, envp, stdin_fd, is_remote, id_ptr, used_stdin) - char **argv, **envp; - int stdin_fd; - int *is_remote; - int *id_ptr; - int *used_stdin; -{ - return -1; -} - -/* Get the status of a dead remote child. Block waiting for one to die - if BLOCK is nonzero. Set *EXIT_CODE_PTR to the exit status, *SIGNAL_PTR - to the termination signal or zero if it exited normally, and *COREDUMP_PTR - nonzero if it dumped core. Return the ID of the child that died, - 0 if we would have to block and !BLOCK, or < 0 if there were none. */ - -int -remote_status (exit_code_ptr, signal_ptr, coredump_ptr, block) - int *exit_code_ptr, *signal_ptr, *coredump_ptr; - int block; -{ - errno = ECHILD; - return -1; -} - -/* Block asynchronous notification of remote child death. - If this notification is done by raising the child termination - signal, do not block that signal. */ -void -block_remote_children () -{ - return; -} - -/* Restore asynchronous notification of remote child death. - If this is done by raising the child termination signal, - do not unblock that signal. */ -void -unblock_remote_children () -{ - return; -} - -/* Send signal SIG to child ID. Return 0 if successful, -1 if not. */ -int -remote_kill (id, sig) - int id; - int sig; -{ - return -1; -} diff --git a/buildtools/windows/source/make/rule.c b/buildtools/windows/source/make/rule.c deleted file mode 100644 index 51103acd9fe..00000000000 --- a/buildtools/windows/source/make/rule.c +++ /dev/null @@ -1,571 +0,0 @@ -/* Pattern and suffix rule internals for GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "commands.h" -#include "dep.h" -#include "file.h" -#include "variable.h" -#include "rule.h" - -static void freerule (); - -/* Chain of all pattern rules. */ - -struct rule *pattern_rules; - -/* Pointer to last rule in the chain, so we can add onto the end. */ - -struct rule *last_pattern_rule; - -/* Number of rules in the chain. */ - -unsigned int num_pattern_rules; - -/* Maximum number of target patterns of any pattern rule. */ - -unsigned int max_pattern_targets; - -/* Maximum number of dependencies of any pattern rule. */ - -unsigned int max_pattern_deps; - -/* Maximum length of the name of a dependencies of any pattern rule. */ - -unsigned int max_pattern_dep_length; - -/* Pointer to structure for the file .SUFFIXES - whose dependencies are the suffixes to be searched. */ - -struct file *suffix_file; - -/* Maximum length of a suffix. */ - -unsigned int maxsuffix; - -/* Compute the maximum dependency length and maximum number of - dependencies of all implicit rules. Also sets the subdir - flag for a rule when appropriate, possibly removing the rule - completely when appropriate. */ - -void -count_implicit_rule_limits () -{ - char *name; - unsigned int namelen; - register struct rule *rule, *lastrule; - - num_pattern_rules = max_pattern_targets = max_pattern_deps = 0; - max_pattern_dep_length = 0; - - name = 0; - namelen = 0; - rule = pattern_rules; - lastrule = 0; - while (rule != 0) - { - unsigned int ndeps = 0; - register struct dep *dep; - struct rule *next = rule->next; - unsigned int ntargets; - - ++num_pattern_rules; - - ntargets = 0; - while (rule->targets[ntargets] != 0) - ++ntargets; - - if (ntargets > max_pattern_targets) - max_pattern_targets = ntargets; - - for (dep = rule->deps; dep != 0; dep = dep->next) - { - unsigned int len = strlen (dep->name); - char *p = rindex (dep->name, '/'); - char *p2 = p != 0 ? index (dep->name, '%') : 0; - - ndeps++; - - if (len > max_pattern_dep_length) - max_pattern_dep_length = len; - - if (p != 0 && p2 > p) - { - /* There is a slash before the % in the dep name. - Extract the directory name. */ - if (p == dep->name) - ++p; - if ((unsigned int)(p - dep->name) > namelen) - { - if (name != 0) - free (name); - namelen = p - dep->name; - name = (char *) xmalloc (namelen + 1); - } - bcopy (dep->name, name, p - dep->name); - name[p - dep->name] = '\0'; - - /* In the deps of an implicit rule the `changed' flag - actually indicates that the dependency is in a - nonexistent subdirectory. */ - - dep->changed = !dir_file_exists_p (name, ""); - if (dep->changed && *name == '/') - { - /* The name is absolute and the directory does not exist. - This rule can never possibly match, since this dependency - can never possibly exist. So just remove the rule from - the list. */ - freerule (rule, lastrule); - --num_pattern_rules; - goto end_main_loop; - } - } - else - /* This dependency does not reside in a subdirectory. */ - dep->changed = 0; - } - - if (ndeps > max_pattern_deps) - max_pattern_deps = ndeps; - - lastrule = rule; - end_main_loop: - rule = next; - } - - if (name != 0) - free (name); -} - -/* Create a pattern rule from a suffix rule. - TARGET is the target suffix; SOURCE is the source suffix. - CMDS are the commands. - If TARGET is nil, it means the target pattern should be `(%.o)'. - If SOURCE is nil, it means there should be no deps. */ - -static void -convert_suffix_rule (target, source, cmds) - char *target, *source; - struct commands *cmds; -{ - char *targname, *targpercent, *depname; - char **names, **percents; - struct dep *deps; - unsigned int len; - - if (target == 0) - /* Special case: TARGET being nil means we are defining a - `.X.a' suffix rule; the target pattern is always `(%.o)'. */ - { - targname = savestring ("(%.o)", 5); - targpercent = targname + 1; - } - else - { - /* Construct the target name. */ - len = strlen (target); - targname = xmalloc (1 + len + 1); - targname[0] = '%'; - bcopy (target, targname + 1, len + 1); - targpercent = targname; - } - - names = (char **) xmalloc (2 * sizeof (char *)); - percents = (char **) alloca (2 * sizeof (char *)); - names[0] = targname; - percents[0] = targpercent; - names[1] = percents[1] = 0; - - if (source == 0) - deps = 0; - else - { - /* Construct the dependency name. */ - len = strlen (source); - depname = xmalloc (1 + len + 1); - depname[0] = '%'; - bcopy (source, depname + 1, len + 1); - deps = (struct dep *) xmalloc (sizeof (struct dep)); - deps->next = 0; - deps->name = depname; - } - - create_pattern_rule (names, percents, 0, deps, cmds, 0); -} - -/* Convert old-style suffix rules to pattern rules. - All rules for the suffixes on the .SUFFIXES list - are converted and added to the chain of pattern rules. */ - -void -convert_to_pattern () -{ - register struct dep *d, *d2; - register struct file *f; - register char *rulename; - register unsigned int slen, s2len; - - /* Compute maximum length of all the suffixes. */ - - maxsuffix = 0; - for (d = suffix_file->deps; d != 0; d = d->next) - { - register unsigned int namelen = strlen (dep_name (d)); - if (namelen > maxsuffix) - maxsuffix = namelen; - } - - rulename = (char *) alloca ((maxsuffix * 2) + 1); - - for (d = suffix_file->deps; d != 0; d = d->next) - { - /* Make a rule that is just the suffix, with no deps or commands. - This rule exists solely to disqualify match-anything rules. */ - convert_suffix_rule (dep_name (d), (char *) 0, (struct commands *) 0); - - f = d->file; - if (f->cmds != 0) - /* Record a pattern for this suffix's null-suffix rule. */ - convert_suffix_rule ("", dep_name (d), f->cmds); - - /* Record a pattern for each of this suffix's two-suffix rules. */ - slen = strlen (dep_name (d)); - bcopy (dep_name (d), rulename, slen); - for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next) - { - s2len = strlen (dep_name (d2)); - - if (slen == s2len && streq (dep_name (d), dep_name (d2))) - continue; - - bcopy (dep_name (d2), rulename + slen, s2len + 1); - f = lookup_file (rulename); - if (f == 0 || f->cmds == 0) - continue; - - if (s2len == 2 && rulename[slen] == '.' && rulename[slen + 1] == 'a') - /* A suffix rule `.X.a:' generates the pattern rule `(%.o): %.X'. - It also generates a normal `%.a: %.X' rule below. */ - convert_suffix_rule ((char *) 0, /* Indicates `(%.o)'. */ - dep_name (d), - f->cmds); - - /* The suffix rule `.X.Y:' is converted - to the pattern rule `%.Y: %.X'. */ - convert_suffix_rule (dep_name (d2), dep_name (d), f->cmds); - } - } -} - - -/* Install the pattern rule RULE (whose fields have been filled in) - at the end of the list (so that any rules previously defined - will take precedence). If this rule duplicates a previous one - (identical target and dependencies), the old one is replaced - if OVERRIDE is nonzero, otherwise this new one is thrown out. - When an old rule is replaced, the new one is put at the end of the - list. Return nonzero if RULE is used; zero if not. */ - -int -new_pattern_rule (rule, override) - register struct rule *rule; - int override; -{ - register struct rule *r, *lastrule; - register unsigned int i, j; - - rule->in_use = 0; - rule->terminal = 0; - - rule->next = 0; - - /* Search for an identical rule. */ - lastrule = 0; - for (r = pattern_rules; r != 0; lastrule = r, r = r->next) - for (i = 0; rule->targets[i] != 0; ++i) - { - for (j = 0; r->targets[j] != 0; ++j) - if (!streq (rule->targets[i], r->targets[j])) - break; - if (r->targets[j] == 0) - /* All the targets matched. */ - { - register struct dep *d, *d2; - for (d = rule->deps, d2 = r->deps; - d != 0 && d2 != 0; d = d->next, d2 = d2->next) - if (!streq (dep_name (d), dep_name (d2))) - break; - if (d == 0 && d2 == 0) - /* All the dependencies matched. */ - if (override) - { - /* Remove the old rule. */ - freerule (r, lastrule); - /* Install the new one. */ - if (pattern_rules == 0) - pattern_rules = rule; - else - last_pattern_rule->next = rule; - last_pattern_rule = rule; - - /* We got one. Stop looking. */ - goto matched; - } - else - { - /* The old rule stays intact. Destroy the new one. */ - freerule (rule, (struct rule *) 0); - return 0; - } - } - } - - matched:; - - if (r == 0) - { - /* There was no rule to replace. */ - if (pattern_rules == 0) - pattern_rules = rule; - else - last_pattern_rule->next = rule; - last_pattern_rule = rule; - } - - return 1; -} - - -/* Install an implicit pattern rule based on the three text strings - in the structure P points to. These strings come from one of - the arrays of default implicit pattern rules. - TERMINAL specifies what the `terminal' field of the rule should be. */ - -void -install_pattern_rule (p, terminal) - struct pspec *p; - int terminal; -{ - register struct rule *r; - char *ptr; - - r = (struct rule *) xmalloc (sizeof (struct rule)); - - r->targets = (char **) xmalloc (2 * sizeof (char *)); - r->suffixes = (char **) xmalloc (2 * sizeof (char *)); - r->lens = (unsigned int *) xmalloc (2 * sizeof (unsigned int)); - - r->targets[1] = 0; - r->suffixes[1] = 0; - r->lens[1] = 0; - - r->lens[0] = strlen (p->target); - /* These will all be string literals, but we malloc space for - them anyway because somebody might want to free them later on. */ - r->targets[0] = savestring (p->target, r->lens[0]); - r->suffixes[0] = find_percent (r->targets[0]); - if (r->suffixes[0] == 0) - /* Programmer-out-to-lunch error. */ - abort (); - else - ++r->suffixes[0]; - - ptr = p->dep; - r->deps = (struct dep *) multi_glob (parse_file_seq (&ptr, '\0', - sizeof (struct dep), 1), - sizeof (struct dep)); - - if (new_pattern_rule (r, 0)) - { - r->terminal = terminal; - r->cmds = (struct commands *) xmalloc (sizeof (struct commands)); - r->cmds->filename = 0; - r->cmds->lineno = 0; - /* These will all be string literals, but we malloc space for them - anyway because somebody might want to free them later. */ - r->cmds->commands = savestring (p->commands, strlen (p->commands)); - r->cmds->command_lines = 0; - } -} - - -/* Free all the storage used in RULE and take it out of the - pattern_rules chain. LASTRULE is the rule whose next pointer - points to RULE. */ - -static void -freerule (rule, lastrule) - register struct rule *rule, *lastrule; -{ - struct rule *next = rule->next; - register unsigned int i; - - for (i = 0; rule->targets[i] != 0; ++i) - free (rule->targets[i]); - - free ((char *) rule->targets); - free ((char *) rule->suffixes); - free ((char *) rule->lens); - - /* We can't free the storage for the commands because there - are ways that they could be in more than one place: - * If the commands came from a suffix rule, they could also be in - the `struct file's for other suffix rules or plain targets given - on the same makefile line. - * If two suffixes that together make a two-suffix rule were each - given twice in the .SUFFIXES list, and in the proper order, two - identical pattern rules would be created and the second one would - be discarded here, but both would contain the same `struct commands' - pointer from the `struct file' for the suffix rule. */ - - free ((char *) rule); - - if (pattern_rules == rule) - if (lastrule != 0) - abort (); - else - pattern_rules = next; - else if (lastrule != 0) - lastrule->next = next; - if (last_pattern_rule == rule) - last_pattern_rule = lastrule; -} - -/* Create a new pattern rule with the targets in the nil-terminated - array TARGETS. If TARGET_PERCENTS is not nil, it is an array of - pointers into the elements of TARGETS, where the `%'s are. - The new rule has dependencies DEPS and commands from COMMANDS. - It is a terminal rule if TERMINAL is nonzero. This rule overrides - identical rules with different commands if OVERRIDE is nonzero. - - The storage for TARGETS and its elements is used and must not be freed - until the rule is destroyed. The storage for TARGET_PERCENTS is not used; - it may be freed. */ - -void -create_pattern_rule (targets, target_percents, - terminal, deps, commands, override) - char **targets, **target_percents; - int terminal; - struct dep *deps; - struct commands *commands; - int override; -{ - register struct rule *r = (struct rule *) xmalloc (sizeof (struct rule)); - register unsigned int max_targets, i; - - r->cmds = commands; - r->deps = deps; - r->targets = targets; - - max_targets = 2; - r->lens = (unsigned int *) xmalloc (2 * sizeof (unsigned int)); - r->suffixes = (char **) xmalloc (2 * sizeof (char *)); - for (i = 0; targets[i] != 0; ++i) - { - if (i == max_targets - 1) - { - max_targets += 5; - r->lens = (unsigned int *) - xrealloc ((char *) r->lens, max_targets * sizeof (unsigned int)); - r->suffixes = (char **) - xrealloc ((char *) r->suffixes, max_targets * sizeof (char *)); - } - r->lens[i] = strlen (targets[i]); - r->suffixes[i] = (target_percents == 0 ? find_percent (targets[i]) - : target_percents[i]) + 1; - if (r->suffixes[i] == 0) - abort (); - } - - if (i < max_targets - 1) - { - r->lens = (unsigned int *) xrealloc ((char *) r->lens, - (i + 1) * sizeof (unsigned int)); - r->suffixes = (char **) xrealloc ((char *) r->suffixes, - (i + 1) * sizeof (char *)); - } - - if (new_pattern_rule (r, override)) - r->terminal = terminal; -} - -/* Print the data base of rules. */ - -static void /* Useful to call from gdb. */ -print_rule (r) - struct rule *r; -{ - register unsigned int i; - register struct dep *d; - - for (i = 0; r->targets[i] != 0; ++i) - { - fputs (r->targets[i], stdout); - if (r->targets[i + 1] != 0) - putchar (' '); - else - putchar (':'); - } - if (r->terminal) - putchar (':'); - - for (d = r->deps; d != 0; d = d->next) - printf (" %s", dep_name (d)); - putchar ('\n'); - - if (r->cmds != 0) - print_commands (r->cmds); -} - -void -print_rule_data_base () -{ - register unsigned int rules, terminal; - register struct rule *r; - - puts ("\n# Implicit Rules"); - - rules = terminal = 0; - for (r = pattern_rules; r != 0; r = r->next) - { - ++rules; - - putchar ('\n'); - print_rule (r); - - if (r->terminal) - ++terminal; - } - - if (rules == 0) - puts ("\n# No implicit rules."); - else - { - printf ("\n# %u implicit rules, %u", rules, terminal); -#ifndef NO_FLOAT - printf (" (%.1f%%)", (double) terminal / (double) rules * 100.0); -#endif - puts (" terminal."); - } - - if (num_pattern_rules != rules) - fatal ("BUG: num_pattern_rules wrong! %u != %u", - num_pattern_rules, rules); -} diff --git a/buildtools/windows/source/make/rule.h b/buildtools/windows/source/make/rule.h deleted file mode 100644 index 75d43d6624c..00000000000 --- a/buildtools/windows/source/make/rule.h +++ /dev/null @@ -1,53 +0,0 @@ -/* Definitions for using pattern rules in GNU Make. -Copyright (C) 1988, 1989, 1991, 1992, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* Structure used for pattern rules. */ - -struct rule - { - struct rule *next; - char **targets; /* Targets of the rule. */ - unsigned int *lens; /* Lengths of each target. */ - char **suffixes; /* Suffixes (after `%') of each target. */ - struct dep *deps; /* Dependencies of the rule. */ - struct commands *cmds; /* Commands to execute. */ - char terminal; /* If terminal (double-colon). */ - char in_use; /* If in use by a parent pattern_search. */ - }; - -/* For calling install_pattern_rule. */ -struct pspec - { - char *target, *dep, *commands; - }; - - -extern struct rule *pattern_rules; -extern struct rule *last_pattern_rule; -extern unsigned int num_pattern_rules; - -extern unsigned int max_pattern_deps; -extern unsigned int max_pattern_targets; -extern unsigned int max_pattern_dep_length; - -extern struct file *suffix_file; -extern unsigned int maxsuffix; - - -extern void install_pattern_rule (); -int new_pattern_rule (); diff --git a/buildtools/windows/source/make/signame.c b/buildtools/windows/source/make/signame.c deleted file mode 100644 index 96b9c3e238d..00000000000 --- a/buildtools/windows/source/make/signame.c +++ /dev/null @@ -1,304 +0,0 @@ -/* Convert between signal names and numbers. - Copyright (C) 1990, 1992, 1993, 1995 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; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include /* Some systems need this for . */ -#include - -/* Some systems declare `sys_siglist in ; if - configure defined SYS_SIGLIST_DECLARED, it may expect - to find the declaration there. */ -#ifdef HAVE_UNISTD_H -#include -#endif - - -/* Some systems do not define NSIG in . */ -#ifndef NSIG -#ifdef _NSIG -#define NSIG _NSIG -#else -#define NSIG 32 -#endif -#endif - -#if !__STDC__ -#define const -#endif - -#include "signame.h" - -#ifndef HAVE_SYS_SIGLIST -/* There is too much variation in Sys V signal numbers and names, so - we must initialize them at runtime. */ - -static const char undoc[] = "unknown signal"; - -const char *sys_siglist[NSIG]; - -#else /* HAVE_SYS_SIGLIST. */ - -#ifndef SYS_SIGLIST_DECLARED -extern char *sys_siglist[]; -#endif /* Not SYS_SIGLIST_DECLARED. */ - -#endif /* Not HAVE_SYS_SIGLIST. */ - -/* Table of abbreviations for signals. Note: A given number can - appear more than once with different abbreviations. */ -typedef struct - { - int number; - const char *abbrev; - } num_abbrev; -static num_abbrev sig_table[NSIG*2]; -/* Number of elements of sig_table used. */ -static int sig_table_nelts = 0; - -/* Enter signal number NUMBER into the tables with ABBREV and NAME. */ - -static void -init_sig (number, abbrev, name) - int number; - const char *abbrev; - const char *name; -{ -#ifndef HAVE_SYS_SIGLIST - sys_siglist[number] = name; -#endif - sig_table[sig_table_nelts].number = number; - sig_table[sig_table_nelts++].abbrev = abbrev; -} - -void -signame_init () -{ -#ifndef HAVE_SYS_SIGLIST - int i; - /* Initialize signal names. */ - for (i = 0; i < NSIG; i++) - sys_siglist[i] = undoc; -#endif /* !HAVE_SYS_SIGLIST */ - - /* Initialize signal names. */ -#if defined (SIGHUP) - init_sig (SIGHUP, "HUP", "Hangup"); -#endif -#if defined (SIGINT) - init_sig (SIGINT, "INT", "Interrupt"); -#endif -#if defined (SIGQUIT) - init_sig (SIGQUIT, "QUIT", "Quit"); -#endif -#if defined (SIGILL) - init_sig (SIGILL, "ILL", "Illegal Instruction"); -#endif -#if defined (SIGTRAP) - init_sig (SIGTRAP, "TRAP", "Trace/breakpoint trap"); -#endif - /* If SIGIOT == SIGABRT, we want to print it as SIGABRT because - SIGABRT is in ANSI and POSIX.1 and SIGIOT isn't. */ -#if defined (SIGABRT) - init_sig (SIGABRT, "ABRT", "Aborted"); -#endif -#if defined (SIGIOT) - init_sig (SIGIOT, "IOT", "IOT trap"); -#endif -#if defined (SIGEMT) - init_sig (SIGEMT, "EMT", "EMT trap"); -#endif -#if defined (SIGFPE) - init_sig (SIGFPE, "FPE", "Floating point exception"); -#endif -#if defined (SIGKILL) - init_sig (SIGKILL, "KILL", "Killed"); -#endif -#if defined (SIGBUS) - init_sig (SIGBUS, "BUS", "Bus error"); -#endif -#if defined (SIGSEGV) - init_sig (SIGSEGV, "SEGV", "Segmentation fault"); -#endif -#if defined (SIGSYS) - init_sig (SIGSYS, "SYS", "Bad system call"); -#endif -#if defined (SIGPIPE) - init_sig (SIGPIPE, "PIPE", "Broken pipe"); -#endif -#if defined (SIGALRM) - init_sig (SIGALRM, "ALRM", "Alarm clock"); -#endif -#if defined (SIGTERM) - init_sig (SIGTERM, "TERM", "Terminated"); -#endif -#if defined (SIGUSR1) - init_sig (SIGUSR1, "USR1", "User defined signal 1"); -#endif -#if defined (SIGUSR2) - init_sig (SIGUSR2, "USR2", "User defined signal 2"); -#endif - /* If SIGCLD == SIGCHLD, we want to print it as SIGCHLD because that - is what is in POSIX.1. */ -#if defined (SIGCHLD) - init_sig (SIGCHLD, "CHLD", "Child exited"); -#endif -#if defined (SIGCLD) - init_sig (SIGCLD, "CLD", "Child exited"); -#endif -#if defined (SIGPWR) - init_sig (SIGPWR, "PWR", "Power failure"); -#endif -#if defined (SIGTSTP) - init_sig (SIGTSTP, "TSTP", "Stopped"); -#endif -#if defined (SIGTTIN) - init_sig (SIGTTIN, "TTIN", "Stopped (tty input)"); -#endif -#if defined (SIGTTOU) - init_sig (SIGTTOU, "TTOU", "Stopped (tty output)"); -#endif -#if defined (SIGSTOP) - init_sig (SIGSTOP, "STOP", "Stopped (signal)"); -#endif -#if defined (SIGXCPU) - init_sig (SIGXCPU, "XCPU", "CPU time limit exceeded"); -#endif -#if defined (SIGXFSZ) - init_sig (SIGXFSZ, "XFSZ", "File size limit exceeded"); -#endif -#if defined (SIGVTALRM) - init_sig (SIGVTALRM, "VTALRM", "Virtual timer expired"); -#endif -#if defined (SIGPROF) - init_sig (SIGPROF, "PROF", "Profiling timer expired"); -#endif -#if defined (SIGWINCH) - /* "Window size changed" might be more accurate, but even if that - is all that it means now, perhaps in the future it will be - extended to cover other kinds of window changes. */ - init_sig (SIGWINCH, "WINCH", "Window changed"); -#endif -#if defined (SIGCONT) - init_sig (SIGCONT, "CONT", "Continued"); -#endif -#if defined (SIGURG) - init_sig (SIGURG, "URG", "Urgent I/O condition"); -#endif -#if defined (SIGIO) - /* "I/O pending" has also been suggested. A disadvantage is - that signal only happens when the process has - asked for it, not everytime I/O is pending. Another disadvantage - is the confusion from giving it a different name than under Unix. */ - init_sig (SIGIO, "IO", "I/O possible"); -#endif -#if defined (SIGWIND) - init_sig (SIGWIND, "WIND", "SIGWIND"); -#endif -#if defined (SIGPHONE) - init_sig (SIGPHONE, "PHONE", "SIGPHONE"); -#endif -#if defined (SIGPOLL) - init_sig (SIGPOLL, "POLL", "I/O possible"); -#endif -#if defined (SIGLOST) - init_sig (SIGLOST, "LOST", "Resource lost"); -#endif -#if defined (SIGDANGER) - init_sig (SIGDANGER, "DANGER", "Danger signal"); -#endif -#if defined (SIGINFO) - init_sig (SIGINFO, "INFO", "Information request"); -#endif -} - -/* Return the abbreviation for signal NUMBER. */ - -char * -sig_abbrev (number) - int number; -{ - int i; - - if (sig_table_nelts == 0) - signame_init (); - - for (i = 0; i < sig_table_nelts; i++) - if (sig_table[i].number == number) - return (char *)sig_table[i].abbrev; - return NULL; -} - -/* Return the signal number for an ABBREV, or -1 if there is no - signal by that name. */ - -int -sig_number (abbrev) - const char *abbrev; -{ - int i; - - if (sig_table_nelts == 0) - signame_init (); - - /* Skip over "SIG" if present. */ - if (abbrev[0] == 'S' && abbrev[1] == 'I' && abbrev[2] == 'G') - abbrev += 3; - - for (i = 0; i < sig_table_nelts; i++) - if (abbrev[0] == sig_table[i].abbrev[0] - && strcmp (abbrev, sig_table[i].abbrev) == 0) - return sig_table[i].number; - return -1; -} - -#ifndef HAVE_PSIGNAL -/* Print to standard error the name of SIGNAL, preceded by MESSAGE and - a colon, and followed by a newline. */ - -void -psignal (signal, message) - int signal; - const char *message; -{ - if (signal <= 0 || signal >= NSIG) - fprintf (stderr, "%s: unknown signal", message); - else - fprintf (stderr, "%s: %s\n", message, sys_siglist[signal]); -} -#endif - -#ifndef HAVE_STRSIGNAL -/* Return the string associated with the signal number. */ - -char * -strsignal (signal) - int signal; -{ - static char buf[] = "Signal 12345678901234567890"; - - if (signal > 0 || signal < NSIG) - return (char *) sys_siglist[signal]; - - sprintf (buf, "Signal %d", signal); - return buf; -} -#endif diff --git a/buildtools/windows/source/make/signame.h b/buildtools/windows/source/make/signame.h deleted file mode 100644 index 18b83cbb890..00000000000 --- a/buildtools/windows/source/make/signame.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Convert between signal names and numbers. - Copyright (C) 1990, 1992, 1993, 1995 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; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#if defined (__STDC__) && __STDC__ - -/* Initialize `sys_siglist'. */ -void signame_init (void); - -/* Return the abbreviation (e.g. ABRT, FPE, etc.) for signal NUMBER. - Do not return this as a const char *. The caller might want to - assign it to a char *. */ -char *sig_abbrev (int number); - -/* Return the signal number for an ABBREV, or -1 if there is no - signal by that name. */ -int sig_number (const char *abbrev); - -/* Avoid conflicts with a system header file that might define these three. */ - -#ifndef HAVE_PSIGNAL -/* Print to standard error the name of SIGNAL, preceded by MESSAGE and - a colon, and followed by a newline. */ -void psignal (int signal, const char *message); -#endif - -#ifndef HAVE_STRSIGNAL -/* Return the name of SIGNAL. */ -char *strsignal (int signal); -#endif - -#if !defined (HAVE_SYS_SIGLIST) -/* Names for signals from 0 to NSIG-1. */ -extern const char *sys_siglist[]; -#endif - -#else - -void signame_init (); -char *sig_abbrev (); -int sig_number (); -#if !defined (HAVE_SYS_SIGLIST) && !defined (HAVE_PSIGNAL) -void psignal (); -#endif -#ifndef HAVE_STRSIGNAL -char *strsignal (); -#endif -#if !defined (HAVE_SYS_SIGLIST) -extern char *sys_siglist[]; -#endif - -#endif diff --git a/buildtools/windows/source/make/texinfo.tex b/buildtools/windows/source/make/texinfo.tex deleted file mode 100644 index 554cc37c52d..00000000000 --- a/buildtools/windows/source/make/texinfo.tex +++ /dev/null @@ -1,4421 +0,0 @@ -%% TeX macros to handle texinfo files - -% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 1994 Free Software Foundation, Inc. - -%This texinfo.tex 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, or (at -%your option) any later version. - -%This texinfo.tex file 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 texinfo.tex file; see the file COPYING. If not, write -%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, -%USA. - - -%In other words, you are welcome to use, share and improve this program. -%You are forbidden to forbid anyone else to use, share and improve -%what you give them. Help stamp out software-hoarding! - - -% Send bug reports to bug-texinfo@prep.ai.mit.edu. -% Please include a *precise* test case in each bug report. - - -% Make it possible to create a .fmt file just by loading this file: -% if the underlying format is not loaded, start by loading it now. -% Added by gildea November 1993. -\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi - -% This automatically updates the version number based on RCS. -\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}} -\deftexinfoversion$Revision: 1.1 $ -\message{Loading texinfo package [Version \texinfoversion]:} - -% If in a .fmt file, print the version number -% and turn on active characters that we couldn't do earlier because -% they might have appeared in the input file name. -\everyjob{\message{[Texinfo version \texinfoversion]}\message{} - \catcode`+=\active \catcode`\_=\active} - -% Save some parts of plain tex whose names we will redefine. - -\let\ptextilde=\~ -\let\ptexlbrace=\{ -\let\ptexrbrace=\} -\let\ptexdots=\dots -\let\ptexdot=\. -\let\ptexstar=\* -\let\ptexend=\end -\let\ptexbullet=\bullet -\let\ptexb=\b -\let\ptexc=\c -\let\ptexi=\i -\let\ptext=\t -\let\ptexl=\l -\let\ptexL=\L - -% Be sure we're in horizontal mode when doing a tie, since we make space -% equivalent to this in @example-like environments. Otherwise, a space -% at the beginning of a line will start with \penalty -- and -% since \penalty is valid in vertical mode, we'd end up putting the -% penalty on the vertical list instead of in the new paragraph. -{\catcode`@ = 11 - \gdef\tie{\leavevmode\penalty\@M\ } -} -\let\~ = \tie % And make it available as @~. - -\message{Basics,} -\chardef\other=12 - -% If this character appears in an error message or help string, it -% starts a new line in the output. -\newlinechar = `^^J - -% Set up fixed words for English. -\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi% -\def\putwordInfo{Info}% -\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi% -\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi% -\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi% -\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi% -\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi% -\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi% -\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi% -\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi% -\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi% - -% Ignore a token. -% -\def\gobble#1{} - -\hyphenation{ap-pen-dix} -\hyphenation{mini-buf-fer mini-buf-fers} -\hyphenation{eshell} - -% Margin to add to right of even pages, to left of odd pages. -\newdimen \bindingoffset \bindingoffset=0pt -\newdimen \normaloffset \normaloffset=\hoffset -\newdimen\pagewidth \newdimen\pageheight -\pagewidth=\hsize \pageheight=\vsize - -% Sometimes it is convenient to have everything in the transcript file -% and nothing on the terminal. We don't just call \tracingall here, -% since that produces some useless output on the terminal. -% -\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% -\def\loggingall{\tracingcommands2 \tracingstats2 - \tracingpages1 \tracingoutput1 \tracinglostchars1 - \tracingmacros2 \tracingparagraphs1 \tracingrestores1 - \showboxbreadth\maxdimen\showboxdepth\maxdimen -}% - -%---------------------Begin change----------------------- -% -%%%% For @cropmarks command. -% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986 -% -\newdimen\cornerlong \newdimen\cornerthick -\newdimen \topandbottommargin -\newdimen \outerhsize \newdimen \outervsize -\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks -\outerhsize=7in -%\outervsize=9.5in -% Alternative @smallbook page size is 9.25in -\outervsize=9.25in -\topandbottommargin=.75in -% -%---------------------End change----------------------- - -% \onepageout takes a vbox as an argument. Note that \pagecontents -% does insertions itself, but you have to call it yourself. -\chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}} -\def\onepageout#1{\hoffset=\normaloffset -\ifodd\pageno \advance\hoffset by \bindingoffset -\else \advance\hoffset by -\bindingoffset\fi -{\escapechar=`\\\relax % makes sure backslash is used in output files. -\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}% -{\let\hsize=\pagewidth \makefootline}}}% -\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi} - -%%%% For @cropmarks command %%%% - -% Here is a modification of the main output routine for Near East Publications -% This provides right-angle cropmarks at all four corners. -% The contents of the page are centerlined into the cropmarks, -% and any desired binding offset is added as an \hskip on either -% site of the centerlined box. (P. A. MacKay, 12 November, 1986) -% -\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up -{\escapechar=`\\\relax % makes sure backslash is used in output files. - \shipout - \vbox to \outervsize{\hsize=\outerhsize - \vbox{\line{\ewtop\hfill\ewtop}} - \nointerlineskip - \line{\vbox{\moveleft\cornerthick\nstop} - \hfill - \vbox{\moveright\cornerthick\nstop}} - \vskip \topandbottommargin - \centerline{\ifodd\pageno\hskip\bindingoffset\fi - \vbox{ - {\let\hsize=\pagewidth \makeheadline} - \pagebody{#1} - {\let\hsize=\pagewidth \makefootline}} - \ifodd\pageno\else\hskip\bindingoffset\fi} - \vskip \topandbottommargin plus1fill minus1fill - \boxmaxdepth\cornerthick - \line{\vbox{\moveleft\cornerthick\nsbot} - \hfill - \vbox{\moveright\cornerthick\nsbot}} - \nointerlineskip - \vbox{\line{\ewbot\hfill\ewbot}} - }} - \advancepageno - \ifnum\outputpenalty>-20000 \else\dosupereject\fi} -% -% Do @cropmarks to get crop marks -\def\cropmarks{\let\onepageout=\croppageout } - -\newinsert\margin \dimen\margin=\maxdimen - -\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} -{\catcode`\@ =11 -\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi -% marginal hacks, juha@viisa.uucp (Juha Takala) -\ifvoid\margin\else % marginal info is present - \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi -\dimen@=\dp#1 \unvbox#1 -\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi -\ifr@ggedbottom \kern-\dimen@ \vfil \fi} -} - -% -% Here are the rules for the cropmarks. Note that they are -% offset so that the space between them is truly \outerhsize or \outervsize -% (P. A. MacKay, 12 November, 1986) -% -\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} -\def\nstop{\vbox - {\hrule height\cornerthick depth\cornerlong width\cornerthick}} -\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} -\def\nsbot{\vbox - {\hrule height\cornerlong depth\cornerthick width\cornerthick}} - -% Parse an argument, then pass it to #1. The argument is the rest of -% the input line (except we remove a trailing comment). #1 should be a -% macro which expects an ordinary undelimited TeX argument. -% -\def\parsearg#1{% - \let\next = #1% - \begingroup - \obeylines - \futurelet\temp\parseargx -} - -% If the next token is an obeyed space (from an @example environment or -% the like), remove it and recurse. Otherwise, we're done. -\def\parseargx{% - % \obeyedspace is defined far below, after the definition of \sepspaces. - \ifx\obeyedspace\temp - \expandafter\parseargdiscardspace - \else - \expandafter\parseargline - \fi -} - -% Remove a single space (as the delimiter token to the macro call). -{\obeyspaces % - \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} - -{\obeylines % - \gdef\parseargline#1^^M{% - \endgroup % End of the group started in \parsearg. - % - % First remove any @c comment, then any @comment. - % Result of each macro is put in \toks0. - \argremovec #1\c\relax % - \expandafter\argremovecomment \the\toks0 \comment\relax % - % - % Call the caller's macro, saved as \next in \parsearg. - \expandafter\next\expandafter{\the\toks0}% - }% -} - -% Since all \c{,omment} does is throw away the argument, we can let TeX -% do that for us. The \relax here is matched by the \relax in the call -% in \parseargline; it could be more or less anything, its purpose is -% just to delimit the argument to the \c. -\def\argremovec#1\c#2\relax{\toks0 = {#1}} -\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} - -% \argremovec{,omment} might leave us with trailing spaces, though; e.g., -% @end itemize @c foo -% will have two active spaces as part of the argument with the -% `itemize'. Here we remove all active spaces from #1, and assign the -% result to \toks0. -% -% This loses if there are any *other* active characters besides spaces -% in the argument -- _ ^ +, for example -- since they get expanded. -% Fortunately, Texinfo does not define any such commands. (If it ever -% does, the catcode of the characters in questionwill have to be changed -% here.) But this means we cannot call \removeactivespaces as part of -% \argremovec{,omment}, since @c uses \parsearg, and thus the argument -% that \parsearg gets might well have any character at all in it. -% -\def\removeactivespaces#1{% - \begingroup - \ignoreactivespaces - \edef\temp{#1}% - \global\toks0 = \expandafter{\temp}% - \endgroup -} - -% Change the active space to expand to nothing. -% -\begingroup - \obeyspaces - \gdef\ignoreactivespaces{\obeyspaces\let =\empty} -\endgroup - - -\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} - -%% These are used to keep @begin/@end levels from running away -%% Call \inENV within environments (after a \begingroup) -\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} -\def\ENVcheck{% -\ifENV\errmessage{Still within an environment. Type Return to continue.} -\endgroup\fi} % This is not perfect, but it should reduce lossage - -% @begin foo is the same as @foo, for now. -\newhelp\EMsimple{Type to continue.} - -\outer\def\begin{\parsearg\beginxxx} - -\def\beginxxx #1{% -\expandafter\ifx\csname #1\endcsname\relax -{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else -\csname #1\endcsname\fi} - -% @end foo executes the definition of \Efoo. -% -\def\end{\parsearg\endxxx} -\def\endxxx #1{% - \removeactivespaces{#1}% - \edef\endthing{\the\toks0}% - % - \expandafter\ifx\csname E\endthing\endcsname\relax - \expandafter\ifx\csname \endthing\endcsname\relax - % There's no \foo, i.e., no ``environment'' foo. - \errhelp = \EMsimple - \errmessage{Undefined command `@end \endthing'}% - \else - \unmatchedenderror\endthing - \fi - \else - % Everything's ok; the right environment has been started. - \csname E\endthing\endcsname - \fi -} - -% There is an environment #1, but it hasn't been started. Give an error. -% -\def\unmatchedenderror#1{% - \errhelp = \EMsimple - \errmessage{This `@end #1' doesn't have a matching `@#1'}% -} - -% Define the control sequence \E#1 to give an unmatched @end error. -% -\def\defineunmatchedend#1{% - \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% -} - - -% Single-spacing is done by various environments (specifically, in -% \nonfillstart and \quotations). -\newskip\singlespaceskip \singlespaceskip = 12.5pt -\def\singlespace{% - % Why was this kern here? It messes up equalizing space above and below - % environments. --karl, 6may93 - %{\advance \baselineskip by -\singlespaceskip - %\kern \baselineskip}% - \setleading \singlespaceskip -} - -%% Simple single-character @ commands - -% @@ prints an @ -% Kludge this until the fonts are right (grr). -\def\@{{\tt \char '100}} - -% This is turned off because it was never documented -% and you can use @w{...} around a quote to suppress ligatures. -%% Define @` and @' to be the same as ` and ' -%% but suppressing ligatures. -%\def\`{{`}} -%\def\'{{'}} - -% Used to generate quoted braces. - -\def\mylbrace {{\tt \char '173}} -\def\myrbrace {{\tt \char '175}} -\let\{=\mylbrace -\let\}=\myrbrace - -% @: forces normal size whitespace following. -\def\:{\spacefactor=1000 } - -% @* forces a line break. -\def\*{\hfil\break\hbox{}\ignorespaces} - -% @. is an end-of-sentence period. -\def\.{.\spacefactor=3000 } - -% @enddots{} is an end-of-sentence ellipsis. -\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000} - -% @! is an end-of-sentence bang. -\gdef\!{!\spacefactor=3000 } - -% @? is an end-of-sentence query. -\gdef\?{?\spacefactor=3000 } - -% @w prevents a word break. Without the \leavevmode, @w at the -% beginning of a paragraph, when TeX is still in vertical mode, would -% produce a whole line of output instead of starting the paragraph. -\def\w#1{\leavevmode\hbox{#1}} - -% @group ... @end group forces ... to be all on one page, by enclosing -% it in a TeX vbox. We use \vtop instead of \vbox to construct the box -% to keep its height that of a normal line. According to the rules for -% \topskip (p.114 of the TeXbook), the glue inserted is -% max (\topskip - \ht (first item), 0). If that height is large, -% therefore, no glue is inserted, and the space between the headline and -% the text is small, which looks bad. -% -\def\group{\begingroup - \ifnum\catcode13=\active \else - \errhelp = \groupinvalidhelp - \errmessage{@group invalid in context where filling is enabled}% - \fi - % - % The \vtop we start below produces a box with normal height and large - % depth; thus, TeX puts \baselineskip glue before it, and (when the - % next line of text is done) \lineskip glue after it. (See p.82 of - % the TeXbook.) Thus, space below is not quite equal to space - % above. But it's pretty close. - \def\Egroup{% - \egroup % End the \vtop. - \endgroup % End the \group. - }% - % - \vtop\bgroup - % We have to put a strut on the last line in case the @group is in - % the midst of an example, rather than completely enclosing it. - % Otherwise, the interline space between the last line of the group - % and the first line afterwards is too small. But we can't put the - % strut in \Egroup, since there it would be on a line by itself. - % Hence this just inserts a strut at the beginning of each line. - \everypar = {\strut}% - % - % Since we have a strut on every line, we don't need any of TeX's - % normal interline spacing. - \offinterlineskip - % - % OK, but now we have to do something about blank - % lines in the input in @example-like environments, which normally - % just turn into \lisppar, which will insert no space now that we've - % turned off the interline space. Simplest is to make them be an - % empty paragraph. - \ifx\par\lisppar - \edef\par{\leavevmode \par}% - % - % Reset ^^M's definition to new definition of \par. - \obeylines - \fi - % - % Do @comment since we are called inside an environment such as - % @example, where each end-of-line in the input causes an - % end-of-line in the output. We don't want the end-of-line after - % the `@group' to put extra space in the output. Since @group - % should appear on a line by itself (according to the Texinfo - % manual), we don't worry about eating any user text. - \comment -} -% -% TeX puts in an \escapechar (i.e., `@') at the beginning of the help -% message, so this ends up printing `@group can only ...'. -% -\newhelp\groupinvalidhelp{% -group can only be used in environments such as @example,^^J% -where each line of input produces a line of output.} - -% @need space-in-mils -% forces a page break if there is not space-in-mils remaining. - -\newdimen\mil \mil=0.001in - -\def\need{\parsearg\needx} - -% Old definition--didn't work. -%\def\needx #1{\par % -%% This method tries to make TeX break the page naturally -%% if the depth of the box does not fit. -%{\baselineskip=0pt% -%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000 -%\prevdepth=-1000pt -%}} - -\def\needx#1{% - % Go into vertical mode, so we don't make a big box in the middle of a - % paragraph. - \par - % - % Don't add any leading before our big empty box, but allow a page - % break, since the best break might be right here. - \allowbreak - \nointerlineskip - \vtop to #1\mil{\vfil}% - % - % TeX does not even consider page breaks if a penalty added to the - % main vertical list is 10000 or more. But in order to see if the - % empty box we just added fits on the page, we must make it consider - % page breaks. On the other hand, we don't want to actually break the - % page after the empty box. So we use a penalty of 9999. - % - % There is an extremely small chance that TeX will actually break the - % page at this \penalty, if there are no other feasible breakpoints in - % sight. (If the user is using lots of big @group commands, which - % almost-but-not-quite fill up a page, TeX will have a hard time doing - % good page breaking, for example.) However, I could not construct an - % example where a page broke at this \penalty; if it happens in a real - % document, then we can reconsider our strategy. - \penalty9999 - % - % Back up by the size of the box, whether we did a page break or not. - \kern -#1\mil - % - % Do not allow a page break right after this kern. - \nobreak -} - -% @br forces paragraph break - -\let\br = \par - -% @dots{} output some dots - -\def\dots{$\ldots$} - -% @page forces the start of a new page - -\def\page{\par\vfill\supereject} - -% @exdent text.... -% outputs text on separate line in roman font, starting at standard page margin - -% This records the amount of indent in the innermost environment. -% That's how much \exdent should take out. -\newskip\exdentamount - -% This defn is used inside fill environments such as @defun. -\def\exdent{\parsearg\exdentyyy} -\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} - -% This defn is used inside nofill environments such as @example. -\def\nofillexdent{\parsearg\nofillexdentyyy} -\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount -\leftline{\hskip\leftskip{\rm#1}}}} - -%\hbox{{\rm#1}}\hfil\break}} - -% @include file insert text of that file as input. - -\def\include{\parsearg\includezzz} -%Use \input\thisfile to avoid blank after \input, which may be an active -%char (in which case the blank would become the \input argument). -%The grouping keeps the value of \thisfile correct even when @include -%is nested. -\def\includezzz #1{\begingroup -\def\thisfile{#1}\input\thisfile -\endgroup} - -\def\thisfile{} - -% @center line outputs that line, centered - -\def\center{\parsearg\centerzzz} -\def\centerzzz #1{{\advance\hsize by -\leftskip -\advance\hsize by -\rightskip -\centerline{#1}}} - -% @sp n outputs n lines of vertical space - -\def\sp{\parsearg\spxxx} -\def\spxxx #1{\par \vskip #1\baselineskip} - -% @comment ...line which is ignored... -% @c is the same as @comment -% @ignore ... @end ignore is another way to write a comment - -\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other% -\parsearg \commentxxx} - -\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 } - -\let\c=\comment - -% Prevent errors for section commands. -% Used in @ignore and in failing conditionals. -\def\ignoresections{% -\let\chapter=\relax -\let\unnumbered=\relax -\let\top=\relax -\let\unnumberedsec=\relax -\let\unnumberedsection=\relax -\let\unnumberedsubsec=\relax -\let\unnumberedsubsection=\relax -\let\unnumberedsubsubsec=\relax -\let\unnumberedsubsubsection=\relax -\let\section=\relax -\let\subsec=\relax -\let\subsubsec=\relax -\let\subsection=\relax -\let\subsubsection=\relax -\let\appendix=\relax -\let\appendixsec=\relax -\let\appendixsection=\relax -\let\appendixsubsec=\relax -\let\appendixsubsection=\relax -\let\appendixsubsubsec=\relax -\let\appendixsubsubsection=\relax -\let\contents=\relax -\let\smallbook=\relax -\let\titlepage=\relax -} - -% Used in nested conditionals, where we have to parse the Texinfo source -% and so want to turn off most commands, in case they are used -% incorrectly. -% -\def\ignoremorecommands{% - \let\defcv = \relax - \let\deffn = \relax - \let\deffnx = \relax - \let\defindex = \relax - \let\defivar = \relax - \let\defmac = \relax - \let\defmethod = \relax - \let\defop = \relax - \let\defopt = \relax - \let\defspec = \relax - \let\deftp = \relax - \let\deftypefn = \relax - \let\deftypefun = \relax - \let\deftypevar = \relax - \let\deftypevr = \relax - \let\defun = \relax - \let\defvar = \relax - \let\defvr = \relax - \let\ref = \relax - \let\xref = \relax - \let\printindex = \relax - \let\pxref = \relax - \let\settitle = \relax - \let\include = \relax - \let\lowersections = \relax - \let\down = \relax - \let\raisesections = \relax - \let\up = \relax - \let\set = \relax - \let\clear = \relax - \let\item = \relax - \let\message = \relax -} - -% Ignore @ignore ... @end ignore. -% -\def\ignore{\doignore{ignore}} - -% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text. -% -\def\ifinfo{\doignore{ifinfo}} -\def\ifhtml{\doignore{ifhtml}} -\def\html{\doignore{html}} -\def\menu{\doignore{menu}} -\def\direntry{\doignore{direntry}} - -% Ignore text until a line `@end #1'. -% -\def\doignore#1{\begingroup - % Don't complain about control sequences we have declared \outer. - \ignoresections - % - % Define a command to swallow text until we reach `@end #1'. - \long\def\doignoretext##1\end #1{\enddoignore}% - % - % Make sure that spaces turn into tokens that match what \doignoretext wants. - \catcode32 = 10 - % - % And now expand that command. - \doignoretext -} - -% What we do to finish off ignored text. -% -\def\enddoignore{\endgroup\ignorespaces}% - -\newif\ifwarnedobs\warnedobsfalse -\def\obstexwarn{% - \ifwarnedobs\relax\else - % We need to warn folks that they may have trouble with TeX 3.0. - % This uses \immediate\write16 rather than \message to get newlines. - \immediate\write16{} - \immediate\write16{***WARNING*** for users of Unix TeX 3.0!} - \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} - \immediate\write16{If you are running another version of TeX, relax.} - \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} - \immediate\write16{ Then upgrade your TeX installation if you can.} - \immediate\write16{If you are stuck with version 3.0, run the} - \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} - \immediate\write16{ to use a workaround.} - \immediate\write16{} - \warnedobstrue - \fi -} - -% **In TeX 3.0, setting text in \nullfont hangs tex. For a -% workaround (which requires the file ``dummy.tfm'' to be installed), -% uncomment the following line: -%%%%%\font\nullfont=dummy\let\obstexwarn=\relax - -% Ignore text, except that we keep track of conditional commands for -% purposes of nesting, up to an `@end #1' command. -% -\def\nestedignore#1{% - \obstexwarn - % We must actually expand the ignored text to look for the @end - % command, so that nested ignore constructs work. Thus, we put the - % text into a \vbox and then do nothing with the result. To minimize - % the change of memory overflow, we follow the approach outlined on - % page 401 of the TeXbook: make the current font be a dummy font. - % - \setbox0 = \vbox\bgroup - % Don't complain about control sequences we have declared \outer. - \ignoresections - % - % Define `@end #1' to end the box, which will in turn undefine the - % @end command again. - \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% - % - % We are going to be parsing Texinfo commands. Most cause no - % trouble when they are used incorrectly, but some commands do - % complicated argument parsing or otherwise get confused, so we - % undefine them. - % - % We can't do anything about stray @-signs, unfortunately; - % they'll produce `undefined control sequence' errors. - \ignoremorecommands - % - % Set the current font to be \nullfont, a TeX primitive, and define - % all the font commands to also use \nullfont. We don't use - % dummy.tfm, as suggested in the TeXbook, because not all sites - % might have that installed. Therefore, math mode will still - % produce output, but that should be an extremely small amount of - % stuff compared to the main input. - % - \nullfont - \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont - \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont - \let\tensf = \nullfont - % Similarly for index fonts (mostly for their use in - % smallexample) - \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont - \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont - \let\indsf = \nullfont - % - % Don't complain when characters are missing from the fonts. - \tracinglostchars = 0 - % - % Don't bother to do space factor calculations. - \frenchspacing - % - % Don't report underfull hboxes. - \hbadness = 10000 - % - % Do minimal line-breaking. - \pretolerance = 10000 - % - % Do not execute instructions in @tex - \def\tex{\doignore{tex}} -} - -% @set VAR sets the variable VAR to an empty value. -% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. -% -% Since we want to separate VAR from REST-OF-LINE (which might be -% empty), we can't just use \parsearg; we have to insert a space of our -% own to delimit the rest of the line, and then take it out again if we -% didn't need it. -% -\def\set{\parsearg\setxxx} -\def\setxxx#1{\setyyy#1 \endsetyyy} -\def\setyyy#1 #2\endsetyyy{% - \def\temp{#2}% - \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty - \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. - \fi -} -% Can't use \xdef to pre-expand #2 and save some time, since \temp or -% \next or other control sequences that we've defined might get us into -% an infinite loop. Consider `@set foo @cite{bar}'. -\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}} - -% @clear VAR clears (i.e., unsets) the variable VAR. -% -\def\clear{\parsearg\clearxxx} -\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} - -% @value{foo} gets the text saved in variable foo. -% -\def\value#1{\expandafter - \ifx\csname SET#1\endcsname\relax - {\{No value for ``#1''\}} - \else \csname SET#1\endcsname \fi} - -% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined -% with @set. -% -\def\ifset{\parsearg\ifsetxxx} -\def\ifsetxxx #1{% - \expandafter\ifx\csname SET#1\endcsname\relax - \expandafter\ifsetfail - \else - \expandafter\ifsetsucceed - \fi -} -\def\ifsetsucceed{\conditionalsucceed{ifset}} -\def\ifsetfail{\nestedignore{ifset}} -\defineunmatchedend{ifset} - -% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been -% defined with @set, or has been undefined with @clear. -% -\def\ifclear{\parsearg\ifclearxxx} -\def\ifclearxxx #1{% - \expandafter\ifx\csname SET#1\endcsname\relax - \expandafter\ifclearsucceed - \else - \expandafter\ifclearfail - \fi -} -\def\ifclearsucceed{\conditionalsucceed{ifclear}} -\def\ifclearfail{\nestedignore{ifclear}} -\defineunmatchedend{ifclear} - -% @iftex always succeeds; we read the text following, through @end -% iftex). But `@end iftex' should be valid only after an @iftex. -% -\def\iftex{\conditionalsucceed{iftex}} -\defineunmatchedend{iftex} - -% We can't just want to start a group at @iftex (for example) and end it -% at @end iftex, since then @set commands inside the conditional have no -% effect (they'd get reverted at the end of the group). So we must -% define \Eiftex to redefine itself to be its previous value. (We can't -% just define it to fail again with an ``unmatched end'' error, since -% the @ifset might be nested.) -% -\def\conditionalsucceed#1{% - \edef\temp{% - % Remember the current value of \E#1. - \let\nece{prevE#1} = \nece{E#1}% - % - % At the `@end #1', redefine \E#1 to be its previous value. - \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}% - }% - \temp -} - -% We need to expand lots of \csname's, but we don't want to expand the -% control sequences after we've constructed them. -% -\def\nece#1{\expandafter\noexpand\csname#1\endcsname} - -% @asis just yields its argument. Used with @table, for example. -% -\def\asis#1{#1} - -% @math means output in math mode. -% We don't use $'s directly in the definition of \math because control -% sequences like \math are expanded when the toc file is written. Then, -% we read the toc file back, the $'s will be normal characters (as they -% should be, according to the definition of Texinfo). So we must use a -% control sequence to switch into and out of math mode. -% -% This isn't quite enough for @math to work properly in indices, but it -% seems unlikely it will ever be needed there. -% -\let\implicitmath = $ -\def\math#1{\implicitmath #1\implicitmath} - -% @bullet and @minus need the same treatment as @math, just above. -\def\bullet{\implicitmath\ptexbullet\implicitmath} -\def\minus{\implicitmath-\implicitmath} - -\def\node{\ENVcheck\parsearg\nodezzz} -\def\nodezzz#1{\nodexxx [#1,]} -\def\nodexxx[#1,#2]{\gdef\lastnode{#1}} -\let\nwnode=\node -\let\lastnode=\relax - -\def\donoderef{\ifx\lastnode\relax\else -\expandafter\expandafter\expandafter\setref{\lastnode}\fi -\global\let\lastnode=\relax} - -\def\unnumbnoderef{\ifx\lastnode\relax\else -\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi -\global\let\lastnode=\relax} - -\def\appendixnoderef{\ifx\lastnode\relax\else -\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi -\global\let\lastnode=\relax} - -\let\refill=\relax - -% @setfilename is done at the beginning of every texinfo file. -% So open here the files we need to have open while reading the input. -% This makes it possible to make a .fmt file for texinfo. -\def\setfilename{% - \readauxfile - \opencontents - \openindices - \fixbackslash % Turn off hack to swallow `\input texinfo'. - \global\let\setfilename=\comment % Ignore extra @setfilename cmds. - \comment % Ignore the actual filename. -} - -\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} - -\def\inforef #1{\inforefzzz #1,,,,**} -\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, - node \samp{\ignorespaces#1{}}} - -\message{fonts,} - -% Font-change commands. - -% Texinfo supports the sans serif font style, which plain TeX does not. -% So we set up a \sf analogous to plain's \rm, etc. -\newfam\sffam -\def\sf{\fam=\sffam \tensf} -\let\li = \sf % Sometimes we call it \li, not \sf. - -%% Try out Computer Modern fonts at \magstephalf -\let\mainmagstep=\magstephalf - -% Set the font macro #1 to the font named #2, adding on the -% specified font prefix (normally `cm'). -\def\setfont#1#2{\font#1=\fontprefix#2} - -% Use cm as the default font prefix. -% To specify the font prefix, you must define \fontprefix -% before you read in texinfo.tex. -\ifx\fontprefix\undefined -\def\fontprefix{cm} -\fi - -\ifx\bigger\relax -\let\mainmagstep=\magstep1 -\setfont\textrm{r12} -\setfont\texttt{tt12} -\else -\setfont\textrm{r10 scaled \mainmagstep} -\setfont\texttt{tt10 scaled \mainmagstep} -\fi -% Instead of cmb10, you many want to use cmbx10. -% cmbx10 is a prettier font on its own, but cmb10 -% looks better when embedded in a line with cmr10. -\setfont\textbf{b10 scaled \mainmagstep} -\setfont\textit{ti10 scaled \mainmagstep} -\setfont\textsl{sl10 scaled \mainmagstep} -\setfont\textsf{ss10 scaled \mainmagstep} -\setfont\textsc{csc10 scaled \mainmagstep} -\font\texti=cmmi10 scaled \mainmagstep -\font\textsy=cmsy10 scaled \mainmagstep - -% A few fonts for @defun, etc. -\setfont\defbf{bx10 scaled \magstep1} %was 1314 -\setfont\deftt{tt10 scaled \magstep1} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} - -% Fonts for indices and small examples. -% We actually use the slanted font rather than the italic, -% because texinfo normally uses the slanted fonts for that. -% Do not make many font distinctions in general in the index, since they -% aren't very useful. -\setfont\ninett{tt9} -\setfont\indrm{r9} -\setfont\indit{sl9} -\let\indsl=\indit -\let\indtt=\ninett -\let\indsf=\indrm -\let\indbf=\indrm -\setfont\indsc{csc10 at 9pt} -\font\indi=cmmi9 -\font\indsy=cmsy9 - -% Fonts for headings -\setfont\chaprm{bx12 scaled \magstep2} -\setfont\chapit{ti12 scaled \magstep2} -\setfont\chapsl{sl12 scaled \magstep2} -\setfont\chaptt{tt12 scaled \magstep2} -\setfont\chapsf{ss12 scaled \magstep2} -\let\chapbf=\chaprm -\setfont\chapsc{csc10 scaled\magstep3} -\font\chapi=cmmi12 scaled \magstep2 -\font\chapsy=cmsy10 scaled \magstep3 - -\setfont\secrm{bx12 scaled \magstep1} -\setfont\secit{ti12 scaled \magstep1} -\setfont\secsl{sl12 scaled \magstep1} -\setfont\sectt{tt12 scaled \magstep1} -\setfont\secsf{ss12 scaled \magstep1} -\setfont\secbf{bx12 scaled \magstep1} -\setfont\secsc{csc10 scaled\magstep2} -\font\seci=cmmi12 scaled \magstep1 -\font\secsy=cmsy10 scaled \magstep2 - -% \setfont\ssecrm{bx10 scaled \magstep1} % This size an font looked bad. -% \setfont\ssecit{cmti10 scaled \magstep1} % The letters were too crowded. -% \setfont\ssecsl{sl10 scaled \magstep1} -% \setfont\ssectt{tt10 scaled \magstep1} -% \setfont\ssecsf{ss10 scaled \magstep1} - -%\setfont\ssecrm{b10 scaled 1315} % Note the use of cmb rather than cmbx. -%\setfont\ssecit{ti10 scaled 1315} % Also, the size is a little larger than -%\setfont\ssecsl{sl10 scaled 1315} % being scaled magstep1. -%\setfont\ssectt{tt10 scaled 1315} -%\setfont\ssecsf{ss10 scaled 1315} - -%\let\ssecbf=\ssecrm - -\setfont\ssecrm{bx12 scaled \magstephalf} -\setfont\ssecit{ti12 scaled \magstephalf} -\setfont\ssecsl{sl12 scaled \magstephalf} -\setfont\ssectt{tt12 scaled \magstephalf} -\setfont\ssecsf{ss12 scaled \magstephalf} -\setfont\ssecbf{bx12 scaled \magstephalf} -\setfont\ssecsc{csc10 scaled \magstep1} -\font\sseci=cmmi12 scaled \magstephalf -\font\ssecsy=cmsy10 scaled \magstep1 -% The smallcaps and symbol fonts should actually be scaled \magstep1.5, -% but that is not a standard magnification. - -% Fonts for title page: -\setfont\titlerm{bx12 scaled \magstep3} -\let\authorrm = \secrm - -% In order for the font changes to affect most math symbols and letters, -% we have to define the \textfont of the standard families. Since -% texinfo doesn't allow for producing subscripts and superscripts, we -% don't bother to reset \scriptfont and \scriptscriptfont (which would -% also require loading a lot more fonts). -% -\def\resetmathfonts{% - \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy - \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf - \textfont\ttfam = \tentt \textfont\sffam = \tensf -} - - -% The font-changing commands redefine the meanings of \tenSTYLE, instead -% of just \STYLE. We do this so that font changes will continue to work -% in math mode, where it is the current \fam that is relevant in most -% cases, not the current. Plain TeX does, for example, -% \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need -% to redefine \bf itself. -\def\textfonts{% - \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl - \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc - \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy - \resetmathfonts} -\def\chapfonts{% - \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl - \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc - \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy - \resetmathfonts} -\def\secfonts{% - \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl - \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc - \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy - \resetmathfonts} -\def\subsecfonts{% - \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl - \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc - \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy - \resetmathfonts} -\def\indexfonts{% - \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl - \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc - \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy - \resetmathfonts} - -% Set up the default fonts, so we can use them for creating boxes. -% -\textfonts - -% Count depth in font-changes, for error checks -\newcount\fontdepth \fontdepth=0 - -% Fonts for short table of contents. -\setfont\shortcontrm{r12} -\setfont\shortcontbf{bx12} -\setfont\shortcontsl{sl12} - -%% Add scribe-like font environments, plus @l for inline lisp (usually sans -%% serif) and @ii for TeX italic - -% \smartitalic{ARG} outputs arg in italics, followed by an italic correction -% unless the following character is such as not to need one. -\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} -\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx} - -\let\i=\smartitalic -\let\var=\smartitalic -\let\dfn=\smartitalic -\let\emph=\smartitalic -\let\cite=\smartitalic - -\def\b#1{{\bf #1}} -\let\strong=\b - -% We can't just use \exhyphenpenalty, because that only has effect at -% the end of a paragraph. Restore normal hyphenation at the end of the -% group within which \nohyphenation is presumably called. -% -\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} -\def\restorehyphenation{\hyphenchar\font = `- } - -\def\t#1{% - {\tt \nohyphenation \rawbackslash \frenchspacing #1}% - \null -} -\let\ttfont = \t -%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null} -\def\samp #1{`\tclose{#1}'\null} -\def\key #1{{\tt \nohyphenation \uppercase{#1}}\null} -\def\ctrl #1{{\tt \rawbackslash \hat}#1} - -\let\file=\samp - -% @code is a modification of @t, -% which makes spaces the same size as normal in the surrounding text. -\def\tclose#1{% - {% - % Change normal interword space to be same as for the current font. - \spaceskip = \fontdimen2\font - % - % Switch to typewriter. - \tt - % - % But `\ ' produces the large typewriter interword space. - \def\ {{\spaceskip = 0pt{} }}% - % - % Turn off hyphenation. - \nohyphenation - % - \rawbackslash - \frenchspacing - #1% - }% - \null -} - -% We *must* turn on hyphenation at `-' and `_' in \code. -% Otherwise, it is too hard to avoid overful hboxes -% in the Emacs manual, the Library manual, etc. - -% Unfortunately, TeX uses one parameter (\hyphenchar) to control -% both hyphenation at - and hyphenation within words. -% We must therefore turn them both off (\tclose does that) -% and arrange explicitly to hyphenate an a dash. -% -- rms. -{ -\catcode`\-=\active -\catcode`\_=\active -\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex} -% The following is used by \doprintindex to insure that long function names -% wrap around. It is necessary for - and _ to be active before the index is -% read from the file, as \entry parses the arguments long before \code is -% ever called. -- mycroft -\global\def\indexbreaks{\catcode`\-=\active \let-\realdash \catcode`\_=\active \let_\realunder} -} -\def\realdash{-} -\def\realunder{_} -\def\codedash{-\discretionary{}{}{}} -\def\codeunder{\normalunderscore\discretionary{}{}{}} -\def\codex #1{\tclose{#1}\endgroup} - -%\let\exp=\tclose %Was temporary - -% @kbd is like @code, except that if the argument is just one @key command, -% then @kbd has no effect. - -\def\xkey{\key} -\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% -\ifx\one\xkey\ifx\threex\three \key{#2}% -\else\tclose{\look}\fi -\else\tclose{\look}\fi} - -% Typeset a dimension, e.g., `in' or `pt'. The only reason for the -% argument is to make the input look right: @dmn{pt} instead of -% @dmn{}pt. -% -\def\dmn#1{\thinspace #1} - -\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} - -\def\l#1{{\li #1}\null} % - -\def\r#1{{\rm #1}} % roman font -% Use of \lowercase was suggested. -\def\sc#1{{\smallcaps#1}} % smallcaps font -\def\ii#1{{\it #1}} % italic font - -\message{page headings,} - -\newskip\titlepagetopglue \titlepagetopglue = 1.5in -\newskip\titlepagebottomglue \titlepagebottomglue = 2pc - -% First the title page. Must do @settitle before @titlepage. -\def\titlefont#1{{\titlerm #1}} - -\newif\ifseenauthor -\newif\iffinishedtitlepage - -\def\shorttitlepage{\parsearg\shorttitlepagezzz} -\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% - \endgroup\page\hbox{}\page} - -\def\titlepage{\begingroup \parindent=0pt \textfonts - \let\subtitlerm=\tenrm -% I deinstalled the following change because \cmr12 is undefined. -% This change was not in the ChangeLog anyway. --rms. -% \let\subtitlerm=\cmr12 - \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% - % - \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% - % - % Leave some space at the very top of the page. - \vglue\titlepagetopglue - % - % Now you can print the title using @title. - \def\title{\parsearg\titlezzz}% - \def\titlezzz##1{\leftline{\titlefont{##1}} - % print a rule at the page bottom also. - \finishedtitlepagefalse - \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% - % No rule at page bottom unless we print one at the top with @title. - \finishedtitlepagetrue - % - % Now you can put text using @subtitle. - \def\subtitle{\parsearg\subtitlezzz}% - \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% - % - % @author should come last, but may come many times. - \def\author{\parsearg\authorzzz}% - \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi - {\authorfont \leftline{##1}}}% - % - % Most title ``pages'' are actually two pages long, with space - % at the top of the second. We don't want the ragged left on the second. - \let\oldpage = \page - \def\page{% - \iffinishedtitlepage\else - \finishtitlepage - \fi - \oldpage - \let\page = \oldpage - \hbox{}}% -% \def\page{\oldpage \hbox{}} -} - -\def\Etitlepage{% - \iffinishedtitlepage\else - \finishtitlepage - \fi - % It is important to do the page break before ending the group, - % because the headline and footline are only empty inside the group. - % If we use the new definition of \page, we always get a blank page - % after the title page, which we certainly don't want. - \oldpage - \endgroup - \HEADINGSon -} - -\def\finishtitlepage{% - \vskip4pt \hrule height 2pt width \hsize - \vskip\titlepagebottomglue - \finishedtitlepagetrue -} - -%%% Set up page headings and footings. - -\let\thispage=\folio - -\newtoks \evenheadline % Token sequence for heading line of even pages -\newtoks \oddheadline % Token sequence for heading line of odd pages -\newtoks \evenfootline % Token sequence for footing line of even pages -\newtoks \oddfootline % Token sequence for footing line of odd pages - -% Now make Tex use those variables -\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline - \else \the\evenheadline \fi}} -\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline - \else \the\evenfootline \fi}\HEADINGShook} -\let\HEADINGShook=\relax - -% Commands to set those variables. -% For example, this is what @headings on does -% @evenheading @thistitle|@thispage|@thischapter -% @oddheading @thischapter|@thispage|@thistitle -% @evenfooting @thisfile|| -% @oddfooting ||@thisfile - -\def\evenheading{\parsearg\evenheadingxxx} -\def\oddheading{\parsearg\oddheadingxxx} -\def\everyheading{\parsearg\everyheadingxxx} - -\def\evenfooting{\parsearg\evenfootingxxx} -\def\oddfooting{\parsearg\oddfootingxxx} -\def\everyfooting{\parsearg\everyfootingxxx} - -{\catcode`\@=0 % - -\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} -\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% -\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} -\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% -\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish} -\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{% -\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} -\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} -\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% -\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} -\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% -\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish} -\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{% -\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}} -\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} -% -}% unbind the catcode of @. - -% @headings double turns headings on for double-sided printing. -% @headings single turns headings on for single-sided printing. -% @headings off turns them off. -% @headings on same as @headings double, retained for compatibility. -% @headings after turns on double-sided headings after this page. -% @headings doubleafter turns on double-sided headings after this page. -% @headings singleafter turns on single-sided headings after this page. -% By default, they are off. - -\def\headings #1 {\csname HEADINGS#1\endcsname} - -\def\HEADINGSoff{ -\global\evenheadline={\hfil} \global\evenfootline={\hfil} -\global\oddheadline={\hfil} \global\oddfootline={\hfil}} -\HEADINGSoff -% When we turn headings on, set the page number to 1. -% For double-sided printing, put current file name in lower left corner, -% chapter name on inside top of right hand pages, document -% title on inside top of left hand pages, and page numbers on outside top -% edge of all pages. -\def\HEADINGSdouble{ -%\pagealignmacro -\global\pageno=1 -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -} -% For single-sided printing, chapter title goes across top left of page, -% page number on top right. -\def\HEADINGSsingle{ -%\pagealignmacro -\global\pageno=1 -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -} -\def\HEADINGSon{\HEADINGSdouble} - -\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} -\let\HEADINGSdoubleafter=\HEADINGSafter -\def\HEADINGSdoublex{% -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -} - -\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} -\def\HEADINGSsinglex{% -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -} - -% Subroutines used in generating headings -% Produces Day Month Year style of output. -\def\today{\number\day\space -\ifcase\month\or -January\or February\or March\or April\or May\or June\or -July\or August\or September\or October\or November\or December\fi -\space\number\year} - -% Use this if you want the Month Day, Year style of output. -%\def\today{\ifcase\month\or -%January\or February\or March\or April\or May\or June\or -%July\or August\or September\or October\or November\or December\fi -%\space\number\day, \number\year} - -% @settitle line... specifies the title of the document, for headings -% It generates no output of its own - -\def\thistitle{No Title} -\def\settitle{\parsearg\settitlezzz} -\def\settitlezzz #1{\gdef\thistitle{#1}} - -\message{tables,} - -% @tabs -- simple alignment - -% These don't work. For one thing, \+ is defined as outer. -% So these macros cannot even be defined. - -%\def\tabs{\parsearg\tabszzz} -%\def\tabszzz #1{\settabs\+#1\cr} -%\def\tabline{\parsearg\tablinezzz} -%\def\tablinezzz #1{\+#1\cr} -%\def\&{&} - -% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). - -% default indentation of table text -\newdimen\tableindent \tableindent=.8in -% default indentation of @itemize and @enumerate text -\newdimen\itemindent \itemindent=.3in -% margin between end of table item and start of table text. -\newdimen\itemmargin \itemmargin=.1in - -% used internally for \itemindent minus \itemmargin -\newdimen\itemmax - -% Note @table, @vtable, and @vtable define @item, @itemx, etc., with -% these defs. -% They also define \itemindex -% to index the item name in whatever manner is desired (perhaps none). - -\newif\ifitemxneedsnegativevskip - -\def\itemxpar{\par\ifitemxneedsnegativevskip\vskip-\parskip\nobreak\fi} - -\def\internalBitem{\smallbreak \parsearg\itemzzz} -\def\internalBitemx{\itemxpar \parsearg\itemzzz} - -\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} -\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} - -\def\internalBkitem{\smallbreak \parsearg\kitemzzz} -\def\internalBkitemx{\itemxpar \parsearg\kitemzzz} - -\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% - \itemzzz {#1}} - -\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% - \itemzzz {#1}} - -\def\itemzzz #1{\begingroup % - \advance\hsize by -\rightskip - \advance\hsize by -\tableindent - \setbox0=\hbox{\itemfont{#1}}% - \itemindex{#1}% - \nobreak % This prevents a break before @itemx. - % - % Be sure we are not still in the middle of a paragraph. - %{\parskip = 0in - %\par - %}% - % - % If the item text does not fit in the space we have, put it on a line - % by itself, and do not allow a page break either before or after that - % line. We do not start a paragraph here because then if the next - % command is, e.g., @kindex, the whatsit would get put into the - % horizontal list on a line by itself, resulting in extra blank space. - \ifdim \wd0>\itemmax - % - % Make this a paragraph so we get the \parskip glue and wrapping, - % but leave it ragged-right. - \begingroup - \advance\leftskip by-\tableindent - \advance\hsize by\tableindent - \advance\rightskip by0pt plus1fil - \leavevmode\unhbox0\par - \endgroup - % - % We're going to be starting a paragraph, but we don't want the - % \parskip glue -- logically it's part of the @item we just started. - \nobreak \vskip-\parskip - % - % Stop a page break at the \parskip glue coming up. Unfortunately - % we can't prevent a possible page break at the following - % \baselineskip glue. - \nobreak - \endgroup - \itemxneedsnegativevskipfalse - \else - % The item text fits into the space. Start a paragraph, so that the - % following text (if any) will end up on the same line. Since that - % text will be indented by \tableindent, we make the item text be in - % a zero-width box. - \noindent - \rlap{\hskip -\tableindent\box0}\ignorespaces% - \endgroup% - \itemxneedsnegativevskiptrue% - \fi -} - -\def\item{\errmessage{@item while not in a table}} -\def\itemx{\errmessage{@itemx while not in a table}} -\def\kitem{\errmessage{@kitem while not in a table}} -\def\kitemx{\errmessage{@kitemx while not in a table}} -\def\xitem{\errmessage{@xitem while not in a table}} -\def\xitemx{\errmessage{@xitemx while not in a table}} - -%% Contains a kludge to get @end[description] to work -\def\description{\tablez{\dontindex}{1}{}{}{}{}} - -\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} -{\obeylines\obeyspaces% -\gdef\tablex #1^^M{% -\tabley\dontindex#1 \endtabley}} - -\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} -{\obeylines\obeyspaces% -\gdef\ftablex #1^^M{% -\tabley\fnitemindex#1 \endtabley -\def\Eftable{\endgraf\afterenvbreak\endgroup}% -\let\Etable=\relax}} - -\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} -{\obeylines\obeyspaces% -\gdef\vtablex #1^^M{% -\tabley\vritemindex#1 \endtabley -\def\Evtable{\endgraf\afterenvbreak\endgroup}% -\let\Etable=\relax}} - -\def\dontindex #1{} -\def\fnitemindex #1{\doind {fn}{\code{#1}}}% -\def\vritemindex #1{\doind {vr}{\code{#1}}}% - -{\obeyspaces % -\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% -\tablez{#1}{#2}{#3}{#4}{#5}{#6}}} - -\def\tablez #1#2#3#4#5#6{% -\aboveenvbreak % -\begingroup % -\def\Edescription{\Etable}% Neccessary kludge. -\let\itemindex=#1% -\ifnum 0#3>0 \advance \leftskip by #3\mil \fi % -\ifnum 0#4>0 \tableindent=#4\mil \fi % -\ifnum 0#5>0 \advance \rightskip by #5\mil \fi % -\def\itemfont{#2}% -\itemmax=\tableindent % -\advance \itemmax by -\itemmargin % -\advance \leftskip by \tableindent % -\exdentamount=\tableindent -\parindent = 0pt -\parskip = \smallskipamount -\ifdim \parskip=0pt \parskip=2pt \fi% -\def\Etable{\endgraf\afterenvbreak\endgroup}% -\let\item = \internalBitem % -\let\itemx = \internalBitemx % -\let\kitem = \internalBkitem % -\let\kitemx = \internalBkitemx % -\let\xitem = \internalBxitem % -\let\xitemx = \internalBxitemx % -} - -% This is the counter used by @enumerate, which is really @itemize - -\newcount \itemno - -\def\itemize{\parsearg\itemizezzz} - -\def\itemizezzz #1{% - \begingroup % ended by the @end itemsize - \itemizey {#1}{\Eitemize} -} - -\def\itemizey #1#2{% -\aboveenvbreak % -\itemmax=\itemindent % -\advance \itemmax by -\itemmargin % -\advance \leftskip by \itemindent % -\exdentamount=\itemindent -\parindent = 0pt % -\parskip = \smallskipamount % -\ifdim \parskip=0pt \parskip=2pt \fi% -\def#2{\endgraf\afterenvbreak\endgroup}% -\def\itemcontents{#1}% -\let\item=\itemizeitem} - -% Set sfcode to normal for the chars that usually have another value. -% These are `.?!:;,' -\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 - \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } - -% \splitoff TOKENS\endmark defines \first to be the first token in -% TOKENS, and \rest to be the remainder. -% -\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% - -% Allow an optional argument of an uppercase letter, lowercase letter, -% or number, to specify the first label in the enumerated list. No -% argument is the same as `1'. -% -\def\enumerate{\parsearg\enumeratezzz} -\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} -\def\enumeratey #1 #2\endenumeratey{% - \begingroup % ended by the @end enumerate - % - % If we were given no argument, pretend we were given `1'. - \def\thearg{#1}% - \ifx\thearg\empty \def\thearg{1}\fi - % - % Detect if the argument is a single token. If so, it might be a - % letter. Otherwise, the only valid thing it can be is a number. - % (We will always have one token, because of the test we just made. - % This is a good thing, since \splitoff doesn't work given nothing at - % all -- the first parameter is undelimited.) - \expandafter\splitoff\thearg\endmark - \ifx\rest\empty - % Only one token in the argument. It could still be anything. - % A ``lowercase letter'' is one whose \lccode is nonzero. - % An ``uppercase letter'' is one whose \lccode is both nonzero, and - % not equal to itself. - % Otherwise, we assume it's a number. - % - % We need the \relax at the end of the \ifnum lines to stop TeX from - % continuing to look for a . - % - \ifnum\lccode\expandafter`\thearg=0\relax - \numericenumerate % a number (we hope) - \else - % It's a letter. - \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax - \lowercaseenumerate % lowercase letter - \else - \uppercaseenumerate % uppercase letter - \fi - \fi - \else - % Multiple tokens in the argument. We hope it's a number. - \numericenumerate - \fi -} - -% An @enumerate whose labels are integers. The starting integer is -% given in \thearg. -% -\def\numericenumerate{% - \itemno = \thearg - \startenumeration{\the\itemno}% -} - -% The starting (lowercase) letter is in \thearg. -\def\lowercaseenumerate{% - \itemno = \expandafter`\thearg - \startenumeration{% - % Be sure we're not beyond the end of the alphabet. - \ifnum\itemno=0 - \errmessage{No more lowercase letters in @enumerate; get a bigger - alphabet}% - \fi - \char\lccode\itemno - }% -} - -% The starting (uppercase) letter is in \thearg. -\def\uppercaseenumerate{% - \itemno = \expandafter`\thearg - \startenumeration{% - % Be sure we're not beyond the end of the alphabet. - \ifnum\itemno=0 - \errmessage{No more uppercase letters in @enumerate; get a bigger - alphabet} - \fi - \char\uccode\itemno - }% -} - -% Call itemizey, adding a period to the first argument and supplying the -% common last two arguments. Also subtract one from the initial value in -% \itemno, since @item increments \itemno. -% -\def\startenumeration#1{% - \advance\itemno by -1 - \itemizey{#1.}\Eenumerate\flushcr -} - -% @alphaenumerate and @capsenumerate are abbreviations for giving an arg -% to @enumerate. -% -\def\alphaenumerate{\enumerate{a}} -\def\capsenumerate{\enumerate{A}} -\def\Ealphaenumerate{\Eenumerate} -\def\Ecapsenumerate{\Eenumerate} - -% Definition of @item while inside @itemize. - -\def\itemizeitem{% -\advance\itemno by 1 -{\let\par=\endgraf \smallbreak}% -\ifhmode \errmessage{\in hmode at itemizeitem}\fi -{\parskip=0in \hskip 0pt -\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% -\vadjust{\penalty 1200}}% -\flushcr} - -% @multitable macros -% Amy Hendrickson, 8/18/94 -% -% @multitable ... @endmultitable will make as many columns as desired. -% Contents of each column will wrap at width given in preamble. Width -% can be specified either with sample text given in a template line, -% or in percent of \hsize, the current width of text on page. - -% Table can continue over pages but will only break between lines. - -% To make preamble: -% -% Either define widths of columns in terms of percent of \hsize: -% @multitable @percentofhsize .2 .3 .5 -% @item ... -% -% Numbers following @percentofhsize are the percent of the total -% current hsize to be used for each column. You may use as many -% columns as desired. - -% Or use a template: -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item ... -% using the widest term desired in each column. - - -% Each new table line starts with @item, each subsequent new column -% starts with @tab. Empty columns may be produced by supplying @tab's -% with nothing between them for as many times as empty columns are needed, -% ie, @tab@tab@tab will produce two empty columns. - -% @item, @tab, @multicolumn or @endmulticolumn do not need to be on their -% own lines, but it will not hurt if they are. - -% Sample multitable: - -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item first col stuff @tab second col stuff @tab third col -% @item -% first col stuff -% @tab -% second col stuff -% @tab -% third col -% @item first col stuff @tab second col stuff -% @tab Many paragraphs of text may be used in any column. -% -% They will wrap at the width determined by the template. -% @item@tab@tab This will be in third column. -% @endmultitable - -% Default dimensions may be reset by user. -% @intableparskip will set vertical space between paragraphs in table. -% @intableparindent will set paragraph indent in table. -% @spacebetweencols will set horizontal space to be left between columns. -% @spacebetweenlines will set vertical space to be left between lines. - -%%%% -% Dimensions - -\newdimen\intableparskip -\newdimen\intableparindent -\newdimen\spacebetweencols -\newdimen\spacebetweenlines -\intableparskip=0pt -\intableparindent=6pt -\spacebetweencols=12pt -\spacebetweenlines=12pt - -%%%% -% Macros used to set up halign preamble: -\let\endsetuptable\relax -\def\xendsetuptable{\endsetuptable} -\let\percentofhsize\relax -\def\xpercentofhsize{\percentofhsize} -\newif\ifsetpercent - -\newcount\colcount -\def\setuptable#1{\def\firstarg{#1}% -\ifx\firstarg\xendsetuptable\let\go\relax% -\else - \ifx\firstarg\xpercentofhsize\global\setpercenttrue% - \else - \ifsetpercent - \if#1.\else% - \global\advance\colcount by1 % - \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}% - \fi - \else - \global\advance\colcount by1 - \setbox0=\hbox{#1}% - \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% - \fi% - \fi% - \let\go\setuptable% -\fi\go} -%%%% -% multitable syntax -\def\tab{&} - -%%%% -% @multitable ... @endmultitable definitions: - -\def\multitable#1\item{\bgroup -\let\item\cr -\tolerance=9500 -\hbadness=9500 -\parskip=\intableparskip -\parindent=\intableparindent -\overfullrule=0pt -\global\colcount=0\relax% -\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}% - % To parse everything between @multitable and @item : -\def\one{#1}\expandafter\setuptable\one\endsetuptable - % Need to reset this to 0 after \setuptable. -\global\colcount=0\relax% - % - % This preamble sets up a generic column definition, which will - % be used as many times as user calls for columns. - % \vtop will set a single line and will also let text wrap and - % continue for many paragraphs if desired. -\halign\bgroup&\global\advance\colcount by 1\relax% -\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname - % In order to keep entries from bumping into each other - % we will add a \leftskip of \spacebetweencols to all columns after - % the first one. - % If a template has been used, we will add \spacebetweencols - % to the width of each template entry. - % If user has set preamble in terms of percent of \hsize - % we will use that dimension as the width of the column, and - % the \leftskip will keep entries from bumping into each other. - % Table will start at left margin and final column will justify at - % right margin. -\ifnum\colcount=1 -\else - \ifsetpercent - \else - % If user has set preamble in terms of percent of \hsize - % we will advance \hsize by \spacebetweencols - \advance\hsize by \spacebetweencols - \fi - % In either case we will make \leftskip=\spacebetweencols: -\leftskip=\spacebetweencols -\fi -\noindent##}\cr% - % \everycr will reset column counter, \colcount, at the end of - % each line. Every column entry will cause \colcount to advance by one. - % The table preamble - % looks at the current \colcount to find the correct column width. -\global\everycr{\noalign{\nointerlineskip\vskip\spacebetweenlines -\filbreak%% keeps underfull box messages off when table breaks over pages. -\global\colcount=0\relax}}} - -\message{indexing,} -% Index generation facilities - -% Define \newwrite to be identical to plain tex's \newwrite -% except not \outer, so it can be used within \newindex. -{\catcode`\@=11 -\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} - -% \newindex {foo} defines an index named foo. -% It automatically defines \fooindex such that -% \fooindex ...rest of line... puts an entry in the index foo. -% It also defines \fooindfile to be the number of the output channel for -% the file that accumulates this index. The file's extension is foo. -% The name of an index should be no more than 2 characters long -% for the sake of vms. - -\def\newindex #1{ -\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file -\openout \csname#1indfile\endcsname \jobname.#1 % Open the file -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex -\noexpand\doindex {#1}} -} - -% @defindex foo == \newindex{foo} - -\def\defindex{\parsearg\newindex} - -% Define @defcodeindex, like @defindex except put all entries in @code. - -\def\newcodeindex #1{ -\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file -\openout \csname#1indfile\endcsname \jobname.#1 % Open the file -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex -\noexpand\docodeindex {#1}} -} - -\def\defcodeindex{\parsearg\newcodeindex} - -% @synindex foo bar makes index foo feed into index bar. -% Do this instead of @defindex foo if you don't want it as a separate index. -\def\synindex #1 #2 {% -\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname -\expandafter\let\csname#1indfile\endcsname=\synindexfoo -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex -\noexpand\doindex {#2}}% -} - -% @syncodeindex foo bar similar, but put all entries made for index foo -% inside @code. -\def\syncodeindex #1 #2 {% -\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname -\expandafter\let\csname#1indfile\endcsname=\synindexfoo -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex -\noexpand\docodeindex {#2}}% -} - -% Define \doindex, the driver for all \fooindex macros. -% Argument #1 is generated by the calling \fooindex macro, -% and it is "foo", the name of the index. - -% \doindex just uses \parsearg; it calls \doind for the actual work. -% This is because \doind is more useful to call from other macros. - -% There is also \dosubind {index}{topic}{subtopic} -% which makes an entry in a two-level index such as the operation index. - -\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} -\def\singleindexer #1{\doind{\indexname}{#1}} - -% like the previous two, but they put @code around the argument. -\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} -\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} - -\def\indexdummies{% -% Take care of the plain tex accent commands. -\def\"{\realbackslash "}% -\def\`{\realbackslash `}% -\def\'{\realbackslash '}% -\def\^{\realbackslash ^}% -\def\~{\realbackslash ~}% -\def\={\realbackslash =}% -\def\b{\realbackslash b}% -\def\c{\realbackslash c}% -\def\d{\realbackslash d}% -\def\u{\realbackslash u}% -\def\v{\realbackslash v}% -\def\H{\realbackslash H}% -% Take care of the plain tex special European modified letters. -\def\oe{\realbackslash oe}% -\def\ae{\realbackslash ae}% -\def\aa{\realbackslash aa}% -\def\OE{\realbackslash OE}% -\def\AE{\realbackslash AE}% -\def\AA{\realbackslash AA}% -\def\o{\realbackslash o}% -\def\O{\realbackslash O}% -\def\l{\realbackslash l}% -\def\L{\realbackslash L}% -\def\ss{\realbackslash ss}% -% Take care of texinfo commands likely to appear in an index entry. -\def\_{{\realbackslash _}}% -\def\w{\realbackslash w }% -\def\bf{\realbackslash bf }% -\def\rm{\realbackslash rm }% -\def\sl{\realbackslash sl }% -\def\sf{\realbackslash sf}% -\def\tt{\realbackslash tt}% -\def\gtr{\realbackslash gtr}% -\def\less{\realbackslash less}% -\def\hat{\realbackslash hat}% -\def\char{\realbackslash char}% -\def\TeX{\realbackslash TeX}% -\def\dots{\realbackslash dots }% -\def\copyright{\realbackslash copyright }% -\def\tclose##1{\realbackslash tclose {##1}}% -\def\code##1{\realbackslash code {##1}}% -\def\samp##1{\realbackslash samp {##1}}% -\def\t##1{\realbackslash r {##1}}% -\def\r##1{\realbackslash r {##1}}% -\def\i##1{\realbackslash i {##1}}% -\def\b##1{\realbackslash b {##1}}% -\def\cite##1{\realbackslash cite {##1}}% -\def\key##1{\realbackslash key {##1}}% -\def\file##1{\realbackslash file {##1}}% -\def\var##1{\realbackslash var {##1}}% -\def\kbd##1{\realbackslash kbd {##1}}% -\def\dfn##1{\realbackslash dfn {##1}}% -\def\emph##1{\realbackslash emph {##1}}% -} - -% \indexnofonts no-ops all font-change commands. -% This is used when outputting the strings to sort the index by. -\def\indexdummyfont#1{#1} -\def\indexdummytex{TeX} -\def\indexdummydots{...} - -\def\indexnofonts{% -% Just ignore accents. -\let\"=\indexdummyfont -\let\`=\indexdummyfont -\let\'=\indexdummyfont -\let\^=\indexdummyfont -\let\~=\indexdummyfont -\let\==\indexdummyfont -\let\b=\indexdummyfont -\let\c=\indexdummyfont -\let\d=\indexdummyfont -\let\u=\indexdummyfont -\let\v=\indexdummyfont -\let\H=\indexdummyfont -% Take care of the plain tex special European modified letters. -\def\oe{oe}% -\def\ae{ae}% -\def\aa{aa}% -\def\OE{OE}% -\def\AE{AE}% -\def\AA{AA}% -\def\o{o}% -\def\O{O}% -\def\l{l}% -\def\L{L}% -\def\ss{ss}% -\let\w=\indexdummyfont -\let\t=\indexdummyfont -\let\r=\indexdummyfont -\let\i=\indexdummyfont -\let\b=\indexdummyfont -\let\emph=\indexdummyfont -\let\strong=\indexdummyfont -\let\cite=\indexdummyfont -\let\sc=\indexdummyfont -%Don't no-op \tt, since it isn't a user-level command -% and is used in the definitions of the active chars like <, >, |... -%\let\tt=\indexdummyfont -\let\tclose=\indexdummyfont -\let\code=\indexdummyfont -\let\file=\indexdummyfont -\let\samp=\indexdummyfont -\let\kbd=\indexdummyfont -\let\key=\indexdummyfont -\let\var=\indexdummyfont -\let\TeX=\indexdummytex -\let\dots=\indexdummydots -} - -% To define \realbackslash, we must make \ not be an escape. -% We must first make another character (@) an escape -% so we do not become unable to do a definition. - -{\catcode`\@=0 \catcode`\\=\other -@gdef@realbackslash{\}} - -\let\indexbackslash=0 %overridden during \printindex. - -\let\SETmarginindex=\relax %initialize! -% workhorse for all \fooindexes -% #1 is name of index, #2 is stuff to put there -\def\doind #1#2{% -% Put the index entry in the margin if desired. -\ifx\SETmarginindex\relax\else% -\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% -\fi% -{\count10=\lastpenalty % -{\indexdummies % Must do this here, since \bf, etc expand at this stage -\escapechar=`\\% -{\let\folio=0% Expand all macros now EXCEPT \folio -\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now -% so it will be output as is; and it will print as backslash in the indx. -% -% Now process the index-string once, with all font commands turned off, -% to get the string to sort the index by. -{\indexnofonts -\xdef\temp1{#2}% -}% -% Now produce the complete index entry. We process the index-string again, -% this time with font commands expanded, to get what to print in the index. -\edef\temp{% -\write \csname#1indfile\endcsname{% -\realbackslash entry {\temp1}{\folio}{#2}}}% -\temp }% -}\penalty\count10}} - -\def\dosubind #1#2#3{% -{\count10=\lastpenalty % -{\indexdummies % Must do this here, since \bf, etc expand at this stage -\escapechar=`\\% -{\let\folio=0% -\def\rawbackslashxx{\indexbackslash}% -% -% Now process the index-string once, with all font commands turned off, -% to get the string to sort the index by. -{\indexnofonts -\xdef\temp1{#2 #3}% -}% -% Now produce the complete index entry. We process the index-string again, -% this time with font commands expanded, to get what to print in the index. -\edef\temp{% -\write \csname#1indfile\endcsname{% -\realbackslash entry {\temp1}{\folio}{#2}{#3}}}% -\temp }% -}\penalty\count10}} - -% The index entry written in the file actually looks like -% \entry {sortstring}{page}{topic} -% or -% \entry {sortstring}{page}{topic}{subtopic} -% The texindex program reads in these files and writes files -% containing these kinds of lines: -% \initial {c} -% before the first topic whose initial is c -% \entry {topic}{pagelist} -% for a topic that is used without subtopics -% \primary {topic} -% for the beginning of a topic that is used with subtopics -% \secondary {subtopic}{pagelist} -% for each subtopic. - -% Define the user-accessible indexing commands -% @findex, @vindex, @kindex, @cindex. - -\def\findex {\fnindex} -\def\kindex {\kyindex} -\def\cindex {\cpindex} -\def\vindex {\vrindex} -\def\tindex {\tpindex} -\def\pindex {\pgindex} - -\def\cindexsub {\begingroup\obeylines\cindexsub} -{\obeylines % -\gdef\cindexsub "#1" #2^^M{\endgroup % -\dosubind{cp}{#2}{#1}}} - -% Define the macros used in formatting output of the sorted index material. - -% This is what you call to cause a particular index to get printed. -% Write -% @unnumbered Function Index -% @printindex fn - -\def\printindex{\parsearg\doprintindex} - -\def\doprintindex#1{% - \tex - \dobreak \chapheadingskip {10000} - \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other - \catcode`\$=\other - \catcode`\~=\other - \indexbreaks - % - % The following don't help, since the chars were translated - % when the raw index was written, and their fonts were discarded - % due to \indexnofonts. - %\catcode`\"=\active - %\catcode`\^=\active - %\catcode`\_=\active - %\catcode`\|=\active - %\catcode`\<=\active - %\catcode`\>=\active - % % - \def\indexbackslash{\rawbackslashxx} - \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt - \begindoublecolumns - % - % See if the index file exists and is nonempty. - \openin 1 \jobname.#1s - \ifeof 1 - % \enddoublecolumns gets confused if there is no text in the index, - % and it loses the chapter title and the aux file entries for the - % index. The easiest way to prevent this problem is to make sure - % there is some text. - (Index is nonexistent) - \else - % - % If the index file exists but is empty, then \openin leaves \ifeof - % false. We have to make TeX try to read something from the file, so - % it can discover if there is anything in it. - \read 1 to \temp - \ifeof 1 - (Index is empty) - \else - \input \jobname.#1s - \fi - \fi - \closein 1 - \enddoublecolumns - \Etex -} - -% These macros are used by the sorted index file itself. -% Change them to control the appearance of the index. - -% Same as \bigskipamount except no shrink. -% \balancecolumns gets confused if there is any shrink. -\newskip\initialskipamount \initialskipamount 12pt plus4pt - -\def\initial #1{% -{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt -\ifdim\lastskip<\initialskipamount -\removelastskip \penalty-200 \vskip \initialskipamount\fi -\line{\secbf#1\hfill}\kern 2pt\penalty10000}} - -% This typesets a paragraph consisting of #1, dot leaders, and then #2 -% flush to the right margin. It is used for index and table of contents -% entries. The paragraph is indented by \leftskip. -% -\def\entry #1#2{\begingroup - % - % Start a new paragraph if necessary, so our assignments below can't - % affect previous text. - \par - % - % Do not fill out the last line with white space. - \parfillskip = 0in - % - % No extra space above this paragraph. - \parskip = 0in - % - % Do not prefer a separate line ending with a hyphen to fewer lines. - \finalhyphendemerits = 0 - % - % \hangindent is only relevant when the entry text and page number - % don't both fit on one line. In that case, bob suggests starting the - % dots pretty far over on the line. Unfortunately, a large - % indentation looks wrong when the entry text itself is broken across - % lines. So we use a small indentation and put up with long leaders. - % - % \hangafter is reset to 1 (which is the value we want) at the start - % of each paragraph, so we need not do anything with that. - \hangindent=2em - % - % When the entry text needs to be broken, just fill out the first line - % with blank space. - \rightskip = 0pt plus1fil - % - % Start a ``paragraph'' for the index entry so the line breaking - % parameters we've set above will have an effect. - \noindent - % - % Insert the text of the index entry. TeX will do line-breaking on it. - #1% - % The following is kluged to not output a line of dots in the index if - % there are no page numbers. The next person who breaks this will be - % cursed by a Unix daemon. - \def\tempa{{\rm }}% - \def\tempb{#2}% - \edef\tempc{\tempa}% - \edef\tempd{\tempb}% - \ifx\tempc\tempd\ \else% - % - % If we must, put the page number on a line of its own, and fill out - % this line with blank space. (The \hfil is overwhelmed with the - % fill leaders glue in \indexdotfill if the page number does fit.) - \hfil\penalty50 - \null\nobreak\indexdotfill % Have leaders before the page number. - % - % The `\ ' here is removed by the implicit \unskip that TeX does as - % part of (the primitive) \par. Without it, a spurious underfull - % \hbox ensues. - \ #2% The page number ends the paragraph. - \fi% - \par -\endgroup} - -% Like \dotfill except takes at least 1 em. -\def\indexdotfill{\cleaders - \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} - -\def\primary #1{\line{#1\hfil}} - -\newskip\secondaryindent \secondaryindent=0.5cm - -\def\secondary #1#2{ -{\parfillskip=0in \parskip=0in -\hangindent =1in \hangafter=1 -\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par -}} - -%% Define two-column mode, which is used in indexes. -%% Adapted from the TeXbook, page 416. -\catcode `\@=11 - -\newbox\partialpage - -\newdimen\doublecolumnhsize - -\def\begindoublecolumns{\begingroup - % Grab any single-column material above us. - \output = {\global\setbox\partialpage - =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}% - \eject - % - % Now switch to the double-column output routine. - \output={\doublecolumnout}% - % - % Change the page size parameters. We could do this once outside this - % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 - % format, but then we repeat the same computation. Repeating a couple - % of assignments once per index is clearly meaningless for the - % execution time, so we may as well do it once. - % - % First we halve the line length, less a little for the gutter between - % the columns. We compute the gutter based on the line length, so it - % changes automatically with the paper format. The magic constant - % below is chosen so that the gutter has the same value (well, +- < - % 1pt) as it did when we hard-coded it. - % - % We put the result in a separate register, \doublecolumhsize, so we - % can restore it in \pagesofar, after \hsize itself has (potentially) - % been clobbered. - % - \doublecolumnhsize = \hsize - \advance\doublecolumnhsize by -.04154\hsize - \divide\doublecolumnhsize by 2 - \hsize = \doublecolumnhsize - % - % Double the \vsize as well. (We don't need a separate register here, - % since nobody clobbers \vsize.) - \vsize = 2\vsize - \doublecolumnpagegoal -} - -\def\enddoublecolumns{\eject \endgroup \pagegoal=\vsize \unvbox\partialpage} - -\def\doublecolumnsplit{\splittopskip=\topskip \splitmaxdepth=\maxdepth - \global\dimen@=\pageheight \global\advance\dimen@ by-\ht\partialpage - \global\setbox1=\vsplit255 to\dimen@ \global\setbox0=\vbox{\unvbox1} - \global\setbox3=\vsplit255 to\dimen@ \global\setbox2=\vbox{\unvbox3} - \ifdim\ht0>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi - \ifdim\ht2>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi -} -\def\doublecolumnpagegoal{% - \dimen@=\vsize \advance\dimen@ by-2\ht\partialpage \global\pagegoal=\dimen@ -} -\def\pagesofar{\unvbox\partialpage % - \hsize=\doublecolumnhsize % have to restore this since output routine - \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}} -\def\doublecolumnout{% - \setbox5=\copy255 - {\vbadness=10000 \doublecolumnsplit} - \ifvbox255 - \setbox0=\vtop to\dimen@{\unvbox0} - \setbox2=\vtop to\dimen@{\unvbox2} - \onepageout\pagesofar \unvbox255 \penalty\outputpenalty - \else - \setbox0=\vbox{\unvbox5} - \ifvbox0 - \dimen@=\ht0 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip - \divide\dimen@ by2 \splittopskip=\topskip \splitmaxdepth=\maxdepth - {\vbadness=10000 - \loop \global\setbox5=\copy0 - \setbox1=\vsplit5 to\dimen@ - \setbox3=\vsplit5 to\dimen@ - \ifvbox5 \global\advance\dimen@ by1pt \repeat - \setbox0=\vbox to\dimen@{\unvbox1} - \setbox2=\vbox to\dimen@{\unvbox3} - \global\setbox\partialpage=\vbox{\pagesofar} - \doublecolumnpagegoal - } - \fi - \fi -} - -\catcode `\@=\other -\message{sectioning,} -% Define chapters, sections, etc. - -\newcount \chapno -\newcount \secno \secno=0 -\newcount \subsecno \subsecno=0 -\newcount \subsubsecno \subsubsecno=0 - -% This counter is funny since it counts through charcodes of letters A, B, ... -\newcount \appendixno \appendixno = `\@ -\def\appendixletter{\char\the\appendixno} - -\newwrite \contentsfile -% This is called from \setfilename. -\def\opencontents{\openout \contentsfile = \jobname.toc} - -% Each @chapter defines this as the name of the chapter. -% page headings and footings can use it. @section does likewise - -\def\thischapter{} \def\thissection{} -\def\seccheck#1{\if \pageno<0 % -\errmessage{@#1 not allowed after generating table of contents}\fi -% -} - -\def\chapternofonts{% -\let\rawbackslash=\relax% -\let\frenchspacing=\relax% -\def\result{\realbackslash result} -\def\equiv{\realbackslash equiv} -\def\expansion{\realbackslash expansion} -\def\print{\realbackslash print} -\def\TeX{\realbackslash TeX} -\def\dots{\realbackslash dots} -\def\copyright{\realbackslash copyright} -\def\tt{\realbackslash tt} -\def\bf{\realbackslash bf } -\def\w{\realbackslash w} -\def\less{\realbackslash less} -\def\gtr{\realbackslash gtr} -\def\hat{\realbackslash hat} -\def\char{\realbackslash char} -\def\tclose##1{\realbackslash tclose {##1}} -\def\code##1{\realbackslash code {##1}} -\def\samp##1{\realbackslash samp {##1}} -\def\r##1{\realbackslash r {##1}} -\def\b##1{\realbackslash b {##1}} -\def\key##1{\realbackslash key {##1}} -\def\file##1{\realbackslash file {##1}} -\def\kbd##1{\realbackslash kbd {##1}} -% These are redefined because @smartitalic wouldn't work inside xdef. -\def\i##1{\realbackslash i {##1}} -\def\cite##1{\realbackslash cite {##1}} -\def\var##1{\realbackslash var {##1}} -\def\emph##1{\realbackslash emph {##1}} -\def\dfn##1{\realbackslash dfn {##1}} -} - -\newcount\absseclevel % used to calculate proper heading level -\newcount\secbase\secbase=0 % @raise/lowersections modify this count - -% @raisesections: treat @section as chapter, @subsection as section, etc. -\def\raisesections{\global\advance\secbase by -1} -\let\up=\raisesections % original BFox name - -% @lowersections: treat @chapter as section, @section as subsection, etc. -\def\lowersections{\global\advance\secbase by 1} -\let\down=\lowersections % original BFox name - -% Choose a numbered-heading macro -% #1 is heading level if unmodified by @raisesections or @lowersections -% #2 is text for heading -\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \chapterzzz{#2} -\or - \seczzz{#2} -\or - \numberedsubseczzz{#2} -\or - \numberedsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \chapterzzz{#2} - \else - \numberedsubsubseczzz{#2} - \fi -\fi -} - -% like \numhead, but chooses appendix heading levels -\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \appendixzzz{#2} -\or - \appendixsectionzzz{#2} -\or - \appendixsubseczzz{#2} -\or - \appendixsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \appendixzzz{#2} - \else - \appendixsubsubseczzz{#2} - \fi -\fi -} - -% like \numhead, but chooses numberless heading levels -\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \unnumberedzzz{#2} -\or - \unnumberedseczzz{#2} -\or - \unnumberedsubseczzz{#2} -\or - \unnumberedsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \unnumberedzzz{#2} - \else - \unnumberedsubsubseczzz{#2} - \fi -\fi -} - - -\def\thischaptername{No Chapter Title} -\outer\def\chapter{\parsearg\chapteryyy} -\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz -\def\chapterzzz #1{\seccheck{chapter}% -\secno=0 \subsecno=0 \subsubsecno=0 -\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}% -\chapmacro {#1}{\the\chapno}% -\gdef\thissection{#1}% -\gdef\thischaptername{#1}% -% We don't substitute the actual chapter name into \thischapter -% because we don't want its macros evaluated now. -\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% -{\chapternofonts% -\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\donoderef % -\global\let\section = \numberedsec -\global\let\subsection = \numberedsubsec -\global\let\subsubsection = \numberedsubsubsec -}} - -\outer\def\appendix{\parsearg\appendixyyy} -\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz -\def\appendixzzz #1{\seccheck{appendix}% -\secno=0 \subsecno=0 \subsubsecno=0 -\global\advance \appendixno by 1 \message{Appendix \appendixletter}% -\chapmacro {#1}{\putwordAppendix{} \appendixletter}% -\gdef\thissection{#1}% -\gdef\thischaptername{#1}% -\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% -{\chapternofonts% -\edef\temp{{\realbackslash chapentry - {#1}{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\appendixnoderef % -\global\let\section = \appendixsec -\global\let\subsection = \appendixsubsec -\global\let\subsubsection = \appendixsubsubsec -}} - -\outer\def\top{\parsearg\unnumberedyyy} -\outer\def\unnumbered{\parsearg\unnumberedyyy} -\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz -\def\unnumberedzzz #1{\seccheck{unnumbered}% -\secno=0 \subsecno=0 \subsubsecno=0 -% -% This used to be simply \message{#1}, but TeX fully expands the -% argument to \message. Therefore, if #1 contained @-commands, TeX -% expanded them. For example, in `@unnumbered The @cite{Book}', TeX -% expanded @cite (which turns out to cause errors because \cite is meant -% to be executed, not expanded). -% -% Anyway, we don't want the fully-expanded definition of @cite to appear -% as a result of the \message, we just want `@cite' itself. We use -% \the to achieve this: TeX expands \the only once, -% simply yielding the contents of the . -\toks0 = {#1}\message{(\the\toks0)}% -% -\unnumbchapmacro {#1}% -\gdef\thischapter{#1}\gdef\thissection{#1}% -{\chapternofonts% -\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\unnumbnoderef % -\global\let\section = \unnumberedsec -\global\let\subsection = \unnumberedsubsec -\global\let\subsubsection = \unnumberedsubsubsec -}} - -\outer\def\numberedsec{\parsearg\secyyy} -\def\secyyy #1{\numhead1{#1}} % normally calls seczzz -\def\seczzz #1{\seccheck{section}% -\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % -\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% -{\chapternofonts% -\edef\temp{{\realbackslash secentry % -{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\donoderef % -\penalty 10000 % -}} - -\outer\def\appenixsection{\parsearg\appendixsecyyy} -\outer\def\appendixsec{\parsearg\appendixsecyyy} -\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz -\def\appendixsectionzzz #1{\seccheck{appendixsection}% -\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % -\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% -{\chapternofonts% -\edef\temp{{\realbackslash secentry % -{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\appendixnoderef % -\penalty 10000 % -}} - -\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} -\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz -\def\unnumberedseczzz #1{\seccheck{unnumberedsec}% -\plainsecheading {#1}\gdef\thissection{#1}% -{\chapternofonts% -\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\unnumbnoderef % -\penalty 10000 % -}} - -\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} -\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz -\def\numberedsubseczzz #1{\seccheck{subsection}% -\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % -\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% -{\chapternofonts% -\edef\temp{{\realbackslash subsecentry % -{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\donoderef % -\penalty 10000 % -}} - -\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} -\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz -\def\appendixsubseczzz #1{\seccheck{appendixsubsec}% -\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % -\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% -{\chapternofonts% -\edef\temp{{\realbackslash subsecentry % -{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\appendixnoderef % -\penalty 10000 % -}} - -\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} -\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz -\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% -\plainsecheading {#1}\gdef\thissection{#1}% -{\chapternofonts% -\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\unnumbnoderef % -\penalty 10000 % -}} - -\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} -\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz -\def\numberedsubsubseczzz #1{\seccheck{subsubsection}% -\gdef\thissection{#1}\global\advance \subsubsecno by 1 % -\subsubsecheading {#1} - {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% -{\chapternofonts% -\edef\temp{{\realbackslash subsubsecentry % - {#1} - {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} - {\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\donoderef % -\penalty 10000 % -}} - -\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} -\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz -\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}% -\gdef\thissection{#1}\global\advance \subsubsecno by 1 % -\subsubsecheading {#1} - {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% -{\chapternofonts% -\edef\temp{{\realbackslash subsubsecentry{#1}% - {\appendixletter} - {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\appendixnoderef % -\penalty 10000 % -}} - -\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} -\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz -\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% -\plainsecheading {#1}\gdef\thissection{#1}% -{\chapternofonts% -\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\unnumbnoderef % -\penalty 10000 % -}} - -% These are variants which are not "outer", so they can appear in @ifinfo. -% Actually, they should now be obsolete; ordinary section commands should work. -\def\infotop{\parsearg\unnumberedzzz} -\def\infounnumbered{\parsearg\unnumberedzzz} -\def\infounnumberedsec{\parsearg\unnumberedseczzz} -\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} -\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} - -\def\infoappendix{\parsearg\appendixzzz} -\def\infoappendixsec{\parsearg\appendixseczzz} -\def\infoappendixsubsec{\parsearg\appendixsubseczzz} -\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} - -\def\infochapter{\parsearg\chapterzzz} -\def\infosection{\parsearg\sectionzzz} -\def\infosubsection{\parsearg\subsectionzzz} -\def\infosubsubsection{\parsearg\subsubsectionzzz} - -% These macros control what the section commands do, according -% to what kind of chapter we are in (ordinary, appendix, or unnumbered). -% Define them by default for a numbered chapter. -\global\let\section = \numberedsec -\global\let\subsection = \numberedsubsec -\global\let\subsubsection = \numberedsubsubsec - -% Define @majorheading, @heading and @subheading - -% NOTE on use of \vbox for chapter headings, section headings, and -% such: -% 1) We use \vbox rather than the earlier \line to permit -% overlong headings to fold. -% 2) \hyphenpenalty is set to 10000 because hyphenation in a -% heading is obnoxious; this forbids it. -% 3) Likewise, headings look best if no \parindent is used, and -% if justification is not attempted. Hence \raggedright. - - -\def\majorheading{\parsearg\majorheadingzzz} -\def\majorheadingzzz #1{% -{\advance\chapheadingskip by 10pt \chapbreak }% -{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 200} - -\def\chapheading{\parsearg\chapheadingzzz} -\def\chapheadingzzz #1{\chapbreak % -{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 200} - -\def\heading{\parsearg\secheadingi} - -\def\subheading{\parsearg\subsecheadingi} - -\def\subsubheading{\parsearg\subsubsecheadingi} - -% These macros generate a chapter, section, etc. heading only -% (including whitespace, linebreaking, etc. around it), -% given all the information in convenient, parsed form. - -%%% Args are the skip and penalty (usually negative) -\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} - -\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} - -%%% Define plain chapter starts, and page on/off switching for it -% Parameter controlling skip before chapter headings (if needed) - -\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt - -\def\chapbreak{\dobreak \chapheadingskip {-4000}} -\def\chappager{\par\vfill\supereject} -\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} - -\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} - -\def\CHAPPAGoff{ -\global\let\pchapsepmacro=\chapbreak -\global\let\pagealignmacro=\chappager} - -\def\CHAPPAGon{ -\global\let\pchapsepmacro=\chappager -\global\let\pagealignmacro=\chappager -\global\def\HEADINGSon{\HEADINGSsingle}} - -\def\CHAPPAGodd{ -\global\let\pchapsepmacro=\chapoddpage -\global\let\pagealignmacro=\chapoddpage -\global\def\HEADINGSon{\HEADINGSdouble}} - -\CHAPPAGon - -\def\CHAPFplain{ -\global\let\chapmacro=\chfplain -\global\let\unnumbchapmacro=\unnchfplain} - -\def\chfplain #1#2{% - \pchapsepmacro - {% - \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #2\enspace #1}% - }% - \bigskip - \penalty5000 -} - -\def\unnchfplain #1{% -\pchapsepmacro % -{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 10000 % -} -\CHAPFplain % The default - -\def\unnchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 10000 % -} - -\def\chfopen #1#2{\chapoddpage {\chapfonts -\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% -\par\penalty 5000 % -} - -\def\CHAPFopen{ -\global\let\chapmacro=\chfopen -\global\let\unnumbchapmacro=\unnchfopen} - -% Parameter controlling skip before section headings. - -\newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt -\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} - -\newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt -\def\secheadingbreak{\dobreak \secheadingskip {-1000}} - -% @paragraphindent is defined for the Info formatting commands only. -\let\paragraphindent=\comment - -% Section fonts are the base font at magstep2, which produces -% a size a bit more than 14 points in the default situation. - -\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}} -\def\plainsecheading #1{\secheadingi {#1}} -\def\secheadingi #1{{\advance \secheadingskip by \parskip % -\secheadingbreak}% -{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}% -\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } - - -% Subsection fonts are the base font at magstep1, -% which produces a size of 12 points. - -\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}} -\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip % -\subsecheadingbreak}% -{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}% -\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } - -\def\subsubsecfonts{\subsecfonts} % Maybe this should change: - % Perhaps make sssec fonts scaled - % magstep half -\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}} -\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip % -\subsecheadingbreak}% -{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}% -\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000} - - -\message{toc printing,} - -% Finish up the main text and prepare to read what we've written -% to \contentsfile. - -\newskip\contentsrightmargin \contentsrightmargin=1in -\def\startcontents#1{% - \pagealignmacro - \immediate\closeout \contentsfile - \ifnum \pageno>0 - \pageno = -1 % Request roman numbered pages. - \fi - % Don't need to put `Contents' or `Short Contents' in the headline. - % It is abundantly clear what they are. - \unnumbchapmacro{#1}\def\thischapter{}% - \begingroup % Set up to handle contents files properly. - \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 - \catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi - \raggedbottom % Worry more about breakpoints than the bottom. - \advance\hsize by -\contentsrightmargin % Don't use the full line length. -} - - -% Normal (long) toc. -\outer\def\contents{% - \startcontents{\putwordTableofContents}% - \input \jobname.toc - \endgroup - \vfill \eject -} - -% And just the chapters. -\outer\def\summarycontents{% - \startcontents{\putwordShortContents}% - % - \let\chapentry = \shortchapentry - \let\unnumbchapentry = \shortunnumberedentry - % We want a true roman here for the page numbers. - \secfonts - \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl - \rm - \advance\baselineskip by 1pt % Open it up a little. - \def\secentry ##1##2##3##4{} - \def\unnumbsecentry ##1##2{} - \def\subsecentry ##1##2##3##4##5{} - \def\unnumbsubsecentry ##1##2{} - \def\subsubsecentry ##1##2##3##4##5##6{} - \def\unnumbsubsubsecentry ##1##2{} - \input \jobname.toc - \endgroup - \vfill \eject -} -\let\shortcontents = \summarycontents - -% These macros generate individual entries in the table of contents. -% The first argument is the chapter or section name. -% The last argument is the page number. -% The arguments in between are the chapter number, section number, ... - -% Chapter-level things, for both the long and short contents. -\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} - -% See comments in \dochapentry re vbox and related settings -\def\shortchapentry#1#2#3{% - \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}% -} - -% Typeset the label for a chapter or appendix for the short contents. -% The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter. -% We could simplify the code here by writing out an \appendixentry -% command in the toc file for appendices, instead of using \chapentry -% for both, but it doesn't seem worth it. -\setbox0 = \hbox{\shortcontrm \putwordAppendix } -\newdimen\shortappendixwidth \shortappendixwidth = \wd0 - -\def\shortchaplabel#1{% - % We typeset #1 in a box of constant width, regardless of the text of - % #1, so the chapter titles will come out aligned. - \setbox0 = \hbox{#1}% - \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi - % - % This space should be plenty, since a single number is .5em, and the - % widest letter (M) is 1em, at least in the Computer Modern fonts. - % (This space doesn't include the extra space that gets added after - % the label; that gets put in in \shortchapentry above.) - \advance\dimen0 by 1.1em - \hbox to \dimen0{#1\hfil}% -} - -\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} -\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}} - -% Sections. -\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} -\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} - -% Subsections. -\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} -\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} - -% And subsubsections. -\def\subsubsecentry#1#2#3#4#5#6{% - \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} -\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} - - -% This parameter controls the indentation of the various levels. -\newdimen\tocindent \tocindent = 3pc - -% Now for the actual typesetting. In all these, #1 is the text and #2 is the -% page number. -% -% If the toc has to be broken over pages, we would want to be at chapters -% if at all possible; hence the \penalty. -\def\dochapentry#1#2{% - \penalty-300 \vskip\baselineskip - \begingroup - \chapentryfonts - \tocentry{#1}{\dopageno{#2}}% - \endgroup - \nobreak\vskip .25\baselineskip -} - -\def\dosecentry#1#2{\begingroup - \secentryfonts \leftskip=\tocindent - \tocentry{#1}{\dopageno{#2}}% -\endgroup} - -\def\dosubsecentry#1#2{\begingroup - \subsecentryfonts \leftskip=2\tocindent - \tocentry{#1}{\dopageno{#2}}% -\endgroup} - -\def\dosubsubsecentry#1#2{\begingroup - \subsubsecentryfonts \leftskip=3\tocindent - \tocentry{#1}{\dopageno{#2}}% -\endgroup} - -% Final typesetting of a toc entry; we use the same \entry macro as for -% the index entries, but we want to suppress hyphenation here. (We -% can't do that in the \entry macro, since index entries might consist -% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) -% -\def\tocentry#1#2{\begingroup - \hyphenpenalty = 10000 - \entry{#1}{#2}% -\endgroup} - -% Space between chapter (or whatever) number and the title. -\def\labelspace{\hskip1em \relax} - -\def\dopageno#1{{\rm #1}} -\def\doshortpageno#1{{\rm #1}} - -\def\chapentryfonts{\secfonts \rm} -\def\secentryfonts{\textfonts} -\let\subsecentryfonts = \textfonts -\let\subsubsecentryfonts = \textfonts - - -\message{environments,} - -% Since these characters are used in examples, it should be an even number of -% \tt widths. Each \tt character is 1en, so two makes it 1em. -% Furthermore, these definitions must come after we define our fonts. -\newbox\dblarrowbox \newbox\longdblarrowbox -\newbox\pushcharbox \newbox\bullbox -\newbox\equivbox \newbox\errorbox - -\let\ptexequiv = \equiv - -%{\tentt -%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} -%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} -%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} -%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} -% Adapted from the manmac format (p.420 of TeXbook) -%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex -% depth .1ex\hfil} -%} - -\def\point{$\star$} - -\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} -\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} -\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} - -\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} - -% Adapted from the TeXbook's \boxit. -{\tentt \global\dimen0 = 3em}% Width of the box. -\dimen2 = .55pt % Thickness of rules -% The text. (`r' is open on the right, `e' somewhat less so on the left.) -\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} - -\global\setbox\errorbox=\hbox to \dimen0{\hfil - \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. - \advance\hsize by -2\dimen2 % Rules. - \vbox{ - \hrule height\dimen2 - \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. - \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. - \kern3pt\vrule width\dimen2}% Space to right. - \hrule height\dimen2} - \hfil} - -% The @error{} command. -\def\error{\leavevmode\lower.7ex\copy\errorbox} - -% @tex ... @end tex escapes into raw Tex temporarily. -% One exception: @ is still an escape character, so that @end tex works. -% But \@ or @@ will get a plain tex @ character. - -\def\tex{\begingroup -\catcode `\\=0 \catcode `\{=1 \catcode `\}=2 -\catcode `\$=3 \catcode `\&=4 \catcode `\#=6 -\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie -\catcode `\%=14 -\catcode 43=12 -\catcode`\"=12 -\catcode`\==12 -\catcode`\|=12 -\catcode`\<=12 -\catcode`\>=12 -\escapechar=`\\ -% -\let\~=\ptextilde -\let\{=\ptexlbrace -\let\}=\ptexrbrace -\let\.=\ptexdot -\let\*=\ptexstar -\let\dots=\ptexdots -\def\@{@}% -\let\bullet=\ptexbullet -\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl -\let\L=\ptexL -% -\let\Etex=\endgroup} - -% Define @lisp ... @endlisp. -% @lisp does a \begingroup so it can rebind things, -% including the definition of @endlisp (which normally is erroneous). - -% Amount to narrow the margins by for @lisp. -\newskip\lispnarrowing \lispnarrowing=0.4in - -% This is the definition that ^^M gets inside @lisp, @example, and other -% such environments. \null is better than a space, since it doesn't -% have any width. -\def\lisppar{\null\endgraf} - -% Make each space character in the input produce a normal interword -% space in the output. Don't allow a line break at this space, as this -% is used only in environments like @example, where each line of input -% should produce a line of output anyway. -% -{\obeyspaces % -\gdef\sepspaces{\obeyspaces\let =\tie}} - -% Define \obeyedspace to be our active space, whatever it is. This is -% for use in \parsearg. -{\sepspaces% -\global\let\obeyedspace= } - -% This space is always present above and below environments. -\newskip\envskipamount \envskipamount = 0pt - -% Make spacing and below environment symmetrical. We use \parskip here -% to help in doing that, since in @example-like environments \parskip -% is reset to zero; thus the \afterenvbreak inserts no space -- but the -% start of the next paragraph will insert \parskip -% -\def\aboveenvbreak{{\advance\envskipamount by \parskip -\endgraf \ifdim\lastskip<\envskipamount -\removelastskip \penalty-50 \vskip\envskipamount \fi}} - -\let\afterenvbreak = \aboveenvbreak - -% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. -\let\nonarrowing=\relax - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \cartouche: draw rectangle w/rounded corners around argument -\font\circle=lcircle10 -\newdimen\circthick -\newdimen\cartouter\newdimen\cartinner -\newskip\normbskip\newskip\normpskip\newskip\normlskip -\circthick=\fontdimen8\circle -% -\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth -\def\ctr{{\hskip 6pt\circle\char'010}} -\def\cbl{{\circle\char'012\hskip -6pt}} -\def\cbr{{\hskip 6pt\circle\char'011}} -\def\carttop{\hbox to \cartouter{\hskip\lskip - \ctl\leaders\hrule height\circthick\hfil\ctr - \hskip\rskip}} -\def\cartbot{\hbox to \cartouter{\hskip\lskip - \cbl\leaders\hrule height\circthick\hfil\cbr - \hskip\rskip}} -% -\newskip\lskip\newskip\rskip - -\long\def\cartouche{% -\begingroup - \lskip=\leftskip \rskip=\rightskip - \leftskip=0pt\rightskip=0pt %we want these *outside*. - \cartinner=\hsize \advance\cartinner by-\lskip - \advance\cartinner by-\rskip - \cartouter=\hsize - \advance\cartouter by 18pt % allow for 3pt kerns on either -% side, and for 6pt waste from -% each corner char - \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip - % Flag to tell @lisp, etc., not to narrow margin. - \let\nonarrowing=\comment - \vbox\bgroup - \baselineskip=0pt\parskip=0pt\lineskip=0pt - \carttop - \hbox\bgroup - \hskip\lskip - \vrule\kern3pt - \vbox\bgroup - \hsize=\cartinner - \kern3pt - \begingroup - \baselineskip=\normbskip - \lineskip=\normlskip - \parskip=\normpskip - \vskip -\parskip -\def\Ecartouche{% - \endgroup - \kern3pt - \egroup - \kern3pt\vrule - \hskip\rskip - \egroup - \cartbot - \egroup -\endgroup -}} - - -% This macro is called at the beginning of all the @example variants, -% inside a group. -\def\nonfillstart{% - \aboveenvbreak - \inENV % This group ends at the end of the body - \hfuzz = 12pt % Don't be fussy - \sepspaces % Make spaces be word-separators rather than space tokens. - \singlespace - \let\par = \lisppar % don't ignore blank lines - \obeylines % each line of input is a line of output - \parskip = 0pt - \parindent = 0pt - \emergencystretch = 0pt % don't try to avoid overfull boxes - % @cartouche defines \nonarrowing to inhibit narrowing - % at next level down. - \ifx\nonarrowing\relax - \advance \leftskip by \lispnarrowing - \exdentamount=\lispnarrowing - \let\exdent=\nofillexdent - \let\nonarrowing=\relax - \fi -} - -% To ending an @example-like environment, we first end the paragraph -% (via \afterenvbreak's vertical glue), and then the group. That way we -% keep the zero \parskip that the environments set -- \parskip glue -% will be inserted at the beginning of the next paragraph in the -% document, after the environment. -% -\def\nonfillfinish{\afterenvbreak\endgroup}% - -% This macro is -\def\lisp{\begingroup - \nonfillstart - \let\Elisp = \nonfillfinish - \tt - \rawbackslash % have \ input char produce \ char from current font - \gobble -} - -% Define the \E... control sequence only if we are inside the -% environment, so the error checking in \end will work. -% -% We must call \lisp last in the definition, since it reads the -% return following the @example (or whatever) command. -% -\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} -\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp} -\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp} - -% @smallexample and @smalllisp. This is not used unless the @smallbook -% command is given. Originally contributed by Pavel@xerox. -% -\def\smalllispx{\begingroup - \nonfillstart - \let\Esmalllisp = \nonfillfinish - \let\Esmallexample = \nonfillfinish - % - % Smaller interline space and fonts for small examples. - \setleading{10pt}% - \indexfonts \tt - \rawbackslash % make \ output the \ character from the current font (tt) - \gobble -} - -% This is @display; same as @lisp except use roman font. -% -\def\display{\begingroup - \nonfillstart - \let\Edisplay = \nonfillfinish - \gobble -} - -% This is @format; same as @display except don't narrow margins. -% -\def\format{\begingroup - \let\nonarrowing = t - \nonfillstart - \let\Eformat = \nonfillfinish - \gobble -} - -% @flushleft (same as @format) and @flushright. -% -\def\flushleft{\begingroup - \let\nonarrowing = t - \nonfillstart - \let\Eflushleft = \nonfillfinish - \gobble -} -\def\flushright{\begingroup - \let\nonarrowing = t - \nonfillstart - \let\Eflushright = \nonfillfinish - \advance\leftskip by 0pt plus 1fill - \gobble} - -% @quotation does normal linebreaking (hence we can't use \nonfillstart) -% and narrows the margins. -% -\def\quotation{% - \begingroup\inENV %This group ends at the end of the @quotation body - {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip - \singlespace - \parindent=0pt - % We have retained a nonzero parskip for the environment, since we're - % doing normal filling. So to avoid extra space below the environment... - \def\Equotation{\parskip = 0pt \nonfillfinish}% - % - % @cartouche defines \nonarrowing to inhibit narrowing at next level down. - \ifx\nonarrowing\relax - \advance\leftskip by \lispnarrowing - \advance\rightskip by \lispnarrowing - \exdentamount = \lispnarrowing - \let\nonarrowing = \relax - \fi -} - -\message{defuns,} -% Define formatter for defuns -% First, allow user to change definition object font (\df) internally -\def\setdeffont #1 {\csname DEF#1\endcsname} - -\newskip\defbodyindent \defbodyindent=.4in -\newskip\defargsindent \defargsindent=50pt -\newskip\deftypemargin \deftypemargin=12pt -\newskip\deflastargmargin \deflastargmargin=18pt - -\newcount\parencount -% define \functionparens, which makes ( and ) and & do special things. -% \functionparens affects the group it is contained in. -\def\activeparens{% -\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active -\catcode`\[=\active \catcode`\]=\active} - -% Make control sequences which act like normal parenthesis chars. -\let\lparen = ( \let\rparen = ) - -{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) - -% Be sure that we always have a definition for `(', etc. For example, -% if the fn name has parens in it, \boldbrax will not be in effect yet, -% so TeX would otherwise complain about undefined control sequence. -\global\let(=\lparen \global\let)=\rparen -\global\let[=\lbrack \global\let]=\rbrack - -\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } -\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} -% This is used to turn on special parens -% but make & act ordinary (given that it's active). -\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr} - -% Definitions of (, ) and & used in args for functions. -% This is the definition of ( outside of all parentheses. -\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested % -\global\advance\parencount by 1 } -% -% This is the definition of ( when already inside a level of parens. -\gdef\opnested{\char`\(\global\advance\parencount by 1 } -% -\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. -% also in that case restore the outer-level definition of (. -\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi -\global\advance \parencount by -1 } -% If we encounter &foo, then turn on ()-hacking afterwards -\gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } -% -\gdef\normalparens{\boldbrax\let&=\ampnr} -} % End of definition inside \activeparens -%% These parens (in \boldbrax) actually are a little bolder than the -%% contained text. This is especially needed for [ and ] -\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&} -\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}} - -% First, defname, which formats the header line itself. -% #1 should be the function name. -% #2 should be the type of definition, such as "Function". - -\def\defname #1#2{% -% Get the values of \leftskip and \rightskip as they were -% outside the @def... -\dimen2=\leftskip -\advance\dimen2 by -\defbodyindent -\dimen3=\rightskip -\advance\dimen3 by -\defbodyindent -\noindent % -\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% -\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line -\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations -\parshape 2 0in \dimen0 \defargsindent \dimen1 % -% Now output arg 2 ("Function" or some such) -% ending at \deftypemargin from the right margin, -% but stuck inside a box of width 0 so it does not interfere with linebreaking -{% Adjust \hsize to exclude the ambient margins, -% so that \rightline will obey them. -\advance \hsize by -\dimen2 \advance \hsize by -\dimen3 -\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}% -% Make all lines underfull and no complaints: -\tolerance=10000 \hbadness=10000 -\advance\leftskip by -\defbodyindent -\exdentamount=\defbodyindent -{\df #1}\enskip % Generate function name -} - -% Actually process the body of a definition -% #1 should be the terminating control sequence, such as \Edefun. -% #2 should be the "another name" control sequence, such as \defunx. -% #3 should be the control sequence that actually processes the header, -% such as \defunheader. - -\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2{\begingroup\obeylines\activeparens\spacesplit#3}% -\parindent=0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup % -\catcode 61=\active % 61 is `=' -\obeylines\activeparens\spacesplit#3} - -\def\defmethparsebody #1#2#3#4 {\begingroup\inENV % -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% -\parindent=0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup\obeylines\activeparens\spacesplit{#3{#4}}} - -\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2##1 ##2 {\def#4{##1}% -\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% -\parindent=0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup\obeylines\activeparens\spacesplit{#3{#5}}} - -% These parsing functions are similar to the preceding ones -% except that they do not make parens into active characters. -% These are used for "variables" since they have no arguments. - -\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2{\begingroup\obeylines\spacesplit#3}% -\parindent=0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup % -\catcode 61=\active % -\obeylines\spacesplit#3} - -% This is used for \def{tp,vr}parsebody. It could probably be used for -% some of the others, too, with some judicious conditionals. -% -\def\parsebodycommon#1#2#3{% - \begingroup\inENV % - \medbreak % - % Define the end token that this defining construct specifies - % so that it will exit this group. - \def#1{\endgraf\endgroup\medbreak}% - \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% - \parindent=0in - \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent - \exdentamount=\defbodyindent - \begingroup\obeylines -} - -\def\defvrparsebody#1#2#3#4 {% - \parsebodycommon{#1}{#2}{#3}% - \spacesplit{#3{#4}}% -} - -% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the -% type is just `struct', because we lose the braces in `{struct -% termios}' when \spacesplit reads its undelimited argument. Sigh. -% \let\deftpparsebody=\defvrparsebody -% -% So, to get around this, we put \empty in with the type name. That -% way, TeX won't find exactly `{...}' as an undelimited argument, and -% won't strip off the braces. -% -\def\deftpparsebody #1#2#3#4 {% - \parsebodycommon{#1}{#2}{#3}% - \spacesplit{\parsetpheaderline{#3{#4}}}\empty -} - -% Fine, but then we have to eventually remove the \empty *and* the -% braces (if any). That's what this does, putting the result in \tptemp. -% -\def\removeemptybraces\empty#1\relax{\def\tptemp{#1}}% - -% After \spacesplit has done its work, this is called -- #1 is the final -% thing to call, #2 the type name (which starts with \empty), and #3 -% (which might be empty) the arguments. -% -\def\parsetpheaderline#1#2#3{% - \removeemptybraces#2\relax - #1{\tptemp}{#3}% -}% - -\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2##1 ##2 {\def#4{##1}% -\begingroup\obeylines\spacesplit{#3{##2}}}% -\parindent=0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup\obeylines\spacesplit{#3{#5}}} - -% Split up #2 at the first space token. -% call #1 with two arguments: -% the first is all of #2 before the space token, -% the second is all of #2 after that space token. -% If #2 contains no space token, all of it is passed as the first arg -% and the second is passed as empty. - -{\obeylines -\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% -\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% -\ifx\relax #3% -#1{#2}{}\else #1{#2}{#3#4}\fi}} - -% So much for the things common to all kinds of definitions. - -% Define @defun. - -% First, define the processing that is wanted for arguments of \defun -% Use this to expand the args and terminate the paragraph they make up - -\def\defunargs #1{\functionparens \sl -% Expand, preventing hyphenation at `-' chars. -% Note that groups don't affect changes in \hyphenchar. -\hyphenchar\tensl=0 -#1% -\hyphenchar\tensl=45 -\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi% -\interlinepenalty=10000 -\advance\rightskip by 0pt plus 1fil -\endgraf\penalty 10000\vskip -\parskip\penalty 10000% -} - -\def\deftypefunargs #1{% -% Expand, preventing hyphenation at `-' chars. -% Note that groups don't affect changes in \hyphenchar. -% Use \boldbraxnoamp, not \functionparens, so that & is not special. -\boldbraxnoamp -\tclose{#1}% avoid \code because of side effects on active chars -\interlinepenalty=10000 -\advance\rightskip by 0pt plus 1fil -\endgraf\penalty 10000\vskip -\parskip\penalty 10000% -} - -% Do complete processing of one @defun or @defunx line already parsed. - -% @deffn Command forward-char nchars - -\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} - -\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% -\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @defun == @deffn Function - -\def\defun{\defparsebody\Edefun\defunx\defunheader} - -\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{Function}% -\defunargs {#2}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @deftypefun int foobar (int @var{foo}, float @var{bar}) - -\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} - -% #1 is the data type. #2 is the name and args. -\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} -% #1 is the data type, #2 the name, #3 the args. -\def\deftypefunheaderx #1#2 #3\relax{% -\doind {fn}{\code{#2}}% Make entry in function index -\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}% -\deftypefunargs {#3}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) - -\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} - -% \defheaderxcond#1\relax$$$ -% puts #1 in @code, followed by a space, but does nothing if #1 is null. -\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi} - -% #1 is the classification. #2 is the data type. #3 is the name and args. -\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} -% #1 is the classification, #2 the data type, #3 the name, #4 the args. -\def\deftypefnheaderx #1#2#3 #4\relax{% -\doind {fn}{\code{#3}}% Make entry in function index -\begingroup -\normalparens % notably, turn off `&' magic, which prevents -% at least some C++ text from working -\defname {\defheaderxcond#2\relax$$$#3}{#1}% -\deftypefunargs {#4}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @defmac == @deffn Macro - -\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} - -\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{Macro}% -\defunargs {#2}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @defspec == @deffn Special Form - -\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} - -\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{Special Form}% -\defunargs {#2}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% This definition is run if you use @defunx -% anywhere other than immediately after a @defun or @defunx. - -\def\deffnx #1 {\errmessage{@deffnx in invalid context}} -\def\defunx #1 {\errmessage{@defunx in invalid context}} -\def\defmacx #1 {\errmessage{@defmacx in invalid context}} -\def\defspecx #1 {\errmessage{@defspecx in invalid context}} -\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}} -\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}} - -% @defmethod, and so on - -% @defop {Funny Method} foo-class frobnicate argument - -\def\defop #1 {\def\defoptype{#1}% -\defopparsebody\Edefop\defopx\defopheader\defoptype} - -\def\defopheader #1#2#3{% -\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index -\begingroup\defname {#2}{\defoptype{} on #1}% -\defunargs {#3}\endgroup % -} - -% @defmethod == @defop Method - -\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} - -\def\defmethodheader #1#2#3{% -\dosubind {fn}{\code{#2}}{on #1}% entry in function index -\begingroup\defname {#2}{Method on #1}% -\defunargs {#3}\endgroup % -} - -% @defcv {Class Option} foo-class foo-flag - -\def\defcv #1 {\def\defcvtype{#1}% -\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} - -\def\defcvarheader #1#2#3{% -\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index -\begingroup\defname {#2}{\defcvtype{} of #1}% -\defvarargs {#3}\endgroup % -} - -% @defivar == @defcv {Instance Variable} - -\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} - -\def\defivarheader #1#2#3{% -\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index -\begingroup\defname {#2}{Instance Variable of #1}% -\defvarargs {#3}\endgroup % -} - -% These definitions are run if you use @defmethodx, etc., -% anywhere other than immediately after a @defmethod, etc. - -\def\defopx #1 {\errmessage{@defopx in invalid context}} -\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}} -\def\defcvx #1 {\errmessage{@defcvx in invalid context}} -\def\defivarx #1 {\errmessage{@defivarx in invalid context}} - -% Now @defvar - -% First, define the processing that is wanted for arguments of @defvar. -% This is actually simple: just print them in roman. -% This must expand the args and terminate the paragraph they make up -\def\defvarargs #1{\normalparens #1% -\interlinepenalty=10000 -\endgraf\penalty 10000\vskip -\parskip\penalty 10000} - -% @defvr Counter foo-count - -\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} - -\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% -\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} - -% @defvar == @defvr Variable - -\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} - -\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index -\begingroup\defname {#1}{Variable}% -\defvarargs {#2}\endgroup % -} - -% @defopt == @defvr {User Option} - -\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} - -\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index -\begingroup\defname {#1}{User Option}% -\defvarargs {#2}\endgroup % -} - -% @deftypevar int foobar - -\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} - -% #1 is the data type. #2 is the name. -\def\deftypevarheader #1#2{% -\doind {vr}{\code{#2}}% Make entry in variables index -\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}% -\interlinepenalty=10000 -\endgraf\penalty 10000\vskip -\parskip\penalty 10000 -\endgroup} - -% @deftypevr {Global Flag} int enable - -\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} - -\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}% -\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} -\interlinepenalty=10000 -\endgraf\penalty 10000\vskip -\parskip\penalty 10000 -\endgroup} - -% This definition is run if you use @defvarx -% anywhere other than immediately after a @defvar or @defvarx. - -\def\defvrx #1 {\errmessage{@defvrx in invalid context}} -\def\defvarx #1 {\errmessage{@defvarx in invalid context}} -\def\defoptx #1 {\errmessage{@defoptx in invalid context}} -\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}} -\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}} - -% Now define @deftp -% Args are printed in bold, a slight difference from @defvar. - -\def\deftpargs #1{\bf \defvarargs{#1}} - -% @deftp Class window height width ... - -\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} - -\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% -\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} - -% This definition is run if you use @deftpx, etc -% anywhere other than immediately after a @deftp, etc. - -\def\deftpx #1 {\errmessage{@deftpx in invalid context}} - -\message{cross reference,} -% Define cross-reference macros -\newwrite \auxfile - -\newif\ifhavexrefs % True if xref values are known. -\newif\ifwarnedxrefs % True if we warned once that they aren't known. - -% \setref{foo} defines a cross-reference point named foo. - -\def\setref#1{% -\dosetq{#1-title}{Ytitle}% -\dosetq{#1-pg}{Ypagenumber}% -\dosetq{#1-snt}{Ysectionnumberandtype}} - -\def\unnumbsetref#1{% -\dosetq{#1-title}{Ytitle}% -\dosetq{#1-pg}{Ypagenumber}% -\dosetq{#1-snt}{Ynothing}} - -\def\appendixsetref#1{% -\dosetq{#1-title}{Ytitle}% -\dosetq{#1-pg}{Ypagenumber}% -\dosetq{#1-snt}{Yappendixletterandtype}} - -% \xref, \pxref, and \ref generate cross-references to specified points. -% For \xrefX, #1 is the node name, #2 the name of the Info -% cross-reference, #3 the printed node name, #4 the name of the Info -% file, #5 the name of the printed manual. All but the node name can be -% omitted. -% -\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} -\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} -\def\ref#1{\xrefX[#1,,,,,,,]} -\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup - \def\printedmanual{\ignorespaces #5}% - \def\printednodename{\ignorespaces #3}% - \setbox1=\hbox{\printedmanual}% - \setbox0=\hbox{\printednodename}% - \ifdim \wd0 = 0pt - % No printed node name was explicitly given. - \ifx\SETxref-automatic-section-title\relax % - % Use the actual chapter/section title appear inside - % the square brackets. Use the real section title if we have it. - \ifdim \wd1>0pt% - % It is in another manual, so we don't have it. - \def\printednodename{\ignorespaces #1}% - \else - \ifhavexrefs - % We know the real title if we have the xref values. - \def\printednodename{\refx{#1-title}}% - \else - % Otherwise just copy the Info node name. - \def\printednodename{\ignorespaces #1}% - \fi% - \fi - \def\printednodename{#1-title}% - \else - % Use the node name inside the square brackets. - \def\printednodename{\ignorespaces #1}% - \fi - \fi - % - % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not - % insert empty discretionaries after hyphens, which means that it will - % not find a line break at a hyphen in a node names. Since some manuals - % are best written with fairly long node names, containing hyphens, this - % is a loss. Therefore, we give the text of the node name again, so it - % is as if TeX is seeing it for the first time. - \ifdim \wd1 > 0pt - \putwordsection{} ``\printednodename'' in \cite{\printedmanual}% - \else - % _ (for example) has to be the character _ for the purposes of the - % control sequence corresponding to the node, but it has to expand - % into the usual \leavevmode...\vrule stuff for purposes of - % printing. So we \turnoffactive for the \refx-snt, back on for the - % printing, back off for the \refx-pg. - {\turnoffactive \refx{#1-snt}{}}% - \space [\printednodename],\space - \turnoffactive \putwordpage\tie\refx{#1-pg}{}% - \fi -\endgroup} - -% \dosetq is the interface for calls from other macros - -% Use \turnoffactive so that punctuation chars such as underscore -% work in node names. -\def\dosetq #1#2{{\let\folio=0 \turnoffactive \auxhat% -\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% -\next}} - -% \internalsetq {foo}{page} expands into -% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} -% When the aux file is read, ' is the escape character - -\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} - -% Things to be expanded by \internalsetq - -\def\Ypagenumber{\folio} - -\def\Ytitle{\thissection} - -\def\Ynothing{} - -\def\Ysectionnumberandtype{% -\ifnum\secno=0 \putwordChapter\xreftie\the\chapno % -\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno % -\else \ifnum \subsubsecno=0 % -\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % -\else % -\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % -\fi \fi \fi } - -\def\Yappendixletterandtype{% -\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}% -\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno % -\else \ifnum \subsubsecno=0 % -\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno % -\else % -\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % -\fi \fi \fi } - -\gdef\xreftie{'tie} - -% Use TeX 3.0's \inputlineno to get the line number, for better error -% messages, but if we're using an old version of TeX, don't do anything. -% -\ifx\inputlineno\thisisundefined - \let\linenumber = \empty % Non-3.0. -\else - \def\linenumber{\the\inputlineno:\space} -\fi - -% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. -% If its value is nonempty, SUFFIX is output afterward. - -\def\refx#1#2{% - \expandafter\ifx\csname X#1\endcsname\relax - % If not defined, say something at least. - $\langle$un\-de\-fined$\rangle$% - \ifhavexrefs - \message{\linenumber Undefined cross reference `#1'.}% - \else - \ifwarnedxrefs\else - \global\warnedxrefstrue - \message{Cross reference values unknown; you must run TeX again.}% - \fi - \fi - \else - % It's defined, so just use it. - \csname X#1\endcsname - \fi - #2% Output the suffix in any case. -} - -% Read the last existing aux file, if any. No error if none exists. - -% This is the macro invoked by entries in the aux file. -\def\xrdef #1#2{ -{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}} - -\def\readauxfile{% -\begingroup -\catcode `\^^@=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\^^C=\other -\catcode `\^^D=\other -\catcode `\^^E=\other -\catcode `\^^F=\other -\catcode `\^^G=\other -\catcode `\^^H=\other -\catcode `\ =\other -\catcode `\^^L=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode 26=\other -\catcode `\^^[=\other -\catcode `\^^\=\other -\catcode `\^^]=\other -\catcode `\^^^=\other -\catcode `\^^_=\other -\catcode `\@=\other -\catcode `\^=\other -\catcode `\~=\other -\catcode `\[=\other -\catcode `\]=\other -\catcode`\"=\other -\catcode`\_=\other -\catcode`\|=\other -\catcode`\<=\other -\catcode`\>=\other -\catcode `\$=\other -\catcode `\#=\other -\catcode `\&=\other -% `\+ does not work, so use 43. -\catcode 43=\other -% Make the characters 128-255 be printing characters -{% - \count 1=128 - \def\loop{% - \catcode\count 1=\other - \advance\count 1 by 1 - \ifnum \count 1<256 \loop \fi - }% -}% -% the aux file uses ' as the escape. -% Turn off \ as an escape so we do not lose on -% entries which were dumped with control sequences in their names. -% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ -% Reference to such entries still does not work the way one would wish, -% but at least they do not bomb out when the aux file is read in. -\catcode `\{=1 \catcode `\}=2 -\catcode `\%=\other -\catcode `\'=0 -\catcode`\^=7 % to make ^^e4 etc usable in xref tags -\catcode `\\=\other -\openin 1 \jobname.aux -\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue -\global\warnedobstrue -\fi -% Open the new aux file. Tex will close it automatically at exit. -\openout \auxfile=\jobname.aux -\endgroup} - - -% Footnotes. - -\newcount \footnoteno - -% The trailing space in the following definition for supereject is -% vital for proper filling; pages come out unaligned when you do a -% pagealignmacro call if that space before the closing brace is -% removed. -\def\supereject{\par\penalty -20000\footnoteno =0 } - -% @footnotestyle is meaningful for info output only.. -\let\footnotestyle=\comment - -\let\ptexfootnote=\footnote - -{\catcode `\@=11 -% -% Auto-number footnotes. Otherwise like plain. -\gdef\footnote{% - \global\advance\footnoteno by \@ne - \edef\thisfootno{$^{\the\footnoteno}$}% - % - % In case the footnote comes at the end of a sentence, preserve the - % extra spacing after we do the footnote number. - \let\@sf\empty - \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi - % - % Remove inadvertent blank space before typesetting the footnote number. - \unskip - \thisfootno\@sf - \footnotezzz -}% - -% Don't bother with the trickery in plain.tex to not require the -% footnote text as a parameter. Our footnotes don't need to be so general. -% -\long\gdef\footnotezzz#1{\insert\footins{% - % We want to typeset this text as a normal paragraph, even if the - % footnote reference occurs in (for example) a display environment. - % So reset some parameters. - \interlinepenalty\interfootnotelinepenalty - \splittopskip\ht\strutbox % top baseline for broken footnotes - \splitmaxdepth\dp\strutbox - \floatingpenalty\@MM - \leftskip\z@skip - \rightskip\z@skip - \spaceskip\z@skip - \xspaceskip\z@skip - \parindent\defaultparindent - % - % Hang the footnote text off the number. - \hang - \textindent{\thisfootno}% - % - % Don't crash into the line above the footnote text. Since this - % expands into a box, it must come within the paragraph, lest it - % provide a place where TeX can split the footnote. - \footstrut - #1\strut}% -} - -}%end \catcode `\@=11 - -% Set the baselineskip to #1, and the lineskip and strut size -% correspondingly. There is no deep meaning behind these magic numbers -% used as factors; they just match (closely enough) what Knuth defined. -% -\def\lineskipfactor{.08333} -\def\strutheightpercent{.70833} -\def\strutdepthpercent {.29167} -% -\def\setleading#1{% - \normalbaselineskip = #1\relax - \normallineskip = \lineskipfactor\normalbaselineskip - \normalbaselines - \setbox\strutbox =\hbox{% - \vrule width0pt height\strutheightpercent\baselineskip - depth \strutdepthpercent \baselineskip - }% -} - -% @| inserts a changebar to the left of the current line. It should -% surround any changed text. This approach does *not* work if the -% change spans more than two lines of output. To handle that, we would -% have adopt a much more difficult approach (putting marks into the main -% vertical list for the beginning and end of each change). -% -\def\|{% - % \vadjust can only be used in horizontal mode. - \leavevmode - % - % Append this vertical mode material after the current line in the output. - \vadjust{% - % We want to insert a rule with the height and depth of the current - % leading; that is exactly what \strutbox is supposed to record. - \vskip-\baselineskip - % - % \vadjust-items are inserted at the left edge of the type. So - % the \llap here moves out into the left-hand margin. - \llap{% - % - % For a thicker or thinner bar, change the `1pt'. - \vrule height\baselineskip width1pt - % - % This is the space between the bar and the text. - \hskip 12pt - }% - }% -} - -% For a final copy, take out the rectangles -% that mark overfull boxes (in case you have decided -% that the text looks ok even though it passes the margin). -% -\def\finalout{\overfullrule=0pt} - - -% End of control word definitions. - -\message{and turning on texinfo input format.} - -\def\openindices{% - \newindex{cp}% - \newcodeindex{fn}% - \newcodeindex{vr}% - \newcodeindex{tp}% - \newcodeindex{ky}% - \newcodeindex{pg}% -} - -% Set some numeric style parameters, for 8.5 x 11 format. - -%\hsize = 6.5in -\newdimen\defaultparindent \defaultparindent = 15pt -\parindent = \defaultparindent -\parskip 18pt plus 1pt -\setleading{15pt} -\advance\topskip by 1.2cm - -% Prevent underfull vbox error messages. -\vbadness=10000 - -% Following George Bush, just get rid of widows and orphans. -\widowpenalty=10000 -\clubpenalty=10000 - -% Use TeX 3.0's \emergencystretch to help line breaking, but if we're -% using an old version of TeX, don't do anything. We want the amount of -% stretch added to depend on the line length, hence the dependence on -% \hsize. This makes it come to about 9pt for the 8.5x11 format. -% -\ifx\emergencystretch\thisisundefined - % Allow us to assign to \emergencystretch anyway. - \def\emergencystretch{\dimen0}% -\else - \emergencystretch = \hsize - \divide\emergencystretch by 45 -\fi - -% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) -\def\smallbook{ - -% These values for secheadingskip and subsecheadingskip are -% experiments. RJC 7 Aug 1992 -\global\secheadingskip = 17pt plus 6pt minus 3pt -\global\subsecheadingskip = 14pt plus 6pt minus 3pt - -\global\lispnarrowing = 0.3in -\setleading{12pt} -\advance\topskip by -1cm -\global\parskip 3pt plus 1pt -\global\hsize = 5in -\global\vsize=7.5in -\global\tolerance=700 -\global\hfuzz=1pt -\global\contentsrightmargin=0pt -\global\deftypemargin=0pt -\global\defbodyindent=.5cm - -\global\pagewidth=\hsize -\global\pageheight=\vsize - -\global\let\smalllisp=\smalllispx -\global\let\smallexample=\smalllispx -\global\def\Esmallexample{\Esmalllisp} -} - -% Use @afourpaper to print on European A4 paper. -\def\afourpaper{ -\global\tolerance=700 -\global\hfuzz=1pt -\setleading{12pt} -\global\parskip 15pt plus 1pt - -\global\vsize= 53\baselineskip -\advance\vsize by \topskip -%\global\hsize= 5.85in % A4 wide 10pt -\global\hsize= 6.5in -\global\outerhsize=\hsize -\global\advance\outerhsize by 0.5in -\global\outervsize=\vsize -\global\advance\outervsize by 0.6in - -\global\pagewidth=\hsize -\global\pageheight=\vsize -} - -% Allow control of the text dimensions. Parameters in order: textheight; -% textwidth; \voffset; \hoffset (!); binding offset. All require a dimension; -% header is additional; added length extends the bottom of the page. - -\def\changepagesizes#1#2#3#4#5{ - \global\vsize= #1 - \advance\vsize by \topskip - \global\voffset= #3 - \global\hsize= #2 - \global\outerhsize=\hsize - \global\advance\outerhsize by 0.5in - \global\outervsize=\vsize - \global\advance\outervsize by 0.6in - \global\pagewidth=\hsize - \global\pageheight=\vsize - \global\normaloffset= #4 - \global\bindingoffset= #5} - -% This layout is compatible with Latex on A4 paper. - -\def\afourlatex{\changepagesizes{22cm}{15cm}{7mm}{4.6mm}{5mm}} - -% Use @afourwide to print on European A4 paper in wide format. -\def\afourwide{\afourpaper -\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}} - -% Define macros to output various characters with catcode for normal text. -\catcode`\"=\other -\catcode`\~=\other -\catcode`\^=\other -\catcode`\_=\other -\catcode`\|=\other -\catcode`\<=\other -\catcode`\>=\other -\catcode`\+=\other -\def\normaldoublequote{"} -\def\normaltilde{~} -\def\normalcaret{^} -\def\normalunderscore{_} -\def\normalverticalbar{|} -\def\normalless{<} -\def\normalgreater{>} -\def\normalplus{+} - -% This macro is used to make a character print one way in ttfont -% where it can probably just be output, and another way in other fonts, -% where something hairier probably needs to be done. -% -% #1 is what to print if we are indeed using \tt; #2 is what to print -% otherwise. Since all the Computer Modern typewriter fonts have zero -% interword stretch (and shrink), and it is reasonable to expect all -% typewriter fonts to have this, we can check that font parameter. -% -\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi} - -% Turn off all special characters except @ -% (and those which the user can use as if they were ordinary). -% Most of these we simply print from the \tt font, but for some, we can -% use math or other variants that look better in normal text. - -\catcode`\"=\active -\def\activedoublequote{{\tt \char '042}} -\let"=\activedoublequote -\catcode`\~=\active -\def~{{\tt \char '176}} -\chardef\hat=`\^ -\catcode`\^=\active -\def\auxhat{\def^{'hat}} -\def^{{\tt \hat}} - -\catcode`\_=\active -\def_{\ifusingtt\normalunderscore\_} -% Subroutine for the previous macro. -\def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}} - -% \lvvmode is equivalent in function to \leavevmode. -% Using \leavevmode runs into trouble when written out to -% an index file due to the expansion of \leavevmode into ``\unhbox -% \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our -% magic tricks with @. -\def\lvvmode{\vbox to 0pt{}} - -\catcode`\|=\active -\def|{{\tt \char '174}} -\chardef \less=`\< -\catcode`\<=\active -\def<{{\tt \less}} -\chardef \gtr=`\> -\catcode`\>=\active -\def>{{\tt \gtr}} -\catcode`\+=\active -\def+{{\tt \char 43}} -%\catcode 27=\active -%\def^^[{$\diamondsuit$} - -% Set up an active definition for =, but don't enable it most of the time. -{\catcode`\==\active -\global\def={{\tt \char 61}}} - -\catcode`+=\active -\catcode`\_=\active - -% If a .fmt file is being used, characters that might appear in a file -% name cannot be active until we have parsed the command line. -% So turn them off again, and have \everyjob (or @setfilename) turn them on. -% \otherifyactive is called near the end of this file. -\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} - -\catcode`\@=0 - -% \rawbackslashxx output one backslash character in current font -\global\chardef\rawbackslashxx=`\\ -%{\catcode`\\=\other -%@gdef@rawbackslashxx{\}} - -% \rawbackslash redefines \ as input to do \rawbackslashxx. -{\catcode`\\=\active -@gdef@rawbackslash{@let\=@rawbackslashxx }} - -% \normalbackslash outputs one backslash in fixed width font. -\def\normalbackslash{{\tt\rawbackslashxx}} - -% Say @foo, not \foo, in error messages. -\escapechar=`\@ - -% \catcode 17=0 % Define control-q -\catcode`\\=\active - -% Used sometimes to turn off (effectively) the active characters -% even after parsing them. -@def@turnoffactive{@let"=@normaldoublequote -@let\=@realbackslash -@let~=@normaltilde -@let^=@normalcaret -@let_=@normalunderscore -@let|=@normalverticalbar -@let<=@normalless -@let>=@normalgreater -@let+=@normalplus} - -@def@normalturnoffactive{@let"=@normaldoublequote -@let\=@normalbackslash -@let~=@normaltilde -@let^=@normalcaret -@let_=@normalunderscore -@let|=@normalverticalbar -@let<=@normalless -@let>=@normalgreater -@let+=@normalplus} - -% Make _ and + \other characters, temporarily. -% This is canceled by @fixbackslash. -@otherifyactive - -% If a .fmt file is being used, we don't want the `\input texinfo' to show up. -% That is what \eatinput is for; after that, the `\' should revert to printing -% a backslash. -% -@gdef@eatinput input texinfo{@fixbackslash} -@global@let\ = @eatinput - -% On the other hand, perhaps the file did not have a `\input texinfo'. Then -% the first `\{ in the file would cause an error. This macro tries to fix -% that, assuming it is called before the first `\' could plausibly occur. -% Also back turn on active characters that might appear in the input -% file name, in case not using a pre-dumped format. -% -@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi - @catcode`+=@active @catcode`@_=@active} - -%% These look ok in all fonts, so just make them not special. The @rm below -%% makes sure that the current font starts out as the newly loaded cmr10 -@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other - -@textfonts -@rm - -@c Local variables: -@c page-delimiter: "^\\\\message" -@c End: diff --git a/buildtools/windows/source/make/variable.c b/buildtools/windows/source/make/variable.c deleted file mode 100644 index 319826f215b..00000000000 --- a/buildtools/windows/source/make/variable.c +++ /dev/null @@ -1,822 +0,0 @@ -/* Internals of variables for GNU Make. -Copyright (C) 1988, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "commands.h" -#include "variable.h" -#include "dep.h" -#include "file.h" - -/* Hash table of all global variable definitions. */ - -#ifndef VARIABLE_BUCKETS -#define VARIABLE_BUCKETS 523 -#endif -#ifndef PERFILE_VARIABLE_BUCKETS -#define PERFILE_VARIABLE_BUCKETS 23 -#endif -#ifndef SMALL_SCOPE_VARIABLE_BUCKETS -#define SMALL_SCOPE_VARIABLE_BUCKETS 13 -#endif -static struct variable *variable_table[VARIABLE_BUCKETS]; -static struct variable_set global_variable_set - = { variable_table, VARIABLE_BUCKETS }; -static struct variable_set_list global_setlist - = { 0, &global_variable_set }; -struct variable_set_list *current_variable_set_list = &global_setlist; - -/* Implement variables. */ - -/* Define variable named NAME with value VALUE in SET. VALUE is copied. - LENGTH is the length of NAME, which does not need to be null-terminated. - ORIGIN specifies the origin of the variable (makefile, command line - or environment). - If RECURSIVE is nonzero a flag is set in the variable saying - that it should be recursively re-expanded. */ - -static struct variable * -define_variable_in_set (name, length, value, origin, recursive, set) - char *name; - unsigned int length; - char *value; - enum variable_origin origin; - int recursive; - struct variable_set *set; -{ - register unsigned int i; - register unsigned int hashval; - register struct variable *v; - - hashval = 0; - for (i = 0; i < length; ++i) - HASH (hashval, name[i]); - hashval %= set->buckets; - - for (v = set->table[hashval]; v != 0; v = v->next) - if (*v->name == *name - && !strncmp (v->name + 1, name + 1, length - 1) - && v->name[length] == '\0') - break; - - if (env_overrides && origin == o_env) - origin = o_env_override; - - if (v != 0) - { - if (env_overrides && v->origin == o_env) - /* V came from in the environment. Since it was defined - before the switches were parsed, it wasn't affected by -e. */ - v->origin = o_env_override; - - /* A variable of this name is already defined. - If the old definition is from a stronger source - than this one, don't redefine it. */ - if ((int) origin >= (int) v->origin) - { - if (v->value != 0) - free (v->value); - v->value = savestring (value, strlen (value)); - v->origin = origin; - v->recursive = recursive; - } - return v; - } - - /* Create a new variable definition and add it to the hash table. */ - - v = (struct variable *) xmalloc (sizeof (struct variable)); - v->name = savestring (name, length); - v->value = savestring (value, strlen (value)); - v->origin = origin; - v->recursive = recursive; - v->expanding = 0; - v->export = v_default; - v->next = set->table[hashval]; - set->table[hashval] = v; - return v; -} - -/* Define a variable in the current variable set. */ - -struct variable * -define_variable (name, length, value, origin, recursive) - char *name; - unsigned int length; - char *value; - enum variable_origin origin; - int recursive; -{ - return define_variable_in_set (name, length, value, origin, recursive, - current_variable_set_list->set); -} - -/* Define a variable in FILE's variable set. */ - -struct variable * -define_variable_for_file (name, length, value, origin, recursive, file) - char *name; - unsigned int length; - char *value; - enum variable_origin origin; - int recursive; - struct file *file; -{ - return define_variable_in_set (name, length, value, origin, recursive, - file->variables->set); -} - -/* Lookup a variable whose name is a string starting at NAME - and with LENGTH chars. NAME need not be null-terminated. - Returns address of the `struct variable' containing all info - on the variable, or nil if no such variable is defined. */ - -struct variable * -lookup_variable (name, length) - char *name; - unsigned int length; -{ - register struct variable_set_list *setlist; - - register unsigned int i; - register unsigned int rawhash = 0; - - for (i = 0; i < length; ++i) - HASH (rawhash, name[i]); - - for (setlist = current_variable_set_list; - setlist != 0; setlist = setlist->next) - { - register struct variable_set *set = setlist->set; - register unsigned int hashval = rawhash % set->buckets; - register struct variable *v; - - for (v = set->table[hashval]; v != 0; v = v->next) - if (*v->name == *name - && !strncmp (v->name + 1, name + 1, length - 1) - && v->name[length] == 0) - return v; - } - - return 0; -} - -/* Initialize FILE's variable set list. If FILE already has a variable set - list, the topmost variable set is left intact, but the the rest of the - chain is replaced with FILE->parent's setlist. */ - -void -initialize_file_variables (file) - struct file *file; -{ - register struct variable_set_list *l = file->variables; - if (l == 0) - { - l = (struct variable_set_list *) - xmalloc (sizeof (struct variable_set_list)); - l->set = (struct variable_set *) xmalloc (sizeof (struct variable_set)); - l->set->buckets = PERFILE_VARIABLE_BUCKETS; - l->set->table = (struct variable **) - xmalloc (l->set->buckets * sizeof (struct variable *)); - bzero ((char *) l->set->table, - l->set->buckets * sizeof (struct variable *)); - file->variables = l; - } - - if (file->parent == 0) - l->next = &global_setlist; - else - { - if (file->parent->variables == 0) - initialize_file_variables (file->parent); - l->next = file->parent->variables; - } -} - -/* Pop the top set off the current variable set list, - and free all its storage. */ - -void -pop_variable_scope () -{ - register struct variable_set_list *setlist = current_variable_set_list; - register struct variable_set *set = setlist->set; - register unsigned int i; - - current_variable_set_list = setlist->next; - free ((char *) setlist); - - for (i = 0; i < set->buckets; ++i) - { - register struct variable *next = set->table[i]; - while (next != 0) - { - register struct variable *v = next; - next = v->next; - - free (v->name); - free ((char *) v); - } - } - free ((char *) set->table); - free ((char *) set); -} - -/* Create a new variable set and push it on the current setlist. */ - -void -push_new_variable_scope () -{ - register struct variable_set_list *setlist; - register struct variable_set *set; - - set = (struct variable_set *) xmalloc (sizeof (struct variable_set)); - set->buckets = SMALL_SCOPE_VARIABLE_BUCKETS; - set->table = (struct variable **) - xmalloc (set->buckets * sizeof (struct variable *)); - bzero ((char *) set->table, set->buckets * sizeof (struct variable *)); - - setlist = (struct variable_set_list *) - xmalloc (sizeof (struct variable_set_list)); - setlist->set = set; - setlist->next = current_variable_set_list; - current_variable_set_list = setlist; -} - -/* Merge SET1 into SET0, freeing unused storage in SET1. */ - -static void -merge_variable_sets (set0, set1) - struct variable_set *set0, *set1; -{ - register unsigned int bucket1; - - for (bucket1 = 0; bucket1 < set1->buckets; ++bucket1) - { - register struct variable *v1 = set1->table[bucket1]; - while (v1 != 0) - { - struct variable *next = v1->next; - unsigned int bucket0; - register struct variable *v0; - - if (set1->buckets >= set0->buckets) - bucket0 = bucket1; - else - { - register char *n; - bucket0 = 0; - for (n = v1->name; *n != '\0'; ++n) - HASH (bucket0, *n); - } - bucket0 %= set0->buckets; - - for (v0 = set0->table[bucket0]; v0 != 0; v0 = v0->next) - if (streq (v0->name, v1->name)) - break; - - if (v0 == 0) - { - /* There is no variable in SET0 with the same name. */ - v1->next = set0->table[bucket0]; - set0->table[bucket0] = v1; - } - else - { - /* The same variable exists in both sets. - SET0 takes precedence. */ - free (v1->value); - free ((char *) v1); - } - - v1 = next; - } - } -} - -/* Merge SETLIST1 into SETLIST0, freeing unused storage in SETLIST1. */ - -void -merge_variable_set_lists (setlist0, setlist1) - struct variable_set_list **setlist0, *setlist1; -{ - register struct variable_set_list *list0 = *setlist0; - struct variable_set_list *last0 = 0; - - while (setlist1 != 0 && list0 != 0) - { - struct variable_set_list *next = setlist1; - setlist1 = setlist1->next; - - merge_variable_sets (list0->set, next->set); - - free ((char *) next); - - last0 = list0; - list0 = list0->next; - } - - if (setlist1 != 0) - { - if (last0 == 0) - *setlist0 = setlist1; - else - last0->next = setlist1; - } -} - -/* Define the automatic variables, and record the addresses - of their structures so we can change their values quickly. */ - -void -define_automatic_variables () -{ - extern char default_shell[]; - register struct variable *v; - char buf[200]; - - sprintf (buf, "%u", makelevel); - (void) define_variable ("MAKELEVEL", 9, buf, o_env, 0); - - sprintf (buf, "%s%s%s", - version_string, - (remote_description == 0 || remote_description[0] == '\0') - ? "" : "-", - (remote_description == 0 || remote_description[0] == '\0') - ? "" : remote_description); - (void) define_variable ("MAKE_VERSION", 12, buf, o_default, 0); - - - /* This won't override any definition, but it - will provide one if there isn't one there. */ - v = define_variable ("SHELL", 5, default_shell, o_default, 0); - v->export = v_export; /* Always export SHELL. */ - - /* Don't let SHELL come from the environment. */ - if (*v->value == '\0' || v->origin == o_env || v->origin == o_env_override) - { - free (v->value); - v->origin = o_file; - v->value = savestring (default_shell, strlen (default_shell)); - } - - /* Make sure MAKEFILES gets exported if it is set. */ - v = define_variable ("MAKEFILES", 9, "", o_default, 0); - v->export = v_ifset; - - /* Define the magic D and F variables in terms of - the automatic variables they are variations of. */ - - define_variable ("@D", 2, "$(patsubst %/,%,$(dir $@))", o_automatic, 1); - define_variable ("%D", 2, "$(patsubst %/,%,$(dir $%))", o_automatic, 1); - define_variable ("*D", 2, "$(patsubst %/,%,$(dir $*))", o_automatic, 1); - define_variable ("variables; - - /* Find the lowest number of buckets in any set in the list. */ - s = set_list; - buckets = s->set->buckets; - for (s = s->next; s != 0; s = s->next) - if (s->set->buckets < buckets) - buckets = s->set->buckets; - - /* Find the hash value of the bucket `MAKELEVEL' will fall into. */ - { - char *p = "MAKELEVEL"; - mklev_hash = 0; - while (*p != '\0') - HASH (mklev_hash, *p++); - } - - /* Temporarily allocate a table with that many buckets. */ - table = (struct variable_bucket **) - alloca (buckets * sizeof (struct variable_bucket *)); - bzero ((char *) table, buckets * sizeof (struct variable_bucket *)); - - /* Run through all the variable sets in the list, - accumulating variables in TABLE. */ - nvariables = 0; - for (s = set_list; s != 0; s = s->next) - { - register struct variable_set *set = s->set; - for (i = 0; i < set->buckets; ++i) - { - register struct variable *v; - for (v = set->table[i]; v != 0; v = v->next) - { - unsigned int j = i % buckets; - register struct variable_bucket *ov; - register char *p = v->name; - - if (i == mklev_hash % set->buckets - && streq (v->name, "MAKELEVEL")) - /* Don't include MAKELEVEL because it will be - added specially at the end. */ - continue; - - switch (v->export) - { - case v_default: - if (v->origin == o_default || v->origin == o_automatic) - /* Only export default variables by explicit request. */ - continue; - - if (! export_all_variables - && v->origin != o_command - && v->origin != o_env && v->origin != o_env_override) - continue; - - if (*p != '_' && (*p < 'A' || *p > 'Z') - && (*p < 'a' || *p > 'z')) - continue; - for (++p; *p != '\0'; ++p) - if (*p != '_' && (*p < 'a' || *p > 'z') - && (*p < 'A' || *p > 'Z') && (*p < '0' || *p > '9')) - break; - if (*p != '\0') - continue; - - case v_export: - break; - - case v_noexport: - continue; - - case v_ifset: - if (v->origin == o_default) - continue; - break; - } - - for (ov = table[j]; ov != 0; ov = ov->next) - if (streq (v->name, ov->variable->name)) - break; - if (ov == 0) - { - register struct variable_bucket *entry; - entry = (struct variable_bucket *) - alloca (sizeof (struct variable_bucket)); - entry->next = table[j]; - entry->variable = v; - table[j] = entry; - ++nvariables; - } - } - } - } - - result = (char **) xmalloc ((nvariables + 2) * sizeof (char *)); - nvariables = 0; - for (i = 0; i < buckets; ++i) - { - register struct variable_bucket *b; - for (b = table[i]; b != 0; b = b->next) - { - register struct variable *v = b->variable; - /* If V is recursively expanded and didn't come from the environment, - expand its value. If it came from the environment, it should - go back into the environment unchanged. */ - if (v->recursive - && v->origin != o_env && v->origin != o_env_override) - { - char *value = recursively_expand (v); - result[nvariables++] = concat (v->name, "=", value); - free (value); - } - else - result[nvariables++] = concat (v->name, "=", v->value); - } - } - result[nvariables] = (char *) xmalloc (100); - (void) sprintf (result[nvariables], "MAKELEVEL=%u", makelevel + 1); - result[++nvariables] = 0; - - return result; -} - -/* Try to interpret LINE (a null-terminated string) as a variable definition. - - ORIGIN may be o_file, o_override, o_env, o_env_override, - or o_command specifying that the variable definition comes - from a makefile, an override directive, the environment with - or without the -e switch, or the command line. - - A variable definition has the form "name = value" or "name := value". - Any whitespace around the "=" or ":=" is removed. The first form - defines a variable that is recursively re-evaluated. The second form - defines a variable whose value is variable-expanded at the time of - definition and then is evaluated only once at the time of expansion. - - If a variable was defined, a pointer to its `struct variable' is returned. - If not, NULL is returned. */ - -struct variable * -try_variable_definition (filename, lineno, line, origin) - char *filename; - unsigned int lineno; - char *line; - enum variable_origin origin; -{ - register int c; - register char *p = line; - register char *beg; - register char *end; - enum { bogus, simple, recursive, append } flavor = bogus; - char *name, *expanded_name, *value; - struct variable *v; - - while (1) - { - c = *p++; - if (c == '\0' || c == '#') - return 0; - if (c == '=') - { - end = p - 1; - flavor = recursive; - break; - } - else if (c == ':') - if (*p == '=') - { - end = p++ - 1; - flavor = simple; - break; - } - else - /* A colon other than := is a rule line, not a variable defn. */ - return 0; - else if (c == '+' && *p == '=') - { - end = p++ - 1; - flavor = append; - break; - } - } - - beg = next_token (line); - while (end > beg && isblank (end[-1])) - --end; - p = next_token (p); - - /* Expand the name, so "$(foo)bar = baz" works. */ - name = (char *) alloca (end - beg + 1); - bcopy (beg, name, end - beg); - name[end - beg] = '\0'; - expanded_name = allocated_variable_expand (name); - - if (expanded_name[0] == '\0') - { - if (filename == 0) - fatal ("empty variable name"); - else - makefile_fatal (filename, lineno, "empty variable name"); - } - - /* Calculate the variable's new value in VALUE. */ - - switch (flavor) - { - case bogus: - /* Should not be possible. */ - abort (); - return 0; - case simple: - /* A simple variable definition "var := value". Expand the value. */ - value = variable_expand (p); - break; - case recursive: - /* A recursive variable definition "var = value". - The value is used verbatim. */ - value = p; - break; - case append: - /* An appending variable definition "var += value". - Extract the old value and append the new one. */ - v = lookup_variable (expanded_name, strlen (expanded_name)); - if (v == 0) - { - /* There was no old value. - This becomes a normal recursive definition. */ - value = p; - flavor = recursive; - } - else - { - /* Paste the old and new values together in VALUE. */ - - unsigned int oldlen, newlen; - - if (v->recursive) - /* The previous definition of the variable was recursive. - The new value comes from the unexpanded old and new values. */ - flavor = recursive; - else - /* The previous definition of the variable was simple. - The new value comes from the old value, which was expanded - when it was set; and from the expanded new value. */ - p = variable_expand (p); - - oldlen = strlen (v->value); - newlen = strlen (p); - value = (char *) alloca (oldlen + 1 + newlen + 1); - bcopy (v->value, value, oldlen); - value[oldlen] = ' '; - bcopy (p, &value[oldlen + 1], newlen + 1); - } - } - - v = define_variable (expanded_name, strlen (expanded_name), - value, origin, flavor == recursive); - - free (expanded_name); - - return v; -} - -/* Print information for variable V, prefixing it with PREFIX. */ - -static void -print_variable (v, prefix) - register struct variable *v; - char *prefix; -{ - char *origin; - - switch (v->origin) - { - case o_default: - origin = "default"; - break; - case o_env: - origin = "environment"; - break; - case o_file: - origin = "makefile"; - break; - case o_env_override: - origin = "environment under -e"; - break; - case o_command: - origin = "command line"; - break; - case o_override: - origin = "`override' directive"; - break; - case o_automatic: - origin = "automatic"; - break; - case o_invalid: - default: - abort (); - break; - } - printf ("# %s\n", origin); - - fputs (prefix, stdout); - - /* Is this a `define'? */ - if (v->recursive && index (v->value, '\n') != 0) - printf ("define %s\n%s\nendef\n", v->name, v->value); - else - { - register char *p; - - printf ("%s %s= ", v->name, v->recursive ? "" : ":"); - - /* Check if the value is just whitespace. */ - p = next_token (v->value); - if (p != v->value && *p == '\0') - /* All whitespace. */ - printf ("$(subst ,,%s)", v->value); - else if (v->recursive) - fputs (v->value, stdout); - else - /* Double up dollar signs. */ - for (p = v->value; *p != '\0'; ++p) - { - if (*p == '$') - putchar ('$'); - putchar (*p); - } - putchar ('\n'); - } -} - - -/* Print all the variables in SET. PREFIX is printed before - the actual variable definitions (everything else is comments). */ - -static void -print_variable_set (set, prefix) - register struct variable_set *set; - char *prefix; -{ - register unsigned int i, nvariables, per_bucket; - register struct variable *v; - - per_bucket = nvariables = 0; - for (i = 0; i < set->buckets; ++i) - { - register unsigned int this_bucket = 0; - - for (v = set->table[i]; v != 0; v = v->next) - { - ++this_bucket; - print_variable (v, prefix); - } - - nvariables += this_bucket; - if (this_bucket > per_bucket) - per_bucket = this_bucket; - } - - if (nvariables == 0) - puts ("# No variables."); - else - { - printf ("# %u variables in %u hash buckets.\n", - nvariables, set->buckets); -#ifndef NO_FLOAT - printf ("# average of %.1f variables per bucket, \ -max %u in one bucket.\n", - (double) nvariables / (double) set->buckets, - per_bucket); -#endif - } -} - - -/* Print the data base of variables. */ - -void -print_variable_data_base () -{ - puts ("\n# Variables\n"); - - print_variable_set (&global_variable_set, ""); -} - - -/* Print all the local variables of FILE. */ - -void -print_file_variables (file) - struct file *file; -{ - if (file->variables != 0) - print_variable_set (file->variables->set, "# "); -} diff --git a/buildtools/windows/source/make/variable.h b/buildtools/windows/source/make/variable.h deleted file mode 100644 index 80961790703..00000000000 --- a/buildtools/windows/source/make/variable.h +++ /dev/null @@ -1,100 +0,0 @@ -/* Definitions for using variables in GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* Codes in a variable definition saying where the definition came from. - Increasing numeric values signify less-overridable definitions. */ -enum variable_origin - { - o_default, /* Variable from the default set. */ - o_env, /* Variable from environment. */ - o_file, /* Variable given in a makefile. */ - o_env_override, /* Variable from environment, if -e. */ - o_command, /* Variable given by user. */ - o_override, /* Variable from an `override' directive. */ - o_automatic, /* Automatic variable -- cannot be set. */ - o_invalid /* Core dump time. */ - }; - -/* Structure that represents one variable definition. - Each bucket of the hash table is a chain of these, - chained through `next'. */ - -struct variable - { - struct variable *next; /* Link in the chain. */ - char *name; /* Variable name. */ - char *value; /* Variable value. */ - enum variable_origin - origin ENUM_BITFIELD (3); /* Variable origin. */ - unsigned int recursive:1; /* Gets recursively re-evaluated. */ - unsigned int expanding:1; /* Nonzero if currently being expanded. */ - enum - { - v_export, /* Export this variable. */ - v_noexport, /* Don't export this variable. */ - v_ifset, /* Export it if it has a non-default value. */ - v_default /* Decide in target_environment. */ - } export ENUM_BITFIELD (2); - }; - -/* Structure that represents a variable set. */ - -struct variable_set - { - struct variable **table; /* Hash table of variables. */ - unsigned int buckets; /* Number of hash buckets in `table'. */ - }; - -/* Structure that represents a list of variable sets. */ - -struct variable_set_list - { - struct variable_set_list *next; /* Link in the chain. */ - struct variable_set *set; /* Variable set. */ - }; - -extern struct variable_set_list *current_variable_set_list; - - -extern void push_new_variable_scope (), pop_variable_scope (); - -extern int handle_function (); - -extern char *variable_buffer_output (); -extern char *variable_expand (), *variable_expand_for_file (); -extern char *allocated_variable_expand_for_file (); -#define allocated_variable_expand(line) \ - allocated_variable_expand_for_file (line, (struct file *) 0) -extern char *expand_argument (); - -extern void define_automatic_variables (); -extern void initialize_file_variables (); -extern void print_file_variables (); - -extern void merge_variable_set_lists (); - -extern struct variable *try_variable_definition (); - -extern struct variable *lookup_variable (), *define_variable (); -extern struct variable *define_variable_for_file (); - -extern int pattern_matches (); -extern char *subst_expand (), *patsubst_expand (), *recursively_expand (); - -extern char **target_environment (); -extern int export_all_variables; diff --git a/buildtools/windows/source/make/version.c b/buildtools/windows/source/make/version.c deleted file mode 100644 index 4818dd6b1d3..00000000000 --- a/buildtools/windows/source/make/version.c +++ /dev/null @@ -1,7 +0,0 @@ -char *version_string = "3.74"; - -/* - Local variables: - version-control: never - End: - */ diff --git a/buildtools/windows/source/make/vpath.c b/buildtools/windows/source/make/vpath.c deleted file mode 100644 index 480fcad744d..00000000000 --- a/buildtools/windows/source/make/vpath.c +++ /dev/null @@ -1,487 +0,0 @@ -/* Implementation of pattern-matching file search paths for GNU Make. -Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make 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. - -GNU Make 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 GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "make.h" -#include "file.h" -#include "variable.h" - - -/* Structure used to represent a selective VPATH searchpath. */ - -struct vpath - { - struct vpath *next; /* Pointer to next struct in the linked list. */ - char *pattern; /* The pattern to match. */ - char *percent; /* Pointer into `pattern' where the `%' is. */ - unsigned int patlen;/* Length of the pattern. */ - char **searchpath; /* Null-terminated list of directories. */ - unsigned int maxlen;/* Maximum length of any entry in the list. */ - }; - -/* Linked-list of all selective VPATHs. */ - -static struct vpath *vpaths; - -/* Structure for the general VPATH given in the variable. */ - -static struct vpath *general_vpath; - -static int selective_vpath_search (); - -/* Reverse the chain of selective VPATH lists so they - will be searched in the order given in the makefiles - and construct the list from the VPATH variable. */ - -void -build_vpath_lists () -{ - register struct vpath *new = 0; - register struct vpath *old, *nexto; - register char *p; - - /* Reverse the chain. */ - for (old = vpaths; old != 0; old = nexto) - { - nexto = old->next; - old->next = new; - new = old; - } - - vpaths = new; - - /* If there is a VPATH variable with a nonnull value, construct the - general VPATH list from it. We use variable_expand rather than just - calling lookup_variable so that it will be recursively expanded. */ - - { - /* Turn off --warn-undefined-variables while we expand SHELL and IFS. */ - int save = warn_undefined_variables_flag; - warn_undefined_variables_flag = 0; - - p = variable_expand ("$(strip $(VPATH))"); - - warn_undefined_variables_flag = save; - } - - if (*p != '\0') - { - /* Save the list of vpaths. */ - struct vpath *save_vpaths = vpaths; - - /* Empty `vpaths' so the new one will have no next, and `vpaths' - will still be nil if P contains no existing directories. */ - vpaths = 0; - - /* Parse P. */ - construct_vpath_list ("%", p); - - /* Store the created path as the general path, - and restore the old list of vpaths. */ - general_vpath = vpaths; - vpaths = save_vpaths; - } -} - -/* Construct the VPATH listing for the pattern and searchpath given. - - This function is called to generate selective VPATH lists and also for - the general VPATH list (which is in fact just a selective VPATH that - is applied to everything). The returned pointer is either put in the - linked list of all selective VPATH lists or in the GENERAL_VPATH - variable. - - If SEARCHPATH is nil, remove all previous listings with the same - pattern. If PATTERN is nil, remove all VPATH listings. - Existing and readable directories that are not "." given in the - searchpath separated by colons are loaded into the directory hash - table if they are not there already and put in the VPATH searchpath - for the given pattern with trailing slashes stripped off if present - (and if the directory is not the root, "/"). - The length of the longest entry in the list is put in the structure as well. - The new entry will be at the head of the VPATHS chain. */ - -void -construct_vpath_list (pattern, dirpath) - char *pattern, *dirpath; -{ - register unsigned int elem; - register char *p; - register char **vpath; - register unsigned int maxvpath; - unsigned int maxelem; - char *percent; - - if (pattern != 0) - { - pattern = savestring (pattern, strlen (pattern)); - percent = find_percent (pattern); - } - - if (dirpath == 0) - { - /* Remove matching listings. */ - register struct vpath *path, *lastpath; - - lastpath = 0; - path = vpaths; - while (path != 0) - { - struct vpath *next = path->next; - - if (pattern == 0 - || (((percent == 0 && path->percent == 0) - || (percent - pattern == path->percent - path->pattern)) - && streq (pattern, path->pattern))) - { - /* Remove it from the linked list. */ - if (lastpath == 0) - vpaths = path->next; - else - lastpath->next = next; - - /* Free its unused storage. */ - free (path->pattern); - free ((char *) path->searchpath); - free ((char *) path); - } - else - lastpath = path; - - path = next; - } - - if (pattern != 0) - free (pattern); - return; - } - - /* Figure out the maximum number of VPATH entries and - put it in MAXELEM. We start with 2, one before the - first colon and one nil, the list terminator and - increment our estimated number for each colon or blank we find. */ - maxelem = 2; - p = dirpath; - while (*p != '\0') - if (*p++ == PATH_SEPARATOR_CHAR || isblank (*p)) - ++maxelem; - - vpath = (char **) xmalloc (maxelem * sizeof (char *)); - maxvpath = 0; - - /* Skip over any initial colons and blanks. */ - p = dirpath; - while (*p == PATH_SEPARATOR_CHAR || isblank (*p)) - ++p; - - elem = 0; - while (*p != '\0') - { - char *v; - unsigned int len; - - /* Find the end of this entry. */ - v = p; - while (*p != '\0' && *p != PATH_SEPARATOR_CHAR && !isblank (*p)) - ++p; - - len = p - v; - /* Make sure there's no trailing slash, - but still allow "/" as a directory. */ - if (len > 1 && p[-1] == '/') - --len; - - if (len > 1 || *v != '.') - { - v = savestring (v, len); - - /* Verify that the directory actually exists. */ - - if (dir_file_exists_p (v, "")) - { - /* It does. Put it in the list. */ - vpath[elem++] = dir_name (v); - free (v); - if (len > maxvpath) - maxvpath = len; - } - else - /* The directory does not exist. Omit from the list. */ - free (v); - } - - /* Skip over colons and blanks between entries. */ - while (*p == PATH_SEPARATOR_CHAR || isblank (*p)) - ++p; - } - - if (elem > 0) - { - struct vpath *path; - /* ELEM is now incremented one element past the last - entry, to where the nil-pointer terminator goes. - Usually this is maxelem - 1. If not, shrink down. */ - if (elem < (maxelem - 1)) - vpath = (char **) xrealloc ((char *) vpath, - (elem + 1) * sizeof (char *)); - - /* Put the nil-pointer terminator on the end of the VPATH list. */ - vpath[elem] = 0; - - /* Construct the vpath structure and put it into the linked list. */ - path = (struct vpath *) xmalloc (sizeof (struct vpath)); - path->searchpath = vpath; - path->maxlen = maxvpath; - path->next = vpaths; - vpaths = path; - - /* Set up the members. */ - path->pattern = pattern; - path->percent = percent; - path->patlen = strlen (pattern); - } - else - { - /* There were no entries, so free whatever space we allocated. */ - free ((char *) vpath); - if (pattern != 0) - free (pattern); - } -} - -/* Search the VPATH list whose pattern matches *FILE for a directory - where the name pointed to by FILE exists. If it is found, we set *FILE to - the newly malloc'd name of the existing file, *MTIME_PTR (if MTIME_PTR is - not NULL) to its modtime (or zero if no stat call was done), and return 1. - Otherwise we return 0. */ - -int -vpath_search (file, mtime_ptr) - char **file; - time_t *mtime_ptr; -{ - register struct vpath *v; - - /* If there are no VPATH entries or FILENAME starts at the root, - there is nothing we can do. */ - - if (**file == '/' || (vpaths == 0 && general_vpath == 0)) - return 0; - - for (v = vpaths; v != 0; v = v->next) - if (pattern_matches (v->pattern, v->percent, *file)) - if (selective_vpath_search (v, file, mtime_ptr)) - return 1; - - if (general_vpath != 0 - && selective_vpath_search (general_vpath, file, mtime_ptr)) - return 1; - - return 0; -} - - -/* Search the given VPATH list for a directory where the name pointed - to by FILE exists. If it is found, we set *FILE to the newly malloc'd - name of the existing file, *MTIME_PTR (if MTIME_PTR is not NULL) to - its modtime (or zero if no stat call was done), and we return 1. - Otherwise we return 0. */ - -static int -selective_vpath_search (path, file, mtime_ptr) - struct vpath *path; - char **file; - time_t *mtime_ptr; -{ - int not_target; - char *name, *n; - char *filename; - register char **vpath = path->searchpath; - unsigned int maxvpath = path->maxlen; - register unsigned int i; - unsigned int flen, vlen, name_dplen; - int exists = 0; - - /* Find out if *FILE is a target. - If and only if it is NOT a target, we will accept prospective - files that don't exist but are mentioned in a makefile. */ - { - struct file *f = lookup_file (*file); - not_target = f == 0 || !f->is_target; - } - - flen = strlen (*file); - - /* Split *FILE into a directory prefix and a name-within-directory. - NAME_DPLEN gets the length of the prefix; FILENAME gets the - pointer to the name-within-directory and FLEN is its length. */ - - n = rindex (*file, '/'); - name_dplen = n != 0 ? n - *file : 0; - filename = name_dplen > 0 ? n + 1 : *file; - if (name_dplen > 0) - flen -= name_dplen + 1; - - /* Allocate enough space for the biggest VPATH entry, - a slash, the directory prefix that came with *FILE, - another slash (although this one may not always be - necessary), the filename, and a null terminator. */ - name = (char *) alloca (maxvpath + 1 + name_dplen + 1 + flen + 1); - - /* Try each VPATH entry. */ - for (i = 0; vpath[i] != 0; ++i) - { - int exists_in_cache = 0; - - n = name; - - /* Put the next VPATH entry into NAME at N and increment N past it. */ - vlen = strlen (vpath[i]); - bcopy (vpath[i], n, vlen); - n += vlen; - - /* Add the directory prefix already in *FILE. */ - if (name_dplen > 0) - { - *n++ = '/'; - bcopy (*file, n, name_dplen); - n += name_dplen; - } - - /* Now add the name-within-directory at the end of NAME. */ - if (n != name && n[-1] != '/') - { - *n = '/'; - bcopy (filename, n + 1, flen + 1); - } - else - bcopy (filename, n, flen + 1); - - /* Check if the file is mentioned in a makefile. If *FILE is not - a target, that is enough for us to decide this file exists. - If *FILE is a target, then the file must be mentioned in the - makefile also as a target to be chosen. - - The restriction that *FILE must not be a target for a - makefile-mentioned file to be chosen was added by an - inadequately commented change in July 1990; I am not sure off - hand what problem it fixes. - - In December 1993 I loosened of this restriction to allow a file - to be chosen if it is mentioned as a target in a makefile. This - seem logical. */ - { - struct file *f = lookup_file (name); - if (f != 0) - exists = not_target || f->is_target; - } - - if (!exists) - { - /* That file wasn't mentioned in the makefile. - See if it actually exists. */ - - /* Clobber a null into the name at the last slash. - Now NAME is the name of the directory to look in. */ - *n = '\0'; - - /* We know the directory is in the hash table now because either - construct_vpath_list or the code just above put it there. - Does the file we seek exist in it? */ - exists_in_cache = exists = dir_file_exists_p (name, filename); - } - - if (exists) - { - /* The file is in the directory cache. - Now check that it actually exists in the filesystem. - The cache may be out of date. When vpath thinks a file - exists, but stat fails for it, confusion results in the - higher levels. */ - - struct stat st; - - /* Put the slash back in NAME. */ - *n = '/'; - - if (!exists_in_cache /* Makefile-mentioned file need not exist. */ - || safe_stat (name, &st) == 0) /* Does it really exist? */ - { - /* We have found a file. - Store the name we found into *FILE for the caller. */ - - *file = savestring (name, (n + 1 - name) + flen); - - if (mtime_ptr != 0) - /* Store the modtime into *MTIME_PTR for the caller. - If we have had no need to stat the file here, - we record a zero modtime to indicate this. */ - *mtime_ptr = exists_in_cache ? st.st_mtime : (time_t) 0; - - return 1; - } - else - exists = 0; - } - } - - return 0; -} - -/* Print the data base of VPATH search paths. */ - -void -print_vpath_data_base () -{ - register unsigned int nvpaths; - register struct vpath *v; - - puts ("\n# VPATH Search Paths\n"); - - nvpaths = 0; - for (v = vpaths; v != 0; v = v->next) - { - register unsigned int i; - - ++nvpaths; - - printf ("vpath %s ", v->pattern); - - for (i = 0; v->searchpath[i] != 0; ++i) - printf ("%s%c", v->searchpath[i], - v->searchpath[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR); - } - - if (vpaths == 0) - puts ("# No `vpath' search paths."); - else - printf ("\n# %u `vpath' search paths.\n", nvpaths); - - if (general_vpath == 0) - puts ("\n# No general (`VPATH' variable) search path."); - else - { - register char **path = general_vpath->searchpath; - register unsigned int i; - - fputs ("\n# General (`VPATH' variable) search path:\n# ", stdout); - - for (i = 0; path[i] != 0; ++i) - printf ("%s%c", path[i], - path[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR); - } -} diff --git a/buildtools/windows/source/make/windir.h b/buildtools/windows/source/make/windir.h deleted file mode 100644 index 0ea444e1e0a..00000000000 --- a/buildtools/windows/source/make/windir.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef WINDIR_H -#define WINDIR_H - -#include -#include - -struct dirent { - char *d_name; -}; -typedef struct { - HANDLE dp; - WIN32_FIND_DATA fdata; - struct dirent de; -} dir_s; -typedef dir_s DIR; - -DIR *opendir(char *); -struct dirent *readdir(DIR *); -void closedir(DIR *); - -#endif diff --git a/buildtools/windows/source/shmsdos/README b/buildtools/windows/source/shmsdos/README deleted file mode 100644 index 7acdac02ac0..00000000000 --- a/buildtools/windows/source/shmsdos/README +++ /dev/null @@ -1,27 +0,0 @@ -This directory contains the source files for shmsdos.exe and -nsinstall.exe, which are used in conjunction with gmake.exe -to build some components of the Mozilla client on Win32. - -The tool shmsdos.exe is a very lightweight shell. It is -the default shell for our gmake.exe. shmsdos.exe implements -several common Unix utilities as built-in commands, such as -mv, cp, rm, echo, mkdir, etc. It only implements very -limited shell features. It can do if-then-else and for loops, -but it can't do variables, pipes, standard I/O redicrection, etc. - -It is possible to use a real Bourne shell with our gmake.exe -by defining the SHELL variable in your makefiles. Our gmake.exe -works with the Korn shell (sh.exe) of MKS Toolkit. If you go -this route, you will also need nsinstall.exe. (nsinstall is -a built-in command for shmsdos.exe.) - -To build shmsdos.exe, you need Microsoft Visual C++ and nmake. -Just issue the command: - nmake /f shmsdos.mak -The output is Release\shmsdos.exe. Copy it to a directory on -your Path. - -To build nsinstall.exe, issue the command: - nmake /f nsinstall.mak -The output is Release\nsinstall.exe. Copy it to a directory -on your Path. diff --git a/buildtools/windows/source/shmsdos/nsinstall.c b/buildtools/windows/source/shmsdos/nsinstall.c deleted file mode 100644 index 2a0a11d4bb8..00000000000 --- a/buildtools/windows/source/shmsdos/nsinstall.c +++ /dev/null @@ -1,697 +0,0 @@ -/* - * The nsinstall command for Win32 - * - * Our gmake makefiles use the nsinstall command to create the - * object directories or installing headers and libs to ns/dist. - * The shmsdos shell has nsinstall as a built-in command. However, - * if we use another shell like MKS toolkit's sh, we need to have - * the nsinstall command separately. - * - * This file was generated by just taking the part of shmsdos.c - * needed by nsinstall and deleting the recursive directory copy code. - * - * To build, say - * nmake /f nsinstall.mak - */ - -#include -#include -#include -#include -#include -#pragma hdrstop - -/* - * sh_FileFcn -- - * - * A function that operates on a file. The pathname is either - * absolute or relative to the current directory, and contains - * no wildcard characters such as * and ?. Additional arguments - * can be passed to the function via the arg pointer. - */ - -typedef BOOL (*sh_FileFcn)( - char *pathName, - WIN32_FIND_DATA *fileData, - void *arg); - -static int shellCp (char **pArgv); -static int shellNsinstall (char **pArgv); -static int shellMkdir (char **pArgv); -static BOOL sh_EnumerateFiles(const char *pattern, const char *where, - sh_FileFcn fileFcn, void *arg, int *nFiles); -static const char *sh_GetLastErrorMessage(void); -static BOOL sh_DoCopy(char *srcFileName, DWORD srcFileAttributes, - char *dstFileName, DWORD dstFileAttributes, - int force, int recursive); - -/* changes all forward slashes in token to back slashes */ -void changeForwardSlashesTpBackSlashes ( char *arg ) -{ - if ( arg == NULL ) - return; - - while ( *arg ) { - if ( *arg == '/' ) - *arg = '\\'; - arg++; - } -} - -int main(int argc, char *argv[ ]) -{ - return shellNsinstall ( argv + 1 ); -} - -static int -shellNsinstall (char **pArgv) -{ - int retVal = 0; /* exit status */ - int dirOnly = 0; /* 1 if and only if -D is specified */ - char **pSrc; - char **pDst; - - /* - * Process the command-line options. We ignore the - * options except for -D. Some options, such as -m, - * are followed by an argument. We need to skip the - * argument too. - */ - while ( *pArgv && **pArgv == '-' ) { - char c = (*pArgv)[1]; /* The char after '-' */ - - if ( c == 'D' ) { - dirOnly = 1; - } else if ( c == 'm' ) { - pArgv++; /* skip the next argument */ - } - pArgv++; - } - - if ( !dirOnly ) { - /* There are files to install. Get source files */ - if ( *pArgv ) { - pSrc = pArgv++; - } else { - fprintf( stderr, "nsinstall: not enough arguments\n"); - return 3; - } - } - - /* Get to last token to find destination directory */ - if ( *pArgv ) { - pDst = pArgv++; - if ( dirOnly && *pArgv ) { - fprintf( stderr, "nsinstall: too many arguments with -D\n"); - return 3; - } - } else { - fprintf( stderr, "nsinstall: not enough arguments\n"); - return 3; - } - while ( *pArgv ) - pDst = pArgv++; - - retVal = shellMkdir ( pDst ); - if ( retVal ) - return retVal; - if ( !dirOnly ) - retVal = shellCp ( pSrc ); - return retVal; -} - -static int -shellMkdir (char **pArgv) -{ - int retVal = 0; /* assume valid return */ - char *arg; - char *pArg; - char path[_MAX_PATH]; - char tmpPath[_MAX_PATH]; - char *pTmpPath = tmpPath; - - /* All the options are simply ignored in this implementation */ - while ( *pArgv && **pArgv == '-' ) { - if ( (*pArgv)[1] == 'm' ) { - pArgv++; /* skip the next argument (mode) */ - } - pArgv++; - } - - while ( *pArgv ) { - arg = *pArgv; - changeForwardSlashesTpBackSlashes ( arg ); - pArg = arg; - pTmpPath = tmpPath; - while ( 1 ) { - /* create part of path */ - while ( *pArg ) { - *pTmpPath++ = *pArg++; - if ( *pArg == '\\' ) - break; - } - *pTmpPath = '\0'; - - /* check if directory alreay exists */ - _getcwd ( path, sizeof (path) ); - if ( _chdir ( tmpPath ) != -1 ) { - _chdir ( path ); - } else { - if ( _mkdir ( tmpPath ) == -1 ) { -// while ( waitForDebug ); - printf ( "%s: ", tmpPath ); - perror ( "Could not create the directory" ); - retVal = 3; - break; - } - } - if ( *pArg == '\0' ) /* complete path? */ - break; - /* loop for next directory */ - } - - pArgv++; - } - return retVal; -} - -static const char * -sh_GetLastErrorMessage() -{ - static char buf[128]; - - FormatMessage( - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* default language */ - buf, - sizeof(buf), - NULL - ); - return buf; -} - -/* - * struct sh_FileData -- - * - * A pointer to the sh_FileData structure is passed into sh_RecordFileData, - * which will fill in the fields. - */ - -struct sh_FileData { - char pathName[_MAX_PATH]; - DWORD dwFileAttributes; -}; - -/* - * sh_RecordFileData -- - * - * Record the pathname and attributes of the file in - * the sh_FileData structure pointed to by arg. - * - * Always return TRUE (successful completion). - * - * This function is intended to be passed into sh_EnumerateFiles - * to see if a certain pattern expands to exactly one file/directory, - * and if so, record its pathname and attributes. - */ - -static BOOL -sh_RecordFileData(char *pathName, WIN32_FIND_DATA *findData, void *arg) -{ - struct sh_FileData *fData = (struct sh_FileData *) arg; - - strcpy(fData->pathName, pathName); - fData->dwFileAttributes = findData->dwFileAttributes; - return TRUE; -} - -static BOOL -sh_DoCopy(char *srcFileName, - DWORD srcFileAttributes, - char *dstFileName, - DWORD dstFileAttributes, - int force, - int recursive -) -{ - if (dstFileAttributes != 0xFFFFFFFF) { - if ((dstFileAttributes & FILE_ATTRIBUTE_READONLY) && force) { - dstFileAttributes &= ~FILE_ATTRIBUTE_READONLY; - SetFileAttributes(dstFileName, dstFileAttributes); - } - } - - if (srcFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - fprintf(stderr, "nsinstall: %s is a directory\n", - srcFileName); - return FALSE; - } else { - if (!CopyFile(srcFileName, dstFileName, FALSE)) { - fprintf(stderr, "nsinstall: cannot copy %s to %s: %s\n", - srcFileName, dstFileName, sh_GetLastErrorMessage()); - return FALSE; - } - } - return TRUE; -} - -/* - * struct sh_CpCmdArg -- - * - * A pointer to the sh_CpCmdArg structure is passed into sh_CpFileCmd. - * The sh_CpCmdArg contains information about the cp command, and - * provide a buffer for constructing the destination file name. - */ - -struct sh_CpCmdArg { - int force; /* -f option, ok to overwrite an existing - * read-only destination file */ - int recursive; /* -r or -R option, recursively copy - * directories. Note: this field is not used - * by nsinstall and should always be 0. */ - char *dstFileName; /* a buffer for constructing the destination - * file name */ - char *dstFileNameMarker; /* points to where in the dstFileName buffer - * we should write the file component of the - * destination file */ -}; - -/* - * sh_CpFileCmd -- - * - * Copy a file to the destination directory - * - * This function is intended to be passed into sh_EnumerateFiles to - * copy all the files specified by the pattern to the destination - * directory. - * - * Return TRUE if the file is successfully copied, and FALSE otherwise. - */ - -static BOOL -sh_CpFileCmd(char *pathName, WIN32_FIND_DATA *findData, void *cpArg) -{ - BOOL retVal = TRUE; - struct sh_CpCmdArg *arg = (struct sh_CpCmdArg *) cpArg; - - strcpy(arg->dstFileNameMarker, findData->cFileName); - return sh_DoCopy(pathName, findData->dwFileAttributes, - arg->dstFileName, GetFileAttributes(arg->dstFileName), - arg->force, arg->recursive); -} - -static int -shellCp (char **pArgv) -{ - int retVal = 0; - char **pSrc; - char **pDst; - struct sh_CpCmdArg arg; - struct sh_FileData dstData; - int dstIsDir = 0; - int n; - - arg.force = 0; - arg.recursive = 0; - arg.dstFileName = dstData.pathName; - arg.dstFileNameMarker = 0; - - while (*pArgv && **pArgv == '-') { - char *p = *pArgv; - - while (*(++p)) { - if (*p == 'f') { - arg.force = 1; - } - } - pArgv++; - } - - /* the first source file */ - if (*pArgv) { - pSrc = pArgv++; - } else { - fprintf(stderr, "nsinstall: not enough arguments\n"); - return 3; - } - - /* get to the last token to find destination */ - if (*pArgv) { - pDst = pArgv++; - } else { - fprintf(stderr, "nsinstall: not enough arguments\n"); - return 3; - } - while (*pArgv) { - pDst = pArgv++; - } - - /* - * The destination pattern must unambiguously expand to exactly - * one file or directory. - */ - - changeForwardSlashesTpBackSlashes(*pDst); - sh_EnumerateFiles(*pDst, *pDst, sh_RecordFileData, &dstData, &n); - assert(n >= 0); - if (n == 1) { - /* - * Is the destination a file or directory? - */ - - if (dstData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - dstIsDir = 1; - } - } else if (n > 1) { - fprintf(stderr, "nsinstall: %s: ambiguous destination file " - "or directory\n", *pDst); - return 3; - } else { - /* - * n == 0, meaning that destination file or directory does - * not exist. In this case the destination file directory - * name must be fully specified. - */ - - char *p; - - for (p = *pDst; *p; p++) { - if (*p == '*' || *p == '?') { - fprintf(stderr, "nsinstall: %s: No such file or directory\n", - *pDst); - return 3; - } - } - - /* - * Do not include the trailing \, if any, unless it is a root - * directory (\ or X:\). - */ - - if (p > *pDst && p[-1] == '\\' && p != *pDst + 1 && p[-2] != ':') { - p[-1] = '\0'; - } - strcpy(dstData.pathName, *pDst); - dstData.dwFileAttributes = 0xFFFFFFFF; - } - - /* - * If there are two or more source files, the destination has - * to be a directory. - */ - - if (pDst - pSrc > 1 && !dstIsDir) { - fprintf(stderr, "nsinstall: cannot copy more than" - " one file to the same destination file\n"); - return 3; - } - - if (dstIsDir) { - arg.dstFileNameMarker = arg.dstFileName + strlen(arg.dstFileName); - - /* - * Now arg.dstFileNameMarker is pointing to the null byte at the - * end of string. We want to make sure that there is a \ at the - * end of string, and arg.dstFileNameMarker should point right - * after that \. - */ - - if (arg.dstFileNameMarker[-1] != '\\') { - *(arg.dstFileNameMarker++) = '\\'; - } - } - - if (!dstIsDir) { - struct sh_FileData srcData; - - assert(pDst - pSrc == 1); - changeForwardSlashesTpBackSlashes(*pSrc); - sh_EnumerateFiles(*pSrc, *pSrc, sh_RecordFileData, &srcData, &n); - if (n == 0) { - fprintf(stderr, "nsinstall: %s: No such file or directory\n", - *pSrc); - retVal = 3; - } else if (n > 1) { - fprintf(stderr, "nsinstall: cannot copy more than one file or " - "directory to the same destination\n"); - retVal = 3; - } else { - assert(n == 1); - if (sh_DoCopy(srcData.pathName, srcData.dwFileAttributes, - dstData.pathName, dstData.dwFileAttributes, - arg.force, arg.recursive) == FALSE) { - retVal = 3; - } - } - return retVal; - } - - for ( ; *pSrc != *pDst; pSrc++) { - BOOL rv; - - changeForwardSlashesTpBackSlashes(*pSrc); - rv = sh_EnumerateFiles(*pSrc, *pSrc, sh_CpFileCmd, &arg, &n); - if (rv == FALSE) { - retVal = 3; - } else { - if (n == 0) { - fprintf(stderr, "nsinstall: %s: No such file or directory\n", - *pSrc); - retVal = 3; - } - } - } - - return retVal; -} - -/* - * sh_EnumerateFiles -- - * - * Enumerate all the files in the specified pattern, which is a pathname - * containing possibly wildcard characters such as * and ?. fileFcn - * is called on each file, passing the expanded file name, a pointer - * to the file's WIN32_FILE_DATA, and the arg pointer. - * - * It is assumed that there are no wildcard characters before the - * character pointed to by 'where'. - * - * On return, *nFiles stores the number of files enumerated. *nFiles is - * set to this number whether sh_EnumerateFiles or 'fileFcn' succeeds - * or not. - * - * Return TRUE if the files are successfully enumerated and all - * 'fileFcn' invocations succeeded. Return FALSE if something went - * wrong. - */ - -static BOOL sh_EnumerateFiles( - const char *pattern, - const char *where, - sh_FileFcn fileFcn, - void *arg, - int *nFiles - ) -{ - WIN32_FIND_DATA fileData; - HANDLE hSearch; - const char *src; - char *dst; - char fileName[_MAX_PATH]; - char *fileNameMarker = fileName; - char *oldFileNameMarker; - BOOL hasWildcard = FALSE; - BOOL retVal = TRUE; - BOOL patternEndsInDotStar = FALSE; - BOOL patternEndsInDot = FALSE; /* a special case of - * patternEndsInDotStar */ - int numDotsInPattern; - int len; - - /* - * Windows expands patterns ending in ".", ".*", ".**", etc. - * differently from the glob expansion on Unix. For example, - * both "foo." and "foo.*" match "foo", and "*.*" matches - * everything, including filenames with no dots. So we need - * to throw away extra files returned by the FindNextFile() - * function. We require that a matched filename have at least - * the number of dots in the pattern. - */ - len = strlen(pattern); - if (len >= 2) { - /* Start from the end of pattern and go backward */ - const char *p = &pattern[len - 1]; - - /* We can have zero or more *'s */ - while (p >= pattern && *p == '*') { - p--; - } - if (p >= pattern && *p == '.') { - patternEndsInDotStar = TRUE; - if (p == &pattern[len - 1]) { - patternEndsInDot = TRUE; - } - p--; - numDotsInPattern = 1; - while (p >= pattern && *p != '\\') { - if (*p == '.') { - numDotsInPattern++; - } - p--; - } - } - } - - *nFiles = 0; - - /* - * Copy pattern to fileName, but only up to and not including - * the first \ after the first wildcard letter. - * - * Make fileNameMarker point to one of the following: - * - the start of fileName, if fileName does not contain any \. - * - right after the \ before the first wildcard letter, if there is - * a wildcard character. - * - right after the last \, if there is no wildcard character. - */ - - dst = fileName; - src = pattern; - while (src < where) { - if (*src == '\\') { - oldFileNameMarker = fileNameMarker; - fileNameMarker = dst + 1; - } - *(dst++) = *(src++); - } - - while (*src && *src != '*' && *src != '?') { - if (*src == '\\') { - oldFileNameMarker = fileNameMarker; - fileNameMarker = dst + 1; - } - *(dst++) = *(src++); - } - - if (*src) { - /* - * Must have seen the first wildcard letter - */ - - hasWildcard = TRUE; - while (*src && *src != '\\') { - *(dst++) = *(src++); - } - } - - /* Now src points to either null or \ */ - - assert(*src == '\0' || *src == '\\'); - assert(hasWildcard || *src == '\0'); - *dst = '\0'; - - /* - * If the pattern does not contain any wildcard characters, then - * we don't need to go the FindFirstFile route. - */ - - if (!hasWildcard) { - /* - * See if it is the root directory, \, or X:\. - */ - - assert(!strcmp(fileName, pattern)); - assert(strlen(fileName) >= 1); - if (dst[-1] == '\\' && (dst == fileName + 1 || dst[-2] == ':')) { - fileData.cFileName[0] = '\0'; - } else { - /* - * Do not include the trailing \, if any - */ - - if (dst[-1] == '\\') { - assert(*fileNameMarker == '\0'); - dst[-1] = '\0'; - fileNameMarker = oldFileNameMarker; - } - strcpy(fileData.cFileName, fileNameMarker); - } - fileData.dwFileAttributes = GetFileAttributes(fileName); - if (fileData.dwFileAttributes == 0xFFFFFFFF) { - return TRUE; - } - *nFiles = 1; - return (*fileFcn)(fileName, &fileData, arg); - } - - hSearch = FindFirstFile(fileName, &fileData); - if (hSearch == INVALID_HANDLE_VALUE) { - return retVal; - } - - do { - if (!strcmp(fileData.cFileName, ".") - || !strcmp(fileData.cFileName, "..")) { - /* - * Skip over . and .. - */ - - continue; - } - - if (patternEndsInDotStar) { - int nDots = 0; - char *p = fileData.cFileName; - while (*p) { - if (*p == '.') { - nDots++; - } - p++; - } - /* Now p points to the null byte at the end of file name */ - if (patternEndsInDot && (p == fileData.cFileName - || p[-1] != '.')) { - /* - * File name does not end in dot. Skip this file. - * Note: windows file name probably cannot end in dot, - * but we do this check anyway. - */ - continue; - } - if (nDots < numDotsInPattern) { - /* - * Not enough dots in file name. Must be an extra - * file in matching .* pattern. Skip this file. - */ - continue; - } - } - - strcpy(fileNameMarker, fileData.cFileName); - if (*src && *(src + 1)) { - /* - * More to go. Recurse. - */ - - int n; - - assert(*src == '\\'); - where = fileName + strlen(fileName); - strcat(fileName, src); - sh_EnumerateFiles(fileName, where, fileFcn, arg, &n); - *nFiles += n; - } else { - assert(strchr(fileName, '*') == NULL); - assert(strchr(fileName, '?') == NULL); - (*nFiles)++; - if ((*fileFcn)(fileName, &fileData, arg) == FALSE) { - retVal = FALSE; - } - } - } while (FindNextFile(hSearch, &fileData)); - - FindClose(hSearch); - return retVal; -} diff --git a/buildtools/windows/source/shmsdos/nsinstall.mak b/buildtools/windows/source/shmsdos/nsinstall.mak deleted file mode 100644 index b9ff221496a..00000000000 --- a/buildtools/windows/source/shmsdos/nsinstall.mak +++ /dev/null @@ -1,141 +0,0 @@ -# NMAKE file for building nsinstall.exe. -# -# This file is edited from an NMAKE file generated by -# Microsoft Developer Studio, Format Version 4.20 -# -# To build, say -# nmake /f nsinstall.mak CFG=Release -# or -# nmake /f nsinstall.mak CFG=Debug -# If CFG is omitted, a release build is assumed. - -!IF "$(CFG)" == "" -CFG=Release -!MESSAGE No configuration specified. Defaulting Release. -!ENDIF - -!IF "$(CFG)" != "Release" && "$(CFG)" != "Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "nsinstall.mak" CFG="Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Release" (based on "Win32 Console Application") -!MESSAGE "Debug" (based on "Win32 Console Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -################################################################################ -# Begin Project -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Release" - -OUTDIR=.\Release -INTDIR=.\Release - -ALL : "$(OUTDIR)\nsinstall.exe" - -CLEAN : - -@erase "$(INTDIR)\nsinstall.obj" - -@erase "$(OUTDIR)\nsinstall.exe" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE"\ - /Fp"$(INTDIR)/nsinstall.pch" /YX /Fo"$(INTDIR)/" /c -CPP_OBJS=.\Release/ -CPP_SBRS=.\. -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)/nsinstall.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -LINK32_FLAGS=/nologo\ - /subsystem:console /incremental:no /pdb:"$(OUTDIR)/nsinstall.pdb"\ - /out:"$(OUTDIR)/nsinstall.exe" -LINK32_OBJS= \ - "$(INTDIR)\nsinstall.obj" - -"$(OUTDIR)\nsinstall.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "Debug" - -OUTDIR=.\Debug -INTDIR=.\Debug - -ALL : "$(OUTDIR)\nsinstall.exe" - -CLEAN : - -@erase "$(INTDIR)\nsinstall.obj" - -@erase "$(INTDIR)\vc40.idb" - -@erase "$(INTDIR)\vc40.pdb" - -@erase "$(OUTDIR)\nsinstall.exe" - -@erase "$(OUTDIR)\nsinstall.ilk" - -@erase "$(OUTDIR)\nsinstall.pdb" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP_PROJ=/nologo /MD /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "DEBUG"\ - /D "_CONSOLE" /Fp"$(INTDIR)/nsinstall.pch" /YX /Fo"$(INTDIR)/"\ - /Fd"$(INTDIR)/" /c -CPP_OBJS=.\Debug/ -CPP_SBRS=.\. -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)/nsinstall.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -LINK32_FLAGS=/nologo\ - /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/nsinstall.pdb" /debug\ - /out:"$(OUTDIR)/nsinstall.exe" -LINK32_OBJS= \ - "$(INTDIR)\nsinstall.obj" - -"$(OUTDIR)\nsinstall.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Target - -################################################################################ -# Begin Source File - -SOURCE=.\nsinstall.c -DEP_CPP_SHMSD=\ - {$(INCLUDE)}"\sys\stat.h"\ - {$(INCLUDE)}"\sys\types.h"\ - - -"$(INTDIR)\nsinstall.obj" : $(SOURCE) $(DEP_CPP_SHMSD) "$(INTDIR)" - - -# End Source File -# End Target -# End Project -################################################################################ diff --git a/buildtools/windows/source/shmsdos/shmsdos.c b/buildtools/windows/source/shmsdos/shmsdos.c deleted file mode 100644 index f8274fd74ed..00000000000 --- a/buildtools/windows/source/shmsdos/shmsdos.c +++ /dev/null @@ -1,2573 +0,0 @@ -/*********************************************************** - * shmsdos - unix shell for msdos - **********************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#pragma hdrstop - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE !FALSE -#endif - -#define index(s, c) strchr((s), (c)) -#define streq(a, b) (strcmp ((a), (b)) == 0) - -#define SH_CMD_CD 0 -#define SH_CMD_EVAL 1 -#define SH_CMD_EXEC 2 -#define SH_CMD_EXIT 3 -#define SH_CMD_LOGIN 4 -#define SH_CMD_LOGOUT 5 -#define SH_CMD_SET 6 -#define SH_CMD_UMASK 7 -#define SH_CMD_WAIT 8 -#define SH_CMD_WHILE 9 -#define SH_CMD_FOR 10 -#define SH_CMD_CASE 11 -#define SH_CMD_IF 12 -#define SH_CMD_COLON 13 -#define SH_CMD_PERIOD 14 -#define SH_CMD_BREAK 15 -#define SH_CMD_CONTINUE 16 -#define SH_CMD_EXPORT 17 -#define SH_CMD_READ 18 -#define SH_CMD_READONLY 19 -#define SH_CMD_SHIFT 20 -#define SH_CMD_TIMES 21 -#define SH_CMD_TRAP 22 -#define SH_CMD_SWITCH 23 -#define SH_CMD_MKDIR 24 -#define SH_CMD_ECHO 25 -#define SH_CMD_CP 26 -#define SH_CMD_RM 27 -#define SH_CMD_TOUCH 28 -#define SH_CMD_NSINSTALL 29 -#define SH_CMD_TEST 30 -#define SH_CMD_CAT 31 -#define SH_CMD_TRUE 32 -#define SH_CMD_MV 33 - -#define COND_WHILE 0 -#define COND_FOR 1 -#define COND_CASE 2 -#define COND_IF 3 -#define COND_BREAK 4 -#define COND_CONTINUE 5 -#define COND_SHIFT 6 -#define COND_TIMES 7 -#define COND_SWITCH 8 -#define COND_FI 9 -#define COND_THEN 10 -#define COND_ELSE 11 -#define COND_DONE 12 -#define COND_DO 13 - -/* - * sh_FileFcn -- - * - * A function that operates on a file. The pathname is either - * absolute or relative to the current directory, and contains - * no wildcard characters such as * and ?. Additional arguments - * can be passed to the function via the arg pointer. - */ - -typedef BOOL (*sh_FileFcn)( - char *pathName, - WIN32_FIND_DATA *fileData, - void *arg); - -//static char sh_chars[] = "#;\"*?[]&|<>(){}$`^"; -static char sh_chars[] = ";"; -static char *conditional_cmds[] = { "while", "for", - "case", "if", "break", "continue", - "shift", "times", "switch", "fi", "then", "else", "done", "do", 0 }; - -static char *sh_cmds[] = { "cd", "eval", "exec", "exit", "login", - "logout", "set", "umask", "wait", "while", "for", - "case", "if", ":", ".", "break", "continue", - "export", "read", "readonly", "shift", "times", - "trap", "switch", "mkdir", "echo", "cp", "rm", - "touch", "nsinstall", "test", "cat", "true", "mv", 0 }; - -static char ** getNextCommandArgv (char **line, char * pMacro, char * pSubstitution); -static int doBuiltinShellCommand (char *argv[ ], char **envp); -static char ** getlistOfOptions (char **pArgv, char * pOptions); -static int parseShellLine ( char** pointerIntoLine, char *argv[ ], char *envp[ ], - char * pMacro, char * pSubstitution ); -static void freeArgv ( char *argv[ ] ); -static int shellCp (char **pArgv); -static int shellEcho (char **pArgv); -static int shellRm (char **pArgv); -static int shellNsinstall (char **pArgv); -static int shellMkdir (char **pArgv); -static int shellTest (char **pArgv); -static int shellCat (char **pArgv); -static int shellMv (char **pArgv); -static BOOL sh_EnumerateFiles(const char *pattern, const char *where, - sh_FileFcn fileFcn, void *arg, int *nFiles); -static const char *sh_GetLastErrorMessage(void); -static BOOL sh_DoCopy(char *srcFileName, DWORD srcFileAttributes, - char *dstFileName, DWORD dstFileAttributes, - int force, int recursive); - -static int waitForDebug = 1; - -char * next_token( char *p) -{ - while ( *p == ' ' || *p == '\t' ) - ++p; - return p; -} - -static char* convertArgvIntoCommandLine( int argc, char *argv[ ] ) -{ - char *pLine; - char *p; - int argi; - int totalLength = 0; - - /* get total # of characters in command line */ - argi = 2; - while ( argi < argc ) { - if ( argv[argi] ) - totalLength += strlen ( argv[argi] ) + 1; - argi++; - } - - /* allocate memory for the command line */ - pLine = (char *) malloc (totalLength * sizeof (char *)); - if ( pLine == NULL ) { - printf ("Not enough memory in SHMSDOS\n"); - exit(1); - } - /* compress all tokens into single command line */ - argi = 2; - p = pLine; - while ( argi < argc ) { - char *pArgv = argv[argi]; - while ( *pArgv ) - *p++ = *pArgv++; - argi++; - *p++ = ' '; - } - - /* remove trailing blanks */ - while ( (p > pLine) && (*(p-1) == ' ' ) ) - *(--p) = '\0'; - - return pLine; -} - -main( int argc, char *argv[ ], char *envp[ ] ) -{ - int status; - char* pointerIntoLine; - char **newArgv; - - char * pLine = convertArgvIntoCommandLine( argc, argv ); - pointerIntoLine = pLine; - - while ( TRUE ) { - newArgv = getNextCommandArgv ( &pointerIntoLine, NULL, NULL ); - if ( newArgv == 0 ) - break; - - status = parseShellLine ( &pointerIntoLine, newArgv, envp, NULL, NULL ); - freeArgv ( newArgv ); - if ( status != 0 ) - break; - } - - /* process each shell command */ - free ( pLine ); - return status; -} - - /* process each shell command */ -int getConditionalCommand ( char * shellName ) -{ - int shellCommand = -1; - int j; - - /* search for shell name */ - for (j = 0; conditional_cmds[j] != 0; ++j) { - if ( streq (conditional_cmds[j], shellName) ) { - shellCommand = j; - break; - } - } - return shellCommand; -} - -/* - if list then list [ elif list then list ] ... [ else list ] fi - The list following if is executed and, if it returns a zero exit - status, the list following the first then is executed. Otherwise, - the list following elif is executed and, if its value is zero, the - list following the next then is executed. Failing that, the else - list is executed. If no else list or then list is executed, then - the if command returns a zero exit status. - */ -int parseIfCommand ( char** pointerIntoLine, char *argv[ ], char *envp[ ], - char * pMacro, char * pSubstitution ) -{ - int ifTestedTrue; - int status = 0; - int shellCommand; - char **pArgv; - - /* check test condition */ -// while ( waitForDebug ); - ifTestedTrue = doBuiltinShellCommand ( argv, envp ); - if ( (ifTestedTrue != 0) && (ifTestedTrue != 1) ) { - printf ( "Error executing command %s while processing 'if'\n", argv[0] ); - return ifTestedTrue; - } - ifTestedTrue = !ifTestedTrue; - - while ( TRUE ) { - - char **newArgv = getNextCommandArgv ( pointerIntoLine, pMacro, pSubstitution ); - if ( newArgv == 0 ) { - status = -1; - break; - } - pArgv = newArgv; - - /* get next shell command */ - shellCommand = getConditionalCommand ( newArgv[0] ); - if ( shellCommand == COND_FI ) { - status = 0; - freeArgv ( newArgv ); - break; - } else if ( shellCommand == COND_THEN ) { - pArgv++; - } else if ( shellCommand == COND_ELSE ) { - pArgv++; - ifTestedTrue = !ifTestedTrue; - } - if ( ifTestedTrue ) - status = parseShellLine ( pointerIntoLine, pArgv, envp, pMacro, pSubstitution ); - else - status = 0; - freeArgv ( newArgv ); - if ( status != 0 ) - break; - } - - return status; -} -/* - for name [ in word ... ] do list done - Each time a for command is executed, name is set to the next word - taken from the in word list. If in word ... is omitted, then the - for command executes the do list once for each positional parameter - that is set (see Parameter Substitution below). Execution ends when - there are no more words in the list. - */ -int parseForCommand ( char** pointerIntoLine, char *argv[ ], char *envp[ ] ) -{ - int status = 0; - int shellCommand; - char **pArgv = argv; - char * pMacro; - char ** pWord; - char* doPointerIntoLine; - - // get name of macro - pMacro = *pArgv++; - - if ( strcmp ( "in" , *pArgv ) != 0 ) { - exit (1); - } - pArgv++; - pWord = pArgv; - - - - /* check test condition */ -// while ( waitForDebug ); - doPointerIntoLine = *pointerIntoLine; - while ( *pWord ) { - - while ( TRUE ) { - char **newArgv = getNextCommandArgv ( pointerIntoLine, pMacro, *pWord ); - if ( newArgv == 0 ) { - status = -1; - break; - } - pArgv = newArgv; - - shellCommand = getConditionalCommand ( *pArgv ); - if ( shellCommand == COND_DO ) { - pArgv++; - } - - /* get next shell command */ - if ( shellCommand == COND_DONE ) { - status = 0; - freeArgv ( newArgv ); - break; - } - status = parseShellLine ( pointerIntoLine, pArgv, envp, pMacro, *pWord ); - freeArgv ( newArgv ); - if ( status != 0 ) - break; - } - pWord++; - if ( status != 0 ) - break; - - /* if another word exists in list, then repeat */ - if ( *pWord ) - *pointerIntoLine = doPointerIntoLine; - } - - return status; -} -/* process each shell command */ -int parseShellLine ( char** pointerIntoLine, char *argv[ ], char *envp[ ], - char * pMacro, char * pSubstitution ) -{ - int shellCommand; - char **pArgv; - int status; - - /* search for shell name */ - shellCommand = getConditionalCommand ( argv[0] ); - - /* process shell command */ - - if ( shellCommand == -1 ) { - status = doBuiltinShellCommand ( argv, envp ); - } else { - pArgv = &argv[1]; - switch ( shellCommand ) { - case COND_IF: - status = parseIfCommand ( pointerIntoLine, pArgv, envp, pMacro, pSubstitution ); - break; - case COND_FOR: - status = parseForCommand ( pointerIntoLine, pArgv, envp ); - break; - default: - printf ( "Unexpected conditional command: -%s-\n", argv[0] ); - status = -1; - break; - } - } - return status; -} - -/* Figure out the argument list necessary to run LINE as a command. Try to - avoid using a shell. This routine handles only ' quoting, and " quoting - when no backslash, $ or ` characters are seen in the quotes. Starting - quotes may be escaped with a backslash. If any of the characters in - sh_chars[] is seen, or any of the builtin commands listed in sh_cmds[] - is the first word of a line, the shell is used. - - SHELL is the shell to use, or nil to use the default shell. - IFS is the value of $IFS, or nil (meaning the default). */ - -static char ** -getNextCommandArgv (char **pLine, char * pMacro, char * pSubstitution ) -{ - register int i; - register int lineLength; - register char *pp; - register char *p; - register char *ap; - char *line = *pLine; - char *end; - int instring, word_has_equals, seen_nonequals; - char **new_argv = 0; - int foundStartOfLine; - int iSubstitutionLen; - - /* Make sure not to bother processing an empty line. */ - foundStartOfLine = FALSE; - while ( !foundStartOfLine ) { - switch ( *line ) { - case ';': - case '\t': - case ' ': - ++line; - break; - - case '\\': - if ( *(line+1) == 't') { - line += 2; - break; - } - - default: - foundStartOfLine = TRUE; - break; - } - } - - if (*line == '\0') - return 0; - - /* get maximum length of length with arguments substituted */ - i = strlen (line) + 1; - lineLength = i; - - - /* More than 1 arg per character is impossible. */ - new_argv = (char **) malloc (i * sizeof (char *)); - if ( new_argv == NULL ) { - printf ("Not enough memory in SHMSDOS\n"); - exit(1); - } - - /* increase size of parameters by macro substitution */ - pp = line; - if ( pSubstitution ) { - iSubstitutionLen = strlen ( pSubstitution ) - strlen ( pMacro ) - 1; - while ( *pp ) { - if ( *pp++ == '$' ) - lineLength += iSubstitutionLen; - } - } - - /* All the args can fit in a buffer as big as LINE is. */ - ap = new_argv[0] = (char *) malloc (lineLength); - if ( ap == NULL ) { - printf ("Not enough memory in SHMSDOS\n"); - exit(1); - } - end = ap + lineLength; - - /* I is how many complete arguments have been found. */ - i = 0; - instring = word_has_equals = seen_nonequals = 0; - for (p = line; *p != '\0'; ++p) - { - if (ap > end) - { - fprintf(stderr, "Internal error: stepping past the end of buffer, " - "at %s, line %d\n", __FILE__, __LINE__); - abort (); - } - - if (instring) - { - string_char: - /* Inside a string, just copy any char except a closing quote - or a backslash-newline combination. */ - if (*p == instring) - instring = 0; - else if (*p == '\\' && p[1] == '\n') - goto swallow_escaped_newline; - /* Backslash, $, and ` are special inside double quotes. - If we see any of those, punt. */ - else if (instring == '"' && *p == '\\' - && strchr("\\$`\"", p[1]) != NULL) - /* The backslash can be used to escape another special - character inside double quotes. */ - *ap++ = *++p; - else if (instring == '"' && *p == '$') - goto macroSubstitution; - else - *ap++ = *p; - } - else if (index (sh_chars, *p) != 0) - /* Not inside a string, but it's a special char. */ - goto slow; - else - /* Not a special char. */ - switch (*p) - { - case '=': - /* Equals is a special character in leading words before the - first word with no equals sign in it. This is not the case - with sh -k, but we never get here when using nonstandard - shell flags. */ - if (! seen_nonequals) - goto slow; - word_has_equals = 1; - *ap++ = '='; - break; - - case '\\': - /* Backslash-newline combinations are eaten. */ - if (p[1] == '\n') - { - swallow_escaped_newline: - - /* Eat the backslash, the newline, and following whitespace, - replacing it all with a single space. */ - p += 2; - - /* If there is a tab after a backslash-newline, - remove it from the source line which will be echoed, - since it was most likely used to line - up the continued line with the previous one. */ - if (*p == '\t') - strcpy (p, p + 1); - - if (instring) - goto string_char; - else - { - if (ap != new_argv[i]) - /* Treat this as a space, ending the arg. - But if it's at the beginning of the arg, it should - just get eaten, rather than becoming an empty arg. */ - goto end_of_arg; - else - p = next_token (p) - 1; - } - } - else if (p[1] != '\0') - /* Copy and skip the following char. */ - *ap++ = *++p; -// *ap++ = *p; - break; - - case '\'': - case '"': - instring = *p; - break; - - case '\n': - /* Newlines are not special. */ - *ap++ = '\n'; - break; - - case '$': -macroSubstitution: - if ( pMacro ) { - int len = strlen ( pMacro ); - if ( strncmp ( pMacro, p+1, len ) == 0 ) { - p += len; - strcpy ( ap, pSubstitution ); - ap += strlen ( pSubstitution ); - break; - } - } - - /* Newlines are not special. */ - *ap++ = *p; - break; - - case ' ': - case '\t': - end_of_arg: - /* We have the end of an argument. - Terminate the text of the argument. */ - *ap++ = '\0'; - new_argv[++i] = ap; - - /* Update SEEN_NONEQUALS, which tells us if every word - heretofore has contained an `='. */ - seen_nonequals |= ! word_has_equals; - if (word_has_equals && ! seen_nonequals) - /* An `=' in a word before the first - word without one is magical. */ - goto slow; - word_has_equals = 0; /* Prepare for the next word. */ - - /* Ignore multiple whitespace chars. */ - p = next_token (p); - /* Next iteration should examine the first nonwhite char. */ - --p; - break; - - default: - *ap++ = *p; - break; - } - } - - /* Terminate the last argument and the argument list. */ - -slow:; - *ap = '\0'; - if (new_argv[i][0] != '\0') - ++i; - new_argv[i] = 0; - - *pLine = p; /* return pointer into line */ - return new_argv; - -} - -static void -freeArgv ( char *argv[ ] ) -{ - free (argv[0]); - free (argv); -} - -/* changes all forward slashes in token to back slashes */ -void changeForwardSlashesTpBackSlashes ( char *arg ) -{ - if ( arg == NULL ) - return; - - /* get options for command */ - while ( *arg ) { - if ( *arg == '/' ) - *arg = '\\'; - arg++; - } -} - -/* - * The various spawn functions in Microsoft's runtime library - * may fail if the Path environment variable contains nonexistent - * directories. The spawn functions expect to get ENOENT in - * this situation, but on some Compaq PCs I've seen EACCES - * ("Permission denied") being returned. So I wrote our own - * process-spawning function ns_spawn(). My code is inspired - * by Microsoft's implementation of spawnvpe(). - */ - -/* - * Assemble the command line by concatenating the argv array. - * On success, this function returns 0 and the resulting command - * line is returned in *cmdLine. On failure, it returns -1. - */ -static int assembleCmdLine(char **argv, char **cmdLine) -{ - char **arg; - char *p, *q; - int cmdLineSize; - int numBackslashes; - int i; - int argNeedQuotes; - - /* - * Find out how large the command line buffer should be. - */ - cmdLineSize = 0; - for (arg = argv; *arg; arg++) { - /* - * \ and " need to be escaped by a \. In the worst case, - * every character is a \ or ", so the string of length - * may double. If we quote an argument, that needs two ". - * Finally, we need a space between arguments, and - * a null byte at the end of command line. - */ - cmdLineSize += 2 * strlen(*arg) /* \ and " need to be escaped */ - + 2 /* we quote every argument */ - + 1; /* space in between, or final null */ - } - p = *cmdLine = malloc(cmdLineSize); - if (p == NULL) { - return -1; - } - - for (arg = argv; *arg; arg++) { - /* Add a space to separates the arguments */ - if (arg != argv) { - *p++ = ' '; - } - q = *arg; - numBackslashes = 0; - argNeedQuotes = 0; - - /* If the argument contains white space, it needs to be quoted. */ - if (strpbrk(*arg, " \f\n\r\t\v")) { - argNeedQuotes = 1; - } - - if (argNeedQuotes) { - *p++ = '"'; - } - while (*q) { - if (*q == '\\') { - numBackslashes++; - q++; - } else if (*q == '"') { - if (numBackslashes) { - /* - * Double the backslashes since they are followed - * by a quote - */ - for (i = 0; i < 2 * numBackslashes; i++) { - *p++ = '\\'; - } - numBackslashes = 0; - } - /* To escape the quote */ - *p++ = '\\'; - *p++ = *q++; - } else { - if (numBackslashes) { - /* - * Backslashes are not followed by a quote, so - * don't need to double the backslashes. - */ - for (i = 0; i < numBackslashes; i++) { - *p++ = '\\'; - } - numBackslashes = 0; - } - *p++ = *q++; - } - } - - /* Now we are at the end of this argument */ - if (numBackslashes) { - /* - * Double the backslashes if we have a quote string - * delimiter at the end. - */ - if (argNeedQuotes) { - numBackslashes *= 2; - } - for (i = 0; i < numBackslashes; i++) { - *p++ = '\\'; - } - } - if (argNeedQuotes) { - *p++ = '"'; - } - } - - *p = '\0'; - return 0; -} - -/* - * Assemble the environment block by concatenating the envp array - * (preserving the terminating null byte in each array element) - * and adding a null byte at the end. - * - * Returns 0 on success. The resulting environment block is returned - * in *envBlock. Note that if envp is NULL, a NULL pointer is returned - * in *envBlock. Returns -1 on failure. - */ -static int assembleEnvBlock(char **envp, char **envBlock) -{ - char *p; - char *q; - char **env; - char *curEnv; - char *cwdStart, *cwdEnd; - int envBlockSize; - - if (envp == NULL) { - *envBlock = NULL; - return 0; - } - - curEnv = GetEnvironmentStrings(); - - cwdStart = curEnv; - while (*cwdStart) { - if (cwdStart[0] == '=' && cwdStart[1] != '\0' - && cwdStart[2] == ':' && cwdStart[3] == '=') { - break; - } - cwdStart += strlen(cwdStart) + 1; - } - cwdEnd = cwdStart; - if (*cwdEnd) { - cwdEnd += strlen(cwdEnd) + 1; - while (*cwdEnd) { - if (cwdEnd[0] != '=' || cwdEnd[1] == '\0' - || cwdEnd[2] != ':' || cwdEnd[3] != '=') { - break; - } - cwdEnd += strlen(cwdEnd) + 1; - } - } - envBlockSize = cwdEnd - cwdStart; - - for (env = envp; *env; env++) { - envBlockSize += strlen(*env) + 1; - } - envBlockSize++; - - p = *envBlock = malloc(envBlockSize); - if (p == NULL) { - FreeEnvironmentStrings(curEnv); - return -1; - } - - q = cwdStart; - while (q < cwdEnd) { - *p++ = *q++; - } - FreeEnvironmentStrings(curEnv); - - for (env = envp; *env; env++) { - q = *env; - while (*q) { - *p++ = *q++; - } - *p++ = '\0'; - } - *p = '\0'; - return 0; -} - -/* - * For qsort. We sort (case-insensitive) the environment strings - * before generating the environment block. - */ -static int compare(const void *arg1, const void *arg2) -{ - return _stricmp(* (char**)arg1, * (char**)arg2); -} - -/* - * Spawn a new process with arguments argv and environment envp, - * wait until it terminates, and return its exit code in *exitCode. - * Return 0 on success. Return -1 on error. Call GetLastError() - * (note: not errno) to get the error code. - */ -static int ns_spawn(char **argv, char **envp, int *exitCode) -{ - char *cmdLine; - char *envBlock; - char **newEnvp; - BOOL rv; - STARTUPINFO si; - PROCESS_INFORMATION pi; - - changeForwardSlashesTpBackSlashes(argv[0]); - if (assembleCmdLine(argv, &cmdLine) == -1) { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return -1; - } - - if (envp == NULL) { - newEnvp = NULL; - } else { - int i; - int numEnv = 0; - while (envp[numEnv]) { - numEnv++; - } - newEnvp = (char **) malloc((numEnv+1) * sizeof(char *)); - for (i = 0; i <= numEnv; i++) { - newEnvp[i] = envp[i]; - } - qsort((void *) newEnvp, (size_t) numEnv, sizeof(char *), compare); - } - if (assembleEnvBlock(newEnvp, &envBlock) == -1) { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - free(cmdLine); - return -1; - } - - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - - rv = CreateProcess( - NULL, - cmdLine, - NULL, - NULL, - TRUE, - 0, - envBlock, - NULL, - &si, - &pi); - free(cmdLine); - free(envBlock); - if (!rv) { - return -1; - } - CloseHandle(pi.hThread); - WaitForSingleObject(pi.hProcess, INFINITE); - if (exitCode) { - GetExitCodeProcess(pi.hProcess, exitCode); - } - CloseHandle(pi.hProcess); - return 0; -} - -static int -doBuiltinShellCommand (char *argv[ ], char **envp) -{ - int retVal = 0; /* assume valid return */ - char path[_MAX_PATH]; - char **pArgv; - char *arg1; -// char options[1024]; -// char *pOptions; - int j; - int fileHandle; - char * shellName = *argv; - int shellCommand = - 1; - - /* search for shell name */ - for (j = 0; sh_cmds[j] != 0; ++j) { - if ( streq (sh_cmds[j], shellName) ) { - shellCommand = j; - break; - } - } - - pArgv = &argv[1]; - switch ( shellCommand ) { - case SH_CMD_CD: - while ( **pArgv == '-' ) - pArgv++; - arg1 = *pArgv; - changeForwardSlashesTpBackSlashes ( arg1 ); - _getcwd ( path, sizeof (path) ); - if ( _chdir ( arg1 ) == -1 ) { - perror ( "Path not found" ); - retVal = 2; - break; - } - _getcwd ( path, sizeof (path) ); - break; - - case SH_CMD_NSINSTALL: -// while ( waitForDebug ); - retVal = shellNsinstall ( pArgv ); - break; - - - case SH_CMD_MKDIR: - retVal = shellMkdir ( pArgv ); - break; - - case SH_CMD_CP: - retVal = shellCp ( pArgv ); - break; - - case SH_CMD_ECHO: - retVal = shellEcho ( pArgv ); - break; - - case SH_CMD_RM: - retVal = shellRm ( pArgv ); - break; - - case SH_CMD_TOUCH: - while ( **pArgv == '-' ) - pArgv++; - arg1 = *pArgv; - changeForwardSlashesTpBackSlashes ( arg1 ); - fileHandle = _open( arg1, _O_CREAT ); - if( fileHandle == -1 ) { - perror( "Open failed on input file" ); - retVal = 5; - } else { - _close( fileHandle ); - } - break; - - /* - * set [ --aefhkntuvx [ arg ... ] ] - * -a Mark variables which are modified or created for export. - * -e Exit immediately if a command exits with a non-zero exit - * status. - * -f Disable file name generation - * -h Locate and remember function commands as functions are defined - * (function commands are normally located when the function is - * executed). - * -k All keyword arguments are placed in the environment for a - * command, not just those that precede the command name. - * -n Read commands but do not execute them. - * -t Exit after reading and executing one command. - * -u Treat unset variables as an error when substituting. - * -v Print shell input lines as they are read. - * -x Print commands and their arguments as they are executed. - * -- Do not change any of the flags; useful in setting $1 to -. - * Using + rather than - causes these flags to be turned off. These - * flags can also be used upon invocation of the shell. The current - * set of flags may be found in $-. The remaining arguments are - * positional parameters and are assigned, in order, to $1, $2, .... - * If no arguments are given the values of all names are printed. - */ - - case SH_CMD_SET: - arg1 = *pArgv++; - //printf ( "set %s\n", arg1 ); - break; - - case SH_CMD_TEST: - retVal = shellTest ( pArgv ); - break; - - case SH_CMD_CAT: - retVal = shellCat ( pArgv ); - break; - - case SH_CMD_TRUE: - break; - - case SH_CMD_MV: - retVal = shellMv ( pArgv ); - break; - - default: -// retVal = spawnvp (P_WAIT, argv[0], argv ); - if ( ns_spawn (argv, envp, &retVal) == -1 ) { - fprintf (stderr, "SHMSDOS: %s: %s\n", argv[0], - sh_GetLastErrorMessage ()); - retVal = -1; - } - break; - } - return retVal; -} - -static char ** -getlistOfOptions (char **pArgv, char * pOptions) -{ - char *pArg; - while ( *pArgv && (**pArgv == '-') ) { - pArg = *pArgv; - pArg++; /* skip over '-' */ - while ( *pArg ) - *pOptions++ = *pArg++; - pArgv++; - } - *pOptions = '\0'; - return pArgv; -} - -static int -shellNsinstall (char **pArgv) -{ - int retVal = 0; /* exit status */ - int dirOnly = 0; /* 1 if and only if -D is specified */ - char **pSrc; - char **pDst; - - /* - * Process the command-line options. We ignore the - * options except for -D. Some options, such as -m, - * are followed by an argument. We need to skip the - * argument too. - */ - while ( *pArgv && **pArgv == '-' ) { - char c = (*pArgv)[1]; /* The char after '-' */ - - if ( c == 'D' ) { - dirOnly = 1; - } else if ( c == 'm' ) { - pArgv++; /* skip the next argument */ - } - pArgv++; - } - - if ( !dirOnly ) { - /* There are files to install. Get source files */ - if ( *pArgv ) { - pSrc = pArgv++; - } else { - fprintf( stderr, "SHMSDOS: nsinstall: not enough arguments\n"); - return 3; - } - } - - /* Get to last token to find destination directory */ - if ( *pArgv ) { - pDst = pArgv++; - if ( dirOnly && *pArgv ) { - fprintf( stderr, "SHMSDOS: nsinstall: too many arguments with -D\n"); - return 3; - } - } else { - fprintf( stderr, "SHMSDOS: nsinstall: not enough arguments\n"); - return 3; - } - while ( *pArgv ) - pDst = pArgv++; - - retVal = shellMkdir ( pDst ); - if ( retVal ) - return retVal; - if ( !dirOnly ) - retVal = shellCp ( pSrc ); - return retVal; -} - -static int -shellMkdir (char **pArgv) -{ - int retVal = 0; /* assume valid return */ - char *arg; - char *pArg; - char path[_MAX_PATH]; - char tmpPath[_MAX_PATH]; - char *pTmpPath = tmpPath; - - /* All the options are simply ignored in this implementation */ - while ( *pArgv && **pArgv == '-' ) { - if ( (*pArgv)[1] == 'm' ) { - pArgv++; /* skip the next argument (mode) */ - } - pArgv++; - } - - while ( *pArgv ) { - arg = *pArgv; - changeForwardSlashesTpBackSlashes ( arg ); - pArg = arg; - pTmpPath = tmpPath; - while ( 1 ) { - /* create part of path */ - while ( *pArg ) { - *pTmpPath++ = *pArg++; - if ( *pArg == '\\' ) - break; - } - *pTmpPath = '\0'; - - /* check if directory alreay exists */ - _getcwd ( path, sizeof (path) ); - if ( _chdir ( tmpPath ) != -1 ) { - _chdir ( path ); - } else { - if ( _mkdir ( tmpPath ) == -1 ) { -// while ( waitForDebug ); - printf ( "%s: ", tmpPath ); - perror ( "Could not create the directory" ); - retVal = 3; - break; - } - } - if ( *pArg == '\0' ) /* complete path? */ - break; - /* loop for next directory */ - } - - pArgv++; - } - return retVal; -} - -static const char * -sh_GetLastErrorMessage() -{ - static char buf[128]; - - FormatMessage( - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* default language */ - buf, - sizeof(buf), - NULL - ); - return buf; -} - -/* - * struct sh_FileData -- - * - * A pointer to the sh_FileData structure is passed into sh_RecordFileData, - * which will fill in the fields. - */ - -struct sh_FileData { - char pathName[_MAX_PATH]; - DWORD dwFileAttributes; -}; - -/* - * sh_RecordFileData -- - * - * Record the pathname and attributes of the file in - * the sh_FileData structure pointed to by arg. - * - * Always return TRUE (successful completion). - * - * This function is intended to be passed into sh_EnumerateFiles - * to see if a certain pattern expands to exactly one file/directory, - * and if so, record its pathname and attributes. - */ - -static BOOL -sh_RecordFileData(char *pathName, WIN32_FIND_DATA *findData, void *arg) -{ - struct sh_FileData *fData = (struct sh_FileData *) arg; - - strcpy(fData->pathName, pathName); - fData->dwFileAttributes = findData->dwFileAttributes; - return TRUE; -} - -/* - * CopyDirRecursive -- - * - * First create a new directory, then recursively copy - * the contents of the specified directory to the new directory. - * - * This routine is called only by CopyDir and by itself - * (recursion). - */ - -static int -CopyDirRecursive(char *srcDir, char *dstDir, int force) -{ - DWORD dwFileAttributes; - WIN32_FIND_DATA fileData; - HANDLE hSearch; - char *srcDirMarker; - char *dstDirMarker; - int retVal = 0; /* The return value of this routine. 0 means success. - * Nonzero means failure. */ - - dwFileAttributes = GetFileAttributes(dstDir); - if (dwFileAttributes == 0xFFFFFFFF) { - if (_mkdir(dstDir) == -1) { - fprintf(stderr, "SHMSDOS: cp: cannot create directory %s: %s\n", - dstDir, strerror(errno)); - return 8; - } - } else { - if (!(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - fprintf(stderr, "SHMSDOS: cp: target %s is an existing file\n", - dstDir); - return 8; - } - if (force && (dwFileAttributes & FILE_ATTRIBUTE_READONLY)) { - dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY; - SetFileAttributes(dstDir, dwFileAttributes); - } - } - - dstDirMarker = dstDir + strlen(dstDir); - *(dstDirMarker++) = '\\'; - - srcDirMarker = srcDir + strlen(srcDir); - *(srcDirMarker++) = '\\'; - strcpy(srcDirMarker, "*"); - hSearch = FindFirstFile(srcDir, &fileData); - if (hSearch == INVALID_HANDLE_VALUE) { - /* Directory is empty. We are done. */ - - return 0; - } - - do { - if (!strcmp(fileData.cFileName, ".") - || !strcmp(fileData.cFileName, "..")) { - /* - * Skip over . and .. - */ - - continue; - } - - strcpy(srcDirMarker, fileData.cFileName); - strcpy(dstDirMarker, fileData.cFileName); - if (sh_DoCopy(srcDir, fileData.dwFileAttributes, - dstDir, GetFileAttributes(dstDir), - force, TRUE) == FALSE) { - retVal = 5; - } - } while (FindNextFile(hSearch, &fileData)); - FindClose(hSearch); - return retVal; -} - -static BOOL -sh_DoCopy(char *srcFileName, - DWORD srcFileAttributes, - char *dstFileName, - DWORD dstFileAttributes, - int force, - int recursive -) -{ - if (dstFileAttributes != 0xFFFFFFFF) { - if ((dstFileAttributes & FILE_ATTRIBUTE_READONLY) && force) { - dstFileAttributes &= ~FILE_ATTRIBUTE_READONLY; - SetFileAttributes(dstFileName, dstFileAttributes); - } - } - - if (srcFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - if (!recursive) { - fprintf(stderr, "SHMSDOS: cp: %s is a directory\n", - srcFileName); - return FALSE; - } else if (CopyDirRecursive(srcFileName, dstFileName, force) != 0) { - return FALSE; - } - } else { - if (!CopyFile(srcFileName, dstFileName, FALSE)) { - fprintf(stderr, "SHMSDOS: cp: cannot copy %s to %s: %s\n", - srcFileName, dstFileName, sh_GetLastErrorMessage()); - return FALSE; - } - } - return TRUE; -} - -/* - * struct sh_CpCmdArg -- - * - * A pointer to the sh_CpCmdArg structure is passed into sh_CpFileCmd. - * The sh_CpCmdArg contains information about the cp command, and - * provide a buffer for constructing the destination file name. - */ - -struct sh_CpCmdArg { - int force; /* -f option, ok to overwrite an existing - * read-only destination file */ - int recursive; /* -r or -R option, recursively copy - * directories. */ - char *dstFileName; /* a buffer for constructing the destination - * file name */ - char *dstFileNameMarker; /* points to where in the dstFileName buffer - * we should write the file component of the - * destination file */ -}; - -/* - * sh_CpFileCmd -- - * - * Copy a file to the destination directory - * - * This function is intended to be passed into sh_EnumerateFiles to - * copy all the files specified by the pattern to the destination - * directory. - * - * Return TRUE if the file is successfully copied, and FALSE otherwise. - */ - -static BOOL -sh_CpFileCmd(char *pathName, WIN32_FIND_DATA *findData, void *cpArg) -{ - BOOL retVal = TRUE; - struct sh_CpCmdArg *arg = (struct sh_CpCmdArg *) cpArg; - - strcpy(arg->dstFileNameMarker, findData->cFileName); - return sh_DoCopy(pathName, findData->dwFileAttributes, - arg->dstFileName, GetFileAttributes(arg->dstFileName), - arg->force, arg->recursive); -} - -static int -shellCp (char **pArgv) -{ - int retVal = 0; - char **pSrc; - char **pDst; - struct sh_CpCmdArg arg; - struct sh_FileData dstData; - int dstIsDir = 0; - int n; - - arg.force = 0; - arg.recursive = 0; - arg.dstFileName = dstData.pathName; - arg.dstFileNameMarker = 0; - - while (*pArgv && **pArgv == '-') { - char *p = *pArgv; - - while (*(++p)) { - if (*p == 'f') { - arg.force = 1; - } else if (*p == 'r' || *p == 'R') { - arg.recursive = 1; - } - } - pArgv++; - } - - /* the first source file */ - if (*pArgv) { - pSrc = pArgv++; - } else { - fprintf(stderr, "SHMSDOS: cp: not enough arguments\n"); - return 3; - } - - /* get to the last token to find destination */ - if (*pArgv) { - pDst = pArgv++; - } else { - fprintf(stderr, "SHMSDOS: cp: not enough arguments\n"); - return 3; - } - while (*pArgv) { - pDst = pArgv++; - } - - /* - * The destination pattern must unambiguously expand to exactly - * one file or directory. - */ - - changeForwardSlashesTpBackSlashes(*pDst); - sh_EnumerateFiles(*pDst, *pDst, sh_RecordFileData, &dstData, &n); - assert(n >= 0); - if (n == 1) { - /* - * Is the destination a file or directory? - */ - - if (dstData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - dstIsDir = 1; - } - } else if (n > 1) { - fprintf(stderr, "SHMSDOS: cp: %s: ambiguous destination file " - "or directory\n", *pDst); - return 3; - } else { - /* - * n == 0, meaning that destination file or directory does - * not exist. In this case the destination file directory - * name must be fully specified. - */ - - char *p; - - for (p = *pDst; *p; p++) { - if (*p == '*' || *p == '?') { - fprintf(stderr, "SHMSDOS: cp: %s: No such file or directory\n", - *pDst); - return 3; - } - } - - /* - * Do not include the trailing \, if any, unless it is a root - * directory (\ or X:\). - */ - - if (p > *pDst && p[-1] == '\\' && p != *pDst + 1 && p[-2] != ':') { - p[-1] = '\0'; - } - strcpy(dstData.pathName, *pDst); - dstData.dwFileAttributes = 0xFFFFFFFF; - } - - /* - * If there are two or more source files, the destination has - * to be a directory. - */ - - if (pDst - pSrc > 1 && !dstIsDir) { - fprintf(stderr, "SHMSDOS: cp: cannot copy more than" - " one file to the same destination file\n"); - return 3; - } - - if (dstIsDir) { - arg.dstFileNameMarker = arg.dstFileName + strlen(arg.dstFileName); - - /* - * Now arg.dstFileNameMarker is pointing to the null byte at the - * end of string. We want to make sure that there is a \ at the - * end of string, and arg.dstFileNameMarker should point right - * after that \. - */ - - if (arg.dstFileNameMarker[-1] != '\\') { - *(arg.dstFileNameMarker++) = '\\'; - } - } - - if (!dstIsDir) { - struct sh_FileData srcData; - - assert(pDst - pSrc == 1); - changeForwardSlashesTpBackSlashes(*pSrc); - sh_EnumerateFiles(*pSrc, *pSrc, sh_RecordFileData, &srcData, &n); - if (n == 0) { - fprintf(stderr, "SHMSDOS: cp: %s: No such file or directory\n", - *pSrc); - retVal = 3; - } else if (n > 1) { - fprintf(stderr, "SHMSDOS: cp: cannot copy more than one file or " - "directory to the same destination\n"); - retVal = 3; - } else { - assert(n == 1); - if (sh_DoCopy(srcData.pathName, srcData.dwFileAttributes, - dstData.pathName, dstData.dwFileAttributes, - arg.force, arg.recursive) == FALSE) { - retVal = 3; - } - } - return retVal; - } - - for ( ; *pSrc != *pDst; pSrc++) { - BOOL rv; - - changeForwardSlashesTpBackSlashes(*pSrc); - rv = sh_EnumerateFiles(*pSrc, *pSrc, sh_CpFileCmd, &arg, &n); - if (rv == FALSE) { - retVal = 3; - } else { - if (n == 0) { - fprintf(stderr, "SHMSDOS: cp: %s: No such file or directory\n", - *pSrc); - retVal = 3; - } - } - } - - return retVal; -} - -static int -shellEcho(char **pArgv) -{ - int retVal = 0; - FILE *file = stdout; - char *fileName = NULL; - int redirectOutput = 0; - char **argv; - char *arrow = NULL; - int skipTwoArgs = 0; - int firstArg; - const char *mode = "w"; - - if (*pArgv == NULL) { - return 0; - } - - /* - * See if output is redirected to a file - */ - - for (argv = pArgv; *argv; argv++) { - char *p = *argv; - - if (*p == '>') { - if (redirectOutput) { - fprintf(stderr, "SHMSDOS: echo: ambiguous output " - "redirection\n"); - retVal = 8; - goto done; - } - arrow = p; - if (*(p + 1) == '>') { - /* - * append to redirected output file - */ - - mode = "a"; - p++; - } - if (*(p + 1) == '\0') { - /* - * The output file name is the next argument. - * So when we print the arguments later, we have - * one more argument to skip (in addition to the - * arrow ">"). - */ - - fileName = *(argv + 1); - skipTwoArgs = 2; - } else { - fileName = p + 1; - } - if (fileName == NULL || *fileName == '\0') { - fprintf(stderr, "SHMSDOS: echo: missing output file\n"); - assert(file == stdout); - return 8; - } - file = fopen(fileName, mode); - if (file == NULL) { - fprintf(stderr, "SHMSDOS: echo: cannot open output file %s: %s\n", - fileName, strerror(errno)); - assert(file == stdout); - return 8; - } - redirectOutput = 1; - } - } - - argv = pArgv; - firstArg = 1; - while (*argv) { - if (*argv != arrow) { - if (firstArg) { - firstArg = 0; - } else { - fprintf(file, " "); - } - fprintf(file, *argv); - } else if (skipTwoArgs) { - argv++; - } - argv++; - } - fprintf(file, "\n"); - -done: - if (file != stdout) { - fclose(file); - } - return retVal; -} - -/* - **************************************************************** - * - * The following routines implement the 'rm' command. - * - **************************************************************** - */ - -/* - * RemoveDirRecursive -- - * - * First recursively remove the contents of the specified - * directory, then remove the directory itself. - * It is assumed that dirName is just the name of the - * directory itself, i.e., it is not a full or relative - * pathname. - * - * This routine is called only by RemoveDir and by itself - * (recursion). - */ - -static int -RemoveDirRecursive(const char *dirName, int forceRm) -{ - WIN32_FIND_DATA fileData; - HANDLE hSearch; - BOOL rv; - int retVal = 0; /* The return value of this routine. 0 means success. - * Nonzero means failure. */ - - _chdir(dirName); - - hSearch = FindFirstFile("*", &fileData); - if (hSearch == INVALID_HANDLE_VALUE) { - /* Good, it's already empty */ - goto done; - } - - do { - /* - * Skip over . and .. - */ - - if (strcmp(fileData.cFileName, ".") - && strcmp(fileData.cFileName, "..")) { - if (fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - if (RemoveDirRecursive(fileData.cFileName, forceRm) != 0) { - retVal = 5; - } - } else { - if (fileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { - if (forceRm) { - /* - * Change mode to writable, in preparation for - * removal. - */ - - _chmod(fileData.cFileName, _S_IWRITE); - } else { - fprintf(stderr, "SHMSDOS: rm: file %s is read-only\n", - fileData.cFileName); - retVal = 5; - } - } - if (!DeleteFile(fileData.cFileName)) { - fprintf(stderr, "SHMSDOS: rm: cannot delete file %s: %s\n", - fileData.cFileName, sh_GetLastErrorMessage()); - retVal = 5; - } - } - } - rv = FindNextFile(hSearch, &fileData); - } while (rv); - FindClose(hSearch); - - _chdir(".."); -done: - if (!RemoveDirectory(dirName) ) { - fprintf(stderr, "SHMSDOS: rm: cannot remove directory %s: %s\n", - dirName, sh_GetLastErrorMessage()); - retVal = 5; - } - return retVal; -} - -/* - * RemoveDir -- - * Remove the contents of a directory and the directory itself. - * This routine is called only by shellRm. - */ - -static int -RemoveDir(const char *dirName, int forceRm) -{ - char cwd[_MAX_PATH]; - char *cPtr; - int retVal; - - /* - * Before we call RemoveDirRecursive, which actually deletes things, - * we want to find the directory name proper, not including the - * path. - */ - - cPtr = strrchr(dirName, '\\'); - if (cPtr != NULL && *(cPtr + 1) != '\0') { - _getcwd(cwd, sizeof(cwd)); - *cPtr = '\0'; - _chdir(dirName); - retVal = RemoveDirRecursive(cPtr + 1, forceRm); - _chdir(cwd); - } else { - retVal = RemoveDirRecursive(dirName, forceRm); - } - return retVal; -} - -/* - * struct sh_RmCmdArg -- - * - * A pointer to the sh_RmCmdArg structure is passed into sh_RmFileCmd. - */ - -struct sh_RmCmdArg { - int force; /* -f option, ok to remove read-only files and - * directories */ - int recursive; /* -r or -R option, recursively remove directories */ -}; - -/* - * sh_RmFileCmd -- - * - * Remove the file or directory. Return TRUE if the file or directory - * is successfully removed, FALSE otherwise. - */ - -static BOOL -sh_RmFileCmd(char *pathName, WIN32_FIND_DATA *fileData, void *rmArg) -{ - BOOL rv = TRUE; - struct sh_RmCmdArg *arg = (struct sh_RmCmdArg *) rmArg; - - if (fileData->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - if (arg->recursive) { - if (RemoveDir(pathName, arg->force) != 0) { - rv = FALSE; - } - } else { - fprintf(stderr, "SHMSDOS: rm: %s is a directory\n", - fileData->cFileName); - rv = FALSE; - } - } else { - if (fileData->dwFileAttributes & FILE_ATTRIBUTE_READONLY) { - if (arg->force) { - /* - * Change mode to writable, in preparation for - * removal. - */ - - _chmod(pathName, _S_IWRITE); - } else { - fprintf(stderr, - "SHMSDOS: rm: file %s is read-only\n", - pathName); - rv = FALSE; - } - } - if (!DeleteFile(pathName)) { - fprintf(stderr, - "SHMSDOS: rm: cannot delete file %s: %s\n", - pathName, sh_GetLastErrorMessage()); - rv = FALSE; - } - } - return rv; -} - -/* - * sh_EnumerateFiles -- - * - * Enumerate all the files in the specified pattern, which is a pathname - * containing possibly wildcard characters such as * and ?. fileFcn - * is called on each file, passing the expanded file name, a pointer - * to the file's WIN32_FILE_DATA, and the arg pointer. - * - * It is assumed that there are no wildcard characters before the - * character pointed to by 'where'. - * - * On return, *nFiles stores the number of files enumerated. *nFiles is - * set to this number whether sh_EnumerateFiles or 'fileFcn' succeeds - * or not. - * - * Return TRUE if the files are successfully enumerated and all - * 'fileFcn' invocations succeeded. Return FALSE if something went - * wrong. - */ - -static BOOL sh_EnumerateFiles( - const char *pattern, - const char *where, - sh_FileFcn fileFcn, - void *arg, - int *nFiles - ) -{ - WIN32_FIND_DATA fileData; - HANDLE hSearch; - const char *src; - char *dst; - char fileName[_MAX_PATH]; - char *fileNameMarker = fileName; - char *oldFileNameMarker; - BOOL hasWildcard = FALSE; - BOOL retVal = TRUE; - BOOL patternEndsInDotStar = FALSE; - BOOL patternEndsInDot = FALSE; /* a special case of - * patternEndsInDotStar */ - int numDotsInPattern; - int len; - - /* - * Windows expands patterns ending in ".", ".*", ".**", etc. - * differently from the glob expansion on Unix. For example, - * both "foo." and "foo.*" match "foo", and "*.*" matches - * everything, including filenames with no dots. So we need - * to throw away extra files returned by the FindNextFile() - * function. We require that a matched filename have at least - * the number of dots in the pattern. - */ - len = strlen(pattern); - if (len >= 2) { - /* Start from the end of pattern and go backward */ - const char *p = &pattern[len - 1]; - - /* We can have zero or more *'s */ - while (p >= pattern && *p == '*') { - p--; - } - if (p >= pattern && *p == '.') { - patternEndsInDotStar = TRUE; - if (p == &pattern[len - 1]) { - patternEndsInDot = TRUE; - } - p--; - numDotsInPattern = 1; - while (p >= pattern && *p != '\\') { - if (*p == '.') { - numDotsInPattern++; - } - p--; - } - } - } - - *nFiles = 0; - - /* - * Copy pattern to fileName, but only up to and not including - * the first \ after the first wildcard letter. - * - * Make fileNameMarker point to one of the following: - * - the start of fileName, if fileName does not contain any \. - * - right after the \ before the first wildcard letter, if there is - * a wildcard character. - * - right after the last \, if there is no wildcard character. - */ - - dst = fileName; - src = pattern; - while (src < where) { - if (*src == '\\') { - oldFileNameMarker = fileNameMarker; - fileNameMarker = dst + 1; - } - *(dst++) = *(src++); - } - - while (*src && *src != '*' && *src != '?') { - if (*src == '\\') { - oldFileNameMarker = fileNameMarker; - fileNameMarker = dst + 1; - } - *(dst++) = *(src++); - } - - if (*src) { - /* - * Must have seen the first wildcard letter - */ - - hasWildcard = TRUE; - while (*src && *src != '\\') { - *(dst++) = *(src++); - } - } - - /* Now src points to either null or \ */ - - assert(*src == '\0' || *src == '\\'); - assert(hasWildcard || *src == '\0'); - *dst = '\0'; - - /* - * If the pattern does not contain any wildcard characters, then - * we don't need to go the FindFirstFile route. - */ - - if (!hasWildcard) { - /* - * See if it is the root directory, \, or X:\. - */ - - assert(!strcmp(fileName, pattern)); - assert(strlen(fileName) >= 1); - if (dst[-1] == '\\' && (dst == fileName + 1 || dst[-2] == ':')) { - fileData.cFileName[0] = '\0'; - } else { - /* - * Do not include the trailing \, if any - */ - - if (dst[-1] == '\\') { - assert(*fileNameMarker == '\0'); - dst[-1] = '\0'; - fileNameMarker = oldFileNameMarker; - } - strcpy(fileData.cFileName, fileNameMarker); - } - fileData.dwFileAttributes = GetFileAttributes(fileName); - if (fileData.dwFileAttributes == 0xFFFFFFFF) { - return TRUE; - } - *nFiles = 1; - return (*fileFcn)(fileName, &fileData, arg); - } - - hSearch = FindFirstFile(fileName, &fileData); - if (hSearch == INVALID_HANDLE_VALUE) { - return retVal; - } - - do { - if (!strcmp(fileData.cFileName, ".") - || !strcmp(fileData.cFileName, "..")) { - /* - * Skip over . and .. - */ - - continue; - } - - if (patternEndsInDotStar) { - int nDots = 0; - char *p = fileData.cFileName; - while (*p) { - if (*p == '.') { - nDots++; - } - p++; - } - /* Now p points to the null byte at the end of file name */ - if (patternEndsInDot && (p == fileData.cFileName - || p[-1] != '.')) { - /* - * File name does not end in dot. Skip this file. - * Note: windows file name probably cannot end in dot, - * but we do this check anyway. - */ - continue; - } - if (nDots < numDotsInPattern) { - /* - * Not enough dots in file name. Must be an extra - * file in matching .* pattern. Skip this file. - */ - continue; - } - } - - strcpy(fileNameMarker, fileData.cFileName); - if (*src && *(src + 1)) { - /* - * More to go. Recurse. - */ - - int n; - - assert(*src == '\\'); - where = fileName + strlen(fileName); - strcat(fileName, src); - sh_EnumerateFiles(fileName, where, fileFcn, arg, &n); - *nFiles += n; - } else { - assert(strchr(fileName, '*') == NULL); - assert(strchr(fileName, '?') == NULL); - (*nFiles)++; - if ((*fileFcn)(fileName, &fileData, arg) == FALSE) { - retVal = FALSE; - } - } - } while (FindNextFile(hSearch, &fileData)); - - FindClose(hSearch); - return retVal; -} - - -/* - * shellRm -- - * - * Implement the Unix 'rm' command. - * - * We require that the option flags of 'rm', if any, - * be the first arguments and precede all the other - * arguments. Right now the -f, -r, and -R flags are - * recognized. We change / to \ in file pathname arguments. - */ - -static int -shellRm (char **pArgv) -{ - int retVal = 0; /* The return value of this function. 0 means - * success. Nonzero means failure. */ - struct sh_RmCmdArg arg; - - arg.force = 0; - arg.recursive = 0; - - /* Convert option flags */ - while (*pArgv && (**pArgv == '-')) { - char *p = *pArgv; - p++; - while (*p) { - if (!arg.recursive && (*p == 'r' || *p == 'R')) { - arg.recursive = 1; - } - if (!arg.force && *p == 'f') { - arg.force = 1; - } - p++; - } - pArgv++; - } - - /* - * If -f is not specified and there are no paths specified, - * we complain. - */ - - if (!arg.force && !*pArgv) { - fprintf(stderr, "SHMSDOS: usage: rm [-fRr] file ...\n"); - retVal = 5; - } - - /* Delete each file/directory */ - for ( ; *pArgv; pArgv++) { - int n; - BOOL rv; - - changeForwardSlashesTpBackSlashes(*pArgv); - rv = sh_EnumerateFiles(*pArgv, *pArgv, sh_RmFileCmd, &arg, &n); - if (rv == FALSE) { - retVal = 5; - } else { - if (n == 0 && !arg.force) { - fprintf(stderr, "SHMSDOS: rm: %s: No such file or directory\n", - *pArgv); - retVal = 5; - } - } - } - return retVal; -} - -static int -shellTest (char **pArgv) -{ - int retVal = 0; /* assume valid return */ - char * arg1 = NULL; - char * arg2 = NULL; - char * arg3 = NULL; - struct _stat buf; - int result; - int true = 0; - int false = 1; - unsigned short fileStatus; - - if ( strcmp ( *pArgv, "!" ) == 0 ) { - pArgv++; - true = !true; - false = !false; - } - arg1 = *pArgv++; - - if ( *arg1 == '-' ) { - arg2 = *pArgv++; - - // process string tests - switch ( *(arg1+1) ) { - case 'z': - return (!arg2 || strlen ( arg2 ) == 0) ? true : false; // return zero if length of string is zero - case 'n': - return (arg2 && strlen ( arg2 ) != 0) ? true : false; // return zero if length of string is nonzero - } - - // process file tests - if ( !arg2 ) - return false; - changeForwardSlashesTpBackSlashes ( arg2 ); - - /* Check if statistics are valid: */ - result = _stat( arg2, &buf ); - if( result != 0 ) - return false; // file or directory does not exist - - fileStatus = buf.st_mode; - if ( (*(arg1+1) != 'd') && (*(arg1+1) != 'r') - && (*(arg1+1) != 'f') ) - printf ("!!!!!! never been tested: test -%c\n", *(arg1+1) ); - - switch ( *(arg1+1) ) { - case 'c': // character special file? - if ( fileStatus & _S_IFCHR ) - return true; // return directory found - return false; // return directory not found - case 'd': // directory? - if ( fileStatus & _S_IFDIR ) - return true; // return directory found - return false; // return directory not found - case 'f': // regular file? - if ( fileStatus & _S_IFREG ) - return true; // return regular file found - return false; // return regular file not found - case 'g': // set group ID bit set? - return false; // return not set - case 'h': // symbolic link? - case 'l': // symbolic link? - case 'L': // symbolic link? - return false; // return symbolic link not found - case 'k': // sticky bit set? - return false; // return not set - case 'p': // named pipe? - if ( fileStatus & _S_IFIFO ) - return true; // return named pipe found - return false; // return named pipe not found - case 'r': // readable file? - if ( fileStatus & _S_IREAD ) - return true; // return read permission found - return false; // return read permission not found - case 's': // size greater than zero? - if ( buf.st_size > 0 ) - return true; // return file has greater than zero size - return false; // return file size is zero - case 't': // set for terminal device? - return -1; // return not implemented - case 'u': // set user ID bit set? - return false; // return not set - case 'w': // writeable file? - if ( fileStatus & _S_IWRITE ) - return true; // return write permission found - return false; // return write permission not found - case 'x': // executable file? - if ( fileStatus & _S_IEXEC ) - return true; // return execute permission found - return false; // return execute permission not found - default: - return -1; // not implemented - } - } else { // string compares - printf ("!!!!!! never been tested: test %s\n", arg1 ); - if ( *pArgv ) - arg2 = *pArgv++; - if ( *pArgv ) - arg3 = *pArgv++; - - // check if strings compare s1 = s2 or not compare s1 != s2 - if ( arg2 && arg3 ) { - if ( strcmp ( arg2, "=" ) == 0 ) - return strcmp ( arg1, arg3 ) ? false : true; - if ( strcmp ( arg2, "!=" ) == 0 ) - return strcmp ( arg1, arg3 ) ? true : false; - if ( strcmp ( arg2, "-eq" ) == 0 ) - return ( atol(arg1) == atol(arg3) ) ? true : false; - if ( strcmp ( arg2, "-ne" ) == 0 ) - return ( atol(arg1) != atol(arg3) ) ? true : false; - if ( strcmp ( arg2, "-gt" ) == 0 ) - return ( atol(arg1) > atol(arg3) ) ? true : false; - if ( strcmp ( arg2, "-ge" ) == 0 ) - return ( atol(arg1) >= atol(arg3) ) ? true : false; - if ( strcmp ( arg2, "-lt" ) == 0 ) - return ( atol(arg1) < atol(arg3) ) ? true : false; - if ( strcmp ( arg2, "-le" ) == 0 ) - return ( atol(arg1) <= atol(arg3) ) ? true : false; - } - // check for empty string - if ( (arg2 == NULL ) && ( arg3 == NULL) ) - return (strlen(arg1) > 0 ) ? true : false; - } - - return -1; // not implemented -} - -#define COPY_BUFFER_SIZE 4096 - -static int -shellCat (char **pArgv) -{ - int retVal = 0; /* assume valid return */ - char **pSrc; - char **pDst; - - int sfd, dfd, len; - struct _stat fi; - char copy_buffer[COPY_BUFFER_SIZE]; - unsigned long read_len; - - while ( **pArgv == '-' ) - pArgv++; - - /* get source files */ - pSrc = pArgv++; - - /* get to last token to find destination */ - pDst = pArgv++; - while ( *pArgv ) - pDst = pArgv++; - - if( (dfd = _open(*pDst, O_RDWR | O_CREAT | O_BINARY, 0666)) == -1) { - perror ( "Could not open the destination file "); - fprintf(stdout, "Destination file %s\n", *pDst); - retVal = (4); - } - - while ( *pSrc != *pDst ) { - - if (!(strcmp(*pSrc, ">"))) { - *pSrc++; - continue; - } - if (!strcmp(*pSrc, *pDst)) { - *pSrc++; - continue; - } - if( (sfd = _open(*pSrc, O_RDONLY | O_BINARY, 0666)) == -1) { - perror ( "Could not open the source file" ); - fprintf(stdout, "Source file %s\n", *pSrc); - retVal = (4); - return retVal; - } - - _stat(*pSrc, &fi); - if(!(_S_IFREG & fi.st_mode)) { - perror ( "Could not stat the source file" ); - fprintf(stdout, "Source file %s\n", *pSrc); - retVal = (4); - return retVal; - } - len = fi.st_size; - - while(len) { - unsigned long result; - read_len = len>COPY_BUFFER_SIZE?COPY_BUFFER_SIZE:len; - - if ( (read_len = _read(sfd, copy_buffer, read_len)) == -1) { - perror ( "Could not read the source file" ); - fprintf(stdout, "Source file %s\n", *pSrc); - retVal = (4); - return retVal; - } - - if ( (result = (unsigned long)_write(dfd, copy_buffer, read_len)) != read_len) { - perror ( "Could not write to the destination file" ); - fprintf(stdout, "Destination file %s\n", *pDst); - retVal = (4); - return retVal; - } - - len -= read_len; - } - close(sfd); - *pSrc++; - } - close(dfd); - - return retVal; -} - -/* - * struct sh_MvCmdArg -- - * - * A pointer to the sh_MvCmdArg structure is passed into sh_MvFileCmd. - * The sh_MvCmdArg contains information about the mv command, and - * provide a buffer for constructing the destination file name. - */ - -struct sh_MvCmdArg { - int force; /* -f option, ok to overwrite an existing - * read-only destination file */ - char *dstFileName; /* a buffer for constructing the destination - * file name */ - char *dstFileNameMarker; /* points to where in the dstFileName buffer - * we should write the file component of the - * destination file */ -}; - -static BOOL -sh_DoMove(const char *srcFileName, - DWORD srcFileAttributes, - const char *dstFileName, - DWORD dstFileAttributes, - int force -) -{ - if (dstFileAttributes != 0xFFFFFFFF) { - /* - * The destination exists. - * - If the destination is a file, then the source must be a file. - * - If the destination is a directory, then it must be empty, - * and the source must be a directory. - * This is really an arbitrary choice. You may have other - * preference of the behavior. - * - * Because we need to remove the existing destination file - * or directory, we also require that either it is writable - * or 'force' is TRUE. - */ - - int srcIsDir = srcFileAttributes & FILE_ATTRIBUTE_DIRECTORY; - int dstIsDir = dstFileAttributes & FILE_ATTRIBUTE_DIRECTORY; - BOOL rv; - - if (!dstIsDir && srcIsDir) { - fprintf(stderr, "SHMSDOS: mv: cannot rename %s (a directory) " - "to %s (a file)\n", srcFileName, dstFileName); - return FALSE; - } - if (dstIsDir && !srcIsDir) { - fprintf(stderr, "SHMSDOS: mv: cannot rename %s (a file) " - "to %s (a directory)\n", srcFileName, dstFileName); - return FALSE; - } - if ((dstFileAttributes & FILE_ATTRIBUTE_READONLY) && force) { - dstFileAttributes &= ~FILE_ATTRIBUTE_READONLY; - SetFileAttributes(dstFileName, dstFileAttributes); - } - if (dstIsDir) { - rv = RemoveDirectory(dstFileName); - } else { - rv = DeleteFile(dstFileName); - } - if (rv == FALSE) { - fprintf(stderr, "SHMSDOS: mv: cannot overwrite %s: %s\n", - dstFileName, sh_GetLastErrorMessage()); - return FALSE; - } - } - - if (MoveFile(srcFileName, dstFileName) == FALSE) { - fprintf(stderr, "SHMSDOS: mv: cannot move %s to %s: %s\n", - srcFileName, dstFileName, sh_GetLastErrorMessage()); - return FALSE; - } - return TRUE; -} - -/* - * sh_MvFileCmd -- - * - * Move a file to the destination directory - * - * This function is intended to be passed into sh_EnumerateFiles to - * move all the files specified by the pattern to the destination - * directory. - * - * Return TRUE if the file is successfully moved, and FALSE otherwise. - */ - -static BOOL -sh_MvFileCmd(char *pathName, WIN32_FIND_DATA *findData, void *mvArg) -{ - struct sh_MvCmdArg *arg = (struct sh_MvCmdArg *) mvArg; - DWORD dwFileAttributes; - - strcpy(arg->dstFileNameMarker, findData->cFileName); - dwFileAttributes = GetFileAttributes(arg->dstFileName); - return sh_DoMove(pathName, findData->dwFileAttributes, - arg->dstFileName, dwFileAttributes, arg->force); -} - -static int -shellMv (char **pArgv) -{ - int retVal = 0; - char **pSrc; - char **pDst; - struct sh_MvCmdArg arg; - struct sh_FileData dstData; - int dstIsDir = 0; - int n; - - arg.force = 0; - arg.dstFileName = dstData.pathName; - arg.dstFileNameMarker = 0; - - while (*pArgv && **pArgv == '-') { - char *p = *pArgv; - - while (*(++p)) { - if (*p == 'f') { - arg.force = 1; - } - } - pArgv++; - } - - /* the first source file */ - if (*pArgv) { - pSrc = pArgv++; - } else { - fprintf(stderr, "SHMSDOS: mv: not enough arguments\n"); - return 3; - } - - /* get to the last token to find destination */ - if (*pArgv) { - pDst = pArgv++; - } else { - fprintf(stderr, "SHMSDOS: mv: not enough arguments\n"); - return 3; - } - while (*pArgv) { - pDst = pArgv++; - } - - /* - * The destination pattern must unambiguously expand to exactly - * one file or directory. - */ - - changeForwardSlashesTpBackSlashes(*pDst); - sh_EnumerateFiles(*pDst, *pDst, sh_RecordFileData, &dstData, &n); - assert(n >= 0); - if (n == 1) { - /* - * Is the destination a file or directory? - */ - - if (dstData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - dstIsDir = 1; - } - } else if (n > 1) { - fprintf(stderr, "SHMSDOS: mv: %s: ambiguous destination file " - "or directory\n", *pDst); - return 3; - } else { - /* - * n == 0, meaning that destination file or directory does - * not exist. In this case the destination file directory - * name must be fully specified. - */ - - char *p; - - for (p = *pDst; *p; p++) { - if (*p == '*' || *p == '?') { - fprintf(stderr, "SHMSDOS: mv: %s: No such file or directory\n", - *pDst); - return 3; - } - } - - /* - * Do not include the trailing \, if any, unless it is a root - * directory (\ or X:\). - */ - - if (p > *pDst && p[-1] == '\\' && p != *pDst + 1 && p[-2] != ':') { - p[-1] = '\0'; - } - strcpy(dstData.pathName, *pDst); - dstData.dwFileAttributes = 0xFFFFFFFF; - } - - /* - * If there are two or more source files, the destination has - * to be a directory. - */ - - if (pDst - pSrc > 1 && !dstIsDir) { - fprintf(stderr, "SHMSDOS: mv: cannot move more than" - " one file to the same destination file\n"); - return 3; - } - - if (dstIsDir) { - arg.dstFileNameMarker = arg.dstFileName + strlen(arg.dstFileName); - - /* - * Now arg.dstFileNameMarker is pointing to the null byte at the - * end of string. We want to make sure that there is a \ at the - * end of string, and arg.dstFileNameMarker should point right - * after that \. - */ - - if (arg.dstFileNameMarker[-1] != '\\') { - *(arg.dstFileNameMarker++) = '\\'; - } - } - - if (!dstIsDir) { - struct sh_FileData srcData; - - assert(pDst - pSrc == 1); - changeForwardSlashesTpBackSlashes(*pSrc); - sh_EnumerateFiles(*pSrc, *pSrc, sh_RecordFileData, &srcData, &n); - if (n == 0) { - fprintf(stderr, "SHMSDOS: mv: %s: No such file or directory\n", - *pSrc); - retVal = 3; - } else if (n > 1) { - fprintf(stderr, "SHMSDOS: mv: cannot move more than one file or " - "directory to the same destination\n"); - retVal = 3; - } else { - assert(n == 1); - if (sh_DoMove(srcData.pathName, srcData.dwFileAttributes, - dstData.pathName, dstData.dwFileAttributes, - arg.force) == FALSE) { - retVal = 3; - } - } - return retVal; - } - - for ( ; *pSrc != *pDst; pSrc++) { - BOOL rv; - - changeForwardSlashesTpBackSlashes(*pSrc); - rv = sh_EnumerateFiles(*pSrc, *pSrc, sh_MvFileCmd, &arg, &n); - if (rv == FALSE) { - retVal = 3; - } else { - if (n == 0) { - fprintf(stderr, "SHMSDOS: mv: %s: No such file or directory\n", - *pSrc); - retVal = 3; - } - } - } - - return retVal; -} diff --git a/buildtools/windows/source/shmsdos/shmsdos.mak b/buildtools/windows/source/shmsdos/shmsdos.mak deleted file mode 100644 index d884e5ed85f..00000000000 --- a/buildtools/windows/source/shmsdos/shmsdos.mak +++ /dev/null @@ -1,141 +0,0 @@ -# NMAKE file for building shmsdos.exe. -# -# This file is edited from an NMAKE file generated by -# Microsoft Developer Studio, Format Version 4.20 -# -# To build, say -# nmake /f shmsdos.mak CFG=Release -# or -# nmake /f shmsdos.mak CFG=Debug -# If CFG is omitted, a release build is assumed. - -!IF "$(CFG)" == "" -CFG=Release -!MESSAGE No configuration specified. Defaulting Release. -!ENDIF - -!IF "$(CFG)" != "Release" && "$(CFG)" != "Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "shmsdos.mak" CFG="Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Release" (based on "Win32 Console Application") -!MESSAGE "Debug" (based on "Win32 Console Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -################################################################################ -# Begin Project -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Release" - -OUTDIR=.\Release -INTDIR=.\Release - -ALL : "$(OUTDIR)\shmsdos.exe" - -CLEAN : - -@erase "$(INTDIR)\shmsdos.obj" - -@erase "$(OUTDIR)\shmsdos.exe" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE"\ - /Fp"$(INTDIR)/shmsdos.pch" /YX /Fo"$(INTDIR)/" /c -CPP_OBJS=.\Release/ -CPP_SBRS=.\. -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)/shmsdos.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -LINK32_FLAGS=/nologo\ - /subsystem:console /incremental:no /pdb:"$(OUTDIR)/shmsdos.pdb"\ - /out:"$(OUTDIR)/shmsdos.exe" -LINK32_OBJS= \ - "$(INTDIR)\shmsdos.obj" - -"$(OUTDIR)\shmsdos.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "Debug" - -OUTDIR=.\Debug -INTDIR=.\Debug - -ALL : "$(OUTDIR)\shmsdos.exe" - -CLEAN : - -@erase "$(INTDIR)\shmsdos.obj" - -@erase "$(INTDIR)\vc40.idb" - -@erase "$(INTDIR)\vc40.pdb" - -@erase "$(OUTDIR)\shmsdos.exe" - -@erase "$(OUTDIR)\shmsdos.ilk" - -@erase "$(OUTDIR)\shmsdos.pdb" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP_PROJ=/nologo /MD /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "DEBUG"\ - /D "_CONSOLE" /Fp"$(INTDIR)/shmsdos.pch" /YX /Fo"$(INTDIR)/"\ - /Fd"$(INTDIR)/" /c -CPP_OBJS=.\Debug/ -CPP_SBRS=.\. -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)/shmsdos.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -LINK32_FLAGS=/nologo\ - /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/shmsdos.pdb" /debug\ - /out:"$(OUTDIR)/shmsdos.exe" -LINK32_OBJS= \ - "$(INTDIR)\shmsdos.obj" - -"$(OUTDIR)\shmsdos.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Target - -################################################################################ -# Begin Source File - -SOURCE=.\shmsdos.c -DEP_CPP_SHMSD=\ - {$(INCLUDE)}"\sys\stat.h"\ - {$(INCLUDE)}"\sys\types.h"\ - - -"$(INTDIR)\shmsdos.obj" : $(SOURCE) $(DEP_CPP_SHMSD) "$(INTDIR)" - - -# End Source File -# End Target -# End Project -################################################################################ diff --git a/buildtools/windows/source/uname/README b/buildtools/windows/source/uname/README deleted file mode 100644 index feb43969c8c..00000000000 --- a/buildtools/windows/source/uname/README +++ /dev/null @@ -1,9 +0,0 @@ -This directory contains the source for uname.exe on Win32. -This version of uname.exe returns the string "WINNT" when -you say 'uname -s' on Windows NT. - -To build it, you need Microsoft Visual C++ and nmake. -Issue the command: - nmake /f uname.mak -The output is Release\uname.exe. Copy it to a directory -on your Path. \ No newline at end of file diff --git a/buildtools/windows/source/uname/uname.c b/buildtools/windows/source/uname/uname.c deleted file mode 100644 index eb26c2ac474..00000000000 --- a/buildtools/windows/source/uname/uname.c +++ /dev/null @@ -1,155 +0,0 @@ -/*********************************************************** - * uname - returns name of OS - **********************************************************/ -#include -#include -#include - -#define index(s, c) strchr((s), (c)) -#define streq(a, b) (strcmp ((a), (b)) == 0) - -static char ** getlistOfOptions (char **pArgv, char * pOptions); -static void getUnameOption ( char option ); - -/*********************************************************************** - * -a Print all information. - * - * -m Print the machine hardware name. - * - * -n Print the nodename (the nodename is the name by which - * the system is known to a communications network). - * - * -p Print the current host's processor type. - * - * -r Print the operating system release. - * - * -s Print the name of the operating system. This is the - * default. - * - * -v Print the operating system version. - * - * -S systemname - * The nodename may be changed by specifying a system name - * argument. The system name argument is restricted to - * SYS_NMLN characters. SYS_NMLN is an implementation - * specific value defined in . Only the - * super-user is allowed this capability. - ***********************************************************************/ - -main( int argc, char *argv[ ], char *envp[ ] ) -{ - char options[1024]; - char *pOptions; - char **pArgv; - char c; - - pArgv = &argv[1]; - pArgv = getlistOfOptions (pArgv, options); - - /* if no options specified, then return operating system */ - pOptions = options; - if ( *pOptions == '\0' ) { - options[0] = 's'; - options[1] = '\0'; - } - while (c = *pOptions++ ) { - if ( c == 'a' ) { - getUnameOption ( 's' ); - printf (" " ); - getUnameOption ( 'n' ); - printf (" " ); - getUnameOption ( 'r' ); - printf (" " ); - getUnameOption ( 'v' ); - printf (" " ); - getUnameOption ( 'm' ); - printf (" " ); - getUnameOption ( 'p' ); - } else - getUnameOption ( c ); - } - return 0; -} - -static char ** -getlistOfOptions (char **pArgv, char * pOptions) -{ - char *pArg; - while ( *pArgv && (**pArgv == '-') ) { - pArg = *pArgv; - pArg++; /* skip over '-' */ - while ( *pArg ) - *pOptions++ = *pArg++; - pArgv++; - } - *pOptions = '\0'; - return pArgv; -} -void getUnameOption ( char option ) -{ - char computerName[128]; - SYSTEM_INFO systemInfo; - OSVERSIONINFO versionInfo; - DWORD computerNameLength = sizeof(computerName); - - GetSystemInfo( &systemInfo); - GetComputerName( (LPTSTR)&computerName, &computerNameLength ); - versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx( &versionInfo ); - - switch ( option ) { - case 'a': - printf ( getenv ("OS") ); - break; - case 'm': - printf ( "xx" ); - break; - case 'n': - printf ( computerName ); - break; - case 'p': - switch ( systemInfo.wProcessorArchitecture ) { - case PROCESSOR_ARCHITECTURE_INTEL: - printf("I386"); - break; - case PROCESSOR_ARCHITECTURE_MIPS: - printf("MIPS"); - break; - case PROCESSOR_ARCHITECTURE_ALPHA: - printf("ALPHA"); - break; - case PROCESSOR_ARCHITECTURE_PPC: - printf("PPC"); - break; - default: - printf("UNKNOWN_PROCESSOR"); - break; - } - break; - case 'r': - printf ("%d.%d", versionInfo.dwMajorVersion, versionInfo.dwMinorVersion ); - break; - case 's': - switch ( versionInfo.dwPlatformId ) { - case VER_PLATFORM_WIN32s: - printf("WIN32S"); - break; - case VER_PLATFORM_WIN32_WINDOWS: - printf("WIN95"); - break; - case VER_PLATFORM_WIN32_NT: - printf("WINNT"); - break; - default: - printf("UNKNOWN_OS"); - break; - } - break; - case 'v': - printf ("%d", versionInfo.dwBuildNumber ); - break; - default: - printf ( "uname -%c is unimplemented", option ); - break; - } -} diff --git a/buildtools/windows/source/uname/uname.mak b/buildtools/windows/source/uname/uname.mak deleted file mode 100644 index f92fd4e294c..00000000000 --- a/buildtools/windows/source/uname/uname.mak +++ /dev/null @@ -1,141 +0,0 @@ -# NMAKE file for building uname.exe. -# -# This file is edited from an NMAKE file generated by -# Microsoft Developer Studio, Format Version 4.20 -# -# To build, say -# nmake /f uname.mak CFG=Release -# or -# nmake /f uname.mak CFG=Debug -# If CFG is omitted, a release build is assumed. - -!IF "$(CFG)" == "" -CFG=Release -!MESSAGE No configuration specified. Defaulting Release. -!ENDIF - -!IF "$(CFG)" != "Release" && "$(CFG)" != "Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "uname.mak" CFG="Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Release" (based on "Win32 Console Application") -!MESSAGE "Debug" (based on "Win32 Console Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -################################################################################ -# Begin Project -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Release" - -OUTDIR=.\Release -INTDIR=.\Release - -ALL : "$(OUTDIR)\uname.exe" - -CLEAN : - -@erase "$(INTDIR)\uname.obj" - -@erase "$(OUTDIR)\uname.exe" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE"\ - /Fp"$(INTDIR)/uname.pch" /YX /Fo"$(INTDIR)/" /c -CPP_OBJS=.\Release/ -CPP_SBRS=.\. -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)/uname.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -LINK32_FLAGS=/nologo\ - /subsystem:console /incremental:no /pdb:"$(OUTDIR)/uname.pdb"\ - /out:"$(OUTDIR)/uname.exe" -LINK32_OBJS= \ - "$(INTDIR)\uname.obj" - -"$(OUTDIR)\uname.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "Debug" - -OUTDIR=.\Debug -INTDIR=.\Debug - -ALL : "$(OUTDIR)\uname.exe" - -CLEAN : - -@erase "$(INTDIR)\uname.obj" - -@erase "$(INTDIR)\vc40.idb" - -@erase "$(INTDIR)\vc40.pdb" - -@erase "$(OUTDIR)\uname.exe" - -@erase "$(OUTDIR)\uname.ilk" - -@erase "$(OUTDIR)\uname.pdb" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP_PROJ=/nologo /MD /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "DEBUG"\ - /D "_CONSOLE" /Fp"$(INTDIR)/uname.pch" /YX /Fo"$(INTDIR)/"\ - /Fd"$(INTDIR)/" /c -CPP_OBJS=.\Debug/ -CPP_SBRS=.\. -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)/uname.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -LINK32_FLAGS=/nologo\ - /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/uname.pdb" /debug\ - /out:"$(OUTDIR)/uname.exe" -LINK32_OBJS= \ - "$(INTDIR)\uname.obj" - -"$(OUTDIR)\uname.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Target - -################################################################################ -# Begin Source File - -SOURCE=.\uname.c -DEP_CPP_SHMSD=\ - {$(INCLUDE)}"\sys\stat.h"\ - {$(INCLUDE)}"\sys\types.h"\ - - -"$(INTDIR)\uname.obj" : $(SOURCE) $(DEP_CPP_SHMSD) "$(INTDIR)" - - -# End Source File -# End Target -# End Project -################################################################################ diff --git a/l10nkits/client/windows/docs/installer/IS1.JPG b/l10nkits/client/windows/docs/installer/IS1.JPG deleted file mode 100644 index 5ca5152c740bc8a77d260cc12123e79638a1deb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8087 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 I{B-Hx02oPDMgRZ+ diff --git a/l10nkits/client/windows/docs/installer/L10NTREE.JPG b/l10nkits/client/windows/docs/installer/L10NTREE.JPG deleted file mode 100644 index 9ab09c8beb484e66842fa51a4f3e9b84a8a14ce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4513 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 - - - - - Product Branding Issues - - - -

-Product Branding Instructions

-Under the terms of the Unlimited Localization Program, you must remove -or replace all trademarked Netscape terms, brand names, icons, images, -etc.  These trademarks are listed on the page found at the following -URL: - -
  %0%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_DIALOG_FETCH_STRINGS, (SEC_DIALOG_STRING_BASE + 440), "\ -"MOZ_NAME_PRODUCT" will search network Directories for the Security Certificates \ -that are used to send other people encrypted mail messages.

Enter the exact E-mail \ -%-cont-%") -#else -ResDef(XP_DIALOG_FETCH_STRINGS, (SEC_DIALOG_STRING_BASE + 440), "\ -Communicator will search network Directories for the Security Certificates \ -that are used to send other people encrypted mail messages.

Enter the exact E-mail \ -%-cont-%") -#endif - -ResDef(XP_DIALOG_FETCH_STRINGS2, (SEC_DIALOG_STRING_BASE + 441), "\ -addresses of the people you are looking for and press Search. \ -\ -\ -\ -\ -%-cont-%") - -ResDef(XP_DIALOG_FETCH_STRINGS4, (SEC_DIALOG_STRING_BASE + 443), "\ -\ -\ -\ -\ -
Directory:
E-mail Addresses:
") - -ResDef(XP_DIALOG_ALL_DIRECTORIES, (SEC_DIALOG_STRING_BASE + 444), "\ -All Directories") - -ResDef(XP_DIALOG_FETCH_RESULTS_TITLE, (SEC_DIALOG_STRING_BASE + 445), "\ -Search Results") - -ResDef(XP_DIALOG_FETCH_RESULTS_STRINGS, (SEC_DIALOG_STRING_BASE + 446), "\ -Press the %ok% button to save the Certificates that were found, or \ -%cancel% to discard them.

\ -Certificates for the following E-Mail users were found in the \ -directory:
\ -%0%

%1%%2%") - -ResDef(XP_DIALOG_FETCH_NOT_FOUND_STRINGS, (SEC_DIALOG_STRING_BASE + 447), "\ -Certificates for the following E-Mail users were not found in the \ -directory:
") - -ResDef(XP_DIALOG_PUBLISH_CERT_TITLE, (SEC_DIALOG_STRING_BASE + 448), "\ -Send Your E-Mail Certificate To A Directory") - -ResDef(XP_DIALOG_PUBLISH_CERT_STRINGS, (SEC_DIALOG_STRING_BASE + 449), "\ -Select the Directory to send your \ -Certificate to:

\ -
\ -%-cont-%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_DIALOG_PUBLISH_CERT_STRINGS2, (SEC_DIALOG_STRING_BASE + 450), "\ -"MOZ_NAME_PRODUCT" will send your Security Certificate to a network Directory \ -so that other user's can easily find it to send you \ -encrypted messages.") -#else -ResDef(XP_DIALOG_PUBLISH_CERT_STRINGS2, (SEC_DIALOG_STRING_BASE + 450), "\ -Communicator will send your Security Certificate to a network Directory \ -so that other user's can easily find it to send you \ -encrypted messages.") -#endif - -ResDef(XP_STATUS_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 451), "\ -%0%%1%%2%%3%%4%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_DIALOG_FETCH2_STRINGS, (SEC_DIALOG_STRING_BASE + 452), "\ -"MOZ_NAME_PRODUCT" will search a Directory for the Security \ -Certificates that are needed to send this encrypted message. \ -%-cont-%") -#else -ResDef(XP_DIALOG_FETCH2_STRINGS, (SEC_DIALOG_STRING_BASE + 452), "\ -Communicator will search a Directory for the Security \ -Certificates that are needed to send this encrypted message. \ -%-cont-%") -#endif - -ResDef(XP_DIALOG_FETCH2_STRINGS2, (SEC_DIALOG_STRING_BASE + 453), "\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -
Select a Directory:
Searching For:%2%
") - -ResDef(XP_SENDING_TO_DIRECTORY, (SEC_DIALOG_STRING_BASE + 455), "\ -Sending to Directory") - -ResDef(XP_SEARCHING_DIRECTORY, (SEC_DIALOG_STRING_BASE + 456), "\ -Searching Directory") - -ResDef(XP_DIRECTORY_PASSWORD, (SEC_DIALOG_STRING_BASE + 457), "\ -Enter Password for Directory") - -ResDef(XP_DIRECTORY_ERROR, (SEC_DIALOG_STRING_BASE + 458), "\ -An error occurred when communicating with the Directory") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_KEY_GEN_MOREINFO_STRINGS, (SEC_DIALOG_STRING_BASE + 459), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -"MOZ_NAME_PRODUCT" is about to generate a Private Key for you. It will be used \ -along with the Certificate you are now \ -%-cont-%") -#else -ResDef(XP_KEY_GEN_MOREINFO_STRINGS, (SEC_DIALOG_STRING_BASE + 459), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -Communicator is about to generate a Private Key for you. It will be used \ -along with the Certificate you are now \ -%-cont-%") -#endif - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_KEY_GEN_MOREINFO_STRINGS_1, (SEC_DIALOG_STRING_BASE + 460), "\ -requesting to identify you to Web\ -Sites and via Email. You Private Key never leaves your computer, and if you \ -choose, will be protected by a "MOZ_NAME_PRODUCT" password.

\ -%-cont-%") -#else -ResDef(XP_KEY_GEN_MOREINFO_STRINGS_1, (SEC_DIALOG_STRING_BASE + 460), "\ -requesting to identify you to Web\ -Sites and via Email. You Private Key never leaves your computer, and if you \ -choose, will be protected by a Communicator password.

\ -%-cont-%") -#endif - -ResDef(XP_KEY_GEN_MOREINFO_STRINGS_2, (SEC_DIALOG_STRING_BASE + 461), "\ -Passwords are particularly important if you are in an environment where other \ -people have access to your computer, either physically or over a network. \ -%-cont-%") - -ResDef(XP_KEY_GEN_MOREINFO_STRINGS_3, (SEC_DIALOG_STRING_BASE + 462), "\ -Do not give others your password, because that would allow them to use your \ -Certificate to impersonate you.

\ -%-cont-%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_KEY_GEN_MOREINFO_STRINGS_4, (SEC_DIALOG_STRING_BASE + 463), "\ -"MOZ_NAME_PRODUCT" uses a complex mathematical operation to generate your private \ -key. It may take up to severeal minutes to complete. If you interrupt \ -%-cont-%") -#else -ResDef(XP_KEY_GEN_MOREINFO_STRINGS_4, (SEC_DIALOG_STRING_BASE + 463), "\ -Communicator uses a complex mathematical operation to generate your private \ -key. It may take up to severeal minutes to complete. If you interrupt \ -%-cont-%") -#endif - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_KEY_GEN_MOREINFO_STRINGS_5, (SEC_DIALOG_STRING_BASE + 464), "\ -"MOZ_NAME_PRODUCT" during this process, it will not create your key, and you will \ -have to reapply for your Certificate.") -#else -ResDef(XP_KEY_GEN_MOREINFO_STRINGS_5, (SEC_DIALOG_STRING_BASE + 464), "\ -Communicator during this process, it will not create your key, and you will \ -have to reapply for your Certificate.") -#endif - -ResDef(XP_PW_MOREINFO_STRINGS, (SEC_DIALOG_STRING_BASE + 465), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -Passwords are particularly important if you are in an environment where other \ -%-cont-%") - -ResDef(XP_PW_MOREINFO_STRINGS_1, (SEC_DIALOG_STRING_BASE + 466), "\ -people have access to your computer, either physically or over a network. \ -Do not give others your password, because that would allow them to use your \ -%-cont-%") - -ResDef(XP_PW_MOREINFO_STRINGS_2, (SEC_DIALOG_STRING_BASE + 467), "\ -Certificate to impersonate you.

The safest passwords are at least 8 \ -characters long, include both letters, and number or symbols, and contain \ -no words found in a dictionary.") - -ResDef(XP_PKCS12_TITLE_STRING, (SEC_DIALOG_STRING_BASE + 468), "\ -Select a Card or Database") - -ResDef(XP_PKCS12_SELECT_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 469), "\ -Select the card or database you wish to import certificates to:
\ -") - -ResDef(XP_VERIFY_NOT_FORTEZZA_CA, (SEC_DIALOG_STRING_BASE + 470), "\ -Not a valid FORTEZZA Certificate Authority") - -ResDef(XP_VERIFY_NO_PUBLIC_KEY, (SEC_DIALOG_STRING_BASE + 471), "\ -Certificate does not have a Recognized Public Key") - -#ifdef XP_MAC -ResDef(XP_PREENC_SAVE_PROMPT, (SEC_DIALOG_STRING_BASE + 472), "\ -Save this file encrypted [yes] or unencrypted [no]") -#else -ResDef(XP_PREENC_SAVE_PROMPT, (SEC_DIALOG_STRING_BASE + 472), "\ -Save this file encrypted [ok] or unencrypted [cancel]") -#endif - -ResDef(XP_SEC_ERROR_PWD, (SEC_DIALOG_STRING_BASE + 473), "\ -Successive login failures may disable this card or database. \ -Password is invalid. Retry?\n\ - %s\n") - -ResDef(XP_VERIFY_NO_KRL, (SEC_DIALOG_STRING_BASE + 474), -"No key revocation list for the certificate has been found.\n\ -You must load the key revocation list before continuing.") - -ResDef(XP_VERIFY_KRL_EXPIRED, (SEC_DIALOG_STRING_BASE + 475), -"The key revocation list for the certificate has expired.\n\ -Reload a new key revocation list.") - -ResDef(XP_VERIFY_KRL_BAD_SIGNATURE, (SEC_DIALOG_STRING_BASE + 476), -"The key revocation list for the certificate has an invalid signature.\n\ -Reload a new key revocation list.") - -ResDef(XP_VERIFY_REVOKED_KEY, (SEC_DIALOG_STRING_BASE + 477), -"The key for the certificate has been revoked.") - -ResDef(XP_VERIFY_KRL_INVALID, (SEC_DIALOG_STRING_BASE + 478), -"The key revocation list has an invalid format.") - -ResDef(XP_VERIFY_BAD_CERT_DOMAIN, (SEC_DIALOG_STRING_BASE + 479), -MOZ_NAME_BRAND" is unable to communicate securely with this site\n\ -because the domain to which you are attempting to connect\n\ -does not match the domain name in the server's certificate.") - -/* Fortezza SMIME strings */ -ResDef(XP_SMIME_SKIPJACK, (SEC_DIALOG_STRING_BASE + 480), "\ -FORTEZZA SKIPJACK encryption with an 80-bit key") - -/* New Security Advisor->Crypto Modules->Edit menu */ -ResDef(XP_DIALOG_EDIT_MODULE, (SEC_DIALOG_STRING_BASE + 481), "\ -Security Module Name: %0%\ -
\ -Security Module File: %3%\ -
\ -%-cont-%") - -ResDef(XP_DIALOG_EDIT_MODULE_0, (SEC_DIALOG_STRING_BASE + 482), "\ -Manufacturer: %6%
Description:%8%
\ -PKCS #11 Version: %7%
\ -Library Version: %9%
%-cont-%") - -ResDef(XP_DIALOG_EDIT_MODULE_1, (SEC_DIALOG_STRING_BASE + 483), "\ -

\ -\ -
%-cont-%") - -ResDef(XP_DIALOG_EDIT_MODULE_2, (SEC_DIALOG_STRING_BASE + 484), "\ -\ -
%-cont-%") - -ResDef(XP_DIALOG_EDIT_MODULE_3, (SEC_DIALOG_STRING_BASE + 485), "\ -\ -
%-cont-%") - -ResDef(XP_DIALOG_EDIT_MODULE_4, (SEC_DIALOG_STRING_BASE + 486), "\ -\ -
\ -\ -
%-cont-%") - -ResDef(XP_DIALOG_EDIT_MODULE_5, (SEC_DIALOG_STRING_BASE + 487), "\ -
") - - ResDef(XP_SEC_CONFIG, (SEC_DIALOG_STRING_BASE + 491), "\ - Config") - - /* Config Slot/Token */ - - ResDef(XP_DIALOG_CONFIG_SLOT, (SEC_DIALOG_STRING_BASE + 492), "\ -

Module Name: %0%\ -
Slot Description: %1%\ -
Token Name: %2%\ -
Remarks: %3%


\ - %-cont-%") - - ResDef(XP_DIALOG_CONFIG_SLOT_0, (SEC_DIALOG_STRING_BASE + 493), "\ -

\ -

\ - Disable this token. \ - %-cont-%") - - ResDef(XP_DIALOG_CONFIG_SLOT_1, (SEC_DIALOG_STRING_BASE + 494), "\ -

\ -

\ -
\ - Enable this token and turn on the following functions: \ - %6%\ -
") - - - /* display this if try to configure a slot w/o token */ - ResDef(XP_DIALOG_CONFIG_SLOT_NO_SLOT, (SEC_DIALOG_STRING_BASE + 495), "\ -

Module Name: %0%\ -
Slot Description: %1%\ -
Token Name: %2%\ -


\ - %-cont-%") - - ResDef(XP_DIALOG_CONFIG_SLOT_NO_SLOT_0, (SEC_DIALOG_STRING_BASE + 496), "\ -

\ - %3%
%4%
%5%\ -

") - - ResDef(XP_DIALOG_CONFIG_SLOT_TITLE, (SEC_DIALOG_STRING_BASE + 497), "\ - Configure Slot") - - /* define prompts for lm_pkcs11.c */ - /* squeezed in this space */ - ResDef(XP_JS_PKCS11_MOD_PROMPT, (SEC_DIALOG_STRING_BASE + 498), "Module Name: ") - ResDef(XP_JS_PKCS11_DLL_PROMPT, (SEC_DIALOG_STRING_BASE + 499), "File: ") - - - /* some Mechanism Type labels */ - ResDef(XP_CKM_RSA_PKCS_LABEL, (SEC_DIALOG_STRING_BASE + 500),\ - "RSA PKCS encryption") - - - /* define some messages for lm_pkcs11.c */ - ResDef(XP_JS_PKCS11_EXTERNAL_DELETED, (SEC_DIALOG_STRING_BASE + 501), - "External security module successfully deleted") - ResDef(XP_JS_PKCS11_INTERNAL_DELETED, (SEC_DIALOG_STRING_BASE + 502), - "Internal security module successfully deleted") - ResDef(XP_JS_PKCS11_ADD_MOD_SUCCESS, (SEC_DIALOG_STRING_BASE + 503), - "A new security module has been installed") - ResDef(XP_JS_PKCS11_ADD_MOD_WARN, (SEC_DIALOG_STRING_BASE + 504), - "Are you sure you want to install this security module?") - ResDef(XP_JS_PKCS11_DEL_MOD_WARN, (SEC_DIALOG_STRING_BASE + 505), - "Are you sure you want to delete this security module?") - -ResDef(XP_SEC_PROMPT_FOR_NICKNAME, (SEC_DIALOG_STRING_BASE + 506), -"Enter a nickname for the certificate:") - - /* Security Advisor->Signers->CRL's */ - -ResDef(XP_DIALOG_SHOW_CRLS_TITLE, (SEC_DIALOG_STRING_BASE + 507), "\ -View/Edit CRL's") - -ResDef(XP_DIALOG_SHOW_CRL, (SEC_DIALOG_STRING_BASE + 508), "\ -

%0%

\ -URL:%1%
Last Update:%2%
Next Update:%3% %4%
\ -Signed by:
    %5%

\ -
") - -ResDef(XP_DIALOG_NEW_CRL, (SEC_DIALOG_STRING_BASE + 509), "\ -Enter the URL of the new CRL/CKL to load:") - -ResDef(XP_DIALOG_EDIT_CRL, (SEC_DIALOG_STRING_BASE + 510), "\ -

%0%

\ -Enter the URL of the Certificate Revocation List.

\ -URL:") - -ResDef(XP_DIALOG_NO_CRL_SELECTED, (SEC_DIALOG_STRING_BASE + 511), "\ -No CRL was selected. Please select a CRL from the list.") - -ResDef(XP_DIALOG_NO_URL_FOR_CRL, (SEC_DIALOG_STRING_BASE + 512), "\ -Selected CRL does not have a valid URL to load from.\n\ -Use 'New/Edit...' to set the URL.") - -ResDef(XP_DIALOG_CRL_EXPIRED_TAG, (SEC_DIALOG_STRING_BASE + 513), "\ -Expired") - -ResDef(XP_DIALOG_NO_URL_GIVEN, (SEC_DIALOG_STRING_BASE + 514), "\ -You did not enter a URL: No new CRL loaded.") - -ResDef(XP_DIALOG_CRL_EDIT_TITLE, (SEC_DIALOG_STRING_BASE + 515), "\ -Edit CRL") - -ResDef(XP_DIALOG_CRLS_TITLE, (SEC_DIALOG_STRING_BASE + 516), "\ -CRL") - -ResDef(XP_DIALOG_JS_HEADER_STRINGS_WITH_UTF8_CHARSET, (SEC_DIALOG_STRING_BASE + 517), "\ -\ -%0%\n\ -\n\ -%-cont-%") - -ResDef (MK_MSG_ASK_HTML_MAIL_4, XP_MSG_BASE + 947, "\ -\n\ -\n\ -\n\ -%-cont-%") - -ResDef (MK_MSG_ASK_HTML_MAIL_5, XP_MSG_BASE + 948, "\ -\n\ -\n\ -\n\ -") - - -/* Reserve a bunch extra, just in case. */ - -ResDef (MK_MSG_ASK_HTML_MAIL_6, XP_MSG_BASE + 949, "") -ResDef (MK_MSG_ASK_HTML_MAIL_7, XP_MSG_BASE + 950, "") -ResDef (MK_MSG_ASK_HTML_MAIL_8, XP_MSG_BASE + 951, "") -ResDef (MK_MSG_ASK_HTML_MAIL_9, XP_MSG_BASE + 952, "") -ResDef (MK_MSG_ASK_HTML_MAIL_10, XP_MSG_BASE + 953, "") - -/* String to use to indicate everyone at a given domain. Used as - in "@netscape.com". */ -ResDef (MK_MSG_EVERYONE, XP_MSG_BASE + 954, "") - -ResDef (MK_MSG_HTML_RECIPIENTS_TITLE, XP_MSG_BASE + 955, "HTML Recipients") - -ResDef (MK_MSG_HTML_RECIPIENTS, XP_MSG_BASE + 956, "\ -The recipients and domains below are not listed as being able to read\n\ -HTML messages. If this listing is incorrect, you may change it below.\n\ -%-cont-%") - -ResDef (MK_MSG_HTML_RECIPIENTS_1, XP_MSG_BASE + 957, "\ -

\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -
Does not prefer HTMLPrefers HTML
\n\ -\n\ -\n\ -
\n\ -\n\ -%-cont-%") - -ResDef (MK_MSG_HTML_RECIPIENTS_3, XP_MSG_BASE + 959, "\ -

\n\ -\n\ -

\n\ -
\n\ -\n\ -
\n\ -

\n\ -

\n\ -%-cont-%") - -ResDef (MK_MSG_HTML_RECIPIENTS_5, XP_MSG_BASE + 961, "\ -\n\ -\n\ -\n\ -%-cont-%") - -ResDef (MK_MSG_HTML_RECIPIENTS_6, XP_MSG_BASE + 962, "\ -\n\ -\n\ -
\n\ -\n\ -") - - -/* Reserve a bunch extra, just in case. */ - -ResDef (MK_MSG_HTML_RECIPIENTS_7, XP_MSG_BASE + 963, "") -ResDef (MK_MSG_HTML_RECIPIENTS_8, XP_MSG_BASE + 964, "") -ResDef (MK_MSG_HTML_RECIPIENTS_9, XP_MSG_BASE + 965, "") -ResDef (MK_MSG_HTML_RECIPIENTS_10, XP_MSG_BASE + 966, "") -ResDef (MK_MSG_HTML_RECIPIENTS_11, XP_MSG_BASE + 967, "") - -ResDef (MK_ADDR_ENTRY_ALREADY_EXISTS, XP_MSG_BASE + 968, - "An Address Book entry with this name and email address already exists.") - -ResDef (MK_ADDR_ENTRY_ALREADY_IN_LIST, XP_MSG_BASE + 969, - "This Address Book entry is already a member of this list.") - -ResDef (MK_LDAP_CUSTOM1, XP_MSG_BASE + 970, "Custom 1") -ResDef (MK_LDAP_CUSTOM2, XP_MSG_BASE + 971, "Custom 2") -ResDef (MK_LDAP_CUSTOM3, XP_MSG_BASE + 972, "Custom 3") -ResDef (MK_LDAP_CUSTOM4, XP_MSG_BASE + 973, "Custom 4") -ResDef (MK_LDAP_CUSTOM5, XP_MSG_BASE + 974, "Custom 5") - -ResDef (MK_ADDR_ADD_PERSON_TO_ABOOK, XP_MSG_BASE + 975, -"Mailing lists can only contain entries from the Personal Address Book.\n\ -Would you like to add %s to the address book?") - -ResDef (MK_ADDR_ENTRY_IS_LIST, XP_MSG_BASE + 976, -"A mailing list cannot have itself as a member") -ResDef (MK_ADDR_NEW_CARD, XP_MSG_BASE + 977, -"New Card") -ResDef (MK_ADDR_NEW_PERCARD, XP_MSG_BASE + 978, -"New Personal Card") -ResDef (MK_ADDR_PERCARD, XP_MSG_BASE + 979, -"Personal Card for %s") -ResDef (MK_ADDR_CCNAME, XP_MSG_BASE + 980, "CC: %s") -ResDef (MK_ADDR_BCCNAME, XP_MSG_BASE + 981, "Bcc: %s") -ResDef (MK_ADDR_TONAME, XP_MSG_BASE + 982, "To: %s") - -ResDef (XP_EDT_ERR_SAVE_WRITING_ROOT, XP_MSG_BASE + 983, - "%s can't be saved. Either the disk is full\n\ -or the file is locked.\n\n\ -Try saving on a different disk or try saving\n\ -%s with a different name.") -ResDef (XP_EDT_HEAD_FAILED, XP_MSG_BASE + 984, - "HEAD call to server failed.\nUpload aborted.") - -ResDef (MK_UNABLE_TO_OPEN_ADDR_FILE, XP_MSG_BASE + 985, - "Unable to open address book database file.") -ResDef (MK_ADDR_LIST_ALREADY_EXISTS, XP_MSG_BASE + 986, - "A mailing list with this name already exists.") -#ifndef MOZ_COMMUNICATOR_NAME -ResDef (MK_ADDR_UNABLE_TO_IMPORT, XP_MSG_BASE + 987, - MOZ_NAME_PRODUCT" is unable to import this file into the address book.") -#else -ResDef (MK_ADDR_UNABLE_TO_IMPORT, XP_MSG_BASE + 987, - "Communicator is unable to import this file into the address book.") -#endif - -ResDef(MK_MSG_PURGING_NEWSGROUP_ETC, XP_MSG_BASE + 988, - "Mail: Purging discussion group %s...") - - ResDef(MK_MSG_PURGING_NEWSGROUP_HEADER, XP_MSG_BASE + 989, - "Mail: Purging discussion group %s...header %ld") - -ResDef(MK_MSG_PURGING_NEWSGROUP_ARTICLE, XP_MSG_BASE + 990, -"Purging discussion group %s...article %ld") - -ResDef(MK_MSG_PURGING_NEWSGROUP_DONE, XP_MSG_BASE + 991, - "Mail: Purging discussion group %s...Done") - -ResDef (XP_EDT_PUBLISH_ERROR_BODY, XP_MSG_BASE + 992, - "Make sure you specify the entire destination URL.\n\ -e.g. http://somemachine/somedirectory/somefile.html\n\n\ -Try to publish to this URL anyway?") -ResDef (XP_EDT_PUBLISH_BAD_URL, XP_MSG_BASE + 993, - "Publish destination is invalid.") -ResDef (XP_EDT_PUBLISH_BAD_CHAR, XP_MSG_BASE + 994, - "Publish destination contains at least one illegal character.") -ResDef (XP_EDT_PUBLISH_BAD_PROTOCOL, XP_MSG_BASE + 995, - "Publish destination must begin with ftp:// or http://") -ResDef (XP_EDT_PUBLISH_NO_FILE, XP_MSG_BASE + 996, - "Publish destination ends in a slash.") -ResDef (XP_EDT_PUBLISH_NO_EXTENSION, XP_MSG_BASE + 997, - "Publish destination has no file extension.") - -ResDef (MK_CVCOLOR_SOURCE_OF, XP_MSG_BASE + 998, - "Source of: ") -ResDef (MK_ACCESS_COOKIES_THE_SERVER, XP_MSG_BASE + 999, - "The server ") -ResDef (MK_ACCESS_COOKIES_WISHES, XP_MSG_BASE + 1000, - "\nwishes to set a cookie that will be sent ") -ResDef (MK_ACCESS_COOKIES_TOANYSERV, XP_MSG_BASE + 1001, - "\nto any server in the domain ") -ResDef (MK_ACCESS_COOKIES_TOSELF, XP_MSG_BASE + 1002, - "only back to itself") -ResDef (MK_ACCESS_COOKIES_NAME_AND_VAL, XP_MSG_BASE + 1003, - "\nThe name and value of the cookie are:\n") -ResDef (MK_ACCESS_COOKIES_COOKIE_WILL_PERSIST, XP_MSG_BASE + 1004, - "\nThis cookie will persist until ") -ResDef (MK_ACCESS_COOKIES_SET_IT, XP_MSG_BASE + 1005, - "\nDo you wish to allow the cookie to be set?") - -ResDef (MK_CACHE_CONTENT_LENGTH, XP_MSG_BASE + 1006, - "Content Length:") -ResDef (MK_CACHE_REAL_CONTENT_LENGTH, XP_MSG_BASE + 1007, - "Real Content Length:") -ResDef (MK_CACHE_CONTENT_TYPE, XP_MSG_BASE + 1008, - "Content type:") -ResDef (MK_CACHE_LOCAL_FILENAME, XP_MSG_BASE + 1009, - "Local filename:") -ResDef (MK_CACHE_LAST_MODIFIED, XP_MSG_BASE + 1010, - "Last Modified:") -ResDef (MK_CACHE_EXPIRES, XP_MSG_BASE + 1011, - "Expires:") -ResDef (MK_CACHE_LAST_ACCESSED, XP_MSG_BASE + 1012, - "Last accessed:") -ResDef (MK_CACHE_CHARSET, XP_MSG_BASE + 1013, - "Character set:") -ResDef (MK_CACHE_SECURE, XP_MSG_BASE + 1014, - "Secure:") -ResDef (MK_CACHE_USES_RELATIVE_PATH, XP_MSG_BASE + 1015, - "Uses relative path:") -ResDef (MK_CACHE_FROM_NETSITE_SERVER, XP_MSG_BASE + 1016, - "From Netsite Server:") - -ResDef (XP_EDT_I18N_HAS_CHARSET, XP_MSG_BASE + 1017, - "Changing the character encoding may alter some\n\ -of the characters in your document.\n\ -This change is not undoable.\n\ -Are you sure you want to proceed?") - -ResDef (XP_EDT_BREAKING_LINKS, XP_MSG_BASE + 1018, - "The following links could become invalid because\n\ -they refer to files on your local hard disk(s).\n\n\ -%s\nIf you're sure you set up the links properly, click\n\ -OK to continue publishing.") -ResDef (XP_EDT_ERR_SAVE_FILE_WRITE, XP_MSG_BASE + 1019, - "%s can't be saved because the disk is full or the\n\ -file is locked. Try saving on a different disk or try saving\n\ -%s with a different name.") -ResDef (XP_EDT_ERR_SAVE_CONTINUE, XP_MSG_BASE + 1020, - "\n\n\ -If you continue saving, %s won't be saved with\n\ -this page.") -ResDef (XP_EDT_ERR_SAVE_SRC_NOT_FOUND, XP_MSG_BASE + 1021, - "The file %s associated with this page can't be\n\ -saved. Make sure the file is in the correct location.") -ResDef (XP_EDT_ERR_SAVE_FILE_READ, XP_MSG_BASE + 1022, - "The file %s associated with this page can't be\n\ -saved because there is a problem with the file.") -ResDef (XP_EDT_ERR_PUBLISH_PREPARING_ROOT, XP_MSG_BASE + 1023, - "There was a problem preparing %s for\n\ -publishing. "MOZ_NAME_PRODUCT" couldn't create a temporary file.") -ResDef (XP_EDT_ERR_CHECK_DISK, XP_MSG_BASE + 1024, - "\n\n\ -Check to see if your hard disk is full.") -ResDef (XP_EDT_ERR_PUBLISH_FILE_WRITE, XP_MSG_BASE + 1025, - "There was a problem preparing %s for publishing.\n\ -"MOZ_NAME_PRODUCT" couldn't create a temporary file.") -ResDef (XP_EDT_ERR_PUBLISH_CONTINUE, XP_MSG_BASE + 1026, - "\n\n\ -If you continue, %s won't be published with\n\ -this page.") -ResDef (XP_EDT_ERR_PUBLISH_SRC_NOT_FOUND, XP_MSG_BASE + 1027, -MOZ_NAME_BRAND" couldn't prepare the file %s for\n\ -publishing. Make sure the file is in the correct location.") -ResDef (XP_EDT_ERR_PUBLISH_FILE_READ, XP_MSG_BASE + 1028, - "The file %s associated with this page can't\n\ -be published because there is a problem with the file.") -ResDef (XP_EDT_ERR_MAIL_PREPARING_ROOT, XP_MSG_BASE + 1029, - "There was a problem preparing the message for sending.\n\ -"MOZ_NAME_PRODUCT" couldn't create a temporary file.") -ResDef (XP_EDT_ERR_MAIL_FILE_WRITE, XP_MSG_BASE + 1030, - "There was a problem preparing %s for sending.\n\ -"MOZ_NAME_PRODUCT" couldn't create a temporary file.") -ResDef (XP_EDT_ERR_MAIL_SRC_NOT_FOUND, XP_MSG_BASE + 1031, -MOZ_NAME_BRAND" couldn't prepare the file %s for\n\ -sending. Make sure the file is in the correct location.") -ResDef (XP_EDT_ERR_MAIL_FILE_READ, XP_MSG_BASE + 1032, - "The file %s associated with this page can't be\n\ -sent because there is a problem with the file.") -ResDef (XP_EDT_ERR_MAIL_CONTINUE, XP_MSG_BASE + 1033, - "\n\n\ -If you continue, %s won't be sent with\n\ -this page.") - -ResDef (MK_ADDR_VIEW_COMPLETE_VCARD, XP_MSG_BASE + 1034, - "View Complete Card") -ResDef (MK_ADDR_VIEW_CONDENSED_VCARD, XP_MSG_BASE + 1035, - "View Condensed Card") - -ResDef(MK_MSG_BY_FLAG, XP_MSG_BASE + 1036, - "By Flag") - -ResDef(MK_MSG_BY_UNREAD, XP_MSG_BASE + 1037, - "By Unread") - -ResDef(MK_MSG_BY_SIZE, XP_MSG_BASE + 1038, - "By Size") - -ResDef(XP_ALERT_OFFLINE_MODE_SELECTED, XP_MSG_BASE + 1039, -MOZ_NAME_BRAND" was unable to connect to the network because\n\ -you are in offline mode.\n\ -Choose Go Online from the File Menu and try again.") - -ResDef(MK_ADDR_FIRST_LAST_SEP, XP_MSG_BASE + 1040, - " ") - -ResDef(MK_ADDR_LAST_FIRST_SEP, XP_MSG_BASE + 1041, - ", ") - -ResDef(MK_MSG_CANT_MOVE_FOLDER, XP_MSG_BASE + 1042, - "That item can not be moved to the requested location.") - -ResDef(XP_SEC_ENTER_EXPORT_PWD, XP_MSG_BASE + 1043, - "Enter password to protect data being exported:") - -ResDef(MK_SEARCH_SCOPE_ONE, XP_MSG_BASE + 1044, "in %s") -ResDef(MK_SEARCH_SCOPE_SELECTED, XP_MSG_BASE + 1045, "in selected items") -ResDef(MK_SEARCH_SCOPE_OFFLINE_MAIL, XP_MSG_BASE + 1046, "in offline mail folders") -ResDef(MK_SEARCH_SCOPE_ONLINE_MAIL, XP_MSG_BASE + 1047, "in online mail folders") -ResDef(MK_SEARCH_SCOPE_SUBSCRIBED_NEWS, XP_MSG_BASE + 1048, "in subscribed discussion groups") -ResDef(MK_SEARCH_SCOPE_ALL_NEWS, XP_MSG_BASE + 1049, "in searchable discussion groups") - -ResDef(MK_ADDR_DEFAULT_DLS, XP_MSG_BASE + 1050, "Default Directory Server") -ResDef(MK_ADDR_SPECIFIC_DLS, XP_MSG_BASE + 1051, "Specific Directory Server") -ResDef(MK_ADDR_HOSTNAMEIP, XP_MSG_BASE + 1052, "Hostname or IP Address") -ResDef(MK_ADDR_CONFINFO, XP_MSG_BASE + 1053,MOZ_NAME_BRAND" Conference Address") -ResDef(MK_ADDR_ADDINFO, XP_MSG_BASE + 1054, "Additional Information:") - -ResDef(MK_MSG_HTML_DOMAINS_DIALOG_TITLE, XP_MSG_BASE + 1055, "HTML Domains") - -ResDef(MK_MSG_HTML_DOMAINS_DIALOG, XP_MSG_BASE + 1056, "\ -\n\ -This is a list of domains that can accept HTML mail. Anyone whose\n\ -%-cont-%") - -ResDef (MK_MSG_HTML_DOMAINS_DIALOG_3, XP_MSG_BASE + 1059, "\ -e-mail address ends in one of these domains is considered to use a\n\ -mail reader which understands HTML, such as "MOZ_NAME_PRODUCT".

\n\ -You may remove a domain from this list by clicking on it and\n\ -%-cont-%") - -ResDef (MK_MSG_HTML_DOMAINS_DIALOG_4, XP_MSG_BASE + 1060, "\ -choosing Delete.

\n\ -\n\ -\n\ -\n\ -") - -/* Reserve a bunch extra, just in case. */ - -ResDef (MK_MSG_HTML_DOMAINS_DIALOG_5, XP_MSG_BASE + 1061, "") -ResDef (MK_MSG_HTML_DOMAINS_DIALOG_6, XP_MSG_BASE + 1062, "") -ResDef (MK_MSG_HTML_DOMAINS_DIALOG_7, XP_MSG_BASE + 1063, "") -ResDef (MK_MSG_HTML_DOMAINS_DIALOG_8, XP_MSG_BASE + 1064, "") -ResDef (MK_MSG_HTML_DOMAINS_DIALOG_9, XP_MSG_BASE + 1065, "") - - -ResDef (MK_MSG_SET_HTML_NEWSGROUP_HEIRARCHY_CONFIRM, XP_MSG_BASE + 1066, -"The discussion group %s was accepting HTML because all groups whose name\n\ -started with \042%s\042 were marked to accept HTML. This action will\n\ -reverse that; groups whose name start with \042%s\042 will no longer\n\ -accept HTML.") - -ResDef (MK_MSG_NEXT_CATEGORY, XP_MSG_BASE + 1067, "Next Category") - -ResDef (MK_MSG_GROUP_NOT_ON_SERVER, XP_MSG_BASE + 1068, -"The discussion group %s does not appear to exist on the host %s.\n\ -Would you like to unsubscribe from it?") - -ResDef(MK_MIMEHTML_SHOW_SECURITY_ADVISOR, XP_MSG_BASE + 1079, - "Show Security Information") - -ResDef(MK_MIMEHTML_ENC_AND_SIGNED, XP_MSG_BASE + 1080, - "Encrypted
and Signed") -ResDef(MK_MIMEHTML_SIGNED, XP_MSG_BASE + 1081, "Signed") -ResDef(MK_MIMEHTML_ENCRYPTED, XP_MSG_BASE + 1082, "Encrypted") -ResDef(MK_MIMEHTML_CERTIFICATES, XP_MSG_BASE + 1083, "Certificates") -ResDef(MK_MIMEHTML_ENC_SIGNED_BAD, XP_MSG_BASE + 1084, - "Invalid Signature") -ResDef(MK_MIMEHTML_SIGNED_BAD, XP_MSG_BASE + 1085, - "Invalid Signature") -ResDef(MK_MIMEHTML_ENCRYPTED_BAD, XP_MSG_BASE + 1086, - "Invalid Encryption") -ResDef(MK_MIMEHTML_CERTIFICATES_BAD, XP_MSG_BASE + 1087, - "Invalid Certificates") - -ResDef (MK_MSG_NEW_NEWSGROUP, XP_MSG_BASE + 1088, -"New Discussion Group") -ResDef (MK_MSG_NEW_CATEGORY, XP_MSG_BASE + 1089, -"Creates a new category in this discussion group") - -ResDef(MK_ADDR_NO_EMAIL_ADDRESS, XP_MSG_BASE + 1090, - "There is no email address for %s.") - -ResDef (MK_MSG_EXPIRE_COUNT, XP_MSG_BASE + 1091, "Expired %ld messages") - -ResDef (MK_MSG_DONE_EXPIRE_COUNT, XP_MSG_BASE + 1092, "Expired %ld messages...Done") - -/* Localized names of mail folders */ -ResDef (MK_MSG_TRASH_L10N_NAME, XP_MSG_BASE + 1093, "Trash") -ResDef (MK_MSG_INBOX_L10N_NAME, XP_MSG_BASE + 1094, "Inbox") -#ifdef XP_WIN16 -ResDef (MK_MSG_OUTBOX_L10N_NAME, XP_MSG_BASE + 1095, "Unsent") -#else -ResDef (MK_MSG_OUTBOX_L10N_NAME, XP_MSG_BASE + 1095, "Unsent Messages") -#endif -ResDef (MK_MSG_DRAFTS_L10N_NAME, XP_MSG_BASE + 1096, "Drafts") -ResDef (MK_MSG_SENT_L10N_NAME, XP_MSG_BASE + 1097, "Sent") - -/* Caption text for FE_PromptWithCaption */ -ResDef (MK_MSG_NEW_FOLDER_CAPTION, XP_MSG_BASE + 1098, "New Folder") -ResDef (MK_MSG_RENAME_FOLDER_CAPTION, XP_MSG_BASE + 1099, "Rename Folder") - -ResDef (MK_MSG_MANAGE_MAIL_ACCOUNT, XP_MSG_BASE + 1100, "Manage Mail Account") - -ResDef (MK_MSG_UNABLE_MANAGE_MAIL_ACCOUNT, XP_MSG_BASE+1101, -MOZ_NAME_BRAND" is unable to manage your mail account.\n\ -Please contact your mail account administrator\n\ -or try again later.") - -ResDef (MK_MSG_MODERATE_NEWSGROUP, XP_MSG_BASE + 1102, -"Manage Discussion Group") - -ResDef(MK_UNABLE_TO_LOCATE_SOCKS_HOST, XP_MSG_BASE + 1103, -MOZ_NAME_BRAND" is unable to locate the socks server:\n\ - %.200s\n\ -The server does not have a DNS entry.\n\n\ -Check the socks server name in the proxy\n\ -configuration and try again.") - -ResDef (XP_SEC_PROMPT_NICKNAME_COLLISION, (XP_MSG_BASE + 1104), - "An object with that nickname exists. Please enter a new nickname.") - -ResDef(MK_MSG_GET_NEW_DISCUSSION_MSGS, XP_MSG_BASE + 1105, "Get New Discussion Messages") - -ResDef(MK_MSG_LOCAL_MAIL, XP_MSG_BASE + 1106, "Local Mail") -ResDef(MK_NEWS_DISCUSSIONS_ON, XP_MSG_BASE + 1107, "%s Discussions") - -ResDef( XP_RECEIVING_MESSAGE_HEADERS_OF, XP_MSG_BASE + 1108, -"%s Receiving: message headers %lu of %lu" ) - -ResDef( XP_RECEIVING_MESSAGE_FLAGS_OF, XP_MSG_BASE + 1109, -"%s Receiving: message flags %lu of %lu" ) - -ResDef( XP_IMAP_DELETING_MESSAGES, XP_MSG_BASE + 1110, "Deleting messages...") -ResDef( XP_IMAP_DELETING_MESSAGE, XP_MSG_BASE + 1111, "Deleting message...") -ResDef( XP_IMAP_MOVING_MESSAGES_TO, XP_MSG_BASE + 1112, "Moving messages to %s...") -ResDef( XP_IMAP_MOVING_MESSAGE_TO, XP_MSG_BASE + 1113, "Moving message to %s...") -ResDef( XP_IMAP_COPYING_MESSAGES_TO, XP_MSG_BASE + 1114, "Copying messages %s...") -ResDef( XP_IMAP_COPYING_MESSAGE_TO, XP_MSG_BASE + 1115, "Copying message %s...") -ResDef( XP_IMAP_SELECTING_MAILBOX, XP_MSG_BASE + 1116, "Opening folder %s...") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(MK_MSG_CONFIRM_MOVE_MAGIC_FOLDER, XP_MSG_BASE + 1117, -"Are you sure you want to move %s away from its default \n\ -location? Next time "MOZ_NAME_PRODUCT" runs, a new %s folder \n\ -will be created in the default location") -#else -ResDef(MK_MSG_CONFIRM_MOVE_MAGIC_FOLDER, XP_MSG_BASE + 1117, -"Are you sure you want to move %s away from its default \n\ -location? Next time Communicator runs, a new %s folder \n\ -will be created in the default location") -#endif - -ResDef(MK_MSG_UPDATE_MSG_COUNTS, XP_MSG_BASE + 1118, "Update Message Counts") - -ResDef(MK_MSG_DELETING_MSGS_STATUS, XP_MSG_BASE + 1119, "Deleting %lu of %lu messages") -ResDef(MK_MSG_COPYING_MSGS_STATUS, XP_MSG_BASE + 1120, "Copying %lu of %lu messages to %s") -ResDef(MK_MSG_MOVING_MSGS_STATUS, XP_MSG_BASE + 1121, "Moving %lu of %lu messages to %s") - -ResDef(XP_EDT_PUBLISH_REPORT_ONE_FILE, XP_MSG_BASE + 1122, -"Your file was uploaded successfully.") -ResDef(XP_EDT_PUBLISH_REPORT_MSG, XP_MSG_BASE + 1123, -"%d files were uploaded successfully.") - -ResDef(MK_MSG_DELIVERING_MESSAGE_TO, XP_MSG_BASE + 1124, "Mail: delivering message %ld to %s...") -ResDef(MK_MSG_DELIVERING_MESSAGE, XP_MSG_BASE + 1125, "Mail: delivering message %ld...") - -ResDef(MK_MSG_FORWARDING_ENCRYPTED_WARNING, XP_MSG_BASE + 1126, - "You are doing an unencrypted Forward of a message which was\n\ -encrypted when you received it. Sending this message unencrypted\n\ -may reduce the level of privacy of the attached message.\n\ -\n\ -Send unencrypted anyway?") - -ResDef(XP_EDT_BROWSE_TO_DEFAULT, XP_MSG_BASE + 1127, -"\n\nBrowse to your default publishing location now?") - -ResDef (XP_EDT_BAD_CLIPBOARD_VERSION, XP_MSG_BASE + 1128, - "You can not copy and paste between different\n\ -versions of "MOZ_NAME_PRODUCT" Composer or "MOZ_NAME_PRODUCT" Gold.") -ResDef (XP_EDT_BAD_CLIPBOARD_ENCODING, XP_MSG_BASE + 1129, - "You can not copy and paste between windows with\n\ -different character set encodings.") - -ResDef(XP_ALERT_NFS_USEHTTP, XP_MSG_BASE+1130, -"NFS URLs not internally supported, use an HTTP proxy server: ") - -ResDef(MK_MSG_MARK_CATEGORY_READ, XP_MSG_BASE+1131, "Mark Category Read") - -ResDef(MK_MSG_TRACK_FOLDER_MOVE, XP_MSG_BASE + 1132, -"Change rule to reflect new folder location?") -ResDef(MK_MSG_TRACK_FOLDER_DEL, XP_MSG_BASE + 1133, -"Disable filter rule for this folder?") - -/* Webfonts strings from modules/libfont */ - -ResDef(WF_MSG_ABOUT_TITLE, XP_MSG_BASE + 1134, -"Dynamic Fonts") -ResDef(WF_MSG_ABOUT_BEGIN_1, XP_MSG_BASE + 1135, -"

Installed Font Displayers

\n\ - \n\ - The font displayers that you have installed and the font formats\n\ - supported by each, are listed below.") - ResDef(WF_MSG_ABOUT_BEGIN_2, XP_MSG_BASE + 1136, - "Use the radioboxes to enable or disable a particular format for a\n\ - particular displayer.

") - ResDef(WF_MSG_ABOUT_BEGIN_3, XP_MSG_BASE + 1137, - "For more information on "MOZ_NAME_PRODUCT" Dynamic Fonts, click\ - here


") -ResDef(WF_MSG_ABOUT_END, XP_MSG_BASE + 1138, -"
") -ResDef(WF_MSG_ABOUT_DISPLAYER_DYNAMIC, XP_MSG_BASE + 1139, -"\n\ - \n\ - ") -ResDef(WF_MSG_ABOUT_DISPLAYER_STATIC, XP_MSG_BASE + 1140, -"
%s
%s
Located at: %s

\n\ - \n\ - ") -ResDef(WF_MSG_ABOUT_DISPLAYER_MIME, XP_MSG_BASE + 1141, -"\n\ - \n\ - \n\ - \n\ - ") -ResDef(WF_MSG_ABOUT_DISPLAYER_END, XP_MSG_BASE + 1142, -"
%s
%s

%s%s%s
\n\ -
\n\ -
") -ResDef(WF_MSG_ABOUT_NO_DISPLAYER, XP_MSG_BASE + 1143, -"No Displayers Installed") -ResDef(WF_MSG_NATIVE_DISPLAYER_NAME, XP_MSG_BASE + 1144, -MOZ_NAME_BRAND" Default Font Displayer") -ResDef(WF_MSG_NATIVE_DISPLAYER_DESCRIPTION, XP_MSG_BASE + 1145, -"This font displayer handles fonts that are installed on the system.") - -/* More messenger strings */ -ResDef (MK_MSG_OUTBOX_L10N_NAME_OLD, XP_MSG_BASE + 1146, "Outbox") -ResDef(MK_MSG_BOGUS_QUEUE_MSG_1_OLD, XP_MSG_BASE + 1147, - "The `Outbox' folder contains a message which is not\n\ -scheduled for delivery!") -ResDef(MK_MSG_BOGUS_QUEUE_MSG_N_OLD, XP_MSG_BASE + 1148, - "The `Outbox' folder contains %d messages which are not\n\ -scheduled for delivery!") -ResDef(MK_MSG_BOGUS_QUEUE_REASON_OLD, XP_MSG_BASE + 1149, - "\n\nThis probably means that some program other than\n\ -"MOZ_NAME_PRODUCT" has added messages to this folder.\n") -ResDef(MK_MSG_WHY_QUEUE_SPECIAL_OLD, XP_MSG_BASE + 1150, - "The `Outbox' folder is special; it is only for holding\n\ -messages which have been deferred for later delivery.") - -ResDef(XP_AUTOADMIN_MISSING, XP_MSG_BASE + 1151, - "The local configuration file specified a configuration URL but the AutoAdmin component could not \ - be loaded. AutoAdmin is required to support remote configuration URLs. You will be unable to load\ - any remote documents." ) - - ResDef(MK_MSG_ADDING_LDAP_TO_AB, XP_MSG_BASE + 1152, - "Adding to Address Book: %ld of %ld") - - ResDef(MK_MSG_XSENDER_INTERNAL, XP_MSG_BASE + 1153, - "      Internal") - -ResDef(XP_PKCS12_IMPORT_FILE_PROMPT, (XP_MSG_BASE + 1154), -"File Name to Import") - -ResDef(XP_PKCS12_EXPORT_FILE_PROMPT, (XP_MSG_BASE + 1155), -"File Name to Export") - -ResDef(XP_EDT_CP_DOCUMENT_TOO_LARGE_READ, XP_MSG_BASE + 1156, - "This document is %ld bytes long. That is too large to be read by a Composer Plug-in. \ -The maximum allowed size is %ld bytes.") - -ResDef(XP_EDT_CP_DOCUMENT_TOO_LARGE_WRITE, XP_MSG_BASE + 1157, - "The Composer Plug-in tried to create a document that is %ld bytes long. \ -The maximum allowed size is %ld bytes.") - -ResDef(MK_MIME_SMIME_ENCRYPTED_CONTENT_DESCRIPTION, XP_MSG_BASE + 1158, - "S/MIME Encrypted Message") - -ResDef(MK_MIME_SMIME_SIGNATURE_CONTENT_DESCRIPTION, XP_MSG_BASE + 1159, - "S/MIME Cryptographic Signature") - -/* Netcaster Strings */ - -ResDef(XP_ALERT_CANT_RUN_NETCASTER, XP_MSG_BASE + 1160, -MOZ_NAME_BRAND" was unable to start Netcaster.\n\ -Make sure Netcaster is installed correctly.") - - -ResDef(XP_EDT_CANT_EDIT_URL, XP_MSG_BASE + 1161, - "Composer can't open the URL '%s'.\n\n\ -You must enter an absolute URL or an absolute pathname.\n\ -e.g. 'http://mysystem.com/mydoc.html'") - -ResDef(XP_SA_ALG_AND_BITS_FORMAT, XP_MSG_BASE + 1162, "%d-bit %s") - -ResDef(MK_MSG_IMAP_MULTIPLE_SELECT_FAILED, XP_MSG_BASE + 1163, -"Only one operation at a time on this folder is permitted. \ -\nPlease wait until the other operation completes and try again.") - -ResDef(MK_MSG_CONFIRM_MOVE_FOLDER_TO_TRASH, XP_MSG_BASE + 1164, -"Are you sure you want to move the selected folders into the Trash?") - -ResDef(XP_ALERT_NETCASTER_NO_JS, XP_MSG_BASE + 1165, -MOZ_NAME_BRAND" is unable to start Netcaster because Java and/or JavaScript are not enabled. \n\ -Please verify that your Advanced Preferences are set correctly and try again.") - - -ResDef(XP_EDT_ADD_COLUMNS, XP_MSG_BASE + 1170, - "Add %d column(s) to the table") - -ResDef(XP_EDT_ADD_ROWS, XP_MSG_BASE + 1171, - "Add %d rows(s) to the table") - -ResDef(XP_EDT_PERCENT_CELL, XP_MSG_BASE + 1172, - "% of parent cell ") - -ResDef(XP_EDT_PERCENT_TABLE, XP_MSG_BASE + 1173, - "% of table ") - -/* XP_NSCOLOR_BASE and the 70 color strings removed - * We would like to reserve this range (1174 - 1250) for Editor -*/ - -/* please reserve strings to here for future colors */ -ResDef(SU_NOT_A_JAR_FILE, XP_MSG_BASE + 1262, - "SmartUpdate failed: Downloaded archive is not a JAR file.") - -ResDef(SU_SECURITY_CHECK, XP_MSG_BASE + 1263, - "SmartUpdate failed: JAR archive failed security check. %s.") - -ResDef(SU_INSTALL_FILE_HEADER, XP_MSG_BASE + 1264, - "SmartUpdate failed: JAR archive has no installer file information.") - -ResDef(SU_INSTALL_FILE_MISSING, XP_MSG_BASE + 1265, - "SmartUpdate failed: JAR archive is missing an installer file %s.") - -ResDef(XP_GLOBAL_NO_CONFIG_RECEIVED_NO_FAILOVER, XP_MSG_BASE + 1266, -"No automatic configuration file was received.\n\n\ -You will be unable to load and documents from the network.\n\ -See your local system administrator for help." ) - -ResDef(XP_GLOBAL_BAD_TYPE_CONFIG_IGNORED, XP_MSG_BASE + 1267, - "The automatic configuration file is not of the correct type:\n\n\ - %s\n\n\ -Expected the MIME type of application/x-javascript-config." ) - -ResDef(XP_GLOBAL_CONF_LOAD_FAILED_NO_FAILOVER, XP_MSG_BASE + 1268, -"The automatic configuration file could not be loaded.\n\n\ -You will be unable to load any documents from the network.\n\ -See your local system administrator for help." ) - -ResDef(XP_GLOBAL_NO_CONFIG_RECIEVED, XP_MSG_BASE + 1269, - "No automatic configuration file was received.\n\n\ -Will default based on the last configuration." ) - -ResDef(XP_GLOBAL_EVEN_SAVED_IS_BAD, XP_MSG_BASE + 1270, - "The backup automatic configuration file had errors.\n\n\ -We will default to the standard configuration." ) - -ResDef(XP_GLOBAL_BAD_CONFIG_IGNORED, XP_MSG_BASE + 1271, - "The automatic configuration file has errors:\n\n %s\n\n\ -We will default to the standard configuration." ) - -ResDef(XP_GLOBAL_CONFIG_LOAD_ABORTED, XP_MSG_BASE + 1272, - "Automatic configuration load was cancelled.\n\n\ -We will default to the standard configuration." ) - -ResDef(XP_PKCS12_SUCCESSFUL_EXPORT, (XP_MSG_BASE + 1273), -"Your certificates have been successfully exported.") - -ResDef(XP_PKCS12_SUCCESSFUL_IMPORT, (XP_MSG_BASE + 1274), -"Your certificates have been successfully imported.") - -ResDef(XP_SEC_ENTER_IMPORT_PWD, (XP_MSG_BASE + 1275), -"Enter password protecting data to be imported:") - -ResDef(MK_MSG_CONTINUE_ADDING, (XP_MSG_BASE + 1276), -"Would you like to add the remaining addresses to the personal address book?") - -ResDef(MK_LDAP_USER_CERTIFICATE, XP_MSG_BASE + 1277, "User Certificate") - -ResDef(MK_LDAP_SMIME_USER_CERTIFICATE, XP_MSG_BASE + 1278, "User E-mail Certificate") - -ResDef(MK_MSG_UNIQUE_TRASH_RENAME_FAILED, XP_MSG_BASE + 1279, -"The Trash already contains a folder named '%s.'\n\ -Please either empty the trash or rename this folder.") - -ResDef(MK_MSG_NEEDED_UNIQUE_TRASH_NAME, XP_MSG_BASE + 1280, -"The Trash already contained a folder named '%s.'\n\ -The folder which you just deleted can be found in the Trash\n\ -under the new name '%s.'") - -ResDef(MK_MSG_IMAP_SERVER_SAID, XP_MSG_BASE + 1281, -"The current command did not succeed. The IMAP server responded:\n%s") - -ResDef(SU_INSTALL_ASK_FOR_DIRECTORY, XP_MSG_BASE + 1282, - "Where would you like to install %s?") - -ResDef(EDT_VIEW_SOURCE_WINDOW_TITLE, XP_MSG_BASE + 1283, -"View Document Source") - -ResDef(LAY_PAGEINFO_NOINFO, XP_MSG_BASE + 1284, -"

No info while document is loading

\n") -ResDef(LAY_PAGEINFO_FRAME, XP_MSG_BASE + 1285, -"
  • Frame: ") -ResDef(LAY_PAGEINFO_IMAGE, XP_MSG_BASE + 1286, -"Image:") -ResDef(LAY_PAGEINFO_EMBED, XP_MSG_BASE + 1287, -"Embed:") -ResDef(LAY_PAGEINFO_APPLET, XP_MSG_BASE + 1288, -"Applet:") -ResDef(LAY_PAGEINFO_BACKGROUND_IMAGE, XP_MSG_BASE + 1289, -"Background Image: ") -ResDef(LAY_PAGEINFO_ACTIONURL, XP_MSG_BASE + 1290, -"
  • Action URL: ") -ResDef(LAY_PAGEINFO_ENCODING, XP_MSG_BASE + 1291, -"
  • Encoding: ") -ResDef(LAY_PAGEINFO_METHOD, XP_MSG_BASE + 1292, -"
  • Method: ") -ResDef(LAY_PAGEINFO_LAYER, XP_MSG_BASE + 1293, -"
  • Layer: ") - -ResDef(MK_MSG_MAC_PROMPT_UUENCODE, XP_MSG_BASE + 1294, -"Some of these attachments contain Macintosh specific information. \ -Using UUENCODE will cause this information to be lost. \ -Continue sending?") - -ResDef(XP_SEC_REENTER_TO_CONFIRM_PWD, XP_MSG_BASE + 1295, -"Re-enter the password to confirm it:") - -ResDef(XP_SEC_BAD_CONFIRM_EXPORT_PWD, XP_MSG_BASE + 1296, -"The passwords entered did not match. Enter\n\ -the password to protect data being exported:") - -ResDef(MK_IMAP_STATUS_CREATING_MAILBOX, XP_MSG_BASE + 1297, -"Creating folder...") - -ResDef(MK_IMAP_STATUS_SELECTING_MAILBOX, XP_MSG_BASE + 1298, -"Opening folder...") - -ResDef(MK_IMAP_STATUS_DELETING_MAILBOX, XP_MSG_BASE + 1299, -"Deleting folder %s...") - -ResDef(MK_IMAP_STATUS_RENAMING_MAILBOX, XP_MSG_BASE + 1300, -"Renaming folder %s...") - -ResDef(MK_IMAP_STATUS_LOOKING_FOR_MAILBOX, XP_MSG_BASE + 1301, -"Looking for folders...") - -ResDef(MK_IMAP_STATUS_SUBSCRIBE_TO_MAILBOX, XP_MSG_BASE + 1302, -"Subscribing to folder %s...") - -ResDef(MK_IMAP_STATUS_UNSUBSCRIBE_MAILBOX, XP_MSG_BASE + 1303, -"Unsubscribing from folder %s...") - -ResDef(MK_IMAP_STATUS_SEARCH_MAILBOX, XP_MSG_BASE + 1304, -"Searching folder...") - -ResDef(MK_IMAP_STATUS_MSG_INFO, XP_MSG_BASE + 1305, -"Getting message info...") - -ResDef(MK_IMAP_STATUS_CLOSE_MAILBOX, XP_MSG_BASE + 1306, -"Closing folder...") - -ResDef(MK_IMAP_STATUS_EXPUNGING_MAILBOX, XP_MSG_BASE + 1307, -"Compacting folder...") - -ResDef(MK_IMAP_STATUS_LOGGING_OUT, XP_MSG_BASE + 1308, -"Logging out...") - -ResDef(MK_IMAP_STATUS_CHECK_COMPAT, XP_MSG_BASE + 1309, -"Checking IMAP server capability...") - -ResDef(MK_IMAP_STATUS_SENDING_LOGIN, XP_MSG_BASE + 1310, -"Sending login information...") - -ResDef(MK_IMAP_STATUS_SENDING_AUTH_LOGIN, XP_MSG_BASE + 1311, -"Sending authenticate login information...") - -ResDef(SU_NEED_TO_REBOOT, XP_MSG_BASE + 1312, - "SmartUpdate is not complete until you reboot Windows") - -ResDef(MK_MSG_REPLY_TO_SENDER, XP_MSG_BASE + 1313, - "to Sender") - -ResDef(MK_ADDR_DEFAULT_EXPORT_FILENAME, XP_MSG_BASE + 1314, - "untitled") - -ResDef(MK_MSG_ADVANCE_TO_NEXT_FOLDER, XP_MSG_BASE + 1315, - "Advance to next unread message in %s?") - -ResDef(MK_PORT_ACCESS_NOT_ALLOWED, XP_MSG_BASE + 1316, - "Sorry, access to the port number given\n\ -has been disabled for security reasons") - -ResDef(XP_PRIORITY_LOWEST, XP_MSG_BASE + 1317, "Lowest") -ResDef(XP_PRIORITY_LOW, XP_MSG_BASE + 1318, "Low") -ResDef(XP_PRIORITY_NORMAL, XP_MSG_BASE + 1319, "Normal") -ResDef(XP_PRIORITY_HIGH, XP_MSG_BASE + 1320, "High") -ResDef(XP_PRIORITY_HIGHEST, XP_MSG_BASE + 1321, "Highest") -ResDef(XP_PRIORITY_NONE, XP_MSG_BASE + 1322, "NONE") - -ResDef(XP_PROGRESS_READ_NEWSGROUP_COUNTS, XP_MSG_BASE + 1323, - "Receiving: message totals: %lu of %lu") - -ResDef(MK_LDAP_AUTH_PROMPT, XP_MSG_BASE + 1324, - "Please enter your %s and password for access to %s") - -ResDef( XP_FOLDER_RECEIVING_MESSAGE_OF, XP_MSG_BASE + 1325, -"%s - Receiving: message %lu of %lu" ) - -ResDef(MK_MSG_COLLABRA_DISABLED, XP_MSG_BASE + 1326, - "Sorry, Collabra has been disabled; newsgroup functionality \ -has been turned off.") - -ResDef(MK_IMAP_DOWNLOADING_MESSAGE, XP_MSG_BASE + 1327, - "Downloading message...") - -ResDef(MK_IMAP_CREATE_FOLDER_BUT_NO_SUBSCRIBE, XP_MSG_BASE + 1328, - "Folder creation succeeded, but "MOZ_NAME_PRODUCT" was unable to subscribe \ -the new folder.") - -ResDef(MK_IMAP_DELETE_FOLDER_BUT_NO_UNSUBSCRIBE, XP_MSG_BASE + 1329, - "Folder deletion succeeded, but "MOZ_NAME_PRODUCT" was unable to unubscribe \ -from the folder.") - -ResDef(MK_IMAP_RENAME_FOLDER_BUT_NO_SUBSCRIBE, XP_MSG_BASE + 1330, - "Folder move succeeded, but "MOZ_NAME_PRODUCT" was unable to subscribe \ -to the new folder name.") - -ResDef(MK_IMAP_RENAME_FOLDER_BUT_NO_UNSUBSCRIBE, XP_MSG_BASE + 1331, - "Folder move succeeded, but "MOZ_NAME_PRODUCT" was unable to unsubscribe \ -from the old folder name.") - -ResDef(XP_MSG_JS_CLOSE_WINDOW, XP_MSG_BASE + 1332, "Close Window?") - -ResDef(XP_MSG_JS_CLOSE_WINDOW_NAME, XP_MSG_BASE + 1333, "Close Window %s?") - -ResDef(MK_ACCESS_YOUR_COOKIES, XP_MSG_BASE + 1334, - "Your Cookies") -ResDef(MK_ACCESS_MAXIMUM_COOKS, XP_MSG_BASE + 1335, - "Maximum number of cookies allowed:") -ResDef(MK_ACCESS_COOK_COUNT, XP_MSG_BASE + 1336, - "The number of cookies you have:") -ResDef(MK_ACCESS_MAXIMUM_COOKS_PER_SERV, XP_MSG_BASE + 1337, - "Maximum number of cookies per server:") -ResDef(MK_ACCESS_MAXIMUM_COOK_SIZE, XP_MSG_BASE + 1338, - "Maximum size of each cookie:") -ResDef(MK_ACCESS_NO_COOKIES, XP_MSG_BASE + 1339, - "You have no cookies.") -ResDef(MK_ACCESS_NAME, XP_MSG_BASE + 1340, - "Name:") -ResDef(MK_ACCESS_VALUE, XP_MSG_BASE + 1341, - "Value:") -ResDef(MK_ACCESS_HOST, XP_MSG_BASE + 1342, - "Host:") -ResDef(MK_ACCESS_SEND_TO_HOST, XP_MSG_BASE + 1343, - "Send to host:") -ResDef(MK_ACCESS_IS_DOMAIN, XP_MSG_BASE + 1344, - "any host in the domain from the host above") -ResDef(MK_ACCESS_IS_NOT_DOMAIN, XP_MSG_BASE + 1345, - "the above fully qualified host only") -ResDef(MK_ACCESS_SEND_TO_PATH, XP_MSG_BASE + 1346, - "Send to path:") -ResDef(MK_ACCESS_AND_BELOW, XP_MSG_BASE + 1347, - " (and below)") -ResDef(MK_ACCESS_SECURE, XP_MSG_BASE + 1348, - "Secure:") -ResDef(MK_ACCESS_EXPIRES, XP_MSG_BASE + 1349, - "Expires:") -ResDef(MK_ACCESS_END_OF_SESSION, XP_MSG_BASE + 1350, - "at end of session") -ResDef(MK_LDAP_HTML_TITLE, XP_MSG_BASE + 1351, - "LDAP Search Results") -ResDef(MK_ACCESS_JAVASCRIPT_COOKIE_FILTER, XP_MSG_BASE + 1352, - "Javascript Cookie Filter Message:\n") -ResDef(MK_JSFILTERDIALOG_EDIT_TITLE, XP_MSG_BASE + 1353, - "Edit JavaScript Message Filter") -ResDef(MK_JSFILTERDIALOG_NEW_TITLE, XP_MSG_BASE + 1354, - "New JavaScript Message Filter") -ResDef(MK_JSFILTERDIALOG_STRING, XP_MSG_BASE + 1355, -"
    \ - \ -
    \ - JavaScript Message Filter \ -%-cont-%") -ResDef(MK_JSFILTERDIALOG_STRING_2, XP_MSG_BASE + 1356, -"
    Filter Name: \n\ - \ -%-cont-%") -ResDef(MK_JSFILTERDIALOG_STRING_3, XP_MSG_BASE + 1357, -"
    JavaScript Function: \n\ - \ -%-cont-%") -ResDef(MK_JSFILTER_DIALOG_STRING_4, XP_MSG_BASE + 1358, -"
    Description: \n\ - \ -%-cont-%") -ResDef(MK_JSFILTER_DIALOG_STRING_5, XP_MSG_BASE + 1359, -"
    Filter is \n\ - onoff \ -
    ") -ResDef(MK_JSFILTER_DIALOG_STRING_6, XP_MSG_BASE + 1360, "") -ResDef(MK_JSFILTER_DIALOG_STRING_7, XP_MSG_BASE + 1361, "") -ResDef(MK_JSFILTER_DIALOG_STRING_8, XP_MSG_BASE + 1362, "") -ResDef(MK_JSFILTER_DIALOG_STRING_9, XP_MSG_BASE + 1363, "") -ResDef(MK_JSFILTER_DIALOG_STRING_10, XP_MSG_BASE + 1364, "") -ResDef(MK_MSG_RETRIEVE_SELECTED, XP_MSG_BASE + 1365, - "Retrieve selected messages") -ResDef(MK_MSG_RETRIEVE_FLAGGED, XP_MSG_BASE + 1366, - "Retrieve flagged messages") - -ResDef(MK_IMAP_STATUS_GETTING_NAMESPACE, XP_MSG_BASE + 1367, - "Checking IMAP Namespace...") - -ResDef(MK_LDAP_REPL_CHANGELOG_BOGUS, XP_MSG_BASE + 1368, - "Can't replicate because the server's change log appears incomplete.") -ResDef(MK_LDAP_REPL_DSE_BOGUS, XP_MSG_BASE + 1369, - "Can't replicate because the server's replication information appears incomplete.") -ResDef(MK_LDAP_REPL_CANT_SYNC_REPLICA, XP_MSG_BASE + 1370, - "Can't replicate because the replica is too far out of date with the server.") -ResDef(MK_ADD_ADDRESSBOOK, XP_MSG_BASE + 1371, - "New Address Book...") -ResDef(MK_ADD_LDAPDIRECTORY, XP_MSG_BASE + 1372, - "New Directory...") -#ifdef XP_WIN16 -ResDef (MK_MSG_TEMPLATES_L10N_NAME, XP_MSG_BASE + 1373, "Template") -#else -ResDef (MK_MSG_TEMPLATES_L10N_NAME, XP_MSG_BASE + 1373, "Templates") -#endif -ResDef (MK_MSG_SAVING_AS_DRAFT, XP_MSG_BASE + 1374, "Saving as draft ...") -ResDef (MK_MSG_SAVING_AS_TEMPLATE, XP_MSG_BASE + 1375, "Saving as template ...") - -ResDef(MK_MSG_ADDBOOK_MOUSEOVER_TEXT, XP_MSG_BASE + 1376, - "Add %s to your Address Book") -ResDef(MK_MSG_ENTER_NAME_FOR_TEMPLATE, XP_MSG_BASE + 1377, - "Enter a name for your new message template.") - -ResDef(MK_MSG_MDN_DISPLAYED, XP_MSG_BASE + 1378, -MOZ_NAME_BRAND" Messenger has displayed the message. There is no guarantee \ -that the content has been read or understood.") - -ResDef(MK_MSG_MDN_DISPATCHED, XP_MSG_BASE + 1379, -"The message has been sent somewhere in some manner (e.g., printed, faxed, forwarded) \ -without being displayed to the person you sent it to. They may or may not \ -see it later.") - -ResDef(MK_MSG_MDN_PROCESSED, XP_MSG_BASE + 1380, -"The message has been processed in some manner (i.e., by some sort of rules or \ -server) without being displayed to the person you sent it to. They may or may not see it \ -later. There may not even be a human user associated the mailbox.") - -ResDef(MK_MSG_MDN_DELETED, XP_MSG_BASE + 1381, -"The message has been deleted. The person you sent it to may or may not have seen it. \ -They might \042undelete\042 it at a later time and read it.") - -ResDef(MK_MSG_MDN_DENIED, XP_MSG_BASE + 1382, -"The recipient of the message does not wish to send a return receipt back to \ -you.") - -ResDef(MK_MSG_MDN_FAILED, XP_MSG_BASE + 1383, -"A failure occurred. A proper return receipt could not be generated or sent to \ -you.") - -ResDef(MK_MSG_MDN_WISH_TO_SEND, XP_MSG_BASE + 1384, -"The sender of the message requested a receipt to be returned. \n\ -Do you wish to send one?") - -ResDef(MK_MSG_DELIV_IMAP, XP_MSG_BASE + 1385, - "Delivering message...") -ResDef(MK_MSG_DELIV_IMAP_DONE, XP_MSG_BASE + 1386, - "Delivering message... Done") -ResDef(MK_MSG_IMAP_DISCOVERING_MAILBOX, XP_MSG_BASE + 1387, -"Found folder: %s") - -ResDef(MK_MSG_UNABLE_TO_SAVE_DRAFT, XP_MSG_BASE + 1388, -MOZ_NAME_BRAND" is unable to save your message as a draft. Please make sure \n\ -that your Drafts mail folder is correctly chosen in your Mail and \n\ -Newsgroups preferences.") -ResDef(MK_MSG_UNABLE_TO_SAVE_TEMPLATE, XP_MSG_BASE + 1389, -MOZ_NAME_BRAND" is unable to save your message as a template. Please make \n\ -sure that your Templates mail folder is correctly chosen in your Mail \n\ -and Newsgroups preferences.") - -ResDef(MK_MSG_IMAP_INBOX_NAME, XP_MSG_BASE + 1390, "Inbox") - -ResDef(MK_IMAP_UPGRADE_NO_PERSONAL_NAMESPACE, XP_MSG_BASE + 1391, "The IMAP server indicates that \ -you have may not have any personal mail folders.\nPlease verify your subscriptions.") - -ResDef(MK_IMAP_UPGRADE_TOO_MANY_FOLDERS, XP_MSG_BASE + 1392, "While trying to automatically subscribe, \ -"MOZ_NAME_PRODUCT" has found a large number of IMAP folders.\nPlease select which folders you would like subscribed.") - -ResDef(MK_IMAP_UPGRADE_PROMPT_USER, XP_MSG_BASE + 1393, -MOZ_NAME_PRODUCT" has detected that you have upgraded from a previous version of Communicator.\n\ -You will need to choose which IMAP folders you want subscribed.") - -ResDef(MK_IMAP_UPGRADE_PROMPT_USER_2, XP_MSG_BASE + 1394, -"Any folders which are left unsubscribed will not appear in your folder lists,\n\ -but can be subscribed to later by choosing File / Subscribe.") - -ResDef(MK_IMAP_UPGRADE_PROMPT_QUESTION, XP_MSG_BASE + 1395, -"Would you like "MOZ_NAME_PRODUCT" to try to automatically subscribe to all your folders?") - -ResDef(MK_IMAP_UPGRADE_CUSTOM, XP_MSG_BASE + 1396, -"Please choose which folders you want subscribed in the Subscribe window...") - -ResDef(MK_IMAP_UPGRADE_WAIT_WHILE_UPGRADE, XP_MSG_BASE + 1397, -"Please wait while "MOZ_NAME_PRODUCT" upgrades you to use IMAP subscriptions...") - -ResDef(MK_IMAP_UPGRADE_SUCCESSFUL, XP_MSG_BASE + 1398, -"Upgrade to IMAP subscription successful.") - -ResDef(MK_POP3_ONLY_ONE, XP_MSG_BASE + 1399, -"You cannot add another server, because you are using POP.") - -ResDef(MK_MSG_REMOVE_MAILHOST_CONFIRM, XP_MSG_BASE + 1400, -"Are you sure you want to delete this server?\n\ -All mail downloaded from this server will be erased from your hard drive, and you cannot undo.") - -ResDef(MK_IMAP_GETTING_ACL_FOR_FOLDER, XP_MSG_BASE + 1401, -"Getting folder ACL...") - -ResDef(MK_MSG_EXPIRE_NEWS_ARTICLES, XP_MSG_BASE + 1402, -"Click here to remove all expired articles") - -ResDef(MK_MDN_DISPLAYED_RECEIPT, XP_MSG_BASE + 1403, -"Return Receipt (displayed)") - -ResDef(MK_MDN_DISPATCHED_RECEIPT, XP_MSG_BASE + 1404, -"Return Receipt (dispatched)") - -ResDef(MK_MDN_PROCESSED_RECEIPT, XP_MSG_BASE + 1405, -"Return Receipt (processed)") - -ResDef(MK_MDN_DELETED_RECEIPT, XP_MSG_BASE + 1406, -"Return Receipt (deleted)") - -ResDef(MK_MDN_DENIED_RECEIPT, XP_MSG_BASE + 1407, -"Return Receipt (denied)") - -ResDef(MK_MDN_FAILED_RECEIPT, XP_MSG_BASE + 1408, -"Return Receipt (failed)") - -ResDef(MK_IMAP_GETTING_SERVER_INFO, XP_MSG_BASE + 1409, -"Getting Server Configuration Info...") - -ResDef(MK_IMAP_GETTING_MAILBOX_INFO, XP_MSG_BASE + 1410, -"Getting Mailbox Configuration Info...") - -ResDef(MK_IMAP_EMPTY_MIME_PART, XP_MSG_BASE + 1411, -"This body part will be downloaded on demand.") - - -#define LI_MSG_BASE XP_MSG_BASE + 1500 -ResDef(LI_DOWN_CONFLICT_1, LI_MSG_BASE+1, "\ -Local and server copies of %0% are in conflict. What would you like to do:

    \ -%-cont-%") - -ResDef(LI_DOWN_CONFLICT_2, LI_MSG_BASE+2, "\ -\ -%-cont-%") - -ResDef(LI_DOWN_CONFLICT_3, LI_MSG_BASE+3, "\ -\ -\ -

    \ -%-cont-%") - -ResDef(LI_DOWN_CONFLICT_4, LI_MSG_BASE+4, "\ -

    \ -%-cont-%") - -ResDef(LI_DOWN_CONFLICT_5, LI_MSG_BASE+5, "\ -\ -%-cont-%") - -ResDef(LI_DOWN_CONFLICT_6, LI_MSG_BASE+6, "\ -Do this for all the remaining files \ -") - -ResDef(LI_DOWN_TITLE, LI_MSG_BASE+7, "\ -Download conflict") - -ResDef(LI_UP_CONFLICT_1, LI_MSG_BASE+8, "\ -Local and server copies of %0% are in conflict. What would you like to do:

    \ -%-cont-%") - -ResDef(LI_UP_CONFLICT_2, LI_MSG_BASE+9, "\ -\ -%-cont-%") - -ResDef(LI_UP_CONFLICT_3, LI_MSG_BASE+10, "\ -\ -\ -

    \ -%-cont-%") - -ResDef(LI_UP_CONFLICT_4, LI_MSG_BASE+11, "\ -

    \ -%-cont-%") - -ResDef(LI_UP_CONFLICT_5, LI_MSG_BASE+12, "\ -\ -Do this for all the remaining files \ -") - -ResDef(LI_UP_TITLE, LI_MSG_BASE+13, "\ -Upload conflict") - -ResDef(LI_INIT_LATER, LI_MSG_BASE+14, -"Your new location independence preference\n\ -will take effect the next time\n\ -you restart Communicator.") - - -#define RDF_MSG_BASE XP_MSG_BASE + 2000 - -ResDef(RDF_HTML_STR, RDF_MSG_BASE+1, "\ -

    %0%

    %1%") - -ResDef(RDF_HTML_STR_1, RDF_MSG_BASE+2, "\ -%s:\n") - -ResDef(RDF_HTML_STR_2, RDF_MSG_BASE+3, "\ -%s:\n") - -ResDef(RDF_HTML_STR_3, RDF_MSG_BASE+4, "\ -%s:%s\n") - -ResDef(RDF_HTML_STR_4, RDF_MSG_BASE+5, "\ - %s
    \n") - -ResDef(RDF_HTML_STR_5, RDF_MSG_BASE+6, "\ -%s:\n") - -ResDef(RDF_HTML_WINDATE, RDF_MSG_BASE+7, "%#m/%#d/%Y %#I:%M %p") -ResDef(RDF_HTML_MACDATE, RDF_MSG_BASE+8, "%m/%d/%Y %I:%M %p") - -ResDef(RDF_DATA_1, RDF_MSG_BASE+9, "Untitled URL") -ResDef(RDF_DATA_2, RDF_MSG_BASE+10, "Untitled Folder") -ResDef(RDF_DELETEFILE, RDF_MSG_BASE+11, "Delete file '%s' ?") -ResDef(RDF_UNABLETODELETEFILE, RDF_MSG_BASE+12, "File: '%s' could not be deleted.") -ResDef(RDF_DELETEFOLDER, RDF_MSG_BASE+13, "Delete folder '%s' and its contents?") -ResDef(RDF_UNABLETODELETEFOLDER, RDF_MSG_BASE+14, "Folder: '%s' could not be deleted.") -ResDef(RDF_NEWPASSWORD, RDF_MSG_BASE+15, "New Password:") -ResDef(RDF_CONFIRMPASSWORD, RDF_MSG_BASE+16, "Confirm New Password:") -ResDef(RDF_MISMATCHPASSWORD, RDF_MSG_BASE+17, "Passwords did not match.") -ResDef(RDF_ENTERPASSWORD, RDF_MSG_BASE+18, "Enter Password for '%s' ?") -ResDef(RDF_SITEMAPNAME, RDF_MSG_BASE+19, "Sitemap") -ResDef(RDF_RELATEDLINKSNAME, RDF_MSG_BASE+20, "Related Links") -ResDef(RDF_DEFAULTCOLUMNNAME, RDF_MSG_BASE+21, "Name") -ResDef(RDF_NEWWORKSPACEPROMPT, RDF_MSG_BASE+22, "New workspace name:") -ResDef(RDF_DELETEWORKSPACE, RDF_MSG_BASE+23, "Delete workspace '%s' and its contents?") - -ResDef(RDF_ADDITIONS_ALLOWED, RDF_MSG_BASE+24, "Additions allowed") -ResDef(RDF_DELETION_ALLOWED, RDF_MSG_BASE+25, "Deletion allowed") -ResDef(RDF_ICON_URL_LOCKED, RDF_MSG_BASE+26, "Icon URL locked") -ResDef(RDF_NAME_LOCKED, RDF_MSG_BASE+27, "Name locked") -ResDef(RDF_COPY_ALLOWED, RDF_MSG_BASE+28, "Copies allowed") -ResDef(RDF_MOVE_ALLOWED, RDF_MSG_BASE+29, "Moves allowed") -ResDef(RDF_WORKSPACE_POS_LOCKED, RDF_MSG_BASE+30, "Workspace position locked") - -ResDef(RDF_WEEKOF, RDF_MSG_BASE+31, "Week of %d/%d/%d") -ResDef(RDF_WITHINLASTHOUR, RDF_MSG_BASE+32, "Within the last hour") -ResDef(RDF_TODAY, RDF_MSG_BASE+33, "Today") - -#define RDF_DAY_BASE RDF_MSG_BASE + 34 -ResDef(RDF_DAY_0, RDF_DAY_BASE+0, "Sunday") -ResDef(RDF_DAY_1, RDF_DAY_BASE+1, "Monday") -ResDef(RDF_DAY_2, RDF_DAY_BASE+2, "Tuesday") -ResDef(RDF_DAY_3, RDF_DAY_BASE+3, "Wednesday") -ResDef(RDF_DAY_4, RDF_DAY_BASE+4, "Thursday") -ResDef(RDF_DAY_5, RDF_DAY_BASE+5, "Friday") -ResDef(RDF_DAY_6, RDF_DAY_BASE+6, "Saturday") - -#define RDF_CMD_BASE RDF_MSG_BASE + 41 -ResDef(RDF_CMD_0, RDF_CMD_BASE+0, " ") -ResDef(RDF_CMD_1, RDF_CMD_BASE+1, "Open or Close") -ResDef(RDF_CMD_2, RDF_CMD_BASE+2, "Open File") -ResDef(RDF_CMD_3, RDF_CMD_BASE+3, "Print") -ResDef(RDF_CMD_4, RDF_CMD_BASE+4, "Open URL In New Window") -ResDef(RDF_CMD_5, RDF_CMD_BASE+5, "Open URL in Composer") -ResDef(RDF_CMD_6, RDF_CMD_BASE+6, "Open As Workspace") -ResDef(RDF_CMD_7, RDF_CMD_BASE+7, "New Bookmark") -ResDef(RDF_CMD_8, RDF_CMD_BASE+8, "New Folder") -ResDef(RDF_CMD_9, RDF_CMD_BASE+9, "New Separator") -ResDef(RDF_CMD_10, RDF_CMD_BASE+10, "Make Alias") -ResDef(RDF_CMD_11, RDF_CMD_BASE+11, "Add To Bookmarks") -ResDef(RDF_CMD_12, RDF_CMD_BASE+12, "Save As...") -ResDef(RDF_CMD_13, RDF_CMD_BASE+13, "Create Shortcut") -ResDef(RDF_CMD_14, RDF_CMD_BASE+14, "Set Personal Toolbar Folder") -ResDef(RDF_CMD_15, RDF_CMD_BASE+15, "Set Bookmark Menu") -ResDef(RDF_CMD_16, RDF_CMD_BASE+16, "Set New Bookmark Folder") -ResDef(RDF_CMD_17, RDF_CMD_BASE+17, "Cut") -ResDef(RDF_CMD_18, RDF_CMD_BASE+18, "Copy") -ResDef(RDF_CMD_19, RDF_CMD_BASE+19, "Paste") -ResDef(RDF_CMD_20, RDF_CMD_BASE+20, "Delete File...") -ResDef(RDF_CMD_21, RDF_CMD_BASE+21, "Delete Folder...") -ResDef(RDF_CMD_22, RDF_CMD_BASE+22, "Reveal in Finder") -ResDef(RDF_CMD_23, RDF_CMD_BASE+23, "Properties...") -ResDef(RDF_CMD_24, RDF_CMD_BASE+24, "Rename Workspace") -ResDef(RDF_CMD_25, RDF_CMD_BASE+25, "Delete Workspace...") -ResDef(RDF_CMD_26, RDF_CMD_BASE+26, "Move Workspace Up") -ResDef(RDF_CMD_27, RDF_CMD_BASE+27, "Move Workspace Down") -ResDef(RDF_CMD_28, RDF_CMD_BASE+28, "Refresh") -ResDef(RDF_CMD_29, RDF_CMD_BASE+29, "Export...") -ResDef(RDF_CMD_30, RDF_CMD_BASE+30, "Remove as Bookmark Menu") -ResDef(RDF_CMD_31, RDF_CMD_BASE+31, "Remove as New Bookmark Folder") -ResDef(RDF_CMD_32, RDF_CMD_BASE+32, "Set Password...") -ResDef(RDF_CMD_33, RDF_CMD_BASE+33, "Remove Password...") -ResDef(RDF_CMD_34, RDF_CMD_BASE+34, "Export All...") -ResDef(RDF_CMD_35, RDF_CMD_BASE+35, "Undo") -ResDef(RDF_CMD_36, RDF_CMD_BASE+36, "New Workspace...") -ResDef(RDF_CMD_37, RDF_CMD_BASE+37, "Rename") - - -END_STR(mcom_include_xp_msg_i_strings) - -/* WARNING: DO NOT TAKE ERROR CODE -666, it is used internally - by the message lib */ - - -#endif /* _ALLXPSTR_H_ */ - diff --git a/l10nkits/client/windows/docs/nav40/branding.html b/l10nkits/client/windows/docs/nav40/branding.html deleted file mode 100644 index a19cfc0cb08..00000000000 --- a/l10nkits/client/windows/docs/nav40/branding.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - Product Branding Issues - - - -

    -Product Branding Instructions

    -Under the terms of the Unlimited Localization Program, you must remove -or replace all trademarked Netscape terms, brand names, icons, images, -etc.  These trademarks are listed on the page found at the following -URL: - -

    http://home.netscape.com/misc/trademarks.html#trademarks - -

    Please refer to that page for details.  You may not release a localized -version of the Netscape Communicator with these trademarks left in the -product. -
      -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -

    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/nav40/charsets.htm b/l10nkits/client/windows/docs/nav40/charsets.htm deleted file mode 100644 index 95e254dc806..00000000000 --- a/l10nkits/client/windows/docs/nav40/charsets.htm +++ /dev/null @@ -1,383 +0,0 @@ - - - - - HTML Output of: C:\TEMP\CHARSET.DBF - - - -

    -CSID REFERENCE TABLE

    -Use this table to determine the Character Set ID (CSID) for the character -set you wish to use, for example, for setting the value of  pref("intl.character_set") -in ALL_PREFS. -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CSIDCHARSET
    0CS_DEFAULT
    1CS_ASCII
    2CS_LATIN1
    6CS_MAC_ROMAN
    10CS_LATIN2
    11CS_MAC_CE
    14CS_8859_3
    15CS_8859_4
    16CS_8859_5
    17CS_8859_6
    18CS_8859_7
    19CS_8859_8
    20CS_8859_9
    21CS_SYMBOL
    22CS_DINGBATS
    23CS_DECTECH
    27CS_JISX0201
    29CS_TIS620
    35CS_UTF7
    38CS_USRDEF2
    39CS_KOI8_R
    40CS_MAC_CYRILLIC
    41CS_CP_1251
    42CS_MAC_GREEK
    43CS_CP_1253
    44CS_CP_1250
    45CS_CP_1254
    46CS_MAC_TURKISH
    53INTL_CHAR_SET_MAX
    254CS_USER_DEFINED_ENCODING
    255CS_UNKNOWN
    260CS_SJIS
    261CS_EUCJP
    263CS_BIG5
    264CS_GB_8BIT
    265CS_CNS_8BIT
    280CS_CNS11643_1
    281CS_CNS11643_2
    282CS_JISX0208
    284CS_KSC5601
    286CS_JISX0212
    287CS_GB2312
    290CS_UTF8
    292CS_NPC
    293CS_X_BIG5
    303CS_GB2312_11
    304CS_JISX0208_11
    305CS_KSC5601_11
    306CS_CNS11643_1110
    515CS_JIS
    525CS_2022_KR
    564CS_IMAP4_UTF7
    810CS_UCS2
    811CS_UCS4
    819CS_UCS2_SWAP
    1292CS_KSC_8BIT
    2308CS_SJIS_AUTO
    2309CS_EUCJP_AUTO
    2563CS_JIS_AUTO
    -@author: relliott -
    @source: ftang -
    @last updated: Mar. 19, 1998 -
    1997, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/nav40/gettingStarted.html b/l10nkits/client/windows/docs/nav40/gettingStarted.html deleted file mode 100644 index 1d8fe51202d..00000000000 --- a/l10nkits/client/windows/docs/nav40/gettingStarted.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - Getting Started - - - -

    -2. Getting Started

    -Before you can begin using the Windows Front End Localization Kit, you -must install it and setup your working directories. This is a simple matter -of unzipping the compressed kit file(s) into the proper directories. Your -system must also meet certain requirements to run the tools needed to perform -the localization steps described below. - -

    -


    -

    -System Requirements

    -There a few system requirements for the kit in the strictest sense; however, -your choice of tools will have their own set of requirements.  The -most likely minimum configuration will be as follows: -
      -
    • -100% IBM compatible PC
    • - -
    • -Pentium® processor
    • - -
    • -Microsoft® Windows NT 3.51 or 4.0 (localized -versions will help testing but aren't required)
    • - -
    • -16 MB RAM
    • - -
    • -30 MB available hard disk space
    • - -
    • -A visual resource editor, such as those provided with Microsoft® -Visual C++, Borland® C++, etc.
    • - -
    • -An active Internet connection and the ability to ftp (send and receive) -large files
    • - -
    • -A Web browser (say, for example, Netscape Communicator ;-)
    • -
    - -

    - -

    - -

    -Installing the Kit

    -It is recommended that you install the Windows Front End Localization Kit -in a brand new directory on your development machine. For example, you -can create a \Netscape_L10N_Kits directory on your hard drive. This becomes -your kitRoot directory.  Place the L10n Kit's .ZIP file in -that directory and UNZIP it with the -d parameter: - -

    PKUNZIP -d filename -

      Example:  PKUNZIP -d winfekit
    - -
    -

    -Configuring Your Tools

    -If you intend to use the Netscape Translation Tools, please refer to the -Translation Tools User Guide for -instructions on setting up and using those tools.  If you intend to -use a different localization tool, please refer to that tool's documentation -for set up and usage instructions. -
      -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/nav40/idBuild.jpg b/l10nkits/client/windows/docs/nav40/idBuild.jpg deleted file mode 100644 index 3082e454d8c781027f054840ba9136ee242b577a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57205 zcmeFYcT`i|_AVTHM+i--1QH-1D7~t5Naz6qga9fay*DW;9i)a3Km`;qp-4xnC<4+^ zdMETIy(yqrKF;|0zUSU^&b{BbW86Q!`;D9AkGZq=n)8{@oNKR@xo3V){ayqx!L?!9 z01^@afaKy0_&p2I08mp>Qc+S+Q&CaT&`{ITvog@r(b01PSuU~ia$Vu$<>KMt2TKU^ z3tScC;SrICUcD|UBO`M~Sn-B}l!}D3jMP7rkkHW3(9_XhW?;B11>ylo{V%_Mw*r`{ zNjypO$w&kMq|78_%p|`%06Z5UNy$k5f%mT$1tl3d6)6ez#aU}600|ixDH$mhEiEMl zE#<|9q-5j(3T7aPl0}kLfJ)883_mi;#vv$We#a*Qm%%PAr;hMXORpXVBOUzmYwo^o zTRD)CHT8|e7QC!og2-zGL>&s*f6%&6&UIn*zqbtdhjt3ei*wS<0Md&CN^(k45{mx< zc5!%N)`Xl@QVo&Da%cE}f=$3DB44U{Nl@Li?eO;ufS&Ba7iKbMz%4+5cf+N&mRVqo zQl?OSIb5Qlgt6Wn4*>%-niO<}=|o3p%_zb9?1t=-#FDaipbxyv6FXFbpd#}MX*a+f zc$aS-RP~O6Z3lsT`=ER&Foo&KSd+h|uP-pq)+boo=y3L`D>?Pr z4xZcXtfVE2n&3Pqo6pa2+Xmr2G7z3dwV$P9St9K@F3X6ADYkHCyRN;@5)1wTJVH=`;U_1bOMI%vR(`J%nO0GG25ik)uW-7L)?e%u}(v8F}`l<1=c zAkq1ZRTbOu;tbHuMp)|@rS`bzaw_fNH5F;^hS^NiL6#D&MA5t=QMe9x+J-rP{B86=$+H#M)J$JW?O;B~6W5R}~HvqT((S zh`bOuHm^w0Q8}|+=e~RXVdBrDgpg{ffqbA;~CCZItu6~@-U%Y=MCj>BX$IA-!{pmf`9#x{Zd8Gc zG@@5K<;t}TA><4qG~^lB{D_sKNllBG#Jm01WF)T7$H=V+DBk0-KnF|ln8x!=2C!3$ zLXo&i!Tx#?B1ea$!b6*B>Fft46@g9cYmM#dnSJjS#b*q$oYVR31VNG9*=zPj82CHrB@MolUMgYt9N z+8(v-4d(N_NIu*1EVtu$pro{0+HL$+uZGsc$tbck`3DcT!8yBM zXb-s~y|Ch0(+TnQ91a?KS!^d0S?%ZnYVGIYqy>i8bGHt!wG%RR*yxf%tq+!Nd`Ng* zj;k6ikm^f_&~S)Wm{Kw&pnRpPKHE#!GTlaBo$OamXngyz*%XVa~CR}Xerx6%GB3G!*ypsPXmLNCcp%JRPFO*IQh8O^cJYIvlSK6*nZ zvqtelR#%0GHP36b$&FPvSJ8qprP}>QZ7H1q>xku>@XtGEX0;t}z1KP!Y}XWNMoQl0 ze<5Ag<0*%a&OI30GG@fp7eo_8d-rK~8{!r2&I<4ZY0YmkszAl-n|5XDmvy~Q(XJo_ zMzysE(PM)2rq%X*HL-Ce_%|T+T~CczxpyV=EeTC+cX=If*XW=l6H&~~xGw-qUnJ=B zylz>T(M|#g?vAn3G&T-VSW)8^0V-Pw=d{2OL4Q2xp&&Rma{%B&_3 zAw@SCMCrJyVB8TI_v#b&PU0>dZvC1N>RB1T(Uv2BX48prx2dcNtZ@3^`|X*3J>dsB zX~R(IY#X7qd3ry^e2qqZ{-H+dvbFe48Y}P?Ogo16H$anq4=@WPGISg^`lT)%GV~J4 zGc%9oG_^758TGZNCUd%+##6URMtg0{(LWRw4(siFUrkEco-x`)#jc|_bVr3Ct20@b zWmJ(|>r{xBkqB+cIUZFBqSuBgGwdRJ`!&#vqX-sLNgj9^P8ma->J9R%|OZ4M= zTIaO(dg{@;w*+92ZKZWA8!h0hf5t4j(vz zHr`$SkjN}f=o*{qzJ|#4reez|u}5O4d&d;R3`(@h6gPg|sF`^Dk;A@O9%xoKvtB5p zqbJ2@77#79$j>Tn*=~-dWIRuRSI_0mPB-e+eM+VIsZzq&jpFt*9?KOKq~Zrkj+xgB zbIja1;Mt}QIoU~#^%VFD!V|<0AyCn=*fC6S65n03JS=PaJEvt^*{TJJ(S41cP>T-8Ug(UGhzCoe}YE0h;B2e$3s(#m=&rz4Y1X;Y6{Hca?oCB9;P zt=_nH)xlBNrT;D~SpE{~NULIH)7{BJ!VbxDj4MsVG|MK?SDV4QN+qYjS9Ebs;b zLc!P&i!tIfCdLIB$jY5z2)h)FGJHs{qd4G(CA^d=`{oxm?buq;kJvq2 z(amnFwwH!-tu!7v=3f&AtdTdz&@(q4rHb<)X6j}A{G#p_ko6CZ5riyVTo-P)c+%{Z z-VW30MVw~e=;~(hR!F!pms$8pKQZ}}_t>HoFwS3Y8inDxMO{PKYESL#F)WfNCV~sX zzRXUF^33wqfDy(uW8EXgYWg4;e@U=MD@?{l_qb(EwH{VYWrl zlLzv_qlq0+l&v+fnmXjyPFW>T zhK4O7jpMSdXohA2-1yx9k!IA7&5Q>umcO;wVLkj_SUJvm%Fl*zGzJng@x2}yIAyR1 zg$P+v^JK{Oz?tG=7Zdw#H3Pmxgu*u$P@+kmnmUFB9HpZ}CO$gS8%ay?H-jzfh;G)n+)0 z-StZWivd#nhGLNxgZxU);N@ zyWh-<;?pqAK|H%yCBkjH?I(NO=+IXdH@~fu=|-=%68O8dIvrc_8^)uRikB6S?lzQL zD9g_K0hesN4n0o zeKtk&I=gt5cXKDi5+?u%*0dP@a7tQTXdBUGA#C&?3{=NBYrR|Ch!U(>8MJ1aHNcm< zp^MZJ7%3Peltk+v*)TD~Qx6giKylOJK8qn~TKD(7X}*(`JiPiNx#iKxw<}xY#?Vw> z9i}PkXUBx>u+9!gIO4UiT0-lcR`VkYb_kN}UYI+*cfogu6Zi=OCD-J~pn63D7mT)dG9r@trasrn zq}EZ&WW^xz(8HTGx{SIP77n;Q);yIApg zVuclBFQW)naakSm17o%FH^JVssjaF@H2nN0%oy}1@Q`;q zXBw-iu%OAJcQ2^J(l#Z&e=U_e?qHDh*3)SDklF!1njd^axZG@ijIb~23Dq{!5jPJk z{AyQzYEL^9eZRI-veyIatu8#V-zv7A zEUvwLc+`B(xYeK>WQ1*Ke53MIth#|=&n(|tLaLwumrEVw3gJO{5!qPy}V@ZBlP|Sv2*+(B2 zBqJlWE#qRsAzg$5<9crhx$e;nyq2w6u^Y%1?t^J*PMx(S_z54Bf1P#1RKOdhL5L(p zNbBsoToDbAX#BPUoTL{9UM0b#y}#E~5YYR{f;$YW=%PPG4QB=~jZP1k)xZG~?s?wT zRh(nd+xbKeuNXL}e!N@ZhfrQh60N-1v*d-!|)EK7A(|$Q?@$n~_{mU6cK9jPhrm`=b6+J-&}zt%t_GtY1(4d?|9C zt6f#(Y=A)mSQ)ilQ}f3x--Ew2S5hDNwWWx6$h)iKMrsvUpd-d*WKj!Ki&0;gk>ByJ zZuEv}JoIE4i1lP)W?qB9Ke}r>qQ{tPXw>{&758JcC7*eje_sf^UVcezv6AXjprJi8 z^Q`1_oss3n#^vFK{jfWueJXW(UKe-BYRs3jv}GBBGu=bKWPB<43gkiHt(rP}qK9Dg zuAGZ0NIfthQwgGr+2S@%F-DNWUnRIF}-a#&^@;)h$y1i+ z|G^I5E@XR5#JjTe1xc>~g@LN0qf-XR%?ZK89MR{T!=QStVueHLPYh@yF4FsP@YU?Q zWTh~av7>S^o{5IcPOU`oyG~}+`_>#PwygOypt87*u|~hI-(x*jekNAMw-hYBQH^$j|UH-$4jqO`y-s!$(aK6`D z;E02S7~EJdk+*AvwpG|W0#5-X`Gbc3*D3MRRI}4t!-+BpjRiw_NvwK?GAJzoB%VcRl#yVyfW@U z1=SHe$Ucc6T~1{-BrD9*psAy+Nhic+F9){)gAg z=@(1M1Tl!2gdkw3NXx(zAC^`*?rH2Dt2)Up$AgPMs$k?F|_{48muy%8n|p}F$%x%Y*d8UwaW z#HTNg?mg47_fWI4^cMt!6pf7`mY2aye}HhmyjTpNYf|Fz68RukRoq@4R+l{a0b_>! z=bP};eW&&-;1Io*cWURA(B?9yd-KmCpNe<6eEW!VF|}`CWh%0!QK}Vu3nYDwTV%Fy zqc19);STuS8CTLs-2ysR8*U(pg{7h!ROG;X>K}U*~MGG_;5uMS`Xy#48C*6p#CjK`v(^j zF(}}o$kNTv@hLFb;?7b*`My)v^NkaU;dY)13o(m($sb3PoSybhmR`xtwOUXt{wD?- zuHKMr#qD66U}lB4xgxH123rWEd(a7dS@uI@AMhd}aKVdVp-||ee4(dJcMSfZCoWZ| z64?_ZHbyh~Tx~C!Y=Ju`=v9lbjd#PH2-ebT5d#7Zb{@yivz<&$@byRSkTp$+YK}v| zO!FoCpf68;e!rD#de2AyN#&t5rLtP!)b>N*fNrP;HL5*)lVB*=CB-gz2rFsuy3Y9= zBt9M&0HIJLWDXJR;bx0mz?ZlsaAbh6=fU93;o7koF27YPEeZ1Xe<@bxevj|oAO5k$ z*8H=2B0B)+8^@ipWh8D*_{u61^3XTpihL>?1ihNgo4hb$fBN}X0P7%)&Ykr+&8IQC z#>RB--qd0lgJAxVH}76|3&c@&|EuC{+y9j>(}@t?)0_a`dlceYngS>=iIpQ z=-XkX$l3<)i#o}imC9?Jn=6}NCmWH+UJkV%t!uF6#aY9kH77ur<7z~M{&KyG>R;*% zu6@JpS2u4>Kra<4iw0;wb-}0D9Do!|lpg>P_OmP>ooQ;`PM6ZaWlLr+x6f2 z&`xyae0`rs3Ni$5aXj1_lRuj9_=`vC*MbIK=pgLk;o{!Sv@!p~iIDJrC3^%%_Lu*E zbEkp6pP)j$jUhGrprtl>Q8K}@;uk%dMB%aX@FAz9=?vG9HFhPijziEl!`$1e^e#{; zVT89*PU`cz1E<~mzO|SCrqX%Fi^-V_ob-J3W zzC4W59jc7cZY>V;IN?0yIyxS>0rEk)PRyptl)$m17!(3qCr%E)InuV#3j1Rz4Ke&) znN9K{Sv^9-0l#tupN(be-{}Y8WpP{gfvik^H8A*C?rVfjELVCcM~pOc-P;ueT0h>P z8B#}pl86ME(C~Jw0$ySZSf!{x-TVy@60IGBiV??U1m8s z$+7Etb8cR5Y}e28SsH>H6jkP*wMh7lKFpQR1Fd+wi_E3MkEd5T7`t1hhWou%JYJ@A zzZ*LWI@|h$t(|SQw)HugY1Bkb`G~9F-eRp$83d^DKu76q#?@WRd$up7Kh*3?^0>Ou z>-c=hw4so2CdaT!DMhN>&jXhj@64@M%fGf2?1+1%j74lC662}e@mI@As7I4s1dF@; zlDuk~*9eUagT9+I*XNM2tD@>;Zpd>AC-R*~ck<*nQ7+Ba7D6fxXaVRq@iO2Q z8VJVO7fYhZ?e6CLUuAYJy(WWG18?!6m6mP&{0;r5qK+UjM7#f{`q4uMs{zRdbPkCa zJR!A1?i7E6^E3^pcTJ{!3bO@lu}>zr=(eZ8ddYa<=1D8E&&K^dH{2WglsE(3&3g4H zZWn_I;FUtv35=nNeZQ*LNZxI`)jspOjl9}1u|j3RcnorVw`A;?$(S_sv0{5hR74}u z$e8(6wW=Mn(DxP8hJZrK%y^@Rq6tK>!?1wn$Xzl$mrwCW?7N4>@0XCYm4}0?vfE#^ zegkO9uFxz@HEC!HY{S!etE6TkBZsa_H>C6PW$#hNTZz`SA=kwNi(bm$OYZEHKa_Qs z|1O^akE#A?*Pm8FA1?X!9uhtit&9LUpgcL{QTq>-A@Aag2lnjID`>>;m@J!M% z5~yxpJg*_;2HUcHv=E56G@E-Tj~Iy~xHo@7&^DJ$rWOO`IQb-SUk*h*jbsI;IU5`m zm@;5#(Q>_<(8~*##|%Te-{nS>1^(i>2bq(1R2JQU8fGCgr$rnpk!23gpLU&p3#@pS z%?lm%-^g}LuY0@yp~+l0^ku27NfE7RFXAg>vs3XxrP?`Qwwu}V@(aHw1y6@jj%06X zb-^!Y!t4&i0fV*=2er*yL|}8@I6U{3FTkk{hJlPSR}5xXD6Tz;F2zMPCny-hzJ)Jr zi3$Q(2fdfUGdrIX%o#fTcmn7c8)+C72#YDUQ{yQ`1gFNC@?mLF8S1hgQ!kKVeIKF* z+aDdNIw1Yde8+Qs!}>D9I_Ic1r=+fCL^2)EV37M|rMpG#bKuv4&t{Q+NV^Bhoa;}6 z@80({PFhsALD0ny72r$w!$ZQ=xYEb&chM|xXD~a(o->wD>o?kr5+vSkvFF{=BnJcJ zdJl8oEZ((!yEP^GmWQr%RuYb=0iRReiw>Oc1sR014jV?AUD5)WuM(Xe6%;7+C$jzq zT!JMrO9;lnBUd5fixf^G{2Pi>Oqa5{6XeDx1X0X=!PIc$@Yz=$ngEvcoTNqCN*}k= zr$~zeZilZ_k=mJ62Vkh^RtAugWb1{{x!31cp|Xb#yZg@_C1EURD8GK~V@R*4cP_2o z9-DJ_yrXLQ^rLn$Cd#v*~I>`tqZJB`lQ$Z z><=eEt$><6Z_AsG1nQV7)A}g7uW0CwRTWU0X}1bK;xm)$(k(vJT5HU*3{sBP&WYm) z%69p3lbS1hKu%bULh!+GOKygBm=z;p{s}Y1DfYZfoYn)o*v_=5*v_iG^&9YY<)zKl zNh@#LDE2`~qnp5)M+M?!5SVgtEiR$~kw?LkUVd5jOS9eid%r>%MBx^Che=$UVZa@y z^ju@pL%a%y;T}Q4<}`US&LX`5++RyXQ|lXi0Zli)V13Ed1ie5#-%mqRgMDqLX(=@@#GM)Z=KTSTtFwOW3ys8vgLS;4sh zP?0m62Cm4I)s-T(mb0qE9JeGl&96fC&>I)+FUQS|+@KMBy_sYg8wT)WAbZ#RIoE?8 z9{Et$&vfo3BnIWqG(Ml&P(BTsFDs}_qw3vSWF}-~Ue{P$-8O1J@cJ@;a=d8sgD2Ls zJzsL^m9n}<1g-Jh>V{)_L~d2i%CU+KMg6NBKu3HaLS9|_fM-@R*Vx+(s; z%r|@C*~}x!n-CGM$+f;?JDB}s9`xu;-1qjU{&E^4c|{RUB(?~7=%{&COE^^n@El*V zftFau)Vnun#m+>>d&2LUrs7K^wp?_P*kth4=ayV`!hndVqIdHB8S5?B?n*;+rRnOC91f+XJPsa*MBmN?ScZlF*!r8jeVauIPy4B=!cXp(< zCk@;O@8iq*xX#qysNF;Bqr7FejP?JOT$&~J=>a6wHmAwfZS!i#7YeR@(7fXb@uLe} zsy_mIyw3VgA2?!##1S$et)#MK<@_7mjEBT~yzOf~O%P_xr>1S3Ris9zvw!St%3I0= zN;UCKa4}PW2X1jT*!S(^h~?MKKj>9WULGj-Mt8{1rfmCQKahCoKR7to4JK4BP7ka|N;D}=KeR-)~A+3hTFF_s@a{)&*!ZaTpWMn-Wg2{JttG}3?N?1JmuE+OI@xOF` zrVc8TESPn8?T`qZKb{GAvKt#5Aq;`&avEymw>Y8WX^pRDy(@TR6^I$!Ip+f^ESwVk znWU`oiy11Ms2VzM3Sn|F`?*fLKl=WOwTuXok~UV>a~9Osc}|yeq#+?S3LEWJTWjwaOZV)-ms$f643)^L$x#Q7;DfIUpTaF+Hg}nZFQ{Uxq!zJZU#Q%&PVq4$wGYxVz zP1W(a(IjnyP{+WV1zwgw4bM2Kjr-n+q<*5X^a$gRFRkfK6V-8!ppeYbKs;wCxh*3_ znMeANeoe`{EK*y`>f67B2Dv-omQGXi0sG`}qI0+S$vh(SSEgA{A1y#z{cD)x?If?9 zM99B#B>KMl7G|@lKh z5h}2&4%7=T#?L|C`KR&8kSlYE_1@Kp`6)pGrLjds=0N!surOm~F~Fj0MlpACf&Oei zkcDghxplHQOP47G4^e|VGYA_aS+N25JMA(#yy`GB^c}?;Jq#aHN|J@G(?+)R;tgkU z8~mQPoXf5*h)Z#Ltb1Z|T)LzE#eqzSBHbQU{=Jv0+s5MFwOvJTSByXfeCYxzb@1Sk z*_30+_>Net=_lpYRqzgN%?tKD&c?b9dZL}4f!u7eNFLEPvj8}T%Yk-8%0IXtnaS$Cz&JoGt(48%ZYTPl;I^CF!G0$Pm#9f6D${|{g^O;WY4(0 zxR{)>m{9hR!63~s&Ly+6+Gj~fnc7FoQ2Zo2fFNcJB_V;i`3JRugTf8Kfwm?+0;LN?9p?I@?Gvsxw=swDYBl@9By7w9m+rL!A)eCS-87A>IR( zVD7KnL2*LxyqjON;$Y{Ta-ct_`j2US{p!f5*LX}{^y+rZl85VEHVl4ZT2esak zi~r_05lk9L#gFIPs^=#Slh~(82Xz;=drH&5tY2Z%^0i#mXsH~MVIzz|APq9ZgX@j1 z9`7j5cC5JqnzKCb2~rqH0qrT_vgA3;8N6yYcARL&qnF~^Po4eJy(QWo>KSoh!wI!< zX6Q^qLsny%KG+p*|FmBjB=TgBJzfiRKj=-nyo=zwD`gJ4bt!*jN@TNCfy({Ioryxx zr29&t#I+v%fLE?I9w)=zm{|{q(c2A8^5d>6ZSdMKo7DSh!T;z#p(Qd3VORCsw{t`= zOK5I7moa?__FpuHKln{uXh^7$y24a^;vHGd^<#3|gG7(rsvIa|ARc3km>%;Bm-o3T zbsf)h8eV+=2QQZ}WwS>z?fj?VZL8ST%o&=Ant3cdGJwhaz5dyu^;Pfl$IGW)m#DYh zO#7XAGV=9YrEe!Cr?xgSUedY*Z3R|K_!JtxU?7C4Z~$j}z)o+Y%SFi)+i1HC<>7BL znv7M%9n$ZF-)*VS8Ji_9sR=|~_8`zRk1j?~m5gaqN;wr%Xj$!H_mW;iy_v=oug0w? zWqmD$0m7Hz+8Io0?eMO?g~AfltI}A9{!^Gloma#x=so8o2>g7kLGoZgkfzO$RaMmL zOpC!*mP9UbjnKnrJcEn_3#rpNBWKy10DBiRrG14)zhp^D(S`mot!03ch9;2R z@F8@hj4%5N1Ua=dy`$^794lC8e+}f~IGgmCq=V345_uesON}!D@b9HJjnAR)Kin07 z^fGHz7kPS{b1p5wIgv#fxNzk)^fGNqZr3|uB>?bsW9BRcWc*`%J+~kBdm2dTnVn?) zfQ~87 z{6p+;1dg2kAt)H>>w$i9nC2Z{ zv|7)5C+`TJt41CJb`rfzzUon3%;x>^>BCLPMEQZTgZzrpDmZ;6bNwb~#~lS|dpw2S zE$aNzuCf8E3L{vsn7*c@goDdqnMy%n=8&5>K?z_9Nt=fVzYT5nB=4ZBtKa;1dUFYA zca7^@x!2FoFKIEyiRuKoW_}+r=gU-v^<uIVz-mNt%yZ3Ak-qocNl zD4!V(RTBl2f${G6+=148v!_4gZ|q%Zsfy*@dCl`ed_wWT#ubfDW{51qY?KtlVUI5b3EKu339?CBcQF#|uPB6Q(m3dodN++Br zDFi-t+?!-Ks2?fz<;h@ntX0zErpFyqwJFZ4$4~L>NnbD2&nApGbghD(ls!qJ9I2`U z>FTAFQ}8aE`GZNYbjm!%31mLAA1R&U^#bn9!PJah9BZMLBN+;m(Zy>DF#cTF>|5#g z=1q>Dv(~upH-f$axva}BFPXeB@}cu?!heQ(fXTNF_3YmS1g$s-ZCpzTR+){~UQ_rI zG}Mo{KB_{9R?139gn|im3{YAMOE9J^B9MS^5{`#hcQi3JU#?KUj3wTCfkMnWdqZ73 zX!YKm4s_CzH}nhN&bLmL^nDbyG8-R=ew@N?R>Dw%u^b~XE%i-InZiV96>ZIOElm_i zdx56X`H~V+U#ret0_ql%Va7cQ%E`(1UfK6Fbw+q63dqFjxB`cs&;@jTQ7kT@=zvJ9 zzR4)YfpLB&H5k@suRGEY=;gK?kDJTO-VTP^CTkYwId6``_O|w-a*G-IEMjf+cIvlC z+mV<&_Q)83b`T5@bOgB1@m5JksAN**&!xzu$htb9YT9~y&di;J9?CpibE+ge$e30+U7eXqv8Q0+1s zX^-8c8JgWupg0>oNUz3z&dPx`FAkCAn z|0#ue+6;TK7?pwjD06R@n!aEbMt(ELhMPZ1c?7Dodv)#1JhJqM-#3PkpC*sm!>fFs z{00=}o=?2XP}F}kYWQ>8wy(5rh1#H7Gw!Z|#x)3|wxx%dl(lKRDhimvW-n3ioyQjA zj#VRtQw$lQh6Hr)bm5G@^A2YsNm+sZ#gT9%E3L0&4kj>9=IOEs!WfMHOjrzX^d)=u^i9Zyj|V?q~8SDPJc+8E+%*5x4_0Z*!})euC@F&Bs) z6b^tB=is`EWC5&EiX16;qvk5&Wt+k|fvpZC7zBcJ@kGo700@z+>5;x^LnjFlyv zUeR-7P>M}ld)bfbwE+7`VN8?j-1a8A>3w2eCp05&=U&qqvhjM}KLtO=Z#lYYuZhkg z^OG88s_K;b_F{7+M5yJuSULIa68pQX!(7vi6$>DTn^ikBGRnGnm^l;cmA zqD9Co!HXh=>f>F=(8@~&@9Iw_z>H3AN|=2yb<**97d?1$G~aT@YS!@Zz=(vfB?^Le8GOd+GdXWzJ!TDI+~N^`QmS1@~c%$Tj13K=kzHvqAP z#vk5~M0Q>L^Q^v3SkOAYy(;fjjWN&5xxyChm1}P%cc6Qtc7i@xb8aVWHJz{@Ypp{~@9-pil@nt&IL0eY9%e zHqr6Vrh`0{W9Ga{lz)*TGVt=YEgK}dxzBVrPKq+JI_G&d^7U|zP5$aJnjv%Hfu5q0 zIvVBAa6+NRZGW6;lt8e>6naSsN-Al1y}xw`1wq>rfaXcA$kyC=vMUB8ui~WI^YAlEYJsSY=**w%w!$`*Nr9i7~F-1_x6 zJ#V?V6Y6yRaJfzPdhcm#!a`Ra1@9*R$kV>{fhhN-j$`Mf2>b>m)gB$PQL|=EDf)aTF!L_inQ2xlcDN#Ox{b zo^;A4&4^jKt}XyrIdaIHjv6+dxxx@QRLfuVq>xuHPNe~-T@GNF7v+*-qmP z)zkA<@nZRk++JUd`AY17`0|VXeSA_RV~54epRGEZ-O7s|x5=%@NXT5QF6kn?0 zOzx2uK6UuZ_jPV{Q-9(`dGR;kqP}P+`z7mV2-!lEo}0wMT+L^K;$TWM&L7N-C-la^ zh21yAg}KiL?N~dTBg^Xx@6@q;(*tylHXD5OLHE551`p2X|I z?*cH_0hklOZ@_!IV4twb5xcLSX>M{Xp6*OEBks+u^}L{DF=5K@8)~Pz+BkdP1Dx-O zr>_(RxFcY)A}!ppYc*z6JP$njGaX?l9PRV|2*3WC4h zDgMz-ccVXcY3|14M&tJf;|+!LzhX!T)t}l7)!JJ)tuLPM&G}tXj<}8H%HsU?x|!}L zK{q}_j_E@sq2tXKW3r>B%3dD=E1M(iuq>FxaZwrl4Y18=Y;oJX_WcX_k6(;+L?ZT{ zAJNmSt}poFw`M}Yd4m!7SFZ z*T+!=hNwyt6b7&~V9O)UozabAk>#%$0TPMH4#RxV6xvx+TQ&dILk_?!=GavX9ZQtc@mH7AD z<7#p#mt3M{8Ye^3S%w;LPJ-#>YU2Kn&0o`Z`jA zeIZh4jmMa6ig$D&@juKDmvgJv^vt^X+_i{!Kqr0Pk6 znoF=7Ly<9~)JWX*YlpXa6C#UPK796_6QDnj-i`v!1eCzAwJF|~@JEu+;pie=hE3iz zAZ^O4vOlOt|FRSQ!j6vP860otSvlY`v=dxv3UX)4c=;xL%FVxV5uBG^>NlsI<9=XX zhgrJRkC;O{@misL8#u8|sKFpW`6Rm;B_$(}B_VpP^P+VBXtL-}UXeJ}9T1iEPYY#M z_8K?jb%WK^D(v@et|!Ol!oA7X7#ebL>xE)ZdtP`Y5U5_t&8YX0&Ns0~;(!@UvTw28 ztS@FQ(*x_u9E*2VNHH0{5)mW0Zg3LNwe(~?!?VNjs#_j(x!M`3|684 zKSdpm^1oTyi(4Sed%RWXXNf@}QeX*bL$ESkjz2D3ekknr?z6bl-o+P6QKwcX0kwf4 zBNj>AcK5V~Jw(9(7)X#zIIr@~Y5K7-!OQvYVYM3jax>W)6%g7jOaaOFS1?Y-XF{HOG0^7Dfy9d+Vu zosp63c_xR34<)|MZWm101WUXr;xSfw{RssVEZpS(4M;Y7aCBdIAn)hIgWMZ`OY*3n zmtJ4aBs8*uC>Z4XsaEcEmRcCT!G&e)^oHf}w=Ah^lV1EX?79^@ZumDz{{NKb+`ioW zco&s++DnRE>eWHj_FjWskv@u=Bq6^`T12`ixK&^u`6!|Ul;u?6>i(* zpV$M(8X%o7m&;*9G5h3h4LiLGAk4=B3)|-_s@(mbj;k-x(h&vckTf0Aelx!n_MGOp z_*TFRC!@b5gNgSVJ6(_xcY@i^za9Q}*K0CN|LM;^rN2Du`)~RjM*lt?aHWIC=0n3T z=9bRd8=St(6y2;`F}+IKBnzsCY4xs<*AoeE^G41k{o(zMdQn}KN)3~Hrrwr7>s!p& zy7zIZ7)DE2*OV=Ri5bPzSfi;d`!s^mrtR1*Srk4Jhekz?=me>=)Ap+WQdAY@-NRd3 zc*Spz@cKk6lw2jmMV|LsyNH4y!tOzn%L~dA&l-Kl3hkw*C%97j>3b zGtJ}^+x&S8+y+p$1nvIu9=^DiRMk=iImSIZuLa!h8tvSV%W-od!5%`29ipZXgwKur=ssli=eoGoms`?crf z7D~#5+T5kk4@~NypF)O;Sgk>~W0E;XV=fAALWBP+H0sSeflZgo)(bWR> zDfxy9%f^vErhp|$WSOQ?Pj13v_|tHm0mn#MIWN!DX_E`AnnTROD4H0U6h!Fhk`@S<)dUt?8d~xaX$DV{W zAV4XXb|Oz5aUI6n@hiTSizw-Libk)43^RE#qe-CAW@j@bJ4+Hq-b8`h;o0+Y=fJbf zgU|8poO-X|IGlSYbwRNW6ncBJxr^ZBl&mRq zjQc|DADp~;v=k=xG1d3UQ%NJa&JpXkb81g%(T>R;_(eQ6ivy3he^PLrF>U0fQLfvw z^I=dIHY;15l^0u>0EeeOrX2_fn-kOiEMf62<>bqWrKePEqGZK2CRH&p3Vx8VB|;6% zLynP0nik53T8sI-&x}F)z5BG4fADo8IHuiu4>*S|%F)XoFQv4mjbA?UIjj|l&cXUd z7q6gPzo8hWJwDMnYnqXH7{FrTko>wdCZ zF5Rs4zE$cy&bfeMHiwJWxw0Sj7|`_cCSzAt#bjR^H;!;@cF`SGmjS3N>B3f#sMn}d zbCTz{LJu}r4Whqxyrc2F=VwwN6~LCSEyagIa;Xnc-Ct8WGL+LDN0cljqJoR`>lD_L z-Zl-2k8O?@!TT=$VKkwPcMyrHmVMe!QSDJeliUj%P8nE!I%J#+g$`+_<2U=f;oj*O zK%Q*b>EzyPTzmO;LgsS*23;r25|QHrAcq1r&mbZqn+njqq#T2Z9Az`H&;(yGCHBIR znT+D%Vu+qGIK63Xxz~i40fd$Jk-qn768aR7?Blz-N-kGYybg-986)W21~WyA-7Xj1 zrw{N_6a;UMOKSna)kULJ?1i3uQ>sd0^7)PI#`3;3+Vr47W z;g8McK1)A-M#_ioEm`^{70`_wi{G^J$~?kxTG+c-s#h_RKIUKa^b0reYJP+r?=y9c z9FF3$zdmt*2_|^P)?((9?5~0OetFZhP4Q-3+;@)Jb2KAq5n0SLb3+FJ;U&{jMj(K^ z45$iNwTNvD6lwn0*wSEYeZ=$~B~d05nK=}Z`PJEkf-5q?m+_V+7b&lbmgHQ>e%GUW3zpzzb59i^TSJDe~)o~hf?7q)E#T!W?V&ae(g6=v< zR9LUEJ(B8vZY%kxqL^J8A3b^{-)R>bDI2H@1cv0k__V204^id{UT&>)_g*UruM#XD zsS`I8)#wj4bW>Hw7SsXpID#OoXAi%^&qdama4fJp!y-i7(W=A8uqrWCmF>`#*TcAi zxV%XWH^4LrqY-Y2p6l#nudJU;tn8PsVWcBU9CGM$=of)ug$*LK88iEQeN8F-&sN-f z>l(Wq=~b2;_@*|Y5E_u8b}cDfcimmbr1bXk6O1J(9i#g+G0jmU?GbzK;?qg!{Dh#PwL)$(@C0<5nz(ml2{~u`1`OQg3z(SE zpR{#nE3s5S0%h`10J!$Fup)_)V*P4)*22dMo_#-yMEdI6&?s^5)h1CfgC5mh_mY#* zocmqpQPtdhb*u`x?s`rA!CApc8j-UYQe2CE9B%*x7+{1*IYPj(Km;qTpKChX(_~1| za5;?+V+2;Y#~5WeuLZvHsxG%?_IZeXe?p3TM}5`=7C|`b6+!A~2`h_uUYDP;m+Al; z3N#tK`JmdMG@|_fu=br{O?BJ4p%(!G0qI3R2u-CI=|~Am2@pDhfDn2pQbc+Y3@s!y z=_K@CgCf#~qey&wjphpZnwf%*vWGW6U+iTr=+&;~fv1l<|QJ zF$QlC!zVv-q08sFM=FDm9c=-}MDDkubmj>jiDgNcImv1;Vm4-ozWS#~r68~ejnUR2 z5hi11ZCR|fWOEmM(3&wuv?&Rqmk8%F^)HW}Aw z0iVPHIP{`j4S0aee2E*O8n)DO*#>q?8-2$7X*ous4>g;_6siS@3oHyQh+S0Wyx7^p zymKs^aRLiXeQ%{d$BcX~O{K$rE8ED&G=|+ivW-k%JTGu!t)&16*^RL`$)4(w?>kEt z&!%Mtx=R|*vr@PVksGptNmb{89DpjLg$KPNz-qHY`9es7Y8TCKh6sS%$b#F%Ew@xpQBl|?Mkh35Z?;7(6}@N9ud&-P zCIRoB$W&IE?lBQ0?%QRQK2t*2}#qh>Wbr?^M(#0%TL+ zq=e0$^*(2C&`M08Dw3x|sA>9y=Z5(L+(-c(0Eo-~J+O@9WcvdUwF~{xtQ=pFHD`9z z@Az&hpq*{PJ(XYbtt*AFU9>3o&qQ%D>;A9RFV97Ll)0Cc`gTrgDn6I1x*a{KCZ#t= zoWcX!#EV>+n)==_Mt@}Q70hI@EueX5Jt2kBD-Fwic9d?kq?fzd!k}iwwv^^>aF8x| zBo-gdl5u3r0dE-5eIhH#+bH;D%w%*ZYiZp+=yJ~otWBxTIy)#HZE)_na*QEpR!Xk)=S;h?&%Ght zJmr>;VCvW7i+n3w@n4(gggmiR3dU)claqYXJ<-wPX+swC578)R?y`DxYL1JgU5_bM zFZ7Apb&6{y|3F0|qmcURd%Le%8grf*5mh2TYwUyJMii=iAt#WklkI=o zEhJs%YUNyKW_dgUj!Q|Sq{a0v6ImGVy{6c{N8zW~vwH|FpXznhaFBDriqhFvO8~90 zr94eQ7hd1*!*9616GxDD^mTv2j{df7X?4aj`SLdjT6*nGWJA@K$!8m>1Sr6-S#O0e z>)i|3`Yw{&Zkvi)+j`ybk}dlY1wG47u>tt)Q_&~lxG0RMY|9PXMldKjnp)?O9;9KP zeb3_=rN_5r#~Tu*ZuK}XL>VP``UGI~XaWiE^Y>a`)LhJwTYk#XcE7^0gOR5Pi?%oe zeswQv0?rTi*?x~c6#z^ zzryNCNqutV<3c4@*WU8-8a~s+c_@-IVcolTe)x^Va6VH$n@zsIDjJ$qm=cxka!kFi z`l7;<&YE7MkJaO$L1qiN;d~OyJc)}Sx$dwX@cbba0D&jr5n{1+c@o*{T`d!*-C#W_ zR$-pZ9%GEb=*4@m}m;}r?>XwQ-39Xror&*+wX_o z4Qn7<#WXa46g&Id&K!9epS$14gV*#hx8U@tH$>Z|vnM>B2=1_!%s>G?<#$|8z5G~8M9E{71#y(>+XORoo5NA+pAh4Ms7oV0yuBq7{I;l{> z_q^#3fCL-6$yV}t>Dpv!quXSuD)Sa7?UHGOE7>E@-si&T$ntfF>bqA7<6HVn9J<(s zJ5cay#FF|6_0)k!s8Gla*v$bM{kqo6vW@OCenV;Ck zNLf8`V zS8^Nfud4hh^WqO+;+JsGQ=0ONn$?1&5uo$cwO;EtyRKZQ!Z-7f+1wxO!0pub@9AG% zQ*KgP+19JHeNoaI8B-p#)HzD+Q_OKOnJ!ZaD3S{Q1BfWU<}y*RetAiEN@<}Snp*bz zvsX!$-tXC`O(h>gP^fPPauJl@6TP@K?SAPxju`ghnXY z>1usD@q7BWOM)7wSaOJ_JN%e5n)zLr<*29+#Ie}NAYalTv1feQT*HQ64B-uiJOTU+ z-~M(6-vBU9{SV+O?~&7Vjq_1Kp9|~g&O7-(0Q~3Di&xgBA3Iie|FM`K|5l5nnyw^P zzehOxD^wo1q5J4Y0*5q& z5TJ)s$*%r6_gh#AV;kD_kwqrk#{VB53c=YH7_Sd$frNPL_nh23 zt{e@p+E}r<{fgf*N0XPg_YVMEa4BED{o$JQl=^>JNLbUk0nTIqn(=eXQ3X-N7@<7) zRBVMln0vuddhur?U|+R|xX;d#>o=GF0p8to7xq`za<*9|>i>4n+4%HO==j|vE^%cL z5B?S6eZ2ls;27$NEZ)LwNi)=Z`RcwU@ZPEkDi7|Oue@7aomld>>SgpFz3Cn9t7!MR z%B+E)i;sWadKBkjQJrBGljC!(w;I|GPF83ax%C}FpB4XJ5^lNn^e>X@9xdzwYWE@+jDC zaA>w_QUam|DSR1DpO8+q(uTK+$++@0=?9Bw6Dq2Yf9odW-M3w%ev8O#e;f%s+7+5e z`4qrLkcb+n$)ykIBfGVzqO@VD@9413qd}0vvJ2^{@)q&){BL*vS2+^$C@viu z6HHU`X7F1n&rwQW8KvoaUi+zkY^C;U{bqk_Vnc-ik8wKC5Cv0WQ~}9KsFN!Y;PIe@ zYuzmCsHE4^Y!mxt;iZv1SpT`J>|$>Tr$wW6H$;B!uh+<5npFd#N2%+Sr$Nt&9%{ts zhIwpi0>%igC?`G!m>$JBwhgpYyq>7n!iIQh?Z(iNEbUp*|bCtn|Ylrdl`gNp})_2g7fyv;>Dk_Bog0;Eh9zF3L^@U{(SF zux^P_JaFg*%ieu$gnvxFBB_SSX$VKF`)$9Uh)m(xH8%U|2g$JT(;dmT^8BN^VAzRT7~k7d=X_7m65>(>YX6%wK+fD%kw^-O>cFm3w*iZpyGbc4(NJpAujv zkgXM5dXV#LM{==ha^WXE7I(b*SlH$HBe(koNW{~5>kZ=&YB}!k<_^zHVfW}auA|sE zdQM%cjAKjRlE*LN^zaxXapH!Ix#3~LPr1=MwDZ z`)uy2Ko?gtSugI+p2gi-R2OOE@)PBE-@iwc!^2&&mI~*~uH5lRX?yU(D2;fFa87-u_0057GdXuzHsQ#jDK{#Ku`v z6qaHdxfvG3ar}XOow_|Q^Ckh*OpFH-GAPpr&-wr3Nl)kA%#rD`V! zHlXJNZb08=9JX|*08n=gex^R&SO|;Kq80lD^|tOA2$4e#!OwCZn_8=?7z*oR^2yC$ z+_v=eH00kn^184d-q~-MtV$DQyFtj$Y6c6rpYrjz(wSdFy&hp(e)vbPrnnjjo>p(3 zK}R9Ar}nClXa?r)30#6}**d{Dl=&OFY!4wUfhvh|s43-8x zYNzZ<4`k6_?CRir#9=03^y2jxfc#)yFLG{G48)iC-@~X0&;xBeBX^v)Q43f`nNk=~}-@)9|7TIAT8}dnh zXbXpcE67JR^~Lv)=;{;zh6+yki&TFKS0?NiVLj7IqX~=o#F%`#_bP~xUXNhx%9V<_ z-s7k2EVd1!?H9zx^J?llzEn7mN&e{G`mjiXn(t3lmTRfn?hM$Cv3}2UeEsO6MGaqn z;H*`LrLLgaOipL#HRHWIol1+YF1}MN$cISTMN+jJ3%8F=i{v`X{J68m<2czXPo&u0 zus>7}cY=;K{YV%iU=Rib-S5c(i{2WaWQ4QOkI9VQ;v%58SvzaF?zz!o|%&e!g!Q$ zZnL!j_oXl>`jM{fgQZK%$G>g#f@6xRqz7;RbZDV_jDg{*jVc01fx1v`##>3b1(4#I zDS@uioJy$Vph49@!b!Fe*r$2gkwQ0-*TRY%BE`KWbkTVdvhZs^3mIe3$X%r>pXPZ4xhXD9RqpJF1>xv0s6knEuJ6L@*+Vvb>6f;akrqaF#pYBaA2}J3`7S zUv8nUpn1ucWK$p*=gAnP>jK%Om*ghb z>scMKcS8|+^g2rfzm*p)>obU1NYpdvY0zf^QjDl~Ac)Q&vp}y&*Q{gVbk2CVIdmj@ zhqSG6kCp!s(B?CdlKiizFckM@&6&!@{x%1wu^ArlJAd=lbIiaDckwc-m97(|o?dnA z_NbGKyvp3DUicgv@=EG8k4FN(4xccuLRJd2eJCm_ALw8&^x5QD&d@Xpm7vw-O{p8L zWF5xU+yp7@@b5GqyN`k_ckzzP)d~bd6*X6QH>+5}DJ`8H5%VD5lr1HTPann4ChOW3 zk6U?w(2ndwsqK0t^(x6m;tJ6-0ZN6eL_1Z{GNG|YZp5cA6&!;AZlx*HfG2wF)rNgz z+sUGiAXxieaJ-zrprs*~En%*jQA%Dy_T}QN`5@Se=3yl_AC#Ge^J&e+Y?igfYqu)h zPD&larROChGds7Y1`@Y1XzYSFDMOC=Ri3qnCR4BZY&5k|9KMLqAyC-DCY8f%YBivg z4#zedPiy=|g{?Ha$-HlG3-L}u+tFQek^%7mbqjtNl9YjWwJK+$0o`&S6vT>@={Wvs zsSBGK0ka78tpmvv2ri?a!7SJben?iZArtui0O~7T3y)8g9vi{#R;ngr8X1w5@LQ)T zHV9lgBaiTOiL{D=0)g2lc5S|biDa5BdmXO(O7h7u^Ex6t^-*Vrylpjk+m(A3LfdIF zHg?$AO$_U6-^90HH*-9O8RSFy*H6UlV#McbJk1i;JD)0?*g^ZgQ_QZ-TX^ zxdBFSK+r6#m0TgRDS$ePRgf5oEl&EBdfjRIwkKT{_SO}^|JZwGgxJIQz7E;;-LhbneUD`fc12S5 zgX+@)Eonp)y^W*W+tnN>$eq$C z_ymRVg)EcV2f?9I1eF6Y)p|^RIxhu351+Hnr||3?t#z{3zKYI?E>VcUP*S=A?ws$g zd$5)s4vD#{m+sAzb6v48alLjaKk`e00z3iThrB-@pOX>WnYq7n6Og(cKZl)te7O~of5C#)oL{_aAMiZW2g z{iks(ecA*HbHh=`C{w+BQMTh;39BSO$algCZL!gCDANG;zvTt+fH)?>-d=z)`B{^K zn?maKT;QdY9J^*;;;j~=Iw2*Q(5??YHrBnZKv3G+>_$8#8v#fywHX8V_|PIi7}muU zf%0CmT&Ip@+A!ncriV>bR7t3gU@8~ys2q*t{7{B|;aufHt}+$8VTV7Js?B>TR3uLbp3^Na1+)4u7A#hoUSy{sY2knz zm4jfv(sW~jNeqdgAbZXL5uP30r~|$t(9aj-J z$}N0jj6VR=#G-?ir``b({G0d7NF~}P7M7MntSZPtfqmZ#ttsb6N&~fw&MrdUE$Me@ zX~xp3(Wv%)r$N$tf)6VX+Ti}&(-o1`{f_5l0jQH@|BQSczI9dLV(48Li>;8P5D#F; zYVq2zXybGK(}JEN+rWSh!;{FQtlAsixoSC-@*QMym2P;>Y9_sY*)M|YRBiF+lMSc* zMUUy+5MLX(TcuZd`j#v#Um_btmAET8l6n<<$L{-=E@F;Siz4`7_pG7`+kCiDofNq$AsP$ zN=$J*SZT2_=AnDoh<^8=U6{q~sH<>v#-ByHHLGq@VZxR=Cd9L($^mie9#;H%x@N5E zS#(=r6hl}_&X}+neSYz;lw%mKVl|yllSJT6W{MbA$3QP%<}TW9KsQdib5@#cTk(;z zi#j#G{2;hpUgCOT1P!l63ws;Y8{Y>eqzK;CWsOq3744;v$ zamjD#1%e&id)j^HcPgvcGbzO$|0+AYt7@UrRSQt07aj~iFiG-v<{q;! zM#zd`mf*?o$W6H#Sgjt4T1$cIdxg39A3)EqL@)W-NeIH*_`%0Hu;>flnCYX5ruLznTJxyyU2?1kdCF;yLt<0M4sWsL!DwBdDw88Y@}fbI)g7(UWI)6CSsFnbsX=U;qPl7@QZerZUU2G&mqq7UDfX0J zDO(*i+2Fn{W$7U4dX3Rs=A6K2+Ra!SHT_RH_*Z5#HcJh2>^L*21F|-PuDS`>T?*-j zvrv3cgqaN+@QNM;8f%iBKd(rwd{23_s4;Y7&OPI*%dCh=QaE zRpq`K)KH;BlGw?&V9Pu5E2JXkl#Vfz_fx_nLcF!5j1yHderPKQ1Yb$nHdYG6yC**G z4mU~}9b4Oz75I^A_;cXSYEO&v7cE%XBi>$QbarSAiJ#!ByVR%mkq)%N-Fw z?S0$Qm>5-Bmh0*&Ft}Vk(^Ewpd!GToM>OSL?wHnNwi|f1)$8ak9h`>_bpk~ox9eL> zS`DS9IPZ#UNH%j)=wdK2(;&6uI^OD=pksFV$*#t)IN}Yoqc#5riuXa*rcP>a;yl?% zIE#zqhz}8k`Y1&gvv#fhJR;@G()t6^6KM`*&aJ0Hv1@isQfp~_(SGcBR;5FelloxY zYCIQ^>Yab`0fFy^C@L?@Tx-mJaC>|i6#CBdGOj9!$YgN9gJ|;g0Mykj;aXhpL3Y4N zYBQ`9(#fYEB($mS{zTpaXjwj63DBXSQ1HAaZIfecQlIn%uBZ2VvF^ z9Rf)_-fgVp9_>hG+%-!^udC|Wso?bPSAHS#evp?HHtme9jX-mgvFxDvHIPN`6D$D~ zvpL~P^89*&N`V@r5nfV+rWH1L0<<1Q*zAYK32MTVw>%G0SVWtfqJ?!l+X?|w$*U^* zeT7Y=+rV}U$j-gA$ZWz~r>Ae*9tP$=On_QU?7D(|cha^CP%a&VL;~3AOfE%QNc)f^ z`t~ACuxI>@N8@*YQ$aLH`jXJ{9eR6S&G-~Mnp8vxmD8CD8z3aR=z*}6qa4dw4C@yE z9f@Ah!@>yx(WsK@8aV89f|)IOYF~{R)?!>@udbr4gx4{UoVg3Wqt%+|-V-ZtVZ%cohI0UZJo<;#h7^nzkzS)=N zKMbpW>2}In=0cpjFzrPMsbSTMHGlVQkGx~wzvn=cY{-O*J90DfkG z_fyRdDnFPq&fJUA2NT5z1^DFpX{)Kd*27%x^#S^gvWPeY3F}ZyzXTi*{=6aizMucK z5e}Y6=WmJcGV1G%!L%3=xChlyzS#PlM?4Dnqq=)QAn@KA^&oe}knmpSNK`=+A%<&g$+UkFd^h_{Xpd$_XwaIz z{(eTe$f@`PIF7^RYv-k0_oYGWeTK}V;`%Xkr8a2d!;$eVG)J6vpMQCL@&=_bNXwJcP;)%7T8X*eFy`{Rz3RtlWta%V_- z>D9B=r8JD?bL|!@GZ9cC$e7~zyl#uw<6%)~R%^k-THQD?M7wP2k_q9cGh$Q0-aD<4 zSX8g=NbZIPRK-$U+X)XbJYDPF=z zH^Td)B(wzMsu}B(U6K(_w=3*kxbfCq9#z79E4=l*tM0RyQB_j4o06@2@ijAv9X}-x z+w~_)IuCK%J6euU1sY`rVNW8+SrJ8%c`VwD&O`37yC7iZ?PnX{Mwi-UJX_)w#aLc_ zT}#&zs4(S_y2CxYT7EL+6rnleeFWJ{fAwBw6!vt2$;()K4E^m|%COn0nwIaugY>1@ zl^r2Ib~vr3|3X7#={7Eec$hL_V47!FOnTT|R9|FQ4V;b2yGv$t2Kjxd927IOHQ3yq zF-mJC@2?r;a>bQDlhk=hJm!6w5l;T@clL%I)fqUPj8lEWX`smDbwi2yrfxJaoh7+= z_+I@Ha6sWObyG>Xh*3$xr)ypo!d66uSj^z5N7{RnR~mekq4)xO@!4~bI`{OoCO8kB zkotYPhQjN7BUd27eVb_m-pa2t<}1*nlpX$kuKn)&@^3)*`^ml4ciwp6Wa`^{ZCkE^Bv>2E{+AbK^jH%iL6)k}Q#Bh9*N>G#>Os>U6d?>8$*csW%P zE!vB$hK$5gF;Ji%M?YcAea+QI4{9epv*IbCFMWe)e2=h8cQBvR%2HW(s~`HcqR)@; z(QeAPcRe30vu^4)>%N|>TM3NjraEKc-L3c-@dy_$Ny4Ei9B%8&3l6$)xfkxykka?b zy$a~5k%g<$hS$V5?#l56FZ<|oq8%nTp?cYFhDBN^uYd*`iAfuSd8+)Xr+R?9Xk`*? zrn|Ih_ngBQR>>a%K3kmk^2$z3$AC%ni#>DNvsXMZjFLt!?>wOW@2r_KsEs*^08A&t9M4iE?n&Rg5WNktKx2LJP*@+VqUKFWT6>gM z{FFBXQ&Z|P@ft@%*7)5=UHUh>W94Q}Hh_8!BM_5eU+y)kv%|>mpNh?b7Sfq=+?ylw z%gi9bs5!l_yex}xRf?PM!lFoa9T>!w6ekwwH<}A-m{cwhLjCn zSjzRn04O_g5>k~W-PJrMkHd$>KfDaw*wj#fSE&>{m6pNx@+*u}NUnLwdJHZD-+WDg zfHiqMabRqWzDG`RxV!r?t*$#h*3u9*BOt&`R=RJV=7apAn@^aWV8(6V2aQ`9Xp!hq z<$vQ-Pic((y2c$wzU`}Xk_w-3_rSJ*;^dCu)3`a(B25rww%fgrLwaj;$dc`oX+DQ^ zG$Y4!(3M|yxoq)Ryy5m>MNlp|i5??y0tKalt#N9SV>$#KhAeRlbX9F6wbX^O$o4vd zTML>2m-gYZC*N!yxl~JTNtDyJO==9O+BZlxMq#kK=j}$V<6o<=TYRb0fx)Qixvq2u zl|f|_H;u&8`gzBwJ-<2n&sxY-JoMRLT*dH0KModC<9*I*70oWT%XdFKJDAP3Oe46T z_?4dtl%zD?K;YHD$xLbzfB&<`9$fKiZ<~76U3jlkx+vQ}0P*n&7b>_o+nCNVWuHF7 zax3e?z{>i0qF$S2fglOb96e(qmaXEFM0UvA2`0J21}Fd|$ONb{x#!u5x)v@5f}02!uDvr9&~f~1DNIdeLYkQW6xNPoph}5 zp4v5_lm!iGsf2h7*PED3ZrQU__kA-8?III6LbX5u>V~wCAg8vFr=T$n(w^zS$vRSuo)mcu}XeL-&0Tr!t|E<(D)VEW?YkJc3mo0X9fA$GMj2G5%K z=jiT&c=M%=vlB}OuZQ-`d2`;^Gj41c>sB*FJk)sJ-o$S<3E$OI*jH9Yd}w8)gy@ik zM6{o<@e&h0*eq}B{q$?RQ{$U&Fw6Xw_ghZ`U#Od%;#^wZai7bMu_sX(`H_jE_7}PH ztKX==%Dh`99bjZB-#;7oQEK$Gl}uVXnQh5@lxn`Ph7lQ|Jz4d>gp+0C#^Vg|UCr#NV;q*%5}spQ8I_F0 z$q&vZ6ME~&?l%$e|L5=g7d2-5LoIhIOh+pv7-=-1p=Erc4aj*yysu55BgakiD^%O* z`J-6|=O?;GOMN!|e6@&Oe_mcS0}4ECLip!f6Sq`6{!PZF0{tW}hxZ)1JVFzVvI}o5 z7{k2Kf+T!vkytj`AUc~Z&~paIf#eU=B`mUh2t5G6Lx&GQx|vM69X9%Jq9u4-d3sBH zJLPbbD6#a^f|V%rQ*^s%8&1E_BbZht;(PYt%?JsIE_rWu7mOfewFn1-Y1?S;s~K;o zDiX|OLm`0G|D+Wy`A-r|pvu2dGJ*_f{wHB1o>~3h2tF}@|My91j)!dYiEQ4$zi_0y zJhe1^Gl07FKY5tb`Fo;i8(o+?Mg!H(gt@~bH#n5tbzYaIM2-;f=66(T0>Fd#0Hmf# zw&{$+IP$~mpDV+0lM7&@cGqq*gU+X+a*XfqtYFYU3Kj*rtiCj+bi!pfJb~(yM{R?x z;d<{344O)D-o`=3Ei|%`Y_GLt4I1CKym7KzDY7=w6GZ29bO>=OXPdl@^_YEQY@Sd& z&`Oy$&a=aw8D1k*0sYeCzt8V(Z#u)Xh6^oj`klk2WmthjCRpK6zZ1Z}FK( z^~mFCrY*q{3V~-iVVWz-i=gDZXl6^b@qa^vF6K|i&EIIutXU=-CaY$Iq=Ci*kUliEZVt0Oe>%R)|Or zHU+FpC~0d|Y`HBZukZ%?14$nTa3ECu{0ES@^3dd$Xy47K3gdl~1vYmZo?fGo$8NT3 zZu%qQMky0J#WRqW@n+3vabj%wt2ll>q(Z@yGP$mp)m^RwX0>Ix)yE2Y<2 zzT~TpU;37!fL&&vp5CHw5ZqJSe3x;+UFPy7W$sIvuG<5zbozy&VR{C+at=#phtew@ zN@WvWtsJMi(-~5Fd~eU`&ndtTUl(F}d}(;6!sfJf$!pPO)R0kH%hq5D$G}pjh%{|9 zoF4f_K=wG*qRoT-M&HP4LQk7ASG?uM-2!Wku)|v7;xj(qsYDxCiN^^ zT$FKM+Q?62JgW9>TC)_tdX16xz$=2A{1K|UE?&Tnhk*uqJy(n#t;fDMs?w-G>`NrH z60}?Sqa=a01c^V`zEQ_4ns5lPrXX)GeR^NwZQA)($2DOh1^z=o;twED$~^i-2(gw` z^P^ZM&~QSlC=i^(o%0hMZS3K6yR{j8-s%!#uU3&zmy$~S~ICV^V!oDe9~Zl0A}c!ig?+=@m`uo-mehG z{`TC>(OS7=z5$8FiLgA{%5JQ)IEAdMo*>TnGM#~LeHk*E-5htHRsuKtHRsR`&eG05CY2h78ecUs@=X zl5Y>#Ou^x6Xjr?Jn$kdC;o&K(WLHfo)>ZDj5Gi`?4#sL>WW!_rFS{`9Ny#E_pV}uu zFSP@-pdEV#DmS@pg_R!QD&6Y}m|@fv7A>4sH+Re@x-$66Mk;{ZNt`!(PbiCCI36NK z65bN)4&#qVK~#CPe*g=$mRTb5szmQ-&i7oj8_{G^$q8d&HJm}YkzZ=+SltI!*>qzS zg!`>5t#yTYixUSEN=5D2di3VTGM^M*`ODI6$92ZENQ zGAX<0f~HLUf*a~Uu`)^s;lPr>zATruJqU^D86Glyp~)%sPKJ=AC5Furgs74zz9&0@ zN!%bmi8>6)`s9E>UamG*+-9&oTmoM#@}H2ZwEn!iv<`4y7cMLcu=_kf#d zZ=ac&juJm-W`$tI#xv+bPZ8A~uOWaFeO@NED-JfdDW z6oB+wtzBTou!s3O%8%UC9gVUaCl*5G))qy-0CoCynEPi;vfPUwo20}na;!_U_#F-r zWuIZu`z%C*bNH|wl&9>PokXfDEacMI0z;&>OaMAjB)Wz!Q!dW_n7&4w~w6^Z;qSX&VGqZQ=1vq z82}}ATz0*OY7TwbuHxIW2O0goIl`&hDpk0F1|}avrypdyPQvm^hQTRpEt#Xm>)Z{@ zmA9F~5h+`}uX0|h8*()ErH?j~8KWJEz->`8ix1X2;Gk3#u$M%jI9Vd0Pq;f)y&O!t z5XLgd5#nZ=yD-~Uz?R1q-%Jz+D2$BoR}w0_$NRk|Qts>0C8vdB6HCSy3oC-+TT#?v zq6#XW%4^mVT-)4rq9P+mM=AAdhfGps{R1rs(fDDt3q7a4kh})Ul_Ug|@&X}h(nCTIi z{Q8sG#aAfz5)cFBz_(^{ZCUxaCBeAsf16lC(Km=Kr_Mi?`_5K0wpbTz%Fs{3M@o;v zWg8u<7_d+hQ4+!Wo`2|ia@#U_VHl%@A&+_&*g8FPO%*&=YpLTbPs)6ME6~B=q56 zDcOnnbMNN99$kJ-TA}=}hh7Kz|8(UqVAzP`pVAmuLHT2`cYdVhx%ZO4kp*?i_7aRv z{LZvM))Q*MZ~ibv%6|c&#%IFAi)t*E^X&7S;p_p8#m0MC+u}zS;EfmHo5>07p1B|T z*B3FJZ@qCy?-HfbQNl|4MtJs>c@6rwtm(yg=F#)zN-ZJXa&1ZoLu5Afz^^Zm(}Yw6 zSPvFI?%eqJ{nF-KE5PKsYmUcr+2DE{nC+(cKK@NNg^*V8?dMV0G>qLi_My3>$@L>#8`>;1520w> zV&oi46MS;{a1>+8?#|Y{pq9t?xA+O1K@61~wT;m?kM5LF^nshY(O=_O_uXgw!P$|& z1mr4(9D8!l4S0twf4(vLp-}lYxCcYeJZVh34HhSiJ!eJbbfsH@_%mOne4^HVoNE-W z>rm-0b(2=^V(+j`d_2xkGY}s}bOyhkMiFf>*1nE%e58SIm?WyBRyUAG@6gBTn0ANQ z2l6`$oD)c~x}yLoxB+6bpp4hI3hf`)9up4~PmoLv9#~^ws@!@C`JUa1+!LCHg`ooK zEC=H^%SQX$`xY!S$&KPCb1c_xogN5tY=07(S3GZEw;gbHghDMM^nTykTBt04q)R<$ z;Qma?(kik<5%49|W_sOF9)Wo1G-&zt=)-)5F0y&?u#f%?!RDzt-ZcmcXL`g6GG~CF_2Zbkd{L5QRrJmN!z1_jrwGvY!TbO2f>-gS&c5eu;+>NEkxEonMyj`a4Hnz z@h!8zZj%6b4P+0)n?o08+g2)1L{8~@TGne=1RAt;3;3MgRVhR~z)Cf+t}3nDW%?#@ z(ehwpmb^UCrMQwLHm6-iu}1IlJJs1(vm|Hv{V?nrw9!|4q4|_fRYM-ma6lLn>N)q+ zEp6wX&tmhVtzz}J==Ki;TD)!-{=1uuyTd`ede*IK@|!;D4w#V=b6&SAKeL%PX>Opm zbwx)sWyF=cppUX)$~_RL_PpdU0SO}_>stgL@aYOfdL8;yq;`ee%3 zw&K@aG!Ey+g?*U0a!QEs{Gx(*Q_O*33(* za7IPYDeezIdwN8SJ@X~}V4ysjmFY33J)hOo8kJmHiAr~JxM`XYtJpKL6%SW>%$60Op~5b90xuCOG{6E z?rt4I;=2Z&Y}dASwTQ8}ygZp`mb>>_SJ-9`j4+l=Vg~BqVRBK=y5VP&%d2@T_c{3m zNv1|DQs?xRgCMucmvzM%ln}koflYaS(_yU?Lw4NX(v^3~k1@Q;Pd{1cdCg3obtKzk zA7ey&A2$E4;4oHQ-QC5ZovI%i0xKR$_P4qo?PH0bkvg>22Oh|O-dKF3+(y>Rx)i12Kxys$O=t1C*2S<$h8s3-();+U&mRF@)&Vz$fm6d$nyUtOaZ*zOP7#Ig0oqth zKYa@WP9%2?6hzcaArQ)WKghUK`XGKt2PSN=^4@yhn=P%6sJshgTTe?iR+Kt%o=Bz+ z4>$LO^c-!yU%mlPd+NumE8=`u)+J3A@AgSLxuiJQ#(j zv==H_qCo0R%gAZVA3(tWq3*5Yn)?6#VNx1lbc5u8QIZ3sV?zdvk`fV6iP0%Yx5OAQ zq$LJSLUM$Ff;5UcLb|&VR20N}*YEm$Klk@{-TBA$$9?~GwsX$o#QVJ7`Fe)iKW1lVeqd<{ntIr)=%k9&9mHcSgI$Ad>iJEWk}#T0^c`qiMch`u+riO7k^Z{ z51j{sj}vrE%L$(Kof}mQ*|<4;?vkh1`p71&48*$6+1j|_CHUrl7VyOX`~>dJk!@k6 zitGnJe*NYO{!5hj$sfvw%82Kg+9+SUx}RP&q{AYZyp4G=+Vsxu^Bk^O#U0hc!aB`{ zk?{2v)q4L};sREY*%m^x{9mqH@aWCRBY0ksa5)Riep#vmX{#d#kBcd*eLybJPeefS zL8eEgm-v0P@!kjhc+A+_xd+o|5E$oTkCE=!8~34Ne2T9+|cDMtXC~#;fk9f2mA82 z2=3s@0>mI7^S#B;p~rSpF93o^whEfG@?bL~fB5xtNqX+Qc3U4D z90twMu5W$xIEk|W@knT2)!UvU<^{-Ds(2k@rL~C+d+%G#SU6=PPEHOqo6KC>cjOF2 zbjhNKKLur#RSjhtPG*~@Y}uB7(!(YnbhEYU74acgjCxz6*Z7f|8iopVPxFp8@pn&V z9)Pps~ z-MDCH1i+VjzDjK9P?(Q|t%hCOe3H0u_v76q<OINb}^thTgDl~GPrRkDh;2w~MbZGq*KF-aN zvdG2+$d0hy4Z0y($q5x2rMt0AgSQp)mDo*12CN)`r|;bADNi~!HgV`~|5#c%YY|jP zEG#xp(8x)DmBPR4qwmN zAmTeGkncTIl1xc_C%UtVG?c2)t?kyyN8BpB8y}Pr?IO*k;${=0!9J{1dp;Oi+Q4Py z>H)Rv4NS|GJz}kvM0+x(4CyC}^f5W8-PD#%V0oY1;sJ$i9me>1D($ej4(b%;Ejn>8 za`t$x{4z=Ddf%gpcw70MBTA^uL`|^)>R(;NcV~!$bja4#HY+zlwKHtnyNcx$rf+BH zDNRk`pK2lQ8~z+P+Fy5l?A7(6k0lguSB2vKD@};0zBW3TkVqIm`0AJ%I_HZF zi0-&!Zk7It%2si>87nOG!f$OiVj&)+s*LX7&<*(&Qw!eU&!izdpmPTwXh zt2SeNym0->*B0WFC}YsO4l#Mol4;B=4=;||V8j^^YH4}$o5$~(i**++%iGeGEO!Uv zoNk$hA$g`^D35^mcznOIJbdHZ^(O7rCW(aw79bjwu>3WrDTa_DLlMLE%VQfj=Ig~% zU30o}NrIu8Bd5~`ZiqVWU3!8UbXrsJe#WH+t~@x_eLot2)#z1mS-Sy}HO^mu=)`e#o(WBcj{2WC-hqP;l(#H=HV5oSFa@ zUN64rKh$a*nY8~5kE^OCRTUftPjV*sX0V|vH~q-bYR+sr%iOgoUAsWoaRv##dac$b z?<7OANkCjOnr7jq@1+bHs?x2hFB?;*>P(2}`N>=M#!WI&6Z8;ed884|cSRic_cE3mshw(JXrKn#X?Am=#)})%F zXD0M3?B@@O+upl9vww!)7(CQ@g64CFgzWdy;Nyc~0egcmMfP`fto3VbbhrAV6~VTF z-V_3Am91DUL1;c4_L7RnLTMpXqE@iCF0*0n?(>wN)6_-OL&k~0Rl!xC>~1U5PpJ$} z3CxbcN$jY%gglwrw*FWaz+FU{)2%%+<%YszpDLd0l?&?%8i2gx$zQq)h*A?};TG}Y z)rjJ)+KLLr0A_dP(V%Pg-{7x1!anMC7nx>~BOx+O3DZ9SYTXpsSt)}*V{1s8jACxt zsl9`3+OYH5uMg=_Q78;=1#w|AEEH)&%CzP8pNYZIPgiP8RY{&&j#?%M>$8H`Dzn!J zLU=81;=56q6W#@N4xni+M3K0~lO1RhI5&zVLuBd=Jr~0qF`5gZOXo^Op!;FJP2~uG z2&r9F;^oNINW%9&N$*V9cnERLaVO&$*;5)^1b>CczaQ6gYa}6+nJPZ}mh&;-rkEkQ z%J02tA4>MhS#^pFi&qeqK%wC$3%7}}&zh_{@FxafcHf;Ow+&^C$E z?phty&&zOTfc3)j1fxAv3=1FJK{RM`LI)znCldv3U_7wnbw zTJ~^IqjttByvJZq5$g&AQb6CYR?ILBJ=Mrd0;I)8*fzT&$IAi<5#9ba1vf7oLR0b+ z<7Vm}*5%pwNO%v3+iDM%R7?i6!SO~^usTscW5W+Z719GGJO&^{=gC$E```>qi&>U_ zY88H;ax}_+FgvaBY&zd2KzeX#)@(Q0Tne|)PZ)zi4TWmntbKcwyMwohru&H*3;t9*Tl%0)K1gtuO{rKT2mvk(oJ1)NFY~onRMGdh-eJb#H~Ntd z+Rj~b5wtEpo5I^ahONzea)~m6YFx+KT4d^d)lJN`y~8smdMKiQzG?#aS@4?uUa}!T zRqu;GU-5|#0X8ufGF;#OdU|BJ*Wo&l|NjD%O_j_(=qH>0#c45ou!T-y5@KbbgM!?# z&p&w+AS&9XKI}UsTe0J%oe%M)T7FRLLig!VL8qvn?UC{$LOPxNk<(MZ)#2k+M*RBR zh?O66x-Ck!$td;aI5t`GZgRhz7gIj6n!1RmeP8d(26Mb{C7zV(h@ky6UPeW3$J0cP zQs`t>DtRiYe4r{|yF{4ciwD|>it~E~tA|%M6EIt&A&OCZcm_;dnjSxj_>LC#-ft5$ z_J>Ez+O3a@I%oIUXrPrwhFinp!IBS38*2tjQV=ddr_w-$s&}JQo-!pmcL5pIqm*Lxm9>)SjT=^r!~&TOBK{K z_5@LhXNVKv7Y33N5rK(K6=lvL-w1q*C&=uU{kfxzF-eUVFyO9*YY1X-Dyq^KyL*Z=#$dvzm%EMOC#`d;*fj{iT5k@uy0JkP=8^P~PI$}%t z_Tx{teU~se_X~@rRr^gpWQ78Ufgegcf{PRyEGR?=1l5M>2pVgT(LyQ!DG+$~zOZzF2*A8OUkT_?QOx?@T%M+}DLm@s_s=ddT4n3RM zn;uy5 zYGVzs%^;vStQ%{t>UrDf`HaTr@*at<%==Bq3t{w~xJ0dd2#mvvN2O{awrg|VBN@~r zYeO8L!=ynpM=y({+|@n+{2TBvrPmOId8qw~D3!L9v6SuERnC-6={{H)g$EcAFka5O zvra5@;RbGkcSJUC65xifCG9+$g?!%oAx`p{9;yhq8G;gv3{9a5j~|#E@>_a52c4F_ zYgT)Bi*8y+!eYjaT&+uj(hPEefh_YWKKx;7klcQqR4p;wo)Prw3_1yH%0G-5>s-W}|O zE$$Fgn`zrij^Yi8kT*rECpDgYn}T9CA`Ipu9dobi)pp#i){@oq zJXB7JkUfCSnOx;9U%;#sw zq(M(C#)c2z=BvIsF_Xa9Pa1^|+GmiK4)=m0K zG4E1wwm{br=VlcI9G>?x$Yr*3!4LOv7TZgIvg5|6NwewSWU{4B@Co(95#$tK>m;nZ z^{#~({23v<*|W1m#9dyH7pPM82B+yd{61L=(})(Rikj1YvRkLV%s1^-_p01i)`^I_ zA*O7s%Hy%Kp-&tG$#(tCwjN{^C7^t}ZB-FQ8>5z|0&Iksedbtd<`Kt%+_UvaI`mRo zi{V1hLCwrmAJFSVM7q)=xO{K&;Amfdnj~{`Mwd@e3#UQA4jgj zh+wsG+js0a$1YSt7&q?JgpGKq##ccHizG;e2~8)3a{0WtyGe#w&Fb}^yU+$b8~u>{ zNo3|1(CD&PN%HHA89_rQpd+&_ynzyIn-$v=xf9vfT%O@` zJ8_VS>7owF$1@;_$UE*2_N4Q@dBrLGJRn{BJo~lQg4l}0HCB}rkF)H((#(Z_X*HaN zCdeoPIrs|?e0%7WI#ce|tGT~c)0kzskmaN1i~Er(QT;_?#wugQmSj9#qB(B+-1U;W zL84sOUfj&!gR5RUVnSA1RpwxyO^Om)ky(W4x(9vG<>yh3E+WB}%1@sQrnx z{~_t&eptwPiDPx;*hjf4@v!^8!#5OquW@Dmni)#RIj-(}u?%Ouw8R|-WGG0!7?GfB z0D|H+KU8UfJldrFPMwY8j4E-vGo`;K^M41E~ z$=#SG+}!?JgJM48=0H*?v`3z+-B7==x~WV-(cn2H(0bb4sm7aTcrDM$$sJ)X*dd?= zk_*7RjK&B(?y0lOm^GjbMce6rJ`9(5ixs%t=c$x**QgsO=iizAA=kp--ihK39o5E|B||m3E6BP5{CRrkqh|4q0svH zFH!zQ?02%ry?ZqwjEylDIUaLkKlkhxy63X>m16*jnFzxlmStyGclNRyL)*w}up5x& zzeLhcOTT`mP9g%p-reLei3Yq?s4M&P8~v>S8sweyGJ4~S#H@wO3t7i;W%MMKx{+V= zb!DsV>iqkkN_BO1%NB#dzAuZuOuRni!*$<&uhcf{wsnXy@>Utu`jT2Bn6+W?@ZkIOMe^ zZVmLRheV2mSyXJo4CT~i6HApS@b5~Y1W|IX>(iv6e=M%0o zEOwYrI?+GX(sWc&TLEsEn=EvL7f@(t%M^+cbjFVt+0$a>Y*5*ipKIYV01c`Y~Y}xNWRM`v~%Vd&(A`T$n-K0oE$}Wuz3W>0v!3qYe;RA+Z{& z6M&=Qqv}jhQpb}Qy|ECfhuJfX3#-(a=coUUbyI!J!{L2>Jnk3m9`E6)L{$t`L9|tf zA+?z>LNUQ$P0mhab`0!>0LMCIeZ53-vOl~^u5Tul3t_NIx~Fwi^YG=!I1C`4Rn?=v z*>qJ?w5MyeUMD-Bl1QCRWbSq5fI!rAcaYc8@u%;-nE?)SU2kgtHJ{1UeXq9t7h+V-9 zt5@->9OkeAZ! zeZM|*@#!Q#1zXk%37YY5{Dj~5HOw**Jeff^kr26S)X34lz=K%D<@t`ld7+E87Nlvy zT0k4vu&CMYBrSE~I*kyFXN~R9tT=S-9jvvJXaugEAbZByyr}Hhr?49}HMlUbB8C-L z&z1y0)0rtv$p{Q}+h7>k`q;;T*|Wp0UD&$quLDtKBD$EU9dcW_sl2I*#S`=J4nl^m zEDiomL-6qJ>oJ0U3oqu+LCE`!NXX-_b=%>5zRqZNq+VY5wCkO3$*6G@D>`Z@@^x>? zocOre>ugo$Dw`Koa;h#u>da$Onqvk3-iUg|4*ON$tDyUzA? zTVd%|Vc9G9Xctxjq6EMHm-fdlfN)~hXO{maM%qK#nNX-u0Jcu{Uvcy8)Spy z+WgYNbZ%#{l#Qi?-1F4~j&GAWKij{_>~m$uiP(<^?s`H!UgQZ=(Wx|y$55$|A>o>W z-XK^_Y?lD=`E!vaQfn3gIEp8oWE56$uD-x0BC$CU8_vIE&U3qNwcmhDKJE<MTar>qQ$43NFz4Mc4%H_4{kj{+a^4bOdfpI#N_NH>I zZ+`n2mEjRt>PGnY2ds|NBv3v^6l+l!DYH<{m0!g+wb?0(>eoJZ1m8(6V~zqZ6GGA6 z91Ep2<+9;~ct^%6|KSdNwf3~!ky^=dcdTtDwdEwfejCxOF;^)tpPI#<2E@k;xf<;3 zr<@NF%j};#5D!Z(@ip2{LC%O7dKQuwUi(0HC${UV3q@C1X=G;8XtV{o93S{Q7tyFP zbu90wuw?ddouDW6^mXA}*0(7N_~0su5|mbcQRS0DsrYLrb1Uo0OAYC79&cB6(ah_k zoy5e9fc=a(ci9EuF3f|FmX7L>VHStAH-d^ZpPbX%7F=-LI`wg@{V1ObW)w4uXc_TM zw$*li^%GT^hVX{IsYNy}F%hf+?IWTb^-qmL-cG%qunoRLvA+Kyd$`1Ft33gam${^b zG8896;V+4PMPcEe6s<54LpzldmvU`=Z_%tKUkOy6d-+KOtVIEEI?*-kN5O;pIBV<7ORctGKvp-{-H+y4Y%*vx6-@HOhw zYs(PnuzWoPV>%0)ck|hIm#hdzc6fV8H^+)oCvQ85T^!j`j*gKFCirQs`(Fl%_=1XE z%Z`b?j7&UH$#lw#-RO7tn}HCcsE}*LjqkO*Kh&JQX;d`tPyBPMXPl@d{5Ric#b_a$ z^%{Rz-j;m1!kB;1Pr+RiVIY~S8^P;L5vHiJFm0tKC|@jy-kT3)O|&}0B4`C*Y^-Sl zM&$RDxtx^;bT9w)&?aHLGQarnHsAL^bo!tg%nz5=n)Jh<8M8HX1qks*;GwxMr`z2# zMvMfap-w=jlt;$>ZNK#nn}^;j)hEdFnd;969h6WDv*@^B$RzPNRqvllT=%~k@2c($ z_VA2d$=}~4NP;^6OTyezQp=Al+#OTiN=iq*etX?$DgDpq@xI^1=j%H9$G7lfo}2sK zDqc-{w00CcnWOLbv3ZKp+M{ZMfF|4QuWaxktbN`HdY~<~# zKF8CZ56k|&_RLFmF*T`ZR0nr9wqI159^#Yz;3A1=t78Cv+e}KTVYF4T@WGksvFXi0 zEuaQL4vupN+j?PncVLY6N^a?94vU@!CD-O2sWOHByan@X3VSyx?d6~kc&l0$`Hi5g zhQSeN6rX8@tCwWTWTW)?ZfkL2imTD=U!tuZ{y$oLztQ6V){I84Tt2_`zEkdv+$d(i zNDPP?C%&oJefdWw_WRm@G^0-1uObJ|HqONYCEjPP%pIqi6u-}C&4C9UOZDzA^p`89HZ{zz`Qx zl)MO~5G*C~UaNNeS5?^kCnoQt8Jf7k_M~wozhQP)0yc-<^J}-M?a(2kf#YyI5;yGt zpNGrT4O8Q_1XWHa{giQ|n|otn&+>NisOaSPK^XF~Y@rxa2-)M|h-dre|5W6E+6=QN z?nY=l{@(rjy295UY+P^f<&xModi{rO+-bkvwD|w1o1~YEFaGmD{}e$DR?lB1hx+4U z?~liJC(eI~#@<-}B`WyizPD((MArJD*~f*FX?A1OBd?A#rZJaUe@J(SyxR(=r6RX&folV9bTS_!@g<_!69h zaXq!|4^NSyaLZ5CU9}dWGldP>ka177lEbCM>mP;xxrs_sj5%Orb?CG2GIZAr{5)qt z;{nANuK{GUZ?Xofo)0C~N~){--A$%)8!AAaTV#J*4CD-uL=`({@w|80B3-wtUYzrLPgyAtpH z&j)mWI|SNY@%VD6w!HIvzIo>~G_dBvlqceUPu2Vn(b9kAZT?&T{5z}Ze_`|2y&W_q zte*@l8WN&hNS$M_DcF|=AGd9??Mk7{@4j66+HK8%XU&Z@DASYLbpr?g{;u?U1umDl zLSamWNbEZ3w+ZxfZm&ny4KIf$(9n(%&C!+|aNBcn(E*HfCneGLi>JHB&;?Ml>!_sS zq>zrEIiT>FFeKOj~GHcuPBe=CBRAJH_mALeBWG+Y#MH=vn0TY!7<1-$fu7d z$wQx?(0RBn-Oa<7nPdRuW_@W(?~Y1QaEnPX(-~?F>*sh<_H`ckR)(ZM^@QCgu$1jS zD2%z3-M7bcNr}EdMKK{|0&-R|8#x3c7I`k!(?J=$m`7~abHR&~LEH=Srl>jsuKTeo@3-G>L?}v>wtq8-E? znS_M*z8~0ukno=OE8L(PI%J6t9y9XcD&E8coI301hArZ5OxOLO9;ceQes8+B`l}u! zYtN9X=n6&8r@Q-fR>i*8o_oh>pti9Ojsep-EIw9#wAS+x2yyeX-4-yuwRT2^3GZSd zXj?4;>4eocQe)&G`WRv#jE7yB$g*cL6{q}=D;*tC+$xat0fZm1E_Ahpd-6Z0;T9He zvX=wCk}T4z9<_|}28^I8;eb|2QCPOL=*m>#I#=LGf1S?gbH9wxr>owNgo?lLRI)B4 zQ$IEU!NeG}*=p3@Zw!|329YjA2()zz?0o7VGL<%E!fQxDDF~x{9?UeKr7$G~B&%r> z2cxo&qml8nHDyUxpDh!<_EDz1k<0^B1SK(;bMz|!SLV>9I{fZLqATO(Rn)^mE~ZSr z^$nOGcXZ}1UHpa9cRA-dx}7k5Lb2eKLXpbN+T63cCF~w zt?1WY+OHBsJ7%{#2NPAyRJ@tLIZLbcr_%3o5A2dUjbxN0xsQ*5hFozr2)dRzZH71@ zG7SF%A_`5hn}Lq&CBq(H_nu#~Jb3k&i2GXS{#y&jlb7H>5@{FOYZ0K8BWW*ByZ#O} zB@SP{_Q8W%&=bUVF}avPW1QP#Lvbs=iX+Hyh|~K1CYqU}OE?HoomNMgeTiuK#$!G# zB@Zaep^a0t(4Pl?S&(?3DlCz40V^2167LTV2}|CFP5^XA46^`olUxW-K{3h)0o(2> zGr~gKh#zVK7uxyZeEr=gp4U1lZXL%RV~8a?YSSl*4camGQqoR@EKBF@Y^3Hsb3NZ+ zq47YW%1U!$dl?@A%DbQYXj}38Nqoy0JAvs$%AfXb5HioH@Zx0}fg661H1Ce|I_c`w;;IeUiudg81PqUWU|xL% zQJ>qXX@drz;4A|d0Pq#>h0~i8+oCT|I$Ivwahbu}IKbvhR)s>!D9g?c;2lj@HIZfI z#JG@{j{(Nl_7Q9a{CfEbFVZa;@6A4e7uaS~Qk%iDPAP{c3yG(ImK|HGx6_>7#|Gze zsy$h=_`xtQu8p#&Xi2|x4fVl%z>3ev=@Z|xw7L=v(ar3=ExDLe>=`iT7OYJqEGelB zh^ts9l*1GWvy2Ua3FQOU6VF(^za7+YA~e5QymtjOZE>P>!;~(1mGZ2#h#gQ3qQJ-b z<)>9lzK`icBv+5b5(mt4!JD%kAGDWT?V#!|%}QiB`rNIGkC88F2cl9f_^9 zk25CT&3!X z>({LyH%MXKeJ_M@r%m785(^F}E|`k#>mEOJT7k5UsZU+NOP};HOc?2OE^4dxJ~5kN zN)rlPmM34!`EYUTG;j@Q<;ED&JC?!`_n~0Ynlsgu`3&Z!&5S2OwkR)I#D^p;KcuaS z4=b8`|1QfL9aeLK(f$%AP>D_q?2HSJ`CQ&0%4xXY^MqzVB4f#`%bOzV;{G4kZdj*7 zy?vrX)cKQvHh?qeCjgm%>PbTqS(PbrWtyk@N)$RX#nm;Y2 zjY6d4Em)c3QqO_Cq+N8x;YA8H;Yz}4iPLkk$oDj%kA>)vQ5H`x5*D9Y-j|NMW-9WE zSf{t&Ww+Zkx7)GQTM_ii z;B7>7|7{i#2bB7eTh0wqV_Yu3LYnk{cR$RXgYVs z0N_yvC#@5&fH#zVYu}f<+ld1DrB0<6IJ1&M+5>O@OB8Q3#CBprQ+CFcTmq!Fc;*nKfCnk=x6q{a%!Wp6k|Pv`55?T16j!ADHCX3vplI%m z!?Zg?-o3#1M^K(53nr`a`;w>YfFG7tZrd><>7AL&19>vSL2V?4qk+{-4J>@&UB29r zbhvcpjQ)vyoPC)Tyw7<+;>qe7AfDAEzz?rFm*KEO-w56Kp*qAkd@>)r3gI?ZnRmtA z66P0IGi`%$2uql{1e?g}ys0=}>Kq`Z2wuD7N#6y01=|(x7-^&X4Nn)5d-&oi9XB&l z=MJu2D}t`DZF~Bcu*_TPo&J7&sd3^uZe+kBS54sushCjhXsy1iw0Fbx217{Ys;Daw z!Yp=-X^{}&sD&R4v%;01Td7rmy65Da~_g zs6xv;4B1+NZQ{0yuM^N^ym+Y%Hs#U&|3N!$AF(+QZV^tRyH4sGu^j4Fk%M8(r$jRU zwu4UQGSpZ1C7_UjkJ;Y=3K>H>Pnm1vle!*k4$$^JGTxI&(-)%-t&%ULb|W^l<@OfW z?$Y&cB%{xRu7y(!aYOnCjm$%$+pjbiS8;`nZ+Os+OfO<~JjKZOq3{zG_%NY=nuM3m z|62}+puRw@`)R1^vhpv{aQ@f2f0JO))amG-p03TMdA0bSfjhKn0t=3rH-iv}Rn^fI z0IJCnP?+(qmxGY@!zqQ0p-{;;0@N;w@yx=Jg)3&n5)fs`uV%~SE&)Zovb{O8^r`tG zi~A3Vx1Xo~2xL5k!B>Q`kamwNW8rNy%6=D)&t0`eRDg*eXC<@*D8;5xkS(EX0Yf~J zkdHA5y+;C_k9fFohA2}@fM1H}TJum%2)s1Use&ex_N1W!Veb*?d~q_QUlkV)=|tv+ zBXrUmT0|idiz*zZ+^t^36rN0LiLEwAwxG;H0BCC#VZj2`&NmCxZC-l9^K3cVdI$<* zRvhw`1SQoN`Hd_D}qmCLk6!D*u2A}f%76tWz{{ITmxQOj+MWM7NZHy{ifP1$vK zHD1Q8@ z&^_n{gZO;~;jG7uv^{o^mqv!c=JBor$QV`tkr_Ys*=Odmhjq0y8svt_0WBY0fw+VU zj-T>3c<$+^+cMv`789$E(lp%NAc<->%3ruO`%J>f2yXU~h&dkXrVTK#udaQtPD&w! zD9YbDv{~+|=*%s1WSD<0S1G@)ciYg9D?fmo`6YVJ{3(q1GnL?dkBWb@u@YBwT^P)N zXwWuR_}k8?{+0?tt);qJ2(^Z%hq6s*u!Xxkf|d#;Bc;EIwt8i%U}bGwD94@vsS#dT zH7{BYLSxxK=@cT6LZzQF)WFVImzIjs{<>BHLo;nFVrrsTjGKm{?W9WG-Hv=>Lwf zis0%naELMb3Z$j9njCs6w#ks=RQQsI0;tyN4sI@V<9`&D6W4bqM8%*vOVA*8Wn~swi?IN^H*z75=5HsYGWny|sdc>M z){lho+1<5O@Oge`QFc>O1)VhwiYq(mUcG`ujwTiHlRUb+`M-r4&O;$Kjb4E5W`3pz}=le8(;A<(zOZyimy()ahBBi1)om6eydGrzf=cp-uFOOn7D7yT@B4omY?2r1;xlw z$O!17D&k11_?c5_3H1y^JaP~eA(*j>J09>;e&la8maVI&Ws!tIaLZAnk*7!Lwi&@@ zyR9&jRh#J&s<#Q#As@%QECd0YRO0WC7|cr%EOla^d>gcY#A3>m7|UyI8d4CGM2;SlPRsA8M`AEH+ z_3n(wpmTZrd+Y-0z%i)e9V>d4^c{uYB-!MVvD=QAnf11QbmGdwtQ+OCfzGicWOuJ^ zsJrqwF+WCmD!TAd+0miBbe9o8ZJf8OY=Y4pG@PM;h8CNB8K0cr4HPqSbtV?;XbeiI| zpL9=4vX6IN4RlC}8%4>inSR#h1-F7A>T5(m$gc^zwSV_Kfl-)2dC(xXC=6MJK3URi1)HzDi=OC;IR*xE&#bo@UUHMYn&rDNOQb@iDN}oep9i7P5 zmh6DarVwnky~w|rV7JY#+7~S7T|y;0hmgDFuN~#$s#B60&e_Q{`OHSShl1@?iPTr2 z?ZnH^)j^8NLd04ToW+ySAI`$-#Z-%1YpEj8XP)k4v2?Uy+W*U4zCxe6o($SYA9MPvfJ{wQF`c9JBHM` zsYVfI&jo9*nO~}OcdKauKJ_9OR=Kc#BV&icassPQAA)p zu6iv8tX_O|+H+h=d_@hzi0FAh3{qr+}Is7RiGb^4Fa z%^IM=%`$k&w%q&!GG$cp@4nXH=!^E={i0VR12-4F3Psw@F1$8c7m(H8Y_hr$#s;c(sMj9#Df=Ou@{}9alE{1Uc7pvf263XT~t9ko)xWGCy+j~7Y}g#gj&->(ZLH@CE3%e|K2i~iKkqMLdir)K)j zt%7vH4C+@=r^kO_@$|bQwJCGRmy6C%gA01TUNlVYPo3+O7pxYwU2{q4_}kO&X+eN^ zcx%N^Iko2#D@(MwY=mW;(~2FsdAbqe>dy>&tQDeywu_(T_iYd~M_5N58=+$dKsJSF zWc=IQz{zqk8Q(6uDNX1l|UV) zsYcmCH8Niy<`<+FW2EY)`V{6T7!1Mist&`oQLj7EhXiI!> zE3l7y(;bWkC@>=%V5t1<(=K+$`Zh06ghS?~%YM!~lV%6zOQAkn`@r#E2z<*PH8iaB zp0btd%db1srraedoa-?06Vv0HA66lKzt8TLZeLp5flenfV59{;>%T<#Ff}Ug+=ds* zawR=b?K`EQGm2r4`=HwYwPFZvHBYO|rOlAbY$(-kSxr_Hr9$DAOlWXV4Q`x@a`mkS zjJ2qEuH7?o8GBp$1IiE;gK^uem3)04#q^S_#uVC8WYF|qvKJJ<#HT&WYn7{rm0!nt zLQU~`z9@(%daBW1uq*a2(OcV3#S+&T*kyo;hxs+F27lRgo6=t*i$i-cdZ&Mm+&y*t zE*?Bz7G}G9{!%3&SsNY>N+{U^a$sXZ5?qk z#<&+SM;Xp*&^RPy{~O2Wzm)cW;}Pb+L^t@5W|4M;G3=|LHs!g^;8>@FD>d}TZ%?Oq zsRHPT-_0!wZLEX2?!o*Nn77}c$-9HL(vv!yaJsujwCRO2%cW1X~_7Kj|!NvQm?_I*`@@F7id-IfHQyb#D=#Di*FX` zN%5!?@dIvZ21|u|_3#EAZ2ll+B*-M5Zg!sAh=+REjluzQrgkRVxW?-02q%7*U2OMC z&(&sDTF5hOBUj6k3l-7`kG`x^W6j}p0>x;biwa@&l=-+(#;CJif90Oph=)ILpd5>`f=G(rQK<=fYdTNvu7AP51dz;q{8P&l%T zy5(zcp;1JMe^x}N5?x17pyq*(s9}T(vIR(;IeI^?f(%LeY_;gD+U3Bu-6OedwzQ=R z)NsUF!-Q*>YWiJbl#T_t1wPG(Mdiq3Rnd%>|5jg-vsIqH48v*WQY5fHyImGk>EOP> z+!w)E!Mfm|o869VW3JfMND%;!zbq^S4Jy?OmVjD)uJmtdcf3WQ&w_8Q71$XH)$+F# z8H(eJJB}Z--)KD9rZ8ze{XUUYd?3s5zqNN>K}{%17zU(B#~>v@5CkNYV4)WgP^pR# z2qi&!?;-Sqia-z{7zhMJg0w`b1_MM0RisI8N=ZPP6cH2-3JOP0X70neGxzPz+_(F< zyKnon`_K397M@aVlVD?j^A4TQS&o&Q2<)9RcI&g9vQR)salDy+bmmy*z*)$Q=IHq1 z=64I;m|NOF*>=C$3UKm5|N@bi;=TyUtw#09O2ugs&uCogx9kRG;PiO7oq?O zHT6<3bRZjNLz2~<5GVojYZ+YlgB0uwd(kr#?tG^8ZK!>_O$e0$sXPg_X$w>~+0Dwv zfF8<(y0pr<2}^4nDY9D?2W6$v6f6i+x2?_jH!Pu1B7C$IJbzN7;PAP|ou@pHqdBU2 z{6d;U4|j*0wKbUfIfBO-QL|xw(g|J{L4g(py}6^j7|b2$DELwYQXf=b8W>PV5<#an zLlhNtjY9fRIfRt3X&LK(osRzp#$^gQ|7CEZcz0Baap?Pf2z=ujva#2S*oqd$kpuy$ z^W(OeyX)e*0oqqX8?}YmNuju;HN8!aPS`hlKlJE8Q%6Pl@s2}=l(9!)K+^DJMA5IHJg76At}(4iHX3hTY=CL&|M z)bEy)ykfez#9jsju5HsM(y)BgvKM=)NJ`uj+VMLv)Jnyl*)iT{&HV7Es7@9EEF^b6 zybvlAi)28wfjgm;|D|1p)s!(Z@<@a>*LGa-{=Srxk*y0yl2 zJZV2D*Tc-3otKc7p_$KIQibe)BI1a|{8vg`JeS8J3E$`>|Bct$`?)aR={*RgRR)xS@ysE+QU?(av1H(P<2Jhlm9rkSaF=I$~*zN(D! z)7B5R{!R3)%bi}Koe+d8b*{y$ireZYuD*icz8Ri~TGsqFVz~VNMcItUEME;Mx!hb% zm&1j@c2bUgtt$VBp+Y`YACY<1%Y1DMn&Lo5Ty-!lQvQFZQ9o1%52;^11 z>JN~%^Pn6hSM4Vm_4hqW$J{2L204%eMCs%dH3-EpPfhg5%9?NhuPyGo)>RJN)2MXbyD4Il&lgt_~iM&-og=M|47gF ztiK|h^*rx5xAOfI7o;~bw~{Mib^Wc~Vjo*9tbf<%VU4qBH?l*bIp*$EA&g8lGe*?r zB<3b^>t#IN#e(9J`w~1N2%o`uNBR^AJ^RE(p#CxRb{9>$ph8QBw(v-c=4#K#?ac?> zl;LEm;<-d`Vzq@NsNUA0a7f<|SRZYBXQQ@>M7WgtJ_2Vbqi4EaqUpxr{Flmu&&47i zexTHD?0yixf{I?4Zy$R;7fjpa9T2+TZ0m$FKVb;(;q4L>bMb58QJ}v6bC^Sn$D~1C zfJiQQe#Q`Kza!nE8N4j8&TbHXG2GLc6u{n_3{=Ae+#GWSXMCCS=d+;6cN3CO8;2|GJegyK2&%AAwd6b`kMuB39U`HDiC)_aa$Zt zUeynqmHcIY46I9d5OO4UZ-At9BVr13aV+DXRB^JFVAghrci0bmlF}pi|BL_81iX@^ NS6(?^^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!^gSGhp$H+y%lv^r!KiE#Hc<-;r5ik2tTgG*mXU2TzhPc+lK@uJGW?t=sPUPj#y}zFgK`r{vr3 z{f8T${@S;9W#+E7mH7|n3*@$4e6u!X`@?(F={Xia4vIzwwq@YFU?~QmQ9Ai;Tg8PZke;nca{6aIU@j;d`ljFTa1_c>r;u$O!PGpzlWa%!)~ zQS*IETcR!UCf)n=&SJTRlEA4Y&6o9#239ejlu77+$h`PR^P0@ES!eei)}6LKCs(0W z_43vkonanV3{nG*RviNAoY~PnJN-iHdWcak|&evM&$0lJ>K`%f5 zsPf*@sM2>TGQWLxuJl5;9`mWEN)*Zt$TBrH=IYH{(f05BUZv36+ityd39@%6d+^rg e0Ru5-vj`p?X)KV diff --git a/l10nkits/client/windows/docs/nav40/imageEJR.JPG b/l10nkits/client/windows/docs/nav40/imageEJR.JPG deleted file mode 100644 index 1d1f02f7ef0ac80ff7e36763f9f016c4e4a61d7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21513 zcmeFYbyQrz)+gEoX)L&V0trrVhem=+;{ z5aH((X5-@K{6`}QXlQ7d7?>olUz2dYp?Jgje|$Z+18`9hkP$)=5#9n`;UXa7B0P5k zs9(m3jPM^9;J;r8uMm-tQGlpu=ol|I)ZhSKAs`~YLPA7FMnZbI+yCW%01_@T-Wv{a z6ns?^;9F+`&Y;*VR9cCO4nno@Q#vkFmtZt>B4QF!vUl(485o(kd3gEw1q3BON=eJe z%E_y1XliMH($O_Dx3ILbwy||}bNBG{^7aY&`Ykl<`;YLr_=LoyzmuVf8as@ zApSR4FW>(S*uUYzeZln#2?-Gi_zzqNuRLD_5f=&h4F?LIxGK=Z8UHP35GsL0Y*s}F z8ZDRFDWR#$I64s>_xd~dKcM{wvi};e;QuRR|1YrriE9CXiHPvBc!;lD0rTt6*Okr2$Zl!~nxEsFJr2D~0_L8Co&lNEm;q~_p8*e+MO}2UehL-V zKT!l(HsgQ~wV_S*HE5c_!wsxy#%5GGnP4Nc%Q87rn@+zt0uy)Fn5RBC?BV9d>=}S) z^$ghL4luhpfAaI=cm@PjJpU0GIT<5q(EDdki6(|}6>+7Pv zAqPDJNOSI~`!dfr*P|a^XFdZWXS2pN%_$1cp@#uf0nq4B&?#@g6PL`tK2t849YM1# zlkx98isyPAJ_CmS$5Vzs6hA|x(T-A-`w3KG&w#ln;eQ4k{V!b@JaEwsH2Cg^1m{RQZX($P*BB#_cK6Ll;j!EKK~538KM5SF|=TXvxFp4dH?H(t^W--&#s&5 z|MjB$r!n|Y66pN@llI?sf4O9t)dp5UK+X-VO4}rxDAXG_!n}#FHiQXfJ%|#GlCf}k z?w3n18#wFR|7M9g_cG{j694EaITswfcKRDU@m9uW2f#7f*;E15H?4~9jwVMOZTg^S zb{G=?Z=5#S8s&pz$JvX375;6p|C1iCZ^J>|-!Gg?YHK4*l{;vNWLWrV*p|DmdqMJt zt@t;|`f#)vP^~*rGY+coZ<8oqhjTvv9@0_b@;t@D>M|QJzOsvo+;WUp2HM&f%hTLn z*7^AB&R6m%$Q|giND#po(U3es&%OZoI`*R<-_y5ugeiiik_DYreySB(z$mP>U~*(| zI`-R^SL6)q9>xfx9A^*?=sE1{qKsJP84y?SVttI6qaUe}eJHICf3I@sCK6|%)`}^x zNoH=0f)%YY&u=FKW6=gMxq7{NRAhY$Fi|$l6V}4T&%fjWI7`gXlHh8Y^82= z*@Wnhgy?arE_zFvjTXd^mx%!n>am=AdRg;lB`n?%CA*F>WQWIvd*U{$k$(@OCt=Dt z@eg=3$^&B#aXP5Sj-8K9)u_q(g`U6Br2J`|2AS)-abgA%E1k+AzXf^Qh*?0DPnf zhgP5)_etXcRrug4E?wcqpq8NRPr2Q`suF_dN%5`h1q%&E7+!U~PxNr?AKVG`r;Ky&o#MS_5z=&~j)i4luLU_S_GaGgFi#FdfT`o)e z>^&$2cJ8b-OB}CWu?vtO#b3)(f@#KpW>QW@xWeii*cb-ZVT$$~rI*ZGl_swCw9OWc z?96Y21>r%9DKD5JYoO>iO;Y0zQpi!uNmU$mwXJ`n);R_e5e#{)_CL9hXMvWt5XTtG zd1jl9HkzozQyjmtn2&!XOTc!($?-^*ttuROESo7phIIvJH zHM`Dr&?&~DsMdrCVd8WLW1pq~b{WdK$G_0+lR;XT!B(~@+|jnRyG`HP^@33PEa{kW z988xAvD*7syT5qmjUh-8sQf3>x|8Y$F&*HTOp zF?ieg1b3dys4vN%NO5dP^lDH`Flz#z31_xLoeT8$uWJj;;WjSKGNiX5y)u+{SVA+9 zrfkWLbdd+SobD2joTvA^vM8E&x8XuC((AjO^mQc}@QnRs!8ogK-KO+B&E%ofWMWH`=CM zJ=L&@l!;PEQLO~jQUfKvw;|AXuJrT>w!tez7jOd*u`hVOdlc zb7xu5FDKb9C;mOi<>~{|RJFg7yIgfdcRfkiuu7f|*Nz#@6L*1DTG0UOyoQsz&Bh!0 zO09<%cS`vT==%z~JYBsbNKoBuyEzSeY9)ULNW_J&%an!uyIJzyiGBvWQ-(gZYg6Be zqF)FSbx;O}Gvu=ueqcK~WX;&ww+N>rW$C-P7M&K+ZmF(qt%_SYM#?~;=HxsEQiMdS zh|#u+{l?~oTS3aovwdH`U)Yk^+==74oqq{f8rw3yq-iIw{5o6t63als|3kGBs7ZIX z4%mujb)-Gs()6ImbEBQY;ep!`=&zTX{= za_Z|6--T*o#l7h__QA31=AnGG)P=-%<7QL3Ik%6ZnXBUBx|i90Z`x8jI=Tq13ZIxj z3SN1)5c|7bRf_Cs=1#Y(dn}6CrD-W6mZvLD&%9%189`y|nY#n^_4+C4+_WptLxUCLHRBy?bOlL#t4!r^d0(+K5CQ z%AsEn=0~?e0DoNE%eQt@xR(j2WTt*gIwN(T^Ly!!GEkB4vl*e6{4)BIXE*dR1LGM` zk?|7giN`gh2Pih*C~e63>HOCF<;UT(&tuQ~rW;t0N^;2QZASGqb%mmZ*qx*V>j4}{|p$Axk-Hnn9w}~#$e@&lht~! zX{D9kcM=5;5GJZx_;)$KgFGA$(51lyMC|bTI$8-%%W_1^9V$O9EzAAdNmfh67kJm| zbY=o^@rL>Ul6ws)#)VA^@`FkQGlGA9SKBGTBlCm-CFsk;Xpg=Fb@&70{qf&1;_|4JorL9?kBZX zTT;*`{Fisv5;-S{c6K{f*5cu{WjbP)phJRVXk7PHGi~4{&f|#p z=|FH~y-CoHxS|H~hC)@KZ?uc92@?~~iKBg|*ek576?2x&glxNWh$o9mSFS`pLmey3 zI>w}J;o!sowRw`e{!LxHN;nTHI(cg8@X$fS0P7{)B;w$MnIr4!5%D_zo0g10=}C+3 zQzW*ZI#7h^oYyQBuzn`!!Qthxub{iJ3zeP1<=)-B1!PGZyI zMikbc0pBiE3}(1H;AkLrx+cO*yLO6g|Crq2*_Qc~kJFC7-t%a53Xo-`E&(I1_WkPgWY6 zV@n8$`iUGZvg+mgs>5dR`lI~j;T75OFLypL8%F(d8;z?NS+%O>2X`fqvai>Pqy5p! zjw&VwOORrj@~c9S*BL(nf4Lo}MwXxzaCQ9RPsH`8 zA5g*Y5?<}vg{U;`B-h-lNw(c>$wcRUY-ch2ah>ER+OdnGZZb$!fzF_hjI#RExr zi@m#}H)_g^SHX`)VP#VA2E!}e^JhR*+nKEU>b>VPVB-5hePdfy<@{AsJ?k~hF_lJX z?jZ6}O001w?vT)3;cfRCg3~Yh^WWGZyX9>`m{|$I*ffxfYJ^kd7iV-h^bFtvKQ;y& z+1|Yh2b@Fyzdfa_tP;iMMtbIBU>WGbk8n3}r&_2 zyE%t9rpu81$3!WXNOpmbR0|1r|FvL!Iq`mc*G4*qLWo7@a*tEhr=|paa|SiAG5gYa z+q+PILKo$kGiV&uhb04JbaI{XU3I_ljZ5pHmI3>rTS z(znnYj5a~Z+h?wrErI)~UPYYFjN~L}a(?g#J~`F=MY(o4Vn_W%^=;@c%zT~F z%7ORG`v%Uv{J=nOkncj%YN+mV@1G~yx+FQj5>~M;Ogzx9Ee4V~@*+UU(i0`KBJbH3 z^G$A5>43g@i|BRt&fad8WR*W5BH98^CU#jjdfNe=e@{>1q*p7-oF9)pzciGBNW6SN zgf}v3V_Qy{c44*xyJe{6^mFX$h6bkrJ)AeTzR_W=3@E)%6I#5M4n$IPalbPJw-YXm zy^b=fzFrN6TVJz@At&zu0$;olNIt1y2uvVZc(Z>XR^hb+=^PvIIT#)IHTBjiUm}do zH(F9&et#Gj#=fuipm@{bn`Pwq4EX9QjtRBo#M^N*&TQV?A&)QtlNhF@Tpa0jQc=%b z6ihl+r^?h?v}52Ef!%2=!1d*nrwgbje zO^Hu|zs=*k2;!^$&TnR-)jX=p!;|VxuRk>;?R~~*NjOXUD`j#PzeH$ZvKK7EQ3Ox! zEZT@*rBRwB_?SwwO4$P(&>|dp*LGA{yw`Op8$n(XsH?(%bR9htGrG9pk!j(2x~k8$AkJ7#<4;Zw!Qz1m7S zo{J%7Zb?oATx0V4IT|WkaO8s2x799t2{~5Qr*U#U8O$d!tM8Jl z@NErW!Lc8hp(L_M-qiEj!(X)3WHkq#@E=6OnD-zhMq_S2M44}NttJi^2saT1tv69w zH?G~aXYb2@FRpaaL1)ZOh&uh1@lOJ9XwKxg5oR8o|5m52JCu9B`}4sSJ9c}xAEV%8 z%*h8r+Qy~3ih1H^co~{JkohOfrS#j5qHJ>%Lw_*|n3cEEMD3SX1-}Tm<_S z=U}UV^L#arwrkTZM2@xwURR@Dz~sAtdh+^2&d5x zIthmdL^S%Jd@sE;BG8e0TM$~7U0b^tiI@9p$tUIr2kOXJGVSh2thbkmZ4Nir{CYl7v5y*sk&p3A9$s#4%xgLQV2F>4IW;CiC!Q~ zTl@SmWIpxJ$aAETYOBVScipZaF}c+0e_)P;I|llF$ns;ER-2WaOxb`cIwd>Wk^ZbK zSp5)r3>EkT4I;iK;!S~t@L(rhOE;Mo`+PQ)G@C+EbA6gC+uQ&>#5>}?B(_BzACbm@ zH*EjP14Dq*D;~-IjjrxY4 zn`(m&+68$K=`+Au1(>({1#9f$H6x3C^$qp*pn3D@TKa-4P_>}>^?q4`jw0-ej{GXX*R8kTunL^qM zV6YI`SwQ4W^d>fems!VxheZRYNYA`vW>vRG)X`q=CbUjJoP@Hi`<|KkB=l~pj%ZAI zY;K5-ZI>j+zTZM58ZmZH-?0mfeZvb5@o^~Fprn_16SoO%Zmf$GMVi3A{OZsTKnTe| zVQ#qj9zonijnf-~-sn~g{EcomC@ge3sSNjQ*CS75W_Sw+p5%odX=BsUO#mWgR5a|V z!hkQ?BoKo1pH_la;sD#HfqU%-`KJj~Q7wVR%=Nv=$m2er%kZ^ULaz-Fv6m%3Te{iI z9|Cc2M5kLr#I?K4OvzY-BLIP_6u=t>c`2WCQs3P;KBCJrz*irqFllyCv?DJ~h*#F+-r(_=S^W2zo zr$)6UVy9+VV){5*;DN~BfAsJsOtf`+GAweboWNzHSS^xOHA4rbseA|l!f5}dR$0Q~ zAXr)S(_=s~Z5dZt+2ynv*)5rbMCA_>qV`b%S`jo6j%v@6p}Yncf?2|U2N0pvzk z=w{Gmna7=$Fd7w))qScbioo(@wBgT#*+QN@%Oc_Gv#S2Em1KkAjEMM5!cpX!2 z0b&*+5JX;=)bt;@M}XsNJ;rz`+JXtpILoie=(J%N!+GQyS~SDdD_WTwKpvy zRSxh0cCgSIaSDt+a)TmS3%VtZ(B`5Mtwg=9eO}VdIMf#`S8#?{GSg%BY1v-z| z?S3H}_v3RIv%dRGWDR38Gx`NB;n;4&*R57T(P~>SCGQ~una)(-IMM)_C~*4yHAB%e zvj{_gU5{_f?8sAFboYC}Ll&YrT#{AM2}O=Su_a{7TD{{|R^+z&WyhM##xPT0)yt;m z+BH?vaf7IT*z6x}^7S&=1D$Kk4RT%wf7$ztBkk{6oDwa#i&iqXT2oV3Sp!*^KrKDm zFsSIkL(-rM!~&H0s@w#ukErVy7@nuNA}bWn)TcWt}a(6rly% zV}Q@y)oB82^AD;_9fkVhJkmVK8y*g_4dgc{u@sIZ##xVPu^W+7y(}>`B`Oew{&KW~ z*f(mnJ;3!1iG7BV~l)Aq< zgQ>z5h5CF+0?z;~g?MW9L9+`&J*iXbux6n`k*h>|Pe*53qL>%!r!UwqOUw3W`_uUn zmG^<#(!sT=7u`*$5UQb6)xAlrZ(NS$@|NSA_u^3`JmXTz&!AA(`f6dNJf{OCo?CVB zd|`!j1=+veN|MYk$Mc;6?yj`#mr)7Wk2c2~o2$m2ozmBp?=Cl_N)*65N9Yjv$ zjII{~Jq>mIT_RUlx)Pd_9{gv3r@sE1K`l_NDO46nK`p6nWe3^6V$ofcv9hCVR$`_z z1B`IV!}doNsEgh=Fn%HSvb&eJmjvq_z29;DWu({=wwGqE@dyc?i z64ca4++eO%{u9Gd?Y|AvWd`HIA9B6?^W(ua%+8|12S4&`ER!kugyQ=4(lkVAPaVQG zrlNS7Y|661O*l;{{7-qR?et5Llhr3U)eBwLjp@HDrjZPNq$_VLl&EBv$=C29oajZQ zyD~gAZ(=^~ywi$dT==snE)vAgPj$n?#ye)SRFJzz)X17V&oTmy!xF1+Omb;P2sF2( zF~&mZt9zf7+SO>jLR&k#F!x${g*eF45QEmkQQzZY;POuZ)=kc*+0u<>L7oJnXqT&_ zD5(_v975A#Q6P;F9g1>t_ zZY$f1+jF9sNaTbY{30_wXaT5`^lFz2Q=!OkyNF2sA`%u~dj$4SsoO62C~<@K%WzW! z%udc4W4bb&)3iRXV!7$Krtv*LQ1F0`6V=oL7)O{|NwkQzrdIB!k?H8$-Y&h0|=56p@I4~<1xb!Q4`NrX_+ z%@`3E@(?U@aJd(K*VFsD;6<&J{#4g)v0z$40{zKtMh}L z7RTG(Vj|A89L}@BEIb&joFq!4S-$l>sK&*`IV{JkojE}iDspLeh($0k%4G2I5~n zRn#lVZwcYg(htK#&SzUb+dUCa_<7QH6sn=O3T zn-*PdSk#zwM~&P(Sxl_Kg6v~TGZc8Fr+9X{dM~qf9tFgCUA)gQy zeJ^Mq*F$&IX!C19&H{8KyH)k&eU0^R%&34aLG2$$TC>{W8+OhyrjX-Ls^`(oxCwm9 zTxqV5{Or?{kP9R9kK@+0*F1hqIHpyD(>5~%PEz&?vjfo?vIB+B|Eb(d;C1pO{N@=@9{Q3>&drX)<7$U? z`_k@Zj|QA^^Gqhvm~Un}XP)=nju_AN!2Fb}6kmb1F2Cn4Z;OU{UYeci-($M$ka(U-p#XUho8FF`>? z_?_CW()7g8sCxYzSUoK%6bxHLsW_?rb%cgDtl7{{9z@dTAR+_yxoF6(-hNOtQ?c9ssyYwzSJe7~8tWKPHC&W}&BfOI9S>B_E<(TrfW(g(Xh97R`G9e?;v6D%rcU*bUL97 zKr?(p@TFAt8?{W=y!uyZjt;$s85x&7=G+?ooMi(gc~{%~3Zw7x`$3rEB%5)}s&4;2 zt<8WzKDU<8C%`;yNH3Q`I>F?4*;f5>zSBZp)VUX|D;Y;uNtg&vpL@8J?At1?W@lB% zRGgEDXky(4hF-dw9VNH!aw;%E!QItSuv^{w9pFt!NSmESKojKBQB5f>ckyb?c+Ew| zuuVTebovXamd4T_)GM0Jvod`VZBk$QE02rSOU4ezrL70%+*L16-C35nQTWA=ZDNnA z5kc8rwfY1+{e~qmW7%U@$Yp$IolhvF?ky>Isn6)s@y?*9xhav{idbpIPXY@k)FUXc z%~i^y5pqo%tJ_EKS+E~)THIDC6*5#bkc+`v7d2*|m^J5Zi4h1E&H$4BIY>3|)jZW~ z`!*@j@M1wf9kG3I$Petn`-(8f;=;wT2{3k%mL*&nmnfVCvv0|KaLyX=E!4FsC(3cm z-Mi{AuCHr3Q;akI@Qwn6&M}Ep<*Nxs*V$hHe>=H|NN3tJt4XrHI6dz^Vr?)rLke3D zqeJZIOy9{HmTheZj%wT( z|Au8aWoz*Y|LIenP4@DNuFbgqj|@^8wO&n?EXn?YsOF1(jtsks?4oH0eJB)8T%}bp zu&|dBTCvG5EMEAjHQljbv6-m$tUsD1@@AR#v!$krs0ydtR+@80u{0xjV~*?~8fyKJ zFJ=taCHFp)1#?1TH0No4kZX3azS3G#^igKb$lI0MnRcYuMe;fMPl2WV9ece#Gdm3^ z#jTFDal(#PTGWj8bL3!${Al7& z`+SXUVecv@^BTejAM}-X;bl{ELl2+P?%UyuD~*i|uxa+~rR|y#s=E(Fd#&#$P59Kr z5f=<}Q8aDdIQ}GHkqCV~mm$8-c)sT;xEjHouI8&%Q#}!<6{)DvJRzGU14u8vbB9;#L58V_7Px`|r44=*Ui_x$|*?2Rh!Uo=rX)ctD`a2r2c>sJJgr3|bKR_fnv+w0u8 z?^nabRiK?D!&N9Yge#1lz>6gf+&t(gcYI87_%weLJQnm;B!o1wttuU^LS#ta*DWniAIT&n!itEl{W`MF4ma zgxAAg?3)TeoUwhn!5v*P*Jpj08qrOe=a0VAUH!!zwL@Lxt=_j{hBu?GbC(y#zOy`< zLuy>N1ho}k!WqiqBwnohtN$dO@IMoJH`v|klC*s+J{ChcIXHuz?`eVsarK`8Av_01 z9M#W&*Ip1amTRIRw&cQ>ceUvLt6i0ActDv65!t35_3t~2j#oVD9zia^8pk~z+MY&HCeMF6~P!z_|9Rcp* z0iPTam~hV{#Dyzra|qFcI6F=-@)QH$!L3d0y6I5?cTbA)M2=4OcDfqBC2lo`|3%7? zqZ+T~om|?CRzvZK+N6|+cHKP{l}aSPTGXnqu7jYt9B()>@oRimjf~;LkDr26BkXc( zv%Zk0G>^U=%pK^O^Ui`T-W`?CA4gUU(;^N>R!A`oHTdF)Lko!>7)xzMX~x&4Ke+XO zHf{=LjWO0Rn`U|1-@L&v~H${7=GLch(DrF{DdJeBdQ9 z-cK>(zhR-!FRh;DJbA`H06du7%afJ1W132ooy$FRH++1)2%G*jmuxOr8N~(`Q02fuM)J3jhEy81hVS7v zC0x8Oyr0lxPWc=mtjOOEYp`11t?;uGf*W`H0SpH!PJ}Lq_y8%b2(V%cTM_ZlI4(=B z*I&rj>fy3j`_8^L2VaK8mK1_^va2lU0=(Tbtkp{!4Qo<23&RhIGSGqz2}aM$ddLPx zZcBp)Iej88g*{7JQ4M^qdw6*bDSvkPjGR@gl{QskeIj0q4Vt7E4Q&b_xp}q0dM*YL z-$K66s}1(PJ6*%p2bTf+3#Uos#)%RBFb@`L0cfoT(Skhap7BU_$O{A5q44cDc zrei4cvz8Fv)bb%lTb3P(>{6{q&HnfmwMS4p&Abbg&*o16rw&ewLL=6-5JhMg7e>1 z`5)^1A1W=QH%Y8J=1$4D&B1!~r?yv&Q$sLuRA`e&M)kC(wrIV{|LumhcCGA4%ajpI z%wPxxlMlP_QzGccCFw;p+JRvDUrA>xGm&obUTv2*Cb4_5IxA>!A+LxoW>5cZ$$-zj zThQdy^EDx*0n-yZQX${C>OE8=qmZ z>#t(HiSJ0^3(K7{6116{Wh9#9WLhy zqc@&>W2vE(hpDxumHrqnn6#{uy~S-}CdL%R!3P*$UiG*j9trj~tYeTn;_2D_$T#$! zNag1}jH0#pAOtj~8+!W<0X*DCncS4w)2P|(5elxooi#KGpZ{!W(;vA$5XrU%EMs@! zNQ-Pzgt#_Q1l{cccGJ$1c$HAaxN$o zNaw70Gr$zN7=Qv34Ltxi9>OVN{VMRZ=JIkYd10pDbpOur(REp1+I@;nr4s)&!=sM_N?C%EtGOsU}6Jr>pd_(QPf+|xcB;d)4}#siP1TsKkGN0 z0Wtmo$+P7=wsJika&H;R>p4Tt328i4l*iaX&{ux~vxD*Z9ndH?>w){?muuR?riIE8 z<93e$2Gxh|67qVux2lHHY8q@!&T+qwUxFx1*S;<0v;g2jfP>9l`Y)-Zg>4HgW!{JR z!7ExMn82E+u=dBl6)K0}xvtHz1Hd#Zk!bO`j07oKT4syre0ZjES9IT!Bq5i*F=)FCr0h*`e{nET?g&_ekD~a(7h3bvtw#(I*01Y<$klPLLS3!@bNeQ@I=eAF2YOOKI zs_wSUqYkNFYw+7SI|T(*0cpxf7a!a!S*3NF`v|NaqFxgcaHU-Eu3j!q1QMCyW)fRZ zb2Vf|S_YGu&YrHOn%gQCx?Co!qH<+N z0ezo8gVF((UalV-C;jwF4Qevy59urahR%^9J_Cw%5I?AWF?ey3_p?0f>DWf6d2ONP zmJ{!r?nPtn{EteTD@ct4*aa)Mga57tBl=J|8)gjSDsUi(4bYt;TkfYwXBI19FRW|` zByjf5%vLT60Ffel2W8hNRDj6~*18#O1qZ}7=DIu3o-@OmG~y@>*!iAsu4^J zt)lstiY)r(GeD-pFwD^V-{Yije`Sob!xQ+ zo#_tMBdzG;GY_D^m6rQnJ|ol9FD1NOPmqCUfWKeEqa7@rtA zeLdEw#-oQAXCtF=*h3vt~HYwmkz%rc_iTzYz)JIJb+oJ^E?WF==Nl<;U}smM_?Ja?lXb$Dsg8 zs2*Mpd?~>7bL$seGabv<=Vtl8nZ-EhG)hS-H1VsU`39QMJBzF!4K9Zc)D$|z=|-)&x0rbzEb0wgJgqY1I_v&C+*1szst8d zai$9NKhdpDV!W>(MO*Chb&Bul&d7+9hvEDY9>d0In6A%&nTM*AUK^T0Vpaw^c>Fp3 z%O-mUyv@T`9`iPF;X6h|jPC<{p$*!%J%XhFEl~`72H*fQIL1O&GruJEPb(UHoPGxM zx4eB(h321x%3s1Le4UtlfUm;uNcs}#B1u%G2*v(UZ~kX7yQxyl)Hw~U$k(l1jA#-t ziG-0_ssTj%@=Uy}dNZi%PN$>tu5#@1jdVIFYkIydl@N^e7ZW>ly7)LpZkZ7-%uvE2 zn)yt;P7Mx-RF!b&-`JqM1uc8*h7}+|rV#pUfn6gTnFN`nBv_{3Un=%3rM{S2Q>aSH&ol6}BV^3LE7mz}BmRmv1>|Y!Wu?03-LU0FhPs@PAQL_~8)Ip$h z!9Zbpm8QvZVbX%VI^G38?W7fg>J+qNV=e=IE@_Xv;w^icayCvE8AJ!^q-59i`!;e( z_l=@Ic{&d~rhD(s5s@N?-ne)^G<{!^_U=9Lxe_V<#EY`VjwL`1Bj7B-WJfZmz}*w0 z5-`b^37`*VsUg=&RY=vG${1Zaa!m!ZX?6TIoxxTas z5UE$)#Wq|P5!`-fudL4nN$aIwaG+^0+lkX4@PGiRvMb(G7S0foZHpg_n@FsGiWq-Ab@adleqENpNNzdS|Lid&v6shel=?m z8UEf~=r4HC38bj4@GeqzcsxtXlwITE5ewLMR{r5Joi4WdwJ$jbLvn#NeZGceOK7wA zdeKnUQmQn;f@`ifW-*HBDd1vY?^4*;v+#97hKX7b*d)z$@5K`Hmqin-GI|5)s8H!a zuu>-|a~^$`yd|D)ecjS{6r>ANe0j<&-+Aip8Nd|BjH#$P)epE0jv;lOY`cAk`g|)_ zPgxQhhb3rLDnzI9u1fV3sqiDRga;wvZt0u1*cgD$Ki^E4J(t{~C_`NOh; zUDX|{|B>x0&M z#3fO!XQ-aHef(gkp1{iT1lKg8wD=-qxiJ#wwWRaO}i$1SIJYO5!YwnOcO4!twvG=Iv`q$h8+>myS<)g4~PS>lEncPk$br&K`)umI|{4>{HHomBd!#$P)2+`y$0Ih)pI_{jNHpnFVbCq zCD*&Wz6I{9dR))FG-G2(gTNi)*qv4`yo;MeG74r_bQ@>{d$_xU>r^f(Csj(LT&pJv zP;>B;4$zsMSj}FR?wCo>DjmDbe(30UBhDmC?;yBlb$c)3MIi9sL4((Wgg-%3Nl)Tx=+D_E<#Z_MS9$)yh+yY`7z;);^t_*eK)Q@6K(&_l%%LQJ&J@d~ z0}EOF!*~05C)qp~LA+NXPhS$shaAwURPg}WK^Ugo z&^f^eJ;WHv*4g34|L|b{EEZnLTK2%syZo|PG{eyuxf!nU@FE)O&od|y>q7q8VwF=o zsYCarTKmWu3b`#wwB&*z--FpvbNB(+WpX^T%X*T&HavO5rn2-=IkDK%S|qe*Ji~h# zlyIyc<|&rx8yH%XS>&uw^TrcUOg|I89~!(UV(+{*1%3mUyy8{kHKzV>i@f=eEU!uY zfoD9j`J3eToLfCtdz!fJmr~Hc+h#+)c&(}GCJ`Vwe2<5cr-q=uzMg}{no=7x>r;Hv z(Q34_DXdE{O|UG_H~RorC%~5JvDBi5^DtJ0K9z{V-u^cxMP#5a4s_yy(k{nN*M2+U zuy%$_-6nRiax2Dw+}rQ+R?w_%U5o-!zCr%N>Xlh9v7BTblPguS3b1*%h-_mbC$2OY z=3?P#MJW;KSxVj(F6jU5@(^iH&c0xoHLapH_lL_cdP%j@W}*aG4Q*kL0^nBKjB({V zq!4{XxoS0Y?EYeU`Mf*&lCSG~p8+kal*qbur^h9E`<`buf;H7zeAn;y6?{{@g34te!4 zOotr6D12)H0a{DflgaSU8Pqc;%>sqHDH$)MEy9t=S{p$f!g#i(kJ0y?Xn+h9u31`s zRMgK81_6%+*^)(jPP%$_>`jY}2Dj1pf4-RLpo|IVrv-~GLN*GOEY8l@qc&5#z6T*?KgRyQ!>YMZ9$y<2G#jumTML`-DlJ zuHY7SCtHO$)nzmdx*v9Q433>;9~wi?Ob~} zRO=dFPD1)noYgr`=jc3pKl?e)Ie(l#`fGh_J>T=K_j$i>ecx}rzu)_&vrU$} z8F;E(=UmZefUWge;qdz^2Z^u9s~{HfE2uZ;A{q>i@sI}LRR=;6FLCtnnDC@h0AwXTbi<` zUs2OfkCuVCR_IOPUN6(RB#lR2=@q=VH~z};j)1Xdc zdlGu{TXE5Kl@o#4J!0Y1VSC{z%>54jLC;l(2fWD+PohLhz8!<^ z(PN{>XqQf`I>eC3LBZWK#>?Oe@iXchicf}JLha_4&XBX-g_(bdSR`i^=`^svKNqvj z!d7p3*Q+|Nok*#B4g(XG8e6S++_+JOa3s9aNj{knI^tgfO`AS&?;3oqTQ{gVTQXg+ zJ3@OEbE3m}c5?EFsJ%{ONd@)0jLWVAmQSXyUXSwkg+Gpb>6o90MrcgeC1I}KaKG>3 zv>U2&VMgY(Z3$za2m<2ksodJ@k-7Id`Imy;_hl1x{pc6b>tYFcDiuD4=-Hjn5UHMN zO@-wPixlkSBYVfbqncIp!urag_O>BZSf5@%$>woedzeL3->H!@T{zcG-Yo2)T$Wom*G@4l%?04 zt`D&o+nF6L0&l-^e$JV=K+JtxBkO!IB?6;2I>NM)H~m2Pbl*toVVQsXi!FG{xDgFZ zuL?Q;f=!EQ8_`&2+}J_*C{xZX+5MV~N~Y~B@2cCMlTwZ2 zeHZiX)yc2XwiXE#Szn)Iwh>Kk{&+PeNO3h;))y;<+S`%dlXp4pv;zl%fats=#a$S? zA*&aRyX7hE{EEqpAg^>M$9VVNgA&aTpETNLAqU+;SP6k@Fga>dAMHnDZMaxAuRX5N9acM#i}S#qj1LclBpFlXu?R8ai&ABwy6yX* zs>H`BzU4*7)XOJtbX*i?qz!8))fqrq8-zd{Q3yN%DNR*3{!<(eLt0OcF>nzI+fg%hksa77&C=UI0PGz z+-X`#IyY5*irTfa5|r*pT67{B^_N|hu!222YP&VZ1!Lp2qh^q}@=-0b4%ncQY$ZYl z-Kr3A84Bllk|RU6b#KZ(O)u{|iOnorDR$fJFGmf_ZV#&2fvzw}D=F65F)B~j<>y(F z`mKX6{Gzg_RAZiX%-=*7gsiTB#i33N@hy>Sc0yp$A+psbvLB3Trf3QV&J!X;PK67B zuUxOR`7O3$zc*9Bw;}$yvcLJ_Utc*8Lf%Z)mGDFC1$1^WuK1=QijF@TUP`a=VS)%Q z<2tk%)QlQ5P1SDP4MeVge6SYJ(Oab@jd7%Uz|brcHLKR~1x@|qU+CB5CjZ?tNFj2T zz_S-LlnMdvwp`p=0a+Rpw5mn&MT+w8;*h*WA#gwuB50fzTxm#Z4EV~{FSS5Gdg0&c zhX2L=mbbLc=Hv-5KC#G!t}!8Ck{D*{?LXyNWl_#$VxhDj1EJlj zO(Wr;ti}Y56#`MVVAUvCZcA6pqM-tqnRMI~EGY&<@~Y!+Xfs3Z_E25X(o<^EMn z6;j0u5ZwJ43^@YXU}jTbL}6^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!;>2Q2e)mDzSUa3w>w_^)MncIr_3C;)=8f^ z$b+6#Q=446hg*@&r0l_ydIsxgiIWol1h(6lugjR6 zbzN)M5*^m5r)DmhWFfHG?bTxAT|!6Z9cETm;hCtq{%AeFd*V0Sxa&bXcWrIU&|UYq zPc0?9XW8N3hh*8FDLmhBoNd>$D{<|;ZlY?_ZKCRJ!}C8`aNpI>{rQyO? zM;`7=Y%<=?to&5w8*6@j){mgKVcxS}C;fI~+4d^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!`UB>g>v&h+&{8w;>OLpX5D%xuba2%-r};W zc7OTTC&r$=wz4)eU+4YuAFhkMLwE5_3!3ois6*g!-p|Jh3LBN?%{}pWQcZpT)6Y-nCoTejL|2+S|JQ z(Af#1ZjLhi#d8xLO8<r=p?msg`YJQgqx3V{B`|W zRMso2+SWB5YJDYJn>6onXNp)a$yzSGHnQV{#Yvm0lJ(ku7ui2a^#Ao`^M8g5?_Qhl zYmd=CwSMQq4^sB#2kt5R>z_G$CtmOD&j)2Ue*S0J=l}3ZmG06NO`kYt9c}1yO$s~m zB;k2aWb;qKucA-xv)Z^X%$z56?aSM^XBD@qJMM6-iF@8)H9@&lrtk5~xNiB5KOB>^ zO`kq)aMZXbpJTr9=mz_VO9I)JK3u)~Y}lt)<_VMiK51lI&uNI5IR9?-b?)CT^(PL^ z|N1ihKf}Vi*O&iiIF$O~^S|2qPpyUj8IEP2urq%h7N>9}>_3BF=DjPf*?d29m$d6G TdoqEgYsmwvFJBk%|Gx-0Uuo~(b=mLO1004N=0OvCR zEdYd;7EDV60fWJGbP#$*4kkth21ai7ODr6`SFZB$UV*{j2nk{MH8BAg?7E_en3S}f zoZMAmWi=%kq=c-T%)b@^($Uc|GB84!n4mKJFn*c;v(DQ9Y!Cn|l`l2$8i0xoNX-U3 z?*d%C@JR#wcLDxWKq_hw4J{Z#N6&CkP{#_O0#Z{`fv9O{K%k52h>Ljuh>eDwUs{v) zlDP}`8k$2UGUYu);8s;Tr^Qz?Le|wUijJP^GL-v@ppfu&5m7mL1w|!g6)kNYT|IpR z!#kE%);6|w_HOPT_dOqYJ@gL<3o=Jn^70D`i}1xI z)it$sg!+a?Vn=6JcTaC$|G?S5o$P-H7WMxk`!BHn<{|+Yseu=VN6iM%0IY{AFM2x$&6wBY zHp=B80(ShVx>Q1f9UvD>lqvTJy0=X6FC%tPix3>M$7?xnj8ZY|9CVB?lagXKpnG*_^?E0gfFt zTNgdVI>zirU0I@)<(DCF`%^xO11O2fiY(iyp02un$To>-0ng24$9^ z^V4Q;YYHOR-KiQMTT-8##-kSEE_JC`5ptKGBvcdL=&$hv)2M3Bwz-oNri9~j-A@x{ zBzl6Qn)nM(I>zi1E19wn@iujDzB7Od_1H?(br+4CsdFln4nI#eAv0NG%L_hL6YD2h zYbC@b+;CQq(korx80z7jFwXtVBSxNBb>MHZf zDDlbmlbaN$S16BVS&Lmp4v7`#cqwSM|U;gnFb$WWQN(?ODXE zRsp0C;hk8B3j1K-VkN{F#aXb1dyjXV^*Sz9wiZo+%+khGOmt>h= zq}Gs}oNO8sBXeT0Z0yAj1?*m){z*2*H#Z-?)~jz!H530nzeMGd&MDRlY}Q}F@bY{< z@o8IdR=J(*t$2BCdJc)9F6l~9Zv(V}^p*ReccWvvjh9f~H%GU3#0tkUwvN4Ecit3w z3R>Sh!vLQC=!FMvjuKlhKXhWJSf@OySIl5yFF9Oa=E^x z@o;&kBJ?;CDNqzb9J9RSIOthykFd~`+m}qcp;{s;b>r2bGZl+!EFV$jFuOjsi4zob z8h&)zRb%XhuPyS{S`%}BxAK19GK!g*R!O<^@1^l3<-*S32a{&6E29cJO$C&FD=G() z!H*$ruyv%3=}KuU$ArsL^@0{i{!T`y2($pF z<+l`t2@4rb8BBdd{vM=PZ!uw)$qQ}lDRy1F;;R5r;`8VByUP4wo@*;9Nm||aD1Y;o zMpzN7L&4$)3hxqZ=2?5}Y=Skqn8()=0+f!_-r6|oZL^Q|axR)u&zy{oS!*|@&REsx zWReV^(7U*ve%iUV^^=-2Ev&LnT$8-#(g=&aZq9tI;`# ziYnRGZvh>O_~RvN%w&0w3HwjGI_pOYsxUth|0lsZl5JZkQ-^C`RpHBX&RIJ6e$KC6 z*oMQ2rvZ62OpZ8LH|lr}cwmHjTIg=26X%9xdRGztwf}K6G6uRC;K0PU&~6fkM9)@( z8dLH~hO4a6yhKdUa7Zt*rE&R&2D^^8M@2;8GLKrvTxV2&<4t9ksB=J|^e16#GyVv5 zyju4PEZ+=(xvD znj_6I41V%neez<4a6K;>K(&rA%v06~7KmA~EANe!3yQ2QXo?`_oyZ|%{^I1fDY?fm`^v8hGB?YM8F;b&A(0%2WkF^TTm zNyV6boTPhgYwfgn*|Dm%vZ4}3cLh`|oY;yTrh?%Z*!Y>_v8kh~niE=@#CTu#v7C#fD=A z6_rJD{xe2s_-`b3PqfSg(l_YhpEek9_#@B}7|2AsZc9e)Ppkibje zi{Uf(Dl^u4!=73SUt)gm6W3GMyMM~`I6h-~WZ2E&^eko&zTEDqa@73EVCTGOeS-1S zQ&N@YXK31Y({u?x_4~rq8N$4>*y6DWXja*w?$wS3mJR!}%=FB}Cf&UOxe(lUN8B;Z zaJPY!B6Sm1b2S;V@}|k^eSh%MtCk6VE|q+nV^*i8J&>6>TMC=>ar{R>ln^X%}Nt?)x9KuwE7lqxAceQc1!&5Mq%a}=n>|vwZ?0y zmB`_*W6Ce`j>_U*XVfW^qQRbc1!{^5z=(`vDXyz)bzTk}m-TIJs; z#yo{Nn9^>Ztj2F?9lb=3f*yZL2ZW4RUzJ+f8{(5Ct7SLG&$pxa8@yw&`m4$|W+kRT zO|Y1s3=5do*mg49o9hK*s;#%{>5e`ZXs`bceN_I@YBJ!b5*S=yu(bQqUNRmYZ9-uh zbJ+eT)%IvbsaO09I&wIq+p6g4{lB-YICt;+w@{GBJzmplCV4^QZpz+zD=%M7#e9hF>8WB! zQA5Mc_f21rAGvLpZk@GlQ{$n1rS`({2a-?+1{RKcO^hYsc^xH+gR_h&d)UUsAgW9Z zu5w4aqwd&bopX_e#=$#C1(Sgx&qri?)TS;wSKa1~5?aDkI6xnr1GuEyht%BKQ#QgL zzy01V-%=ikH$eGzM?<1QJ)hG<+`gX!LL(V^w9sD$|B;N1`JfPyKd*O%I~eqhZGuu~ zlcRS#GWujnFaIIwGFEJ-ql3Q&{jKV!-$~2sKx9aQF;D*mF`XDdKmj zyBIp(IQgw2@b}uUYQ4b*>Xd||ADMy`RUQ$jqmgZCm|x%M*?WtdEA(Jwg-X(J^9}8m zx{0!-388Tp+={Wag9ef|q?5*4H0)D&>3FIF*-O-dkU!py@7cI#x>>dQ7eb!M#hfXZ z+VuyC)fqWf`k+-=gp7CaDTFZgSt`|!E7(UHIozXLxd!zVrix-W)t{HGgYnf%rs-A0 zB`eu|?)1m~P)#fgI96`+NrZ;&s1Sy8LL1!_WAXl$el_5oBr1{C6r$!1kOXJAbGM3alnmo@pUk9jC#G;qp(Y?}_88+&Mqs zTtPBi?zR(qG7PdPP_SALFjt3s4v0Odt2TvtohCLF?))76K5LXd$9~HO@{IMfAZ!P| z1xhV|I36uH@%!}jIOt6&aN(Tywc@qxV?6fM)epWeHs zF+jiLDy69rj_y^lSC3s964tv<@hD#_CujbgShVh$cC&qBC|W@q{&gaLCFjiZ#G=oO zbicq&C`s_lK1vr`DQ#wsU$WMo0ZQVz=E_Gon_LvqtfS8y$2WRDQ4=h{g zqdy@WqJAy;Q{C-|4;819`)9*9ZjqhhmWu<^t6Lnr-`c*<9QInh<0Fz@@^Tg0hgyFC zKXmDZZBBcgvc#V82A%`xxN-yeN}QI5T+$v)BfNRQ;H$!??Q`jo$;xFTEZrB;wf;z0 zzj0i*fWun~XPk4tUuzLKv(~fqmoHo6WhH$4kvJ;+_O_4OM-M`x-J29!K(M+@*9-G~ z_a*d>{upk#%T;7fE9kE$?~*Bv*F3_9^`=iM>2H5JX$Vnz6v{v>DMdGMxdNQS>P?h4 z5Y?k{_keTVrS?Y5702uj2n)QRV4@lBs>IE%+hs~~2U18xtP6AI}BkEkmKN!eZ%alModu&sqcRhFZ^f*@N zgj6O(#viJg{L`k+T1`=l!QXG@vQGyhqV%%E3&r6&Sk1%%BQkU7tkU7nxl;>E`S=4~+_ z4mprlFJ5NQ;M_>D_a2=swQCXQP}rh+r?8*&dhHUf|Cl3>P7gh~ik~1{*eN6hVZS_bhB2>))ew8|94*GpW&EAX^u%>K9@CHU@1yYokKY)S;fpXNHAmq)~v zK}%Z-6bfA$4^;lie5G3M&4DA2Y3s)biSJLmPuz@B_h3s1JKC>FW~vzfj>jGgTu54e~wg@vjH|Y=TFk#l;G}>X;He; ziTMxbIY;Gw&nc%G;pL$z62V3o$f_N{eCOtlDml!ObR4&JW`|-Tl*{!ITyTBABBz6C z7|Tv*;`YYfSIJM)Q@!ke1S)$7-cZkt7CVz0-9l>pDfA#JWZ*;-AMF{x*3xh1GzsnZ zlk(FP$Dq^PdV>kbcoc7qR z5fjYg<%kOk($$)9lI*apTjip^DMdJb8)<`LDlA2I@W}gAJ*7B~`I_%n0a_u-h}?3? zFjB2DzEQ-l^;4Dq($j3(8n;r8R)w&-T7A?`Vc=e55L-zKmIn=BHwk7I3IFH5+&O@G zV{ak9US(i*&^uJD5n?E+1ag*EdZoLyxVuf3jhHdgG~ z(U|?0KzG6?E|qHS7@kIbx(4FAyBF_Vd~fF*;8RrL)5QZ7t9|PwL`eR*=V;^^upb^r zR9e38+W>X-=rL%ghWn=|B;ijSbnBXG+;eOL<+VTEcZGoheJy>NZGq!%$n^rnE0vZBc`P05Y^tX(ghG5wlB;SV;=&BupMeNQ^E+D%^<<6Z(jK z=-&Ec`%(W`FLmk!-g}T!vsgNz0Jx;mn zkO3@|etx6Qa8+8S!T}MW(Vf{_KOUfV^>z~>GILu}8*O;y7JW%WL}z5$EA#PxM5mI> zMv;CLFXC_!!ut`oIKofUqMgsnkIiG#704`t!)VcxCBfEl&?| z^*_^g(cJBJaF_$@j#UQy)>f37&qo`z+)}unZtx1)u1t*uPh|xWj*3@?Aa?T)FBvdZ zgP(=A$s_}mhZ$o5e$z%|tYlE}a@-3GKM3&elyQTMDo^nCNf^uS0waGI* zL?T>A*R7w?fg0w1uxPFDcF|bT^y`8>MNARLELKgFpUj&ukvPF`8j~ocJ`!4T9zw@$L+OSBKaDe zG0B3NZe2KSN96iukOs;m-k^qlq~k9q#riqK$W_ z=7w#MI(V$CNiI+v?OFY)Cg;hME}R)>Jg~}&D#}P!N*E1IQe)wbjXoHmm$Nx~%s`rR zxK2zpUQjlmeh2L_vAXbdSmJ~vHcS?3GG(L`&G^%oMLRpua^F0nK1z|9&?lS+Wv8->b zYb7+L^1R5@rsKcuEavQ~jJTA_4CJ2ceIF9s@t5}_dHc_2++&jCfe2%Z7k`Dj9y^UT z$erqP4%n%=(G<2>^RPas=LT2&C?w9vuT?Y+gWqT)sT{!f4LN=V;tH{ZV)ov}d$b{$ z5!O?k_Rk5sUW_tY!G7yodxpc820HOBIJoD;rJX0>`A>c9p?-J%V9}g*%G@Bov->nW9RzbHs{y!$1vm#o sI=eDXv-&!wGw0#qDMI1hedhbpzq>#HzNQE-QDn - - - - - ISO Locale codes - - - -
    -

    -ISO Language and Country Codes

    -2 letter language codes are derived from the ISO 639 standard; country -codes are from ISO 3166. Here are the codes for the locales currently supported -by the L10n kits. If an entry also includes the country code then you must -use that as well when creating the locale directory or naming a file. -

    -ISO Language and Country Codes table

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Language NameLanguage CodeCountry Code
    -
    Chinese (Traditional)
    -
    -
    zh
    -
    -
    CN
    -
    -
    Chinese (Simplified)
    -
    -
    zh
    -
    -
    TW
    -
    -
    Danish
    -
    -
    da
    -
    -
    DK
    -
    -
    Dutch
    -
    -
    nl
    -
    -
    NL
    -
    -
    French
    -
    -
    fr
    -
    -
    FR
    -
    -
    German
    -
    -
    de
    -
    -
    DE
    -
    -
    Italian
    -
    -
    it
    -
    -
    IT
    -
    -
    Japanese
    -
    -
    ja
    -
    -
    JP
    -
    -
    Korean
    -
    -
    ko
    -
    -
    KR
    -
    -
    Portuguese
    -
    -
    pt
    -
    -
    BR
    -
    -
    Spanish
    -
    -
    es
    -
    -
    ES
    -
    -
    Swedish
    -
    -
    sv
    -
    -
    SE
    -
    - -

    -1997, Copyright Netscape Communications -Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/nav40/isonames.htm b/l10nkits/client/windows/docs/nav40/isonames.htm deleted file mode 100644 index f3603451c68..00000000000 --- a/l10nkits/client/windows/docs/nav40/isonames.htm +++ /dev/null @@ -1,1029 +0,0 @@ - - - - - Named Entities and Numeric Character References - - - -

    -Named Entities and Numeric Character References

    -The following table lists all of the named entities found in the -official HTML 2.0 RFC. - -

    1st column shows the HTML source of the named entity -
    2nd column shows the result of using that named entity -
    3rd column shows the HTML source of the equivalent numeric character -reference -
    4th column shows the result of using that numeric character reference - -

    The 2nd and 4th columns should look identical. -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    &quot;"&#34;"
    &amp;&&#38;&
    &lt;<&#60;<
    &gt;>&#62;>
    &nbsp; &#160; 
    &iexcl;¡&#161;¡
    &cent;¢&#162;¢
    &pound;£&#163;£
    &curren;¤&#164;¤
    &yen;¥&#165;¥
    &brvbar;¦&#166;¦
    &sect;§&#167;§
    &uml;¨&#168;¨
    &copy;©&#169;©
    &ordf;ª&#170;ª
    &laquo;«&#171;«
    &not;¬&#172;¬
    &shy;­&#173;­
    &reg;®&#174;®
    &macr;¯&#175;¯
    &deg;°&#176;°
    &plusmn;±&#177;±
    &sup2;²&#178;²
    &sup3;³&#179;³
    &acute;´&#180;´
    &micro;µ&#181;µ
    &para;&#182;
    &middot;·&#183;·
    &cedil;¸&#184;¸
    &sup1;¹&#185;¹
    &ordm;º&#186;º
    &raquo;»&#187;»
    &frac14;¼&#188;¼
    &frac12;½&#189;½
    &frac34;¾&#190;¾
    &iquest;¿&#191;¿
    &Agrave;À&#192;À
    &Aacute;Á&#193;Á
    &Acirc;Â&#194;Â
    &Atilde;Ã&#195;Ã
    &Auml;Ä&#196;Ä
    &Aring;Å&#197;Å
    &AElig;Æ&#198;Æ
    &Ccedil;Ç&#199;Ç
    &Egrave;È&#200;È
    &Eacute;É&#201;É
    &Ecirc;Ê&#202;Ê
    &Euml;Ë&#203;Ë
    &Igrave;Ì&#204;Ì
    &Iacute;Í&#205;Í
    &Icirc;Î&#206;Î
    &Iuml;Ï&#207;Ï
    &ETH;Ð&#208;Ð
    &Ntilde;Ñ&#209;Ñ
    &Ograve;Ò&#210;Ò
    &Oacute;Ó&#211;Ó
    &Ocirc;Ô&#212;Ô
    &Otilde;Õ&#213;Õ
    &Ouml;Ö&#214;Ö
    &times;×&#215;×
    &Oslash;Ø&#216;Ø
    &Ugrave;Ù&#217;Ù
    &Uacute;Ú&#218;Ú
    &Ucirc;Û&#219;Û
    &Uuml;Ü&#220;Ü
    &Yacute;Ý&#221;Ý
    &THORN;Þ&#222;Þ
    &szlig;ß&#223;ß
    &agrave;à&#224;à
    &aacute;á&#225;á
    &acirc;â&#226;â
    &atilde;ã&#227;ã
    &auml;ä&#228;ä
    &aring;å&#229;å
    &aelig;æ&#230;æ
    &ccedil;ç&#231;ç
    &egrave;è&#232;è
    &eacute;é&#233;é
    &ecirc;ê&#234;ê
    &euml;ë&#235;ë
    &igrave;ì&#236;ì
    &iacute;í&#237;í
    &icirc;î&#238;î
    &iuml;ï&#239;ï
    &eth;ð&#240;ð
    &ntilde;ñ&#241;ñ
    &ograve;ò&#242;ò
    &oacute;ó&#243;ó
    &ocirc;ô&#244;ô
    &otilde;õ&#245;õ
    &ouml;ö&#246;ö
    &divide;÷&#247;÷
    &oslash;ø&#248;ø
    &ugrave;ù&#249;ù
    &uacute;ú&#250;ú
    &ucirc;û&#251;û
    &uuml;ü&#252;ü
    &yacute;ý&#253;ý
    &thorn;þ&#254;þ
    &yuml;ÿ&#255;ÿ
    - -


    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/nav40/kitOverview.html b/l10nkits/client/windows/docs/nav40/kitOverview.html deleted file mode 100644 index d3fa4b99683..00000000000 --- a/l10nkits/client/windows/docs/nav40/kitOverview.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Kit Overview - - - -

    -Kit Overview

    -This kit is primarily intended for knowledgeable 3rd parties, familiar -with the localization process and with commonly available localization -and resource editing tools.  Using this kit, you will localize the -components that make up the Windows front end (the Windows-specific, -user visible portions) of the Netscape Communicator or Navigator. You may -use the Netscape-developed translation tools (DogLev and ToolCool) or another -tool set of your choice to leverage and localize STRING TABLE, MENU, DIALOG -and certain DATA resource types. You will need to use a Windows compatible -resource editor to localize the remaining DATA resources and to resize -DIALOGs. -
      -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/nav40/kitStruct.html b/l10nkits/client/windows/docs/nav40/kitStruct.html deleted file mode 100644 index 6106dce9ec7..00000000000 --- a/l10nkits/client/windows/docs/nav40/kitStruct.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - Kit Structure - - - -

    -Kit Structure and Organization

    -When you install this Localization Kit you will find a number of new directories -on your hard disk. Each directory is named so as to be fairly self-explanatory, -but the following diagram and description may help avoid any confusion -you may have about what's what. -

    -

    - -

    -Description of Kit Directories

    - -
      -
    • -The kitRoot directory is wherever you install the Netscape -Localization Kits.
    • - -
    • -The l10nkits directory contains the tools and documentation -you need to complete your work (see below)
    • - -
    • -The products directory contains the English language version -of the files you will be translating. This kit concerns the files contained -in the 32 bit Windows client product.
    • -
    -The l10nkit directory tree has the following structure: - -

    -

      -
    • -Since this kit concerns the Windows client Communicator product (as opposed -to our server products) all the relevant documentation and tools are found -under the client\windows directory.
    • - -
    • -The docs directory contains documentation on the Kit, including -the file you are reading now.
    • - -
    • -The tools directory contains any tools provided with the -Kit, such as the Netscape Translation Tool.
    • -
    -  -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/nav40/l10ntree.jpg b/l10nkits/client/windows/docs/nav40/l10ntree.jpg deleted file mode 100644 index b05ad158ffdb092b7e2a3f4eec12d77cbaa93275..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5947 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 IR4(TJ3-U=!XaE2J diff --git a/l10nkits/client/windows/docs/nav40/localizeAboutplg.html b/l10nkits/client/windows/docs/nav40/localizeAboutplg.html deleted file mode 100644 index a06206ad25d..00000000000 --- a/l10nkits/client/windows/docs/nav40/localizeAboutplg.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - Localizing ABOUTPLG - - - -

    -Localization Notes for ABOUTPLG

    -This resource contains the HTML and JavaScript source of the about:plugins -page. You only need to translate the user-visible portions of this file, -as indicated below. DO NOT translate tags or JavaScript language elements. -Unless you plan to create and support your own plugins, you probably should -not localize the URL contained in this page. - -

    Note: this is a cross platform resource; you may be able to reuse this -localization work for Macintosh and/or Unix versions. - -

    Just translate the items in magenta: -

      -
    • -<TITLE>About Plug-ins</TITLE>
    • - -
    • -document.writeln("<b><font size=+3>Installed -plug-ins</font></b><br>");
    • - -
    • -document.writeln("<b><font size=+2>No plug-ins -are installed.</font></b><br>");
    • - -
    • -document.writeln("For more information on Netscape -plug-ins,
    • - -
      <A REF=http://home.netscape.com/comprod/products/navigator/version_2.0/plugins/index.html> -
      click here</A>.<p><hr>"); -
    • -document.writeln("<dl><dd>File name:");
    • - -
    • -document.writeln("<tr><th width=20%><font size=-1>Mime -Type</font></th>");
    • - -
    • -document.writeln("<th width=50%><font size=-1>Description</font></th>");
    • - -
    • -document.writeln("<th width=20%><font size=-1>Suffixes</font></th>");
    • - -
    • -document.writeln("<th><font size=-1>Enabled</th></tr>");
    • - -
    • -enabled = "No";
    • - -
    • -enabled = "Yes";
    • -
    -  -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/localizeAllPref.html b/l10nkits/client/windows/docs/nav40/localizeAllPref.html deleted file mode 100644 index a26a94d00d2..00000000000 --- a/l10nkits/client/windows/docs/nav40/localizeAllPref.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - Localizing ALL_PREFS - - - -

    -Localization Notes for ALL_PREFS

    -These preferences are identified in the localization notes as "ALL_PREFSRCDATA" -followed by the Javascript function name for that preference.  For -example: -
      ALL_PREFSRCDATAnetwork.search.url
    -The localizable portion of this preference will appear in the XL_STR field.  -If this value is a string, it will be surrounded with quotes.  If -it is a number, it will not.  Do not delete quotes if they are present -and do not add them if they are absent!  Many entries also begin with -tab characters or initial spaces; it is best not to alter these, as well. - -

    NOTE: the following section is for reference, -showing the way the complete Javascript syntax looks.  The entries -contained in the translation databases separate the Javascript function -from the data that function returns. Comments are reproduced in the COMMENT -field of the translation database where appropriate. - -

    You only need to localize the following entries. The parts you need -to change are highlighted in majenta. Comments -are in green. Localize URLs according to the -rules. -

      -
    • -pref("network.search.url", "http://cgi.netscape.com/cgi-bin/url_search.cgi?search=");
    • - -
        This URL is connected to the Navigator's Search -button. -
         
      - -
    • -pref("browser.startup.homepage", "http://home.netscape.com/");
    • - -
        This is the default home page value that is attached -to the Home button and the Home menu item.
      -
    - -
      -
    • -pref("browser.personal_toolbar_button.max_chars", 15);
    • - -
        This determines the maximum number of characters -a personal toolbar button title can contain.  You may not need to -change this, but it's there if you do. -
         
      - -
    • -pref("intl.accept_languages",    "en");
    • - -
        This determines the default value of the ACCEPT_LANG -property of the META tag. You can see this value by choosing Edit | Preferences, -select Navigator | Language; the default value will be the 2 letter ISO -Language code value you supply here. -
         
      - -
    • -pref("intl.accept_charsets",  "iso-8859-1,*,utf-8");
    • - -
        Replace iso-8859-1 with sjis for Japanese, euc-kr -for Korean, gb for Simplified Chinese, Big5 for Traditional Chinese, iso8859-2 -for Latin 2 languages. -
         
      - -
    • -pref("intl.character_set",  2);
    • - -
        You only need to change this for non-LATIN1 languages.  -Use the CSID Reference table to look up the -appropriate value for other languages. -
         
      - -
    • -pref("intl.font_encoding", 6);
    • - -
        maybe not used, 6 = CS_MAC_ROMAN, 1292 = ko, -263 = trad. chinese, 264 = simp. chinese
      -  -
    • -pref("editor.template_location", http://home.netscape.com/home/gold3.0_templates.html");
    • - -
    • -pref("editor.default_template_location", "http://home.netscape.com/home/gold3.0_templates.html");
    • - -
        Localize these URL according to the rules.
      - -
    • -pref("editor.html_directory",       "C:\\My -Documents");
    • - -
    • -pref("editor.image_directory",       "C:\\My -Documents");
    • - -
        If the My Documents directory is translated on -the localized version of Windows you working on, then match this preference -with the localized value. -
         
      - -
    • -pref("editor.color_scheme",     "Netscape -Default Colors");
    • - -
        This string should match the value used to translate -STRINGTABLE42169 (but it's not critical if it doesn't). -
         
      - -
    • -pref("ldap.directory1.description", "Personal Address -Book");
    • - -
    • -pref("ldap_1.directory1.description", "Personal Address -Book");
    • - -
        These entries appears as the description for -searching the personal address book in a mail directory search.  Translate -them the way you do all the other instances of this string. -
         
      - -
    • - pref("netcaster.containers.container1", "-3;'Channel_Finder'; 'http://netcaster.netscape.com/finder/container/index.html'; -1440;0");
    • - -
        Localize this URL according to the rules.
      -
    -  -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/localizeBookmarks.html b/l10nkits/client/windows/docs/nav40/localizeBookmarks.html deleted file mode 100644 index a5a2533efe3..00000000000 --- a/l10nkits/client/windows/docs/nav40/localizeBookmarks.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - Localizing Bookmarks - - - -

    -Localization Notes for  BOOKMARKS.HTM

    -As part of the Unlimited Localization Program, you may choose to include -the default set of bookmarks that came with this kit, or you may create -your own bookmarks file.  Assuming you include a bookmarks file, you -should save it to  kitRoot\products\client\windows\platform\locale\nav40\program\defaults\bookmark.htm. -
      -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  -
      - - diff --git a/l10nkits/client/windows/docs/nav40/localizeConfigPref.html b/l10nkits/client/windows/docs/nav40/localizeConfigPref.html deleted file mode 100644 index 074d6b9b871..00000000000 --- a/l10nkits/client/windows/docs/nav40/localizeConfigPref.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - Localizing CONFIG_PREFS - - - -

    -Localization Notes for CONFIG_PREFS

    -These entries make up the configurable Guide Toolbar and Help menu items -and their functions. As part of the Unlimited Localization Program, you -may define your own set of Guide Toolbar and Help Menu items.  You -MUST remove or replace with your own links the following Help Menu items: -
      -
    • -Release Notes
    • - -
    • -Product Information and Support
    • - -
    • -Software Updates
    • - -
    • -Register Now
    • - -
    • -Member Services
    • -
    -CONFIG_PREF items are identified in the localization notes as "CONFIG_PREFSRCDATA" -followed by the Javascript function name.  For example, -
      CONFIG_PREFSRCDATAtoolbar.places.default_url
    -Most items in this list of preferences consist of two related components: -a label and a URL.  To localize a label, only edit the portion of -the preference that are within the second set of quotes.  For example, -
      -
    • -config("toolbar.places.item_0.label","The Internet");
    • -
    -The words, "The Internet" are contained in the second set of quotes; that -is the part you localize.  Because these are button labels, you should -try to keep them as short as possible.  If you find that you must -use a long word or phrase in your translation, you may discover that the -buttons no longer display the entire text.  You can increase the maximum -number of characters the Toolbar buttons will display by increasing the -value of the browser.personal_toolbar_button.max_chars preference. - -

    You can use the "-" character in a label to create a separator. - -

    You can specify a sub-folder in the Guide Toolbar by specifying the -URL to be the word "FOLDER".  For example: -

      -
    • -config("personal_toolbar.item_1.url","FOLDER");
    • -
    -This lets the code that lays out the toolbar know that the current item -is a folder with sub-folders.  DO NOT localize -the word "FOLDER". -

    -Forbidden CONFIG_PREFS Resources

    -There are some URLs in CONFIG_PREFS which must not be changed in any way.  -The first kind is the about: page URLs: -
      -
    • -config("menu.help.item_12.url","about:plugins");
    • - -
    • -config("menu.help.item_13.url","about:fonts");
    • -
    -You may translate the associated labels but not these URLs. (You can, of -course, delete them entirely, but then you won't have access to these "about" -pages via the menus.)  Refer to the Localizing -URLs section for more information. -
    Finally, some items in CONFIG_PREFS are non-localizable Javascript -preference values.  For example, -
      -
    • -config("toolbar.logo.frames",-1);
    • - -
    • -config("personal_toolbar.CreateNewToolbar", false);
    • - -
    • -config("personal_toolbar.NewToolbarFolderName", "");
    • -
    -Don't alter these. -
      -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    -  -
      - - diff --git a/l10nkits/client/windows/docs/nav40/localizeLicense.html b/l10nkits/client/windows/docs/nav40/localizeLicense.html deleted file mode 100644 index b9e69023df5..00000000000 --- a/l10nkits/client/windows/docs/nav40/localizeLicense.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - Localizing the License - - - -

    -Localization notes for LICENSE

    -You must include the Netscape End User License Agreement included with -this kit in your localized product.  The license file may be found -at: products\client\windows\platform\en\license\export\eula\license.txt. -The Localization Kit gives no information on the nature of this license -agreement; it only tells you how to put a localized license into the software. -Whether or not you localize this license (this may depend on your desires -or upon the laws of your country), you must include this in your localized -binaries by following this procedure. (This example uses Microsoft® -MSDEV; if you prefer a different resource editor you may need to execute -slightly different steps): -
      -
    • -Open license.txt in a text editor window.
    • - -
    • -Choose Edit | Select All.
    • - -
    • -Choose Edit | Copy.
    • - -
    • -Open resdll.dll (make sure you have the right one!).
    • - -
    • -Expand the DATA section, open the LICENSE entry.
    • - -
    • -Choose Edit | Select All.
    • - -
    • -Choose Edit | Paste to paste the new text over the old:
    • - -
    • -Terminate the entry with a null character: type "0"
    • - -
      Save and exit.
    -  -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/localizeNpnul.html b/l10nkits/client/windows/docs/nav40/localizeNpnul.html deleted file mode 100644 index 316a882bff4..00000000000 --- a/l10nkits/client/windows/docs/nav40/localizeNpnul.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Localizing NPNUL - - - -

    -Localizing the NULL Plugin

    -The so-called "NULL" plugin is the default plugin that ships with all versions -of the Communicator.  It's job is to list the plugins that you have -installed, and if you don't have a requested plugin, to help you get it. - -

    The NULL plugin consists of a single file, npnul32.dll, located in the -kitRoot\products\client\windows\platform\locale\nav40\program\plugins\ -directory.  Localization notes have been provided for you to use when -localizing the resources for this file.  Instructions for individual -resources can be found in the COMMENT field of the matching DOG file, npnul32.dog -(or npnul16.dog for Windows 3.1) -

     
    -  -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/localizeURL.html b/l10nkits/client/windows/docs/nav40/localizeURL.html deleted file mode 100644 index 57718bc00fd..00000000000 --- a/l10nkits/client/windows/docs/nav40/localizeURL.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - Localizing URLs - - - -

    -Localizing URLs

    -Many resources of all types in the Communicator contain Internet addresses -in the form of URLs (Universal Resource Locators). Most of these point -to locations within the Netscape domain; as part of the Unlimited Localization -Program, you can leave these as they are, or you may change them as you -desire. -

    -Internal URLs

    -There are a number of internal URLs that should not -be changed.  These are the strings that look like about:[some -value].  These point to internally contained resources, such as -the main About Communicator page.  If you localize these strings you -will not be able to load these pages.  The main examples you might -find are: -
      -
    • -about:
    • - -
    • -about:plugins
    • - -
    • -about:fonts
    • -
    -For more examples and information on these internal URLs go here. -
      -
      -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/localize_these_files.html b/l10nkits/client/windows/docs/nav40/localize_these_files.html deleted file mode 100644 index e4a11446b20..00000000000 --- a/l10nkits/client/windows/docs/nav40/localize_these_files.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - Localize these Files - - - -

    -Localize These Files

    -This section tells you exactly what files need to be localized. The following -tables contain two columns: -
      -
    • -The file to be localized column gives the specific file name. The path -name given for each file is relative to the Windows Front End Localization -Kit's starting point; e.g. \kitRoot\products\client\windows\platform\de -(German in this example).  If the file or resource name is a hypertext -link, further information can be found by following that link.
    • - -
    • -The purpose column describes the basic purpose of this file.
    • -
    -Table 1. Binary files to be localized - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    File to be localized Purpose
    nav40\program\brpref32.dllBrowser preferences
    nav40\program\editor32.dllComposer User Interface
    nav40\program\edpref32.dllComposer preferences
    nav40\program\mnpref32.dllMail and News preferences
    nav40\program\nsmailui.dllMail User Interface
    nav40\program\nsnotify.exeMail notification User Interface
    nav40\program\prefui32.dllPreference User Interface 
    nav40\program\resdll.dllMain Browser User Interface
    nav40\program\plugins\npnul32.dllNULL plugin
    - - -

    Table 2. External files to be localized - - - - - - - - - - - - -
    File to be localizedPurpose
    nav40\program\defaults\bookmark.htmDefault bookmarks file.
    -
    -Table 3. DATA resources requiring localization - - - - - - - - - - - - - - - - - - -
    Resource Name Purpose
    ABOUTPLGHTML source of about:plugins page
    LICENSEInternal software license agreement
    - -

     
    -  -
    - - - -
    -
    [CONTENTS]
    -
    - -
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/nomenclature.html b/l10nkits/client/windows/docs/nav40/nomenclature.html deleted file mode 100644 index 0c9415cf4de..00000000000 --- a/l10nkits/client/windows/docs/nav40/nomenclature.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - Conventions - - - -

    -Nomenclature and Typographical Conventions

    -Typographical Conventions -
    Words in italics typeface represent a variable term or phrase, -meant to be replaced by another value at "runtime."  Example: -
      locale -- replaced by a 2- or 4 letter locale code; e.g. zhtw
    -Words in bold typeface, using a proportional font, represent a literal -value in a string that might also contain a variable word or phrase. Example: -
      4.03 [locale] -- 4.03 [ ] are literal values, -while locale is a variable. -
         
      -
    -Words in a fixed width font represent file or directory names, -or DOS or Windows commands to be typed as they appear.  Sometimes, -part or all of the path will be in bold, for emphasis. -Examples: -
      Change to the kitRoot\l10nkits\client\windows\tools -directory -
      Execute RTRNKIT
    -Nomenclature -
    Throughout this document, certain terms and phrases will be used repeatedly: - -

    Table 1. Nomenclature and Typographical Conventions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    kitRoot directory indicates the starting or topmost directory of the Windows Front End -Localization Kit.
    platformeither 16 or 32 bit, depending on the version you are working on.
    localein general, this refers to the language into which you are localizing -the product. The list of valid locale names is defined in the ISO -Language and Country Codes Table.
    localization databasea database generated by a leveraging tool from a set of matched binary -resource files. 
    localization notesany special instructions, including the "translate/don't translate" -flag, associated with a given resource.  Localization notes are contained -in the localization database for each resource module.
    leverageThe process of merging previous localized versions of a file into a -current version. 
    forbidden resourceA resource that cannot be changed from the original value without (negatively) -impacting the functionality of the product. These are identified in the -localization databases.
    -  -
      -

    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/pixel.gif b/l10nkits/client/windows/docs/nav40/pixel.gif deleted file mode 100644 index 094fcbaee5b5171b30a7a7a90b312f9c2712281e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41 pcmZ?wbh9u|WMp7un8?8J|NsA)XU{T#fewfSi8C-U`7knA0|46Z2qXXi diff --git a/l10nkits/client/windows/docs/nav40/projectOverview.html b/l10nkits/client/windows/docs/nav40/projectOverview.html deleted file mode 100644 index 1b11879cd02..00000000000 --- a/l10nkits/client/windows/docs/nav40/projectOverview.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - Project Overview - - - -

    -1. Project Overview

    - -
    Welcome to the Netscape Communicator/Navigator -Localization Kit!
    - - -

    This localization kit will assist you in creating a localized version -of Netscape Communicator or Navigator for the 32-bit Windows platform. -Using the instructions and optionally, the tools provided in this kit, -you can translate the product's menus, dialogs and error messages to the -language of your choice. As long as you follow the terms of the license -agreement under which this kit is distributed, you are free to do what -you want with the resulting localized product. - -

    Localizing the Netscape client is based on "binary" or "no-compile"localization -model. Instead of localizing resource script (.RC) files, which must be -recompiled to produce a working localized version, you work directly on -the binary resource module (.DLL or .EXE) files. You have access to localization -notes to assist and guide you through some of the trickier areas of -the product.  Finally, this kit contains several tools developed by -Netscape to expedited the localization process; however, you may, if you -prefer, work with the localization tools of your choice. - -

    The no-compile localization model offers a number of key benefits over -source file translation: -

      -
    • -A simpler kit environment - no make files or bulky source trees are required.
    • - -
    • -Leveraging previous translations is simpler when resources can be stored -in a database, decreasing translation time.
    • - -
    • -"Forbidden" resources can be locked from over-translation, improving the -quality of translated products.
    • - -
      Localization notes and instructions can be displayed along side the -actual resource being localized, allowing the translator immediate access -to this information.
    -  -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/reference.html b/l10nkits/client/windows/docs/nav40/reference.html deleted file mode 100644 index b04f14751da..00000000000 --- a/l10nkits/client/windows/docs/nav40/reference.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - Reference - - - -

    -Reference

    -This section summarizes the references used throughout this document.  -In addition, other miscellaneous references may be found here. - -

    Table 5. Reference Links - - - - - - - - - - - - - - - - - - - - - - - - -
    Locale Table (local)Locale -Table (remote)Communicator -Data Sheet
    Communicator International -Features"about:" -URLs and easter eggsCSID Reference table 
    Cross-Product Encoding -UI Names
    -
    -Following are links to the two main header files used in the Communicator -project, resource.h and allxpstr.h. Resource.h contains the resource IDs -for the Windows Front End resources, while allxpstr.h contains both the -ID and the actual strings of the cross platform messages. These are provided -for reference only, as the resource name is -sometimes more descriptive than the numeric ID used in the translation -databases. You do not need to localize these files! -

    -  -
    - - - -
    -
    [CONTENTS]
    -
    - -
     
    - -

    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/reportingBugs.html b/l10nkits/client/windows/docs/nav40/reportingBugs.html deleted file mode 100644 index ddf085d774a..00000000000 --- a/l10nkits/client/windows/docs/nav40/reportingBugs.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - Reporting Bugs - - - -

    -Reporting Bugs

    -Any bugs in the localization kits you find should be reported to mozilla.org -as soon as possible. When you report a bug, try to be as specific as you -can about the exact steps needed to reproduce the bug.  Provide a -complete description of the problem versus the expected results.  -You should let us know if the problem is 100% reproducible (it happens -every time), or if it is intermittant.  If you think that your operating -environment may play some factor, let us know the details of that.  -Finally, before reporting any bug, you should make sure that the problem -doesn't also happen in the US English product (if it does, we still want -to know, but it may not be possible to fix it through the localization -kits or tools as they are now). - -

    To report a bug, post a message to the following mozilla.org newsgroup: -

    - -
    news://secnews.netscape.com/netscape.mozilla.public.general
    - - -

    Be sure to include the information described above. -
      -

    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/resource.h b/l10nkits/client/windows/docs/nav40/resource.h deleted file mode 100644 index ad41d803971..00000000000 --- a/l10nkits/client/windows/docs/nav40/resource.h +++ /dev/null @@ -1,3949 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by netscape.rc -// -#define IDI_COMMUNICATOR 1 -#define IDR_MAINFRAME 2 -#define ID_CONFIGUREVIEWER 3 -#define IDC_REMOVE 3 -#define IDC_ADVANCED 3 -#define IDR_DOCUMENT 4 -#define IDR_NETSCAPETYPE_CNTR_IP 6 -#define IDC_VERIFY_HTML 7 -#define IDC_ADD_NEW_TAG 8 -#define IDM_MAINFRAMEFILEMENU 50 -#define IDM_MAINFRAMEEDITMENU 51 -#define IDM_MAINFRAMEVIEWMENU 52 -#define IDM_MAINFRAMEGOMENU 53 -#define IDM_MAILTHREADFILEMENU 54 -#define IDM_MAILTHREADEDITMENU 55 -#define IDM_MAILTHREADVIEWMENU 56 -#define IDM_MAILTHREADGOMENU 57 -#define IDM_MAILTHREADMESSAGEMENU 58 -#define IDM_COMPOSER_TABLE_SELECTMENU 70 -#define IDM_COMPOSER_TABLE_INSERTMENU 71 -#define IDM_COMPOSER_TABLE_DELETEMENU 72 -#define VK_APPS 0x5D -#define IDD_ABOUTBOX 100 -#define HOTLIST1_DIALOG 101 -#define IDD_ADDRESS_LIST 101 -#define IDR_EDITFRAME 101 -#define IDC_BUTTON_BACK 101 -#define IDD_NEWSGROUP_SERVERTYPE 101 -#define IDD_OPENURL_BOX 102 -#define IDS_COMPOSECOMPOSE 103 -#define IDC_BUTTON_ATTACH 103 -#define IDD_HISTORYBAR 103 -#define IDD_LOCATION_DLG 104 -#define IDS_COMPOSE_PRIORITY 104 -#define IDD_PAGE_TITLE 105 -#define IDS_WARN_REMOVE_SERVER 105 -#define IDD_ALERTBOX 106 -#define IDS_USERNAME 106 -#define IDD_PP_FOLDER_DISKSPACE 106 -#define IDS_NICKNAME 107 -#define IDD_CONFIRMBOX 108 -#define IDS_SPECIAL_FOLDER 108 -#define IDD_PROMPT 109 -#define IDD_PROMPT_PASSWD 110 -#define IDR_SEARCHFRAME 111 -#define IDC_URL 112 -#define IDD_URLTITLEBAR 112 -#define IDC_TITLE 113 -#define IDC_NUMLOADS 114 -#define IDS_ATTACHFILE 115 -#define IDB_MAINFRAME_MIXED 116 -#define IDS_COMPOSEOPEN 116 -#define IDS_COMPOSECLOSE 117 -#define IDS_WHITEBOX_MENU 117 -#define IDD_STYLEOG 118 -#define IDS_CANCEL_BUTTON 118 -#define IDD_PREF_CHOOSE_FOLDER 118 -#define IDC_ALERT 119 -#define IDD_JUST_HOME 119 -#define IDS_SENDLATER 119 -#define IDC_CONFIRM 120 -#define IDD_JUST_TOOLS 120 -#define IDR_HISTORY_MENU 120 -#define IDS_EXAMPLESPECIFICDLS 120 -#define IDR_HISTORYSEARCH_MENU 121 -#define IDR_HISTORY_ICON 121 -#define IDS_COMPOSEOPTIONS 121 -#define IDC_OVERANCHOR 122 -#define IDC_OVERANCHOR_OLD 122 -#define IDS_GO_OFFLINE 122 -#define IDC_PROMPT_ASK 123 -#define IDC_OVERANCHOR2 123 -#define IDC_SELECTANCHOR 123 -#define IDS_GO_ONLINE 123 -#define IDC_PROMPT_ANS 124 -#define IDD_ExternalViewerConfig 124 -#define IDS_ADD_LDAP_SERVER 124 -#define IDC_TITLETEXT 125 -#define IDR_MAINFRAME1 125 -#define IDS_LDAP_SERVER_PROPERTY 125 -#define IDI_MAIL 126 -#define IDS_ADD_NEWS_SERVER 126 -#define IDC_URLTEXT 127 -#define IDD_DIALOG1 127 -#define IDR_MAINFRAME2 127 -#define IDD_ADDRESS_USER 127 -#define IDS_NEWS_SERVER_PROPERTY 127 -#define IDC_SOURCE 128 -#define IDI_ICON1 128 -#define IDS_ADD_MAIL_SERVER 128 -#define IDC_STYL_TOOLS 129 -#define IDS_MAIL_SERVER_PROPERTY 129 -#define IDC_STYL_HOME 130 -#define IDD_HISTORY 130 -#define IDS_SERVER_POP3 130 -#define IDC_STYL_WINDOW 131 -#define IDD_APPEARANCE 131 -#define IDS_SERVER_IMAP 131 -#define IDS_SERVER_POP3_STATIC 131 -#define IDC_STYL_NETWORK 132 -#define IDD_STARTUP 132 -#define IDS_SERVER_IMAP_STATIC 132 -#define IDD_USERINFO 133 -#define IDS_POP3_ONLY_ONE 133 -#define IDD_HOTLIST 134 -#define IDS_REMOVE_MAILHOST_CONFIRM 134 -#define IDD_NETWORK 135 -#define IDS_MAIL_SERVER 135 -#define IDD_USERPASS 140 -#define IDS_HELP_BUTTON 140 -#define IDD_MAILURL 141 -#define IDS_BROWSE_BUTTON 141 -#define IDD_UNKNOWNTYPE 142 -#define IDD_HELPER_DIALOG 143 -#define IDD_NEWMIMETYPE 144 -#define IDD_CONFIGUREVIEWER_SMALL 145 -#define IDC_FileName 148 -#define IDD_SPLASH 148 -#define IDC_FileSize 149 -#define IDD_PRINTING_STATUS 149 -#define IDC_TransferTime 150 -#define IDS_PREF_REGULAR 150 -#define IDS_PREF_BOLD 151 -#define IDC_BytesTransferred 152 -#define IDS_PREF_ITALIC 152 -#define IDC_StatusRect 153 -#define IDS_PREF_BOLDITALIC 153 -#define IDS_NUMBERS_ONLY 154 -#define IDC_USE_EXCHANGE 155 -#define IDS_EMPTY_STRING 155 -#define IDS_PORT_RANGE 156 -#define IDD_LICENSE 157 -#define IDS_WIZARD_SENDMAIL 157 -#define IDD_SECURITY 158 -#define IDB_MCI1 158 -#define IDS_WIZARD_READMAIL 158 -#define IDB_MCI2 159 -#define IDS_WIZARD_READNEWS 159 -#define IDS_SENDMAIL_STATIC1 160 -#define IDS_READMAIL_STATIC1 161 -#define IDS_READMAIL_STATIC2 162 -#define IDS_READMAIL_STATIC3 163 -#define IDS_READMAIL_EG1 164 -#define IDS_FINISH 165 -#define IDS_NEXT 166 -#define IDS_WIZARD_COVER 167 -#define IDS_COVER_STATIC1 168 -#define IDB_PICTURES 169 -#define IDS_SENDMAIL_STATIC2 169 -#define IDB_NPOST 170 -#define IDD_ATTACH_DLG 170 -#define IDS_SENDMAIL_EG1 170 -#define IDS_SENDMAIL_EG2 171 -#define IDB_NPOSTR 172 -#define IDC_ACTIVATE_EMBED 172 -#define IDS_SENDMAIL_STATIC3 172 -#define IDS_READNEWS_STATIC1 173 -#define IDS_SENDMAIL_STATIC4 174 -#define IDS_SENDREADMAIL_STATIC5 175 -#define IDS_READNEWS_STATIC5 176 -#define IDB_IMAGE 177 -#define IDS_SERVER_EXISTS 177 -#define IDB_FILE 178 -#define IDS_INVALID_EMAIL 178 -#define IDS_READNEWS_STATIC2 179 -#define IDS_PE_ACCT_SETUP 180 -#define IDB_IMAGE_DELAYED 184 -#define IDB_IMAGE_BAD 185 -#define IDB_IMAGE_NOTFOUND 186 -#define IDB_GOPHER_AUDIO 187 -#define IDB_GOPHER_BINARY 188 -#define IDB_GOPHER_FIND 189 -#define IDB_GOPHER_FOLDER 190 -#define IDB_GOPHER_GENERIC 191 -#define IDB_GOPHER_IMAGE 192 -#define IDB_GOPHER_MOVIE 193 -#define IDB_GOPHER_TELNET 194 -#define IDB_GOPHER_TEXT 195 -#define IDB_SINGLE_NEWS_GROUP 196 -#define IDD_VIEWER_SECURITY 198 -#define IDD_CONTEXT_SAVE 199 -#define IDD_BOOKMARKS_PROPERTIES 200 -#define IDC_MIMESUBTYPE 202 -#define IDD_DOCI_GENERAL 202 -#define IDC_MIMETYPE 203 -#define IDD_PREF_STYLES 203 -#define IDC_SaveToDisk 204 -#define IDD_CONTEXT_PRINT_STATUS 204 -#define IDC_LaunchExtViewer 205 -#define IDI_DOCUMENT_ICON 205 -#define IDD_BOOKMARK_PREFERENCES 205 -#define IDC_ExternalViewer 206 -#define IDB_GOPHER_TELNET_MASK 206 -#define IDD_INTERNETSHORTCUT 206 -#define IDC_ViewerBrowse 207 -#define IDB_GOPHER_AUDIO_MASK 207 -#define IDC_Description 208 -#define IDB_GOPHER_FIND_MASK 208 -#define IDC_Extensions 209 -#define IDB_GOPHER_FOLDER_MASK 209 -#define IDC_AddSubType 210 -#define IDC_DeleteSubType2 211 -#define IDC_STYL_WINDOW_T1 211 -#define IDC_STYL_WINDOW_T3 212 -#define IDB_IMAGE_MASK 212 -#define IDC_COMBO1 213 -#define IDB_IMAGE_BAD_MASK 213 -#define IDC_FONTFACE_COMBO 213 -#define IDC_EDIT1 214 -#define IDC_STRT_EDIT1 214 -#define IDR_SRVR_INPLACE 214 -#define IDC_AUTO_SAVE_MINUTES 214 -#define IDC_PAGE_TITLE 214 -#define IDC_HISTORY_HELP 215 -#define IDC_EDIT3 215 -#define IDD_PREF_COLORS 215 -#define IDC_HISTORY_GOTO 216 -#define IDC_EDIT6 216 -#define IDC_EDIT_MAIL_TOADDRESS 216 -#define IDC_HISTORY_ADD_HOT 217 -#define IDC_PUBLISH_USER_NAME 217 -#define IDC_EDIT7 217 -#define IDC_EDIT_NEWS_TOADDRESS 217 -#define IDR_SRVR_EMBEDDED 218 -#define IDC_STYL_COMBO 219 -#define IDC_STYL_DEFAULTS 220 -#define ID_STYL_HELP 221 -#define ID_SYNC 221 -#define IDR_MAILFRAME 221 -#define IDD_DIALOG_ENCODING 222 -#define IDD_ENCODING 222 -#define IDD_PAGESETUP 223 -#define IDD_PAGESETUP16 224 -#define IDR_COMPOSEFRAME 224 -#define IDR_NEWSFRAME 225 -#define IDI_IBMHOD 226 -#define IDI_NETCASTER 228 -#define IDI_PROFILEMANAGER 229 -#define IDC_APP_STATIC1 230 -#define IDD_ADDRESSBOOK 230 -#define IDC_APP_STATIC2 231 -#define IDR_ADDRESS_MENU 231 -#define IDC_APP_STATIC4 232 -#define IDD_ADDRESS_NEWUSER 232 -#define IDC_APP_STATIC5 233 -#define IDC_APP_STATIC6 234 -#define IDC_APP_STATIC7 235 -#define IDC_APP_STATIC8 236 -#define IDC_APP_STATIC9 237 -#define IDC_APP_STATIC10 238 -#define IDC_APP_RADIO1 239 -#define IDC_APP_RADIO2 240 -#define IDC_APP_RADIO3 241 -#define IDC_COMBO_FOLDERS 241 -#define IDC_APP_RADIO4 242 -#define IDC_COMBO_SERVERS 242 -#define IDC_APP_RADIO5 243 -#define IDC_APP_RADIO6 244 -#define IDC_APP_RADIO7 245 -#define IDC_APP_RADIO8 246 -#define IDC_APP_RADIO9 247 -#define IDC_APP_RADIO10 248 -#define IDC_APP_BUTTON1 249 -#define IDC_APP_EDIT1 250 -#define IDC_APP_EDIT2 251 -#define IDC_APP_CHECK1 252 -#define IDS_ADDRESSMESSAGE 254 -#define ID_STATBAR_SIMPLE 255 -#define IDR_TASKBAR 256 -#define IDC_NET_STATIC1 260 -#define IDC_NET_STATIC2 261 -#define IDC_NET_STATIC3 262 -#define IDC_NET_STATIC4 263 -#define IDC_NET_STATIC5 264 -#define IDC_NET_STATIC6 265 -#define IDC_NET_STATIC7 266 -#define IDC_NET_STATIC8 267 -#define IDC_NET_STATIC9 268 -#define IDC_NET_STATIC10 269 -#define IDC_NET_STATIC11 270 -#define IDC_EDIT 270 -#define IDC_NET_STATIC12 271 -#define IDC_ADD_CURRENT_URL 271 -#define IDC_NET_STATIC13 272 -#define IDC_NET_STATIC14 273 -#define IDC_FIND 273 -#define IDC_NET_STATIC15 274 -#define IDC_FIND_TEXT 274 -#define IDC_NET_STATIC16 275 -#define IDC_DOWN 275 -#define IDC_UP 276 -#define IDC_NET_STATIC21 276 -#define IDC_NET_EDIT1 277 -#define IDC_PLUSPLUS 277 -#define IDC_NET_STATIC22 277 -#define IDC_NET_EDIT2 278 -#define IDC_MINUS 278 -#define IDC_NET_EDIT3 279 -#define IDC_PLUS 279 -#define IDC_NET_EDIT4 280 -#define IDC_URL_AREA 280 -#define IDC_NET_EDIT5 281 -#define IDC_UPPERLEFT 281 -#define IDC_NET_EDIT6 282 -#define IDC_HOTLIST_MAINAREA 282 -#define IDC_NET_EDIT7 283 -#define IDC_HOTLIST_AREA 283 -#define IDC_NET_EDIT8 284 -#define IDC_NAME 284 -#define IDC_NET_EDIT9 285 -#define IDC_LASTVISITED 285 -#define IDC_NET_EDIT10 286 -#define IDC_ADDEDON 286 -#define IDC_NET_EDIT11 287 -#define IDC_TYPE 287 -#define IDC_NET_EDIT12 288 -#define IDC_NEWITEM 288 -#define IDC_NEWURL 288 -#define IDC_NET_EDIT13 289 -#define IDC_COPYITEM 289 -#define IDC_NET_EDIT14 290 -#define IDC_REMOVEITEM 290 -#define IDC_DONE_EDITING 291 -#define IDC_NET_EDIT17 291 -#define IDC_PUT_URLS_UNDER 292 -#define IDC_PUT_HOTLIST_MENU_UNDER 293 -#define IDC_GENERATE_HTML 294 -#define IDC_EXPORT 295 -#define IDC_BUTTON_TO 295 -#define IDD_MUCWIZARD_WIN16 295 -#define IDC_IMPORT 296 -#define IDC_ITEMIS_URL 297 -#define IDC_NEWHEADER 297 -#define IDC_ITEMIS_HEADER 298 -#define IDC_NEWSEPARATOR 298 -#define IDC_ITEMIS_SEPARATOR 299 -#define IDC_HELPER_LIST 300 -#define IDC_HELPER_STATIC1 301 -#define IDC_HELPER_STATIC2 302 -#define IDC_HELPER_STATIC3 303 -#define IDC_HELPER_NEW 304 -#define IDC_HELPER_USENETSCAPE 305 -#define IDC_HELPER_SAVE 306 -#define IDC_HELPER_USEAPP 307 -#define IDC_HELPER_STATIC5 308 -#define IDC_HELPER_EXTENSIONS 309 -#define IDC_HELPER_STATIC6 310 -#define IDC_HELPER_STATIC7 311 -#define IDC_HELPER_STATIC8 312 -#define IDC_HELPER_STATIC9 313 -#define IDC_HELPER_STATIC10 314 -#define IDC_HELPER_UNKNOWN 315 -#define IDC_HELPER_STATIC4 316 -#define IDC_HELPER_PATH 317 -#define IDC_HELPER_BROWSE 318 -#define IDC_STRT_STATIC1 320 -#define IDC_STRT_STATIC2 321 -#define IDC_STRT_STATIC3 323 -#define IDC_STRT_STATIC4 324 -#define IDC_STRT_STATIC5 325 -#define IDC_STRT_STATIC6 326 -#define IDC_STRT_STATIC7 327 -#define IDC_STRT_STATIC8 328 -#define IDC_STRT_STATIC9 329 -#define IDC_STRT_STATIC10 330 -#define IDC_EDIT2 330 -#define IDC_STRT_BUTTON1 331 -#define IDC_PROMPT 331 -#define IDC_STRT_BUTTON2 332 -#define IDC_TO_EDIT 332 -#define IDC_STRT_BUTTON3 333 -#define IDC_FROM_EDIT 333 -#define IDC_STRT_BUTTON4 334 -#define IDC_SUBJECT_EDIT 334 -#define IDC_COMPOSE_SUBJECT 334 -#define IDC_STATIC_TITLE 334 -#define IDC_STRT_BUTTON5 335 -#define IDC_STATIC1 335 -#define IDC_STRT_EDIT2 336 -#define IDC_STATIC2 336 -#define IDC_STRT_EDIT3 337 -#define IDC_STATIC3 337 -#define IDC_STRT_EDIT4 338 -#define IDC_BODY_EDIT 338 -#define IDC_STATIC6 338 -#define IDC_STRT_EDIT5 339 -#define IDC_FILETYPE 339 -#define IDC_STRT_EDIT6 340 -#define ID_SAVETODISK 340 -#define IDC_STRT_EDIT9 341 -#define IDC_IN 341 -#define IDC_STRT_EDIT10 342 -#define IDC_OUT 342 -#define IDC_STRT_BUTTON6 343 -#define IDC_CLOSE_HOTLIST 343 -#define IDC_STRT_CHECK1 344 -#define IDC_STRT_EDIT7 345 -#define IDC_MISC_STATIC1 350 -#define IDC_MISC_STATIC2 351 -#define IDC_MISC_STATIC3 352 -#define IDC_MISC_STATIC4 353 -#define IDC_MISC_STATIC5 354 -#define IDC_MISC_STATIC6 355 -#define IDC_MISC_EDIT2 357 -#define IDC_MISC_EDIT1 358 -#define IDC_MISC_BUTTON7 359 -#define IDC_MISC_RADIO1 360 -#define IDC_MISC_RADIO2 361 -#define IDC_MISC_RADIO3 362 -#define IDC_MISC_RADIO4 363 -#define IDC_MISC_STATIC7 364 -#define IDC_MIMETYPE_EDIT 365 -#define IDC_MIMESUBTYPE_EDIT 366 -#define IDC_MAILTO_EDIT 367 -#define IDC_FROM_STATIC 368 -#define IDC_TOOLBARICON 370 -#define IDC_VERSION 371 -#define IDC_VERSION2 372 -#define IDC_BUTTON1 373 -#define IDC_SHORTCUT1 373 -#define IDC_USE_EXTERNAL_CHANGES 373 -#define IDC_ALT_TEXT_LOWRES 373 -#define IDC_USE_INTERNAL_CHANGES 374 -#define IDC_SHORTCUT2 374 -#define IDC_EXTRA_HTML 374 -#define IDC_ADD_HEADER 374 -#define IDC_BUTTON3 375 -#define IDC_SHORTCUT3 375 -#define IDC_BCC 375 -#define IDC_DELETE 375 -#define IDC_EDIT_HEADER_NAME 375 -#define IDC_REPLACE 375 -#define IDC_BUTTON4 376 -#define IDC_SHORTCUT4 376 -#define IDC_MOVEDOWN 376 -#define IDC_BUTTON5 377 -#define IDC_SHORTCUT5 377 -#define IDC_JAVA 377 -#define IDC_BUTTON6 378 -#define IDC_SHORTCUT6 378 -#define IDC_CUSTHELP 378 -#define IDC_APP_BUTTON2 379 -#define IDC_APP_BUTTON3 380 -#define IDC_CANCEL 381 -#define IDC_GET_DELETE 382 -#define IDC_ADD_SERVER 383 -#define IDD_COLOR_LIST 390 -#define IDD_COLOR_DLG 391 -#define IDC_PRINTING_STATUS_TEXT 418 -#define IDC_PRINTER_STATUS 420 -#define IDD_FONT_SELECT_DIALOG 421 -#define IDC_MISC_EDIT3 422 -#define IDD_PROPS_FONTDEF 423 -#define IDD_DOCINFO 430 -#define IDC_DISECURITY 431 -#define IDD_BOOKMRK 431 -#define IDB_BOOKMARK_ITEM 432 -#define IDC_DIKEY 432 -#define IDD_DOCI_SECURITY 432 -#define IDB_BOOKMARK_FOLDER 433 -#define IDC_DITITLE 433 -#define IDD_PREF_FONTS 433 -#define IDC_DIURL 434 -#define IDD_PREF_APPS 434 -#define IDC_DIMODIFIED 435 -#define IDD_PREF_MAIL 435 -#define IDD_PREF_MAILDIRS 435 -#define IDC_DISERVER 436 -#define IDD_PREF_CACHE 436 -#define IDC_DICERTIFIER 437 -#define IDD_PREF_PROXIES 437 -#define IDD_PREF_PROXY_MANUAL 437 -#define IDC_SECURESHOWAGAIN 438 -#define IDD_PREF_PROXIES1 438 -#define IDD_PREF_IMAGES 438 -#define IDD_PREF_HELPERS 439 -#define IDC_SECUREALERTEDIT 439 -#define IDD_PREF_NETWORK 440 -#define IDD_PREF_DIRS 441 -#define IDD_PREF_IDENTITY 442 -#define IDD_PREF_NEWS 443 -#define IDS_SENDNOW 444 -#define IDS_DEFAULTSENDNOW 445 -#define IDS_DEFAULTSENDLATER 446 -#define IDC_MISC_STATIC8 451 -#define IDC_MISC_STATIC9 452 -#define IDC_MISC_CHECK1 453 -#define IDC_MISC_CHECK2 454 -#define IDC_MISC_CHECK3 455 -#define IDC_MISC_CHECK4 456 -#define IDC_STATIC4 457 -#define IDB_IMAGE_SEC_REPLACE 458 -#define IDB_SECURE_STATUS 459 -#define IDB_NONSECURE_STATUS 460 -#define IDC_MISC_BUTTON1 461 -#define IDC_MISC_BUTTON2 462 -#define IDC_MISC_STATIC10 463 -#define IDC_MISC_STATIC11 464 -#define IDB_HISECURE_STATUS 465 -#define IDB_LITTLE_N 466 -#define IDD_COMPOSEBAR 470 -#define IDD_FONT_SELECT_DIALOG95 471 -#define IDD_PREF_BOOKMARKS 472 -#define IDD_PREF_ORGANIZATION 473 -#define IDD_PREF_SECALERTS 474 -#define IDD_PREF_DIRS1 475 -#define IDD_PREF_ALERTS 476 -#define IDD_PREF_MAILSTYLE 477 -#define IDD_PREF_COMPOSITION 478 -#define IDD_PREF_PASSWORDS 479 -#define IDD_PREF_LANG 480 -#define IDD_PLUGIN_SPLASH 490 -#define IDC_POST_EDIT 500 -#define IDC_ATTACH_EDIT 501 -#define IDC_COMPOSE_ATTACHMENT 501 -#define IDC_STATIC5 502 -#define IDC_APP_STATIC11 503 -#define IDC_NET_STATIC17 504 -#define IDC_NET_EDIT15 505 -#define IDC_NET_STATIC18 506 -#define IDC_NET_EDIT16 507 -#define IDC_STRT_STATIC11 508 -#define IDC_STRT_EDIT11 509 -#define IDC_STRT_STATIC12 510 -#define IDC_STRT_BUTTON7 511 -#define IDC_MISC_STATIC12 512 -#define IDC_NET_STATIC19 514 -#define IDC_MISC_STATIC13 515 -#define IDC_NET_EDIT18 518 -#define IDC_MISC_STATIC14 519 -#define IDC_MISC_STATIC15 520 -#define IDC_MISC_STATIC16 521 -#define IDC_MISC_STATIC17 522 -#define IDC_MISC_EDIT4 523 -#define IDC_MISC_EDIT5 524 -#define IDC_NET_EDIT19 525 -#define IDC_NET_STATIC20 526 -#define IDC_IMG_RADIO1 527 -#define IDC_IMG_RADIO2 528 -#define IDC_IMG_RADIO3 529 -#define IDC_IMG_RADIO4 530 -#define IDC_SEND 531 -#define IDC_RADIO1 540 -#define IDC_OPEN_IN_BROWSER 540 -#define IDC_RADIO2 541 -#define IDC_OPEN_IN_EDITOR 541 -#define IDC_RADIO3 542 -#define IDC_RADIO4 543 -#define IDC_MUCINTRO_ACCT_ADD 543 -#define IDC_ATTACH 544 -#define IDC_MUCINTRO_ACCT_EXIST 544 -#define IDC_STATIC_proxy 545 -#define IDC_MUCINTRO_ACCT_SYS 545 -#define IDC_FONT_PROPOR 546 -#define IDC_FONT_FIXED 547 -#define IDC_PFONT_STATIC1 548 -#define IDC_COLCHOOSE 550 -#define IDC_EDT_SELECT_BKGRND_COLOR 550 -#define IDC_COLCHOOSE2 551 -#define IDC_COLCHOOSE3 552 -#define IDC_BKGRND_COLOR_CHOOSE 552 -#define IDC_CHOOSE_BKGRND_COLOR 552 -#define IDC_COLCHOOSE4 553 -#define IDC_PFONT_STATIC2 554 -#define IDC_PFONT_STATIC4 555 -#define IDC_PFONT_STATIC5 556 -#define IDC_PFONT_STATIC3 557 -#define IDC_FONT_COMBO1 558 -#define IDC_FONT_PROPFONT 559 -#define IDC_FONT_FIXFONT2 560 -#define IDC_FONT_COMBO2 561 -#define IDC_COLOR_RADIO1 562 -#define IDC_EDT_BGRND_COLOR_DEF 562 -#define IDC_COLOR_RADIO2 563 -#define IDC_EDT_BGRND_FILE 563 -#define IDC_BKGRND_USE_IMAGE 563 -#define IDC_COLOR_EDIT1 564 -#define IDC_EDIT_BGRND_FILE 564 -#define IDC_COLOR_RADIO10 565 -#define IDC_COLOR_RADIO11 567 -#define IDC_COLOR_STATIC5 568 -#define IDC_COL_CHECK2 569 -#define IDC_COL_CHECK3 570 -#define IDC_COL_CHECK4 571 -#define IDC_COLBROWSE 572 -#define IDC_EDT_SELECT_BGRND_FILE 572 -#define IDC_BKGRND_IMAGE_BROWSE 572 -#define IDC_COLOR_STATIC6 573 -#define IDC_COLOR_STATIC7 574 -#define IDC_COLOR_STATIC8 575 -#define IDC_COLOR_STATIC9 576 -#define IDC_COLOR_RADIO3 577 -#define IDC_EDT_BGRND_COLOR_USR 577 -#define IDC_DOCINFO_STATIC1 578 -#define IDC_DOCINFO_STATIC2 579 -#define IDC_DOCINFO_STATIC3 580 -#define IDC_DIENCODING 581 -#define IDC_COL_STATIC2 582 -#define IDC_COLOR_LINK 583 -#define IDC_COLOR_FLINK 584 -#define IDC_COLOR_TEXT 585 -#define IDC_COLOR_BACK 586 -#define IDC_EDT_BGRND_COLOR 586 -#define IDC_COL_CHECK5 587 -#define IDS_APP_LANGUAGE 588 -#define IDS_APP_VERSION 589 -#define IDS_APP_NAME 590 -#define IDS_APP_CODE_NAME 591 -#define IDS_DEF_HOMEPAGE 592 -#define IDS_CHANGE_HOMEPAGE 593 -#define IDS_WIN_INI_SECTION 594 -#define IDS_INI_FILE_NAME 595 -#define IDS_NETSCAPE_TOOLBAR 596 -#define IDC_MISC_MIME 600 -#define IDC_MISC_8BIT 601 -#define IDC_MISC_MIMETXT 602 -#define IDC_MISC_CODE 602 -#define IDC_GENERIC1 603 -#define IDC_MISC_MIMETXT2 603 -#define IDC_DONTASKAGAIN 608 -#define IDC_DONTASKTEXT 609 -#define IDC_HANDLEBYOLE 610 -#define IDC_ASKHOWHANDLE 611 -#define IDC_MESSAGE 612 -#define IDC_PROGRESS 613 -#define IDC_ACTION 615 -#define IDC_LOCATION 616 -#define IDC_DESTINATION 617 -#define IDC_PROGRESS_BAR 619 -#define IDC_STATIC_LOC 620 -#define IDS_SHORTCUT1 621 -#define IDC_STATIC_DESC 621 -#define IDS_SHORTCUT2 622 -#define IDS_SHORTCUT3 623 -#define IDS_SHORTCUT4 624 -#define IDS_SHORTCUT5 625 -#define IDS_SHORTCUT6 626 -#define IDC_RADIO5 627 -#define IDC_CHECK2 627 -#define IDC_CHECK_DEFAULT 627 -#define IDC_CHECK_DOWNLOAD_DISC 627 -#define IDC_DIALER_FLAG 627 -#define IDC_RADIO6 628 -#define IDC_CHECK6 628 -#define IDC_CHECK_NEWS_SELF 628 -#define IDC_CK_KEEP_UNREAD 628 -#define IDC_RADIO7 629 -#define IDC_CHECK7 629 -#define IDC_CHECK_MAIL_OTHERS 629 -#define IDC_CHECK1 630 -#define IDC_RADIO8 630 -#define IDC_AUTO_SAVE 630 -#define IDC_LOCK_ASPECT 630 -#define IDC_HR_SAVE_DEFAULT 630 -#define IDS_SHORTCUTNAME1 631 -#define IDC_RADIO9 631 -#define IDC_HTMLCOMPOSE 631 -#define IDC_CHECK11 631 -#define IDS_SHORTCUTNAME2 632 -#define IDC_EDIT4 632 -#define IDS_SHORTCUTNAME3 633 -#define IDC_NICKNAME 633 -#define IDC_CHECK8 633 -#define IDC_CHECK12 633 -#define IDC_CHECK_NEWS_OTHERS 633 -#define IDS_SHORTCUTNAME4 634 -#define IDE_ADDRESS 634 -#define IDC_ADDRESS 634 -#define IDC_CHECK9 634 -#define IDC_CHECK_MAIL_FOLDER 634 -#define IDS_SHORTCUTNAME5 635 -#define IDC_CHECK10 635 -#define IDC_CHECK_NEWS_FOLDER 635 -#define IDS_SHORTCUTNAME6 636 -#define IDC_CHECK13 637 -#define IDC_INSERT_AFTER 638 -#define IDC_BEGIN_MENU 639 -#define IDC_INTERNETSHORTCUTLINK 640 -#define ID_LIST_FONTCOLOR 640 -#define IDC_INTERNETSHORTCUTDESCRIPTION 641 -#define IDC_PLACEONDESKTOP 642 -#define IDC_PAGESETUP_MBOTTOM 643 -#define IDC_PAGESETUP_MLEFT 644 -#define IDC_PAGESETUP_MRIGHT 645 -#define IDC_PAGESETUP_TITLE 646 -#define IDC_PAGESETUP_PAGENUMBERS 647 -#define IDC_PAGESETUP_SAMPLE 648 -#define IDC_PAGESETUP_MTOP 649 -#define IDC_PAGESETUP_PRINTBITMAPS 650 -#define IDC_PAGESETUP_ALLTEXTBLACK 651 -#define IDC_PAGESETUP_ALLLINESBLACK 652 -#define IDC_PAGESETUP_SOLIDLINES 653 -#define IDC_PAGESETUP_REVERSEORDER 654 -#define IDC_PAGESETUP_URL 655 -#define IDC_PAGESETUP_DATE 656 -#define IDC_PAGESETUP_TOTAL 657 -#define IDC_PAGESETUP_MARGINBOX 658 -#define IDC_PERCENTCOMPLETE 659 -#define IDC_PRINTBKIMAGE 659 -#define IDC_PROGRESSMETER 660 -#define IDC_TIMELEFT 661 -#define IDC_CHECK4 662 -#define IDC_CHECK4_BY_DATE 662 -#define IDB_TREEITEM 700 -#define IDB_TREEFOLDERCLOSED 701 -#define IDB_TREEFOLDEROPEN 702 -#define IDB_MAILMESSAGE 703 -#define ID_HIST_MORE 704 -#define ID_HIST_FEWER 705 -#define IDC_MENUBORDER 706 -#define IDB_OPENBOTTOMPARENT 708 -#define IDB_OPENMIDDLEPARENT 709 -#define IDB_OPENTOPPARENT 710 -#define IDB_OPENSINGLEPARENT 711 -#define IDB_MIDDLEITEM 713 -#define IDB_TOPITEM 714 -#define IDB_VERTPIPE 715 -#define IDB_HORZPIPE 716 -#define IDB_POSTOFFICE 717 -#define IDB_NEWSARTICLE 718 -#define IDB_NEWSREPLY 718 -#define IDB_UNREAD 721 -#define IDB_NEWSGROUP 723 -#define IDB_READ 724 -#define IDB_MARKED 725 -#define IDB_THREAD 726 -#define IDB_SORTINDICATORUP 739 -#define IDB_SORTINDICATORDOWN 740 -#define IDB_PUSHLEFT 741 -#define IDB_PUSHRIGHT 742 -#define IDB_PUSHLEFTRIGHT 743 -#define IDB_OPENTREENODE 745 -#define IDB_COMPOSETOOLBARP 755 -#define IDB_COMPOSETOOLBARPT 756 -#define IDB_COMPOSETOOLBART 757 -#define IDS_FILETOATTACH 758 -#define IDS_ADDRESSTO 759 -#define IDS_ADDRESSCC 760 -#define IDS_ADDRESSBCC 761 -#define IDS_ADDRESSREPLYTO 762 -#define IDS_ADDRESSNEWSGROUP 763 -#define IDS_ADDRESSFOLLOWUPTO 764 -#define IDS_RETURNRECEIPT 770 -#define IDS_ENCRYPTED 771 -#define IDS_SIGNED 772 -#define IDS_TOOLATTACH 773 -#define IDS_TOOLATTACHFILES 774 -#define IDS_TOOLATTACHALL 775 -#define IDS_COMPOSITION 776 -#define IDS_CANTWRITETOFILE 777 -#define IDS_TOOLATTACHFILE 778 -#define IDS_ATTACHWEBPAGE 779 -#define IDS_ATTACHADDRESS 781 -#define IDS_CONVERTWARN 782 -#define IDS_TOPMARGINERROR 783 -#define IDS_BOTTOMMARGINERROR 784 -#define IDS_RIGHTMARGINERROR 785 -#define IDS_LEFTMARGINERROR 786 -#define IDS_VIRTUALNEWSGROUP 787 -#define IDS_COMINGSOON 789 -#define IDS_PHONE 790 -#define IDS_CHECKING 791 -#define IDS_DEFAULTSAVEAS 792 -#define IDS_CONVERTTITLE 793 -#define IDS_ENCODING 795 -#define IDS_CHARSET 796 -#define IDS_ATTACHMYCARD 797 -#define IDS_USE8BIT 798 -#define IDS_USEUUENCODE 799 -#define IDC_COMPOSE_FROM 800 -#define IDS_VIRTUALNEWSGROUPDESC 800 -#define IDC_COMPOSE_REPLYTO 801 -#define IDC_COMPOSE_TO 802 -#define IDC_COMPOSE_CC 803 -#define IDC_COMPOSE_FCC 804 -#define IDC_COMPOSE_BCC 805 -#define IDC_COMPOSE_NEWSGROUPS 807 -#define IDC_COMPOSE_FOLLOWUP 809 -#define IDC_COMPOSE_SUBJECT_TEXT 826 -#define IDS_MESSAGEFORMAT 827 -#define IDS_FORMAT_ASKME 828 -#define IDS_FORMAT_PLAIN 829 -#define IDS_FORMAT_HTML 830 -#define IDS_FORMAT_BOTH 831 -#define IDC_BIGSPLASH 900 -#define IDB_NSSPLASH 901 -#define IDB_EDIT_NAMED_ANCHOR 905 -#define IDB_EDIT_NAMED_ANCHOR_MASK 906 -#define IDB_EDIT_FORM_ELEMENT 907 -#define IDB_EDIT_FORM_ELEMENT_MASK 908 -#define IDB_EDIT_UNSUPPORTED_TAG 909 -#define IDB_EDIT_UNSUPPORTED_TAG_MASK 910 -#define IDB_EDIT_UNSUPPORTED_END_TAG 911 -#define IDB_EDIT_UNSUPPORTED_END_TAG_MASK 912 -#define IDB_EDIT_JAVA 913 -#define IDB_EDIT_JAVA_MASK 914 -#define IDB_EDIT_PLUGIN 915 -#define IDB_EDIT_PLUGIN_MASK 916 -#define IDD_ADDRESS_SECURITY 917 -#define IDS_EMAILADDRESS 917 -#define IDD_ADDRESS_COOLTALK 918 -#define IDS_COMPANYNAME 918 -#define IDS_COMPOSE_REMOVE 920 -#define IDS_LOCALITY 921 -#define IDB_PERSON 922 -#define IDS_REMOVE_ATTACHMENT 922 -#define IDB_ARROW3D 923 -#define IDB_ARROW3D_PRESS 924 -#define IDB_NEWSART 925 -#define IDB_COMPOSETOOLBAR 926 -#define ID_SETFOCUS_PARA_STYLE 927 -#define ID_SETFOCUS_FONTFACE 928 -#define ID_SETFOCUS_FONTSIZE 929 -#define IDS_BUTTON_TEXT_CONNECT 930 -#define IDS_BUTTON_TEXT_DISCONNECT 931 -#define IDS_GO_ONLINE_NOW 932 -#define IDS_GO_OFFLINE_NOW 933 -#define IDS_ACTION_ONLINE 934 -#define IDS_ACTION_OFFLINE 935 -#define IDS_JSAPP 938 -#define IDS_IS_ENCRYPTED 939 -#define IDS_NOT_ENCRYPTED 940 -#define IDS_NOTHING_SUBSCRIBED 941 -#define IDS_NO_TEMP_DIRECTORY 942 -#define IDS_STUB_PREFIX 943 -#define IDS_TEXT_FOLDERS_SELECTED 944 -#define IDS_TEXT_DISCUSSIONS_SELECTED 945 -#define IDS_NO_RUN_WHILE_PROFILING 946 -#define IDS_SENDINGMESSAGE 947 -#define ID_GET_COLOR 950 -#define IDI_GIF 951 -#define IDI_JPEG 952 -#define IDI_JAVASCRIPT 953 -#define IDS_ANIMSMALL_X 1000 -#define IDB_ANIMSMALL_0 1000 -#define IDC_EDIT_HOST 1000 -#define IDC_ONLINE_MODE 1000 -#define IDC_LIST 1000 -#define IDC_RADIO_SENT 1000 -#define IDS_ANIMSMALL_Y 1001 -#define IDC_EDIT_PORT 1001 -#define IDC_OFFLINE_MODE 1001 -#define IDC_RADIO_OTHER 1001 -#define IDC_RADIO_NNTP 1001 -#define IDC_ENTRIES 1002 -#define IDC_EDIT_NEWS_SERVER 1002 -#define IDC_EDIT_USER_NAME 1002 -#define IDC_NEW_WORD 1002 -#define IDC_ASK_ME 1002 -#define IDC_EDIT_MAIL_SERVER 1003 -#define IDC_EDIT_ADDRESS 1003 -#define IDC_USE_AS_DEFAULT 1003 -#define IDC_EDIT_SMTP_SERVER 1004 -#define IDC_IP_ADDRESS 1005 -#define IDC_FIRSTNAME 1005 -#define IDC_MIDDLENAME 1006 -#define IDC_CHANGE 1006 -#define IDC_LASTNAME 1007 -#define IDC_ROWSPAN 1007 -#define IDC_COLSPAN 1008 -#define IDC_EDIT_MSG_DAYS 1008 -#define IDC_IGNORE_ALL 1009 -#define IDC_PREF_STRING_MSG 1009 -#define IDC_EDIT_MSG_NO 1009 -#define IDC_DESC 1009 -#define IDC_LOCALITY 1010 -#define IDC_CHANGE_ALL 1010 -#define IDC_CHECK_MSG_SIZE 1010 -#define IDC_ID 1010 -#define IDC_REGION 1011 -#define IDC_USE_PAGE_LOCATION 1011 -#define IDC_WIDTH 1011 -#define IDC_ERROR_PROMPT 1011 -#define IDC_KEEP_MSG_DAYS 1011 -#define IDC_CHECK_MSG_DAYS 1011 -#define IDC_KEEP_UNREAD 1012 -#define IDC_COMPANY_NAME 1013 -#define IDC_EDIT_MSG_SIZE 1013 -#define IDC_EDIT_DICTIONARY 1013 -#define IDC_STREET2 1013 -#define IDC_RUN 1013 -#define IDC_PIXELS_WIDTH 1014 -#define IDC_CHECK_COMAPCT_SIZE 1014 -#define IDC_CHECK_COMPACT_SIZE 1014 -#define IDC_PERCENT_WIDTH 1015 -#define IDC_EDIT_COMPACT_SIZE 1015 -#define IDC_PIXELS_HEIGHT 1016 -#define IDC_KEEP_MSG_NO 1016 -#define IDC_NEW_FOLDER 1016 -#define IDC_HEIGHT 1017 -#define IDC_KEEP_ALL 1017 -#define IDC_PERCENT_HEIGHT 1018 -#define IDC_SECURE 1018 -#define IDC_LIST3 1019 -#define IDC_CHECK_SAVE_PASSWORD 1019 -#define IDC_SAVE_PASSWORD 1019 -#define IDC_USE_NAME 1019 -#define IDC_LOGIN_LDAP 1020 -#define IDC_COLOR_WELL 1021 -#define IDC_CHOOSE_BACKGROUND 1022 -#define IDC_COMBO2 1023 -#define IDC_FONT_SIZE 1023 -#define IDC_CONNECTCOOLTALK 1024 -#define IDC_WRAP 1025 -#define IDC_HEADER 1026 -#define IDC_NOSAVE_FONTDEF 1026 -#define IDC_ALIGN_TOP 1027 -#define IDC_FONTFACE_MSG 1027 -#define IDC_ALIGN_V_CENTER 1028 -#define IDC_ALIGN_BOTTOM 1029 -#define IDC_USE_DEFAULT_LOCATION 1029 -#define IDC_ALIGN_BASELINE 1030 -#define IDC_ROW_HEADER 1031 -#define IDC_FONT_SIZE_MSG 1031 -#define IDC_COLUMN_HEADER 1032 -#define IDC_LANGUAGE 1032 -#define IDC_MAKE_IMAGE_BACKGROUND 1032 -#define IDC_SUGGESTIONS 1033 -#define IDC_WIDTH_PIXELS 1033 -#define IDC_CHECK_WORD 1034 -#define IDS_STATBAR_SECURITY 1050 -#define IDS_ANIM_X 1100 -#define IDC_DEFAULT_COLOR 1100 -#define IDB_ANIM_0 1100 -#define IDC_COLOR_HELP 1101 -#define IDS_ANIM_Y 1101 -#define IDC_LAST_USED_COLOR 1102 -#define IDC_BUTTON_MAIL_CHOOSE 1124 -#define IDC_FRAME_BOX 1178 -#define IDC_TOP_TAG 1179 -#define IDC_BOTTOM_TAG 1180 -#define IDC_HELP_TEXT 1181 -#define IDC_INTRO_TEXT 1183 -#define IDC_VIEW_TEXT1 1184 -#define IDC_EDIT_TEXT 1185 -#define IDC_CHECK3 1200 -#define IDD_ADDRESSDLG 1200 -#define IDC_CHECK_BY_ARTICLES 1200 -#define IDC_CHECK_SEND_MESSAGES 1200 -#define IDC_RADIO10 1201 -#define IDD_MULTIATTACH 1201 -#define IDC_OPEN_WINDOW 1201 -#define IDC_SHOW_IN_THREAD 1201 -#define IDC_RADIO11 1202 -#define IDD_ATTACHLOCATION 1202 -#define IDC_ADDRESSLIST 1203 -#define IDD_PREF_PCERTS 1203 -#define IDR_BOOKMARK_MENU 1203 -#define IDC_TO 1204 -#define IDD_PREF_SCERTS 1204 -#define IDC_CC 1205 -#define IDD_PREF_PROXY 1205 -#define IDC_LANG_LIST1 1206 -#define IDD_SEARCHEADERS 1206 -#define IDC_LANG_LIST2 1207 -#define IDD_DIALOG2 1207 -#define IDC_LANG_ADD 1208 -#define IDD_FINDBOOKMARK 1208 -#define IDC_LANG_REMOVE 1209 -#define IDC_LANG_EDIT 1210 -#define IDD_SEARCHMESSAGES 1210 -#define IDC_LANG_ADDTEXT 1211 -#define IDC_ATTACHURL 1211 -#define IDC_ATTACHFILE 1212 -#define IDD_DEFAULT_BROWSER 1212 -#define IDC_ATTACHMENTS 1213 -#define IDC_ASIS 1214 -#define IDC_CONVERT 1215 -#define IDC_LIST1 1216 -#define IDC_WORD_LIST 1216 -#define IDC_LANGUAGE_LIST 1216 -#define IDC_HEADER_LIST 1216 -#define IDC_EDIT5 1217 -#define ID_SELECT_NEXT_NONTEXT 1217 -#define IDB_SMALLANIMATION 1218 -#define IDC_MATCHCASE 1218 -#define IDB_COMPOSETOOLBARPD 1219 -#define IDD_WHATSNEW 1220 -#define IDC_WHOLEWORD 1221 -#define IDB_COMPOSETOOLBARPTD 1222 -#define IDC_ALLBOOKMARKS 1223 -#define IDC_FINDTEXT 1224 -#define IDC_SELECTEDBOOKMARKS 1225 -#define ID_NO 1226 -#define IDD_UPDATEWHATSNEW 1227 -#define IDC_IGNORE 1228 -#define IDD_PREF_SEC_ADVANCED 1228 -#define IDC_QUESTION_ICON 1229 -#define IDD_PREF_HELPERS1 1229 -#define IDC_WARNING_ICON 1229 -#define IDC_FINDINHEADER 1230 -#define IDD_PREF_PROTOCOLS 1230 -#define IDC_FINDINBODY 1231 -#define IDD_PREF_NET_LANG 1231 -#define IDC_SEARCHUP 1232 -#define IDC_SEARCHDOWN 1233 -#define IDC_DIRECTION 1234 -#define IDC_MORE_INFO 1235 -#define IDR_ACCELERATOR1 1237 -#define IDB_DRAG_URL 1239 -#define IDC_STARTBROWSER 1240 -#define IDC_STARTMAIL 1241 -#define IDC_STARTNEWS 1242 -#define IDD_PREFMAILPANES 1243 -#define IDC_RADIO12 1244 -#define IDC_RADIO13 1245 -#define IDC_RADIO14 1246 -#define IDC_RADIO15 1247 -#define IDC_STATIC_ISALIAS 1247 -#define IDC_RADIO16 1248 -#define IDC_STATIC_ALIASCOUNT 1248 -#define IDC_RADIO17 1249 -#define IDC_BUTTON_SELECTALIASES 1249 -#define IDS_ENTERPRISE_KEY 1250 -#define IDC_DISABLE_JAVA 1250 -#define IDC_DISABLE_SSL2 1251 -#define IDS_LOCKED_PREFERENCES 1252 -#define IDC_CONFIGURE_SSL2 1252 -#define IDC_FTP_ANON 1253 -#define IDI_IMAGE_DELAYED 1253 -#define IDB_SMIMAGE_DELAYED 1254 -#define IDC_DISABLE_SSL3 1254 -#define IDC_AUTO_PROXY_RELOAD 1254 -#define IDC_HELPER_MIME_TYPE 1254 -#define IDB_SMIMAGE_MASK 1255 -#define IDC_CONFIGURE_SSL3 1255 -#define IDR_MESSAGEFRAME 1255 -#define IDC_FEWER 1255 -#define IDC_FTP_EMAIL 1256 -#define IDC_HELPER_HANDLER 1256 -#define IDC_WEB_ANON 1257 -#define IDB_NOTIFY_MAIL1 1257 -#define IDC_COMBO_SCOPE 1257 -#define IDC_WEB_EMAIL 1258 -#define IDC_STATIC_WHERE 1258 -#define IDC_EDIT_IBEAM_LARGE 1259 -#define IDC_COMBO_FIELDS1 1259 -#define IDC_COMBO_FIELDS2 1260 -#define IDC_EDIT_IBEAM 1260 -#define IDC_LINK_COPY 1261 -#define IDC_COMBO_CRITERIA1 1261 -#define IDC_EDIT_MATCH1 1262 -#define IDC_HTML_COPY 1262 -#define IDC_LINK_MOVE 1263 -#define IDC_COMBO_CRITERIA2 1263 -#define IDC_HTML_MOVE 1264 -#define IDC_EDIT_MATCH2 1264 -#define IDC_IMAGE_COPY 1265 -#define IDC_COMBO_FIELDS3 1265 -#define IDC_IMAGE_MOVE 1266 -#define IDC_COMBO_CRITERIA3 1266 -#define IDC_TEXT_MOVE 1267 -#define IDC_EDIT_MATCH3 1267 -#define IDD_MAILFILTER 1267 -#define IDC_TEXT_COPY 1268 -#define IDC_COMBO_FIELDS4 1268 -#define IDC_COMBO_CRITERIA4 1269 -#define IDB_DRAG_URL_MASK 1270 -#define IDC_EDIT_MATCH4 1270 -#define IDB_NOTIFY_NEWS 1271 -#define IDC_OPEN_URL_BROWSER 1271 -#define IDB_NOTIFY_WEB 1272 -#define IDC_OPEN_URL_EDITOR 1272 -#define IDD_SAVE_DOCUMENT 1273 -#define IDC_SAVE_FILE_LABEL 1274 -#define IDC_COMBO_FIELDS5 1274 -#define IDC_COMBO_CRITERIA5 1275 -#define IDD_FILTER_PICKER 1275 -#define IDC_FILE_COUNT_MSG 1275 -#define IDC_SAVE_FILENAME 1276 -#define IDC_EDIT_MATCH5 1276 -#define IDC_SPIN5 1278 -#define IDB_MAILNEWSTABS 1280 -#define IDB_GRANITE 1281 -#define IDB_OUTLINER 1282 -#define IDC_RADIO_OFF 1283 -#define IDB_ADDRESSBOOK 1283 -#define IDC_RADIO_ON 1284 -#define IDB_BOOKMARKS 1284 -#define IDC_COMBO_ATTRIB1 1285 -#define IDB_COLUMN 1285 -#define IDC_COMBO_ATTRIB2 1286 -#define IDB_MAILCOL 1286 -#define IDC_COMBO_ATTRIB3 1287 -#define IDC_COMBO_ATTRIB4 1288 -#define IDC_COMBO_ATTRIB5 1289 -#define IDC_COMBO_OP1 1290 -#define IDC_COMBO_OP2 1291 -#define IDC_COMBO_OP3 1292 -#define IDC_COMBO_OP5 1293 -#define IDC_COMBO_OP4 1294 -#define IDC_EDIT_VALUE1 1296 -#define IDC_EDIT_VALUE2 1297 -#define IDC_EDIT_VALUE3 1298 -#define IDC_EDIT_VALUE4 1299 -#define IDC_EDIT_VALUE5 1300 -#define IDC_COMBO_DEST 1302 -#define IDC_EDIT_DESC 1303 -#define IDC_EDIT_NAME 1304 -#define IDC_COMBO_ACTION 1305 -#define IDC_STATIC_THE2 1306 -#define IDC_STATIC_THE3 1307 -#define IDC_STATIC_THE4 1308 -#define IDC_STATIC_THE5 1309 -#define IDC_STATIC_OF1 1310 -#define IDC_STATIC_OF2 1311 -#define IDC_STATIC_OF3 1312 -#define IDC_STATIC_OF4 1313 -#define IDC_STATIC_OF5 1314 -#define IDC_STATIC_THE1 1315 -#define IDC_STATIC_OF6 1316 -#define IDC_NEW 1319 -#define IDC_SAVE 1321 -#define IDC_CHECK_LOG 1322 -#define IDC_LIST_FILTERS 1323 -#define IDC_MNWIZ_READNEWS_FINISH 1324 -#define IDC_STATIC_DESCRIPTION 1326 -#define IDC_STATIC_ORDER 1327 -#define IDC_STATIC_NAME 1328 -#define IDC_STATIC_ON 1329 -#define IDC_QF_BTN 1330 -#define IDB_BOOKMARK_QF 1330 -#define IDB_MAILNEWS 1331 -#define IDC_ADDRNAME 1332 -#define IDC_LABEL 1332 -#define IDC_EXPLANATION2 1332 -#define IDC_ADD 1333 -#define IDC_MORE 1334 -#define IDB_COMPOSETABS 1334 -#define IDC_STATIC_FINDITEMS 1335 -#define IDB_ADDRESSTOOLBARP 1336 -#define IDB_DOCK_BTN 1337 -#define IDC_BC_BTN 1338 -#define IDB_NOTIFY_MAIL3 1340 -#define IDB_NOTIFY_MAIL2 1341 -#define IDR_NEWSMSGFRAME 1344 -#define IDB_SHADING 1345 -#define IDC_STOP 1345 -#define IDD_NEWS_BAR 1346 -#define IDC_COMBO_NEWS 1346 -#define IDC_OUTLINER_FOLDER 1347 -#define IDC_OUTLINER_MESSAGE 1348 -#define IDD_LDAPSEARCH 1348 -#define IDC_IN_STATIC 1349 -#define IDR_MAILTHREAD 1349 -#define IDC_DIRECTORIES 1350 -#define IDR_NEWSTHREAD 1350 -#define IDC_DIRSEARCH 1351 -#define IDD_MARKREADDATE 1351 -#define IDC_CREATE 1352 -#define IDC_COPY 1353 -#define IDC_ADD_LINK_BUTTON 1354 -#define IDC_STREET 1354 -#define IDC_POBOX 1354 -#define IDC_DELETE_LINK_BUTTON 1355 -#define IDC_ZIP 1355 -#define IDC_CHANGE_LINK_BUTTON 1356 -#define IDC_PHONE1 1356 -#define IDC_IMPORT_LINK_BUTTON 1357 -#define IDC_HOME 1357 -#define IDC_IMPORT_BITMAP 1357 -#define IDC_COUNTRY 1357 -#define IDB_VFLIPPY 1358 -#define IDC_BUTTON_NAME_EDIT 1358 -#define IDC_FAX 1358 -#define IDB_FOLDERTOOLBAR 1359 -#define IDC_BUTTON_PAGE_EDIT 1359 -#define IDC_HOME1 1359 -#define IDR_TASKBAR_POPUP 1360 -#define IDB_GRIPH 1361 -#define IDB_BANNER 1362 -#define IDD_ADDRESSPICKER 1363 -#define IDR_ONEKEYMESSAGE 1364 -#define IDB_BITMAP1 1366 -#define IDC_EXPLANATION 1366 -#define IDC_EXPLANATION3 1366 -#define IDB_LINKBUTTON 1367 -#define IDC_CoolServer 1367 -#define IDC_CoolHost 1368 -#define IDB_BITMAP2 1368 -#define IDC_EXPIRE 1369 -#define IDD_LINK_TOOLBAR 1370 -#define IDC_RADIO_POP 1370 -#define IDC_READMAIL_POP1 1370 -#define IDB_BOOKMARK_FOLDER2 1371 -#define IDC_RADIO_IMAP 1371 -#define IDD_ADDRESS_CONTACT 1372 -#define IDB_SUBMENU1 1373 -#define IDI_ICON2 1373 -#define IDC_STYLE_PLAIN 1373 -#define IDB_SUBMENU2 1374 -#define IDI_ICON3 1374 -#define IDC_STYLE_BOLD 1374 -#define IDB_TASKBARL 1375 -#define IDI_ICON4 1375 -#define IDC_STYLE_ITALIC 1375 -#define IDB_TASKBARS 1376 -#define IDC_STYLE_BOLDITALIC 1376 -#define IDB_NAVBUTTON 1377 -#define IDC_EDIT_NEWSGROUP 1377 -#define IDR_COMPOSEPLAIN 1377 -#define IDC_SIZE_PLAIN 1377 -#define IDC_SUBSCRIBE 1378 -#define IDB_EXPANDO 1378 -#define IDC_SIZE_BIGGER 1378 -#define IDC_EXPAND_ALL 1379 -#define IDC_SIZE_SMALLER 1379 -#define IDC_COLLAPSE_ALL 1380 -#define IDC_REUSE_WINDOW 1380 -#define IDC_REUSE_THREAD_WINDOW 1380 -#define IDD_NEWSGROUP_ALL 1381 -#define IDC_GET_NEW 1381 -#define IDC_EDIT_EMAIL 1381 -#define IDD_NEWSGROUP_SEARCH 1382 -#define IDC_CLEAR_NEW 1382 -#define IDB_MAILQF 1382 -#define IDC_EDIT_REPLYTO 1382 -#define IDD_NEWSGROUP_NEW 1383 -#define IDC_COMBO_SERVER 1383 -#define IDB_MAILINGLIST 1383 -#define IDC_EDIT_ORGANIZATION 1383 -#define IDC_SEARCH_NOW 1384 -#define IDB_BOOKMARK_FOLDER_OPEN 1384 -#define IDC_EDIT_SIGFILE 1384 -#define IDD_NEWSGROUP_ADDSERVER 1385 -#define IDC_BUTTON_BROWSE 1385 -#define IDC_NEWSGROUPS 1386 -#define IDD_PREF_MNMORE 1386 -#define IDC_EDIT_NEWS_DIR 1386 -#define IDC_BUTTON_CREATE 1386 -#define IDD_PREF_MORE_MAIL_SERVER 1386 -#define IDD_WIZARD_RECEIVEMAIL 1387 -#define IDC_CHECK_MAIL_SELF 1387 -#define IDC_SEARCHHELP 1387 -#define IDC_EDIT_MAIL_FOLDER 1388 -#define IDD_WIZARD_SENDMAIL 1389 -#define IDC_EDIT_NEWS_FOLDER 1389 -#define IDD_WIZARD_READNEWS 1390 -#define IDD_WIZARD_COVERPAGE 1391 -#define IDC_BUTTON_NEWS_CHOOSE 1391 -#define IDD_PREF_MNMAILNEWS 1392 -#define IDC_CHECK_AUTO_QUOTE 1392 -#define IDD_PREF_MNIDENTITY 1393 -#define IDC_EDIT_IN_SERVER 1393 -#define IDD_PREF_MNCOMPOSITION 1394 -#define IDC_EDIT_MAIL_DIR 1394 -#define IDD_PREF_MNNEWSSERVER 1395 -#define IDC_BUTTON_MORE 1395 -#define IDC_EDIT_IMAP_DIR 1395 -#define IDD_PREF_MNMAILSERVER 1396 -#define IDC_RADIO_REMOVE 1396 -#define IDC_EDIT_PUBLIC_DIR 1396 -#define IDD_PREF_MNADDRESSBOOK 1397 -#define IDC_RADIO_LEFT 1397 -#define IDC_EDIT_OTHERS_DIR 1397 -#define IDC_RADIO_REMOTE 1398 -#define IDC_RADIO_LOCAL 1399 -#define IDC_CHECK_MAIL 1400 -#define IDD_PREF_MNCHOOSEFOLDER 1400 -#define IDC_CHECK_MESSAGE 1401 -#define IDD_PREF_MNDIRECTORIES 1401 -#define IDC_EDIT_CHECK_MAIL 1402 -#define IDD_RESOLVE_EDIT_CHANGES 1402 -#define IDC_EDIT_MESSAGE_SIZE 1403 -#define IDD_PREF_LDAP_SERVER 1404 -#define IDC_CHOOSE_COLOR 1405 -#define IDC_COLOR 1406 -#define IDB_INSERT_LINK 1406 -#define IDD_DROPDOWN_TOOLBAR 1407 -#define IDC_COMBO_FOLDER 1407 -#define IDB_INSERT_TARGET 1407 -#define IDC_CHOOSE_FONT 1407 -#define IDB_HALIGN_LEFT 1408 -#define IDC_MOVEUP 1409 -#define IDB_HALIGN_CENTER 1409 -#define IDC_EDIT_NO_HITS 1410 -#define IDB_HALIGN_RIGHT 1411 -#define IDB_INSERT_IMAGE 1412 -#define IDB_INSERT_HRULE 1413 -#define IDB_INSERT_TABLE 1414 -#define IDC_STATIC_SERVER 1414 -#define IDC_EDIT_MAX_HITS 1415 -#define IDC_EDIT_PORT_NO 1416 -#define IDC_COMBO_MAIL_FOLDER 1417 -#define IDC_STATIC_ROOT 1417 -#define IDC_EDIT_ROOT 1418 -#define IDC_COMBO_NEWS_FOLDER 1419 -#define IDC_STATIC_PORT 1419 -#define IDC_CHECK_ENCRYPTED 1420 -#define IDC_STATIC_MAX_HITS 1420 -#define IDC_EDIT_SERVE 1421 -#define IDC_FIRSTNAME_FIRST 1421 -#define IDC_CHECK_PASSWORD 1421 -#define IDC_LASTNAME_FIRST 1422 -#define IDC_EDIT_SERVER 1423 -#define IDC_SERVERS_LIST 1423 -#define IDC_EDIT_DESCRIPTION 1424 -#define IDC_STATIC_FONT 1424 -#define IDC_BOOKMARKS 1424 -#define IDB_ADDRESSBOOKSELECT 1425 -#define IDC_STATIC_STYLE 1425 -#define IDC_CUSTPREVIEW 1425 -#define IDC_COOKIES 1425 -#define IDC_STATIC_SIZE 1426 -#define IDC_INSERT 1426 -#define IDC_HANDOPEN 1426 -#define IDC_ADDBOOK 1426 -#define IDB_LARGE_HTAB 1427 -#define IDC_HANDCLOSED 1427 -#define IDC_FILTERS 1427 -#define IDB_LARGE_HFTAB 1428 -#define IDC_MOVEBUTTON 1428 -#define IDB_SMALL_HTAB 1429 -#define IDB_SMALL_HFTAB 1430 -#define IDM_NEWMAILMESSAGE 1430 -#define IDB_OPTIONSSELECT 1433 -#define IDB_BUTTON_FOLDER 1434 -#define IDC_ATTACH_VCARD 1435 -#define IDC_RADIO_FIXED 1435 -#define IDC_BITMAPLIST 1436 -#define IDC_RADIO_VARIABLE 1436 -#define IDB_THREAD_BACK 1436 -#define IDD_WIZARD_MAILNEWS_WIN16 1436 -#define IDC_DELETEPROFILE 1437 -#define IDB_MESSAGE_BACK 1437 -#define IDB_BACK 1437 -#define IDD_NEWMAIL 1438 -#define IDC_ADDRESSBKT 1438 -#define IDC_EDITPROFILE 1438 -#define IDC_STATIC_EG1 1439 -#define IDB_ATTACHBUTTON 1439 -#define IDC_STATIC_EG2 1440 -#define IDC_OPTION 1440 -#define IDC_READMAIL_POP 1441 -#define IDB_MAILREPLY 1441 -#define IDC_READMAIL_IMAP 1442 -#define IDC_READNEWS_STATIC4 1443 -#define IDD_IMAGE_ALT 1443 -#define IDC_BUTTON_HELP 1444 -#define IDD_EXTRA_HTML 1444 -#define IDC_EXTRA_HTML_TEXT 1445 -#define IDC_HISTBAR_FINDTEXT 1445 -#define IDD_NEWFOLDER 1445 -#define IDB_USERBTN 1445 -#define IDC_READMAIL_POP2 1445 -#define IDC_HISTBAR_FIELD 1446 -#define IDD_SPELL_CHECKER 1446 -#define IDC_EXTRA_HTML_MSG 1446 -#define IDC_HISTBAR_FIND 1447 -#define IDC_LOCAL_FONT_MSG 1447 -#define IDD_PREF_MNCREATECARD 1447 -#define IDC_FONT_COLOR_FRAME 1448 -#define IDC_FILENAME_AREA 1449 -#define IDC_FONT_STYLE 1449 -#define IDC_CATEGORY 1450 -#define IDC_COPYFILES 1450 -#define IDC_TEXT1 1451 -#define IDC_IGNOREFILES 1451 -#define IDC_MOVEFILES 1452 -#define IDC_VIEW 1452 -#define IDC_FILTER_HELP 1453 -#define IDC_EDIT_MAXNEWSART 1454 -#define IDC_REUSE_MESSAGE_WINDOW 1456 -#define IDC_CHECK_NOTIFY 1457 -#define IDC_CHECK_POP_REMOTE 1458 -#define IDC_CHECK_IMAP_LOCAL 1459 -#define IDC_CHECK2_DEFAULT 1460 -#define IDC_CHECK_IMAP_SSL 1460 -#define IDC_RD_KEEP_DAYS 1461 -#define IDC_RADIO_ONLINE 1461 -#define IDC_CHECK_IMAP_TRASH 1461 -#define IDC_RD_KEEPALL 1462 -#define IDC_RADIO_OFFLINE 1462 -#define IDC_RD_KEEP_NEW 1463 -#define IDC_CHECK_ASKME_DEFAULT 1463 -#define IDC_ARROW_HAND 1464 -#define IDC_EDIT_DAYS 1464 -#define IDC_INSTALL 1464 -#define IDC_BNT_MORE 1465 -#define IDC_NETHELP 1465 -#define IDC_IBEAM_HAND 1466 -#define IDC_COLOR_LIST_FRAME 1466 -#define IDC_EDIT_NEWEST 1466 -#define IDC_CHECK_DOWNLOAD 1466 -#define IDC_EXPLANATION1 1466 -#define IDC_RADIO_FROM 1467 -#define IDC_RADIO_KEEP1 1468 -#define IDC_RADIO_ALWAYS 1468 -#define IDC_RADIO_SINCE 1468 -#define IDD_NEWSMAXHEADERS 1469 -#define IDC_RADIO_KEEP2 1469 -#define IDC_RADIO_NEVER 1469 -#define IDC_EDIT_DAYS_AGO 1469 -#define IDC_TEXT_ACTION 1469 -#define IDC_RADIO_KEEP3 1470 -#define IDD_PREF_MNOFFLINE 1470 -#define IDC_TEXT_ACTION2 1470 -#define IDC_CHECK_KEEP4 1471 -#define IDD_MORE_DISK_CHOICES 1471 -#define IDC_BUTTON_SELECT 1471 -#define IDD_PREF_MORE_DISKSPACE 1472 -#define IDD_ASKME_DIALOG 1473 -#define IDC_CHECK_DOWNLOAD_MAIL 1473 -#define IDB_PREVIEWSPLASH 1474 -#define IDD_NO_SPELL_CHECKER 1474 -#define IDC_TEXT_SELECTION_COUNT 1474 -#define IDC_TEXT_DISCUSSIONS_SELECTED 1474 -#define IDB_PROPREVIEWSPLASH 1475 -#define IDB_FILEATTACHMENT 1475 -#define IDC_LIST_DISCUSSIONS 1475 -#define IDD_PP_DOWNLOAD_DISCUS 1476 -#define IDD_CUSTOM_DICTIONARY 1476 -#define IDC_BUTTON_SELECT_ALL 1476 -#define IDD_PP_DOWNLOAD_MAIL 1477 -#define IDB_WEBATTACHMENT 1477 -#define IDC_ACCTADD_TEXT 1477 -#define IDC_STATIC_UNREAD 1477 -#define IDC_CTRL 1477 -#define IDD_GO_ONOROFF_LINE 1478 -#define IDC_MUCWIZARD_MODEMLIST 1478 -#define IDC_ACCTSYS_TEXT 1478 -#define IDC_STATIC_TOTAL 1478 -#define IDC_EMAIL_TEXT1 1478 -#define IDC_BTN_RECIPIENTS 1478 -#define IDB_MAIL 1479 -#define IDC_ACCTEXIST_TEXT 1479 -#define IDC_MUCWIZARD_OK 1479 -#define IDC_STATIC_SPACE 1479 -#define IDC_EMAIL_TEXT2 1479 -#define IDC_LIST2 1479 -#define IDB_DISCUSSIONS_1 1480 -#define IDC_MUCEDIT_TEXT1 1480 -#define IDC_MUCWIZARD_CANCEL 1480 -#define IDC_CHECK_RECEIVE_HTML 1480 -#define IDC_EMAIL_ADDRTEXT 1480 -#define ID_BTN_ADD 1480 -#define IDB_MESSAGE 1481 -#define IDC_MAIL_SERVER_NAME 1481 -#define IDC_EMAIL_TEXT4 1481 -#define ID_BTN_REMOVE 1481 -#define IDD_SELECT_DISCUSSIONS 1482 -#define IDI_FILE 1482 -#define IDB_BOOKMARKOUTLINER 1482 -#define IDC_MUCWIZARD_ACCTLIST 1482 -#define IDC_PERCENT_WASTED 1482 -#define IDC_EMAIL_TEXT_PATCH 1482 -#define IDC_STATIC_HTML1 1482 -#define IDC_MUCEDIT_TEXT2 1483 -#define IDC_MUCWIZARD_MODEMVIEW 1483 -#define IDC_USED_SPACE 1483 -#define IDC_STATIC_HTML2 1483 -#define IDB_COMPOSEVTAB 1484 -#define IDC_MUCEDIT_TEXT3 1484 -#define IDC_MUCWIZARD_ACCTVIEW 1484 -#define IDC_DOWNLOAD_NOW 1484 -#define IDC_HELP_RECIPIENTS 1484 -#define IDB_VERTICALTAB 1485 -#define IDC_MUCEDIT_TEXT4 1485 -#define IDC_PRETTY_NAME 1485 -#define IDC_HELP_HTMLOK 1485 -#define IDS_INVALID_PROFILE_NAME 1486 -#define IDC_CHECK 1486 -#define IDB_MSGENCRYPTED 1486 -#define IDC_UGLY_NAME 1486 -#define IDC_ICON1 1486 -#define IDS_UNABLE_CREATE_DIR 1487 -#define IDC_TEXT2 1487 -#define IDB_MSGSIGNEDENCRYPTED 1487 -#define IDC_NEWS_SERVER 1487 -#define IDS_PROFILE_EMPTY 1488 -#define IDC_SERVER_NAME 1488 -#define IDC_ADVANCED_ACCTNAME 1488 -#define IDS_PROFILE_DELETED 1489 -#define IDB_MSGSIGNED 1489 -#define IDC_PORT_NUMBER 1489 -#define IDC_LISTBOX_TAG 1489 -#define IDS_CONFIRM_DELETE 1490 -#define IDC_SECURITY_TYPE 1490 -#define IDC_EMAIL_NAMEEG 1490 -#define IDB_MSGENCRYPTEDBAD 1491 -#define IDC_DESCRIPTION_STR 1491 -#define IDC_EMAIL_ADDREG 1491 -#define IDC_VIEW_TEXT2 1492 -#define IDB_MSGSIGNEDBAD 1493 -#define IDC_TEXT_FOLDERS_SELECTED 1493 -#define IDC_USE_MAPI 1493 -#define IDS_BAD_DIRECTORY2 1494 -#define IDC_MAPI_GROUP 1494 -#define IDB_MSGSIGNEDENCRYPTEDBAD 1495 -#define IDC_STATIC_LABEL_SELECTED 1495 -#define IDB_MSGSTAMPMASK 1496 -#define IDC_HELP_SELECT_FOR_DOWNLOAD 1496 -#define IDB_MSGATTACHED 1497 -#define IDC_HELP_GO_OFFLINE 1497 -#define IDS_INSUFFICIENT_DISKSPACE_MOVE 1498 -#define IDC_DIALER_TEXT 1498 -#define IDS_INSUFFICIENT_DISKSPACE_COPY 1499 -#define IDC_LOGINNAME 1499 -#define IDD_SPELLING_LANGUAGE 1500 -#define IDC_ADVANCED_SEARCH 1500 -#define IDC_PASSWORD 1500 -#define IDS_PROFDIR_EXISTS 1501 -#define IDC_LDAP_SEARCHBASE 1501 -#define IDS_PROFILE_SELECTOR_TITLE 1502 -#define IDC_LDAP_ADDRESS 1502 -#define IDS_PE_INTROPAGE_TEXT 1503 -#define IDC_COMBO_AND_OR 1503 -#define IDC_LDAP_SERVER 1503 -#define IDD_PP_NEWS_GENERAL 1504 -#define IDB_SAENCRYPTEDBAD 1504 -#define IDS_PEMUC_NEWSPAGE 1504 -#define IDC_HTTP_SERVER 1504 -#define IDD_PP_NEWSHOST_GENERAL 1505 -#define IDB_SAENCRYPTED 1505 -#define IDC_CHECK_SUBFOLDERS 1505 -#define IDC_HTTP_ADDRESS 1505 -#define IDB_SAUNENCRYPTED 1506 -#define IDC_RADIO_SERVER 1506 -#define IDB_SASIGNED 1507 -#define IDC_REMOVE_HEADER 1507 -#define IDB_SASIGNEDBAD 1508 -#define IDS_PEMUCWIZ_TITLE 1508 -#define IDC_EDIT_HEADERS 1508 -#define IDB_SAENCRYPTED_MASK 1509 -#define IDS_PEMUCWIZ_BUTTON 1509 -#define IDC_CLEAR_SEARCH 1509 -#define IDC_ADVANCED_SEARCH_HELP 1510 -#define IDB_SAENCRYPTEDBAD_MASK 1510 -#define IDS_PEMUC_READNEWS_FINISH 1510 -#define IDS_CLICK_FINISH 1511 -#define IDB_SASIGNED_MASK 1512 -#define IDS_PEMUC_NAMEPAGE_TEXT 1512 -#define IDB_SAUNENCRYPTED_MASK 1513 -#define IDS_MUP_NAMEPAGE_TEXT 1513 -#define IDB_SASIGNEDBAD_MASK 1514 -#define IDS_PEMUCVIEW_TEXT1 1514 -#define IDD_HTML_MAIL_QUESTION 1515 -#define IDS_PEMUCVIEW_TEXT2 1515 -#define IDD_HTML_RECIPIENTS 1516 -#define IDS_PEMUCEDIT_UPGRADE 1516 -#define IDS_PEMUCEDIT_NORMAL 1517 -#define IDB_OLDCHARTB 1521 -#define IDB_NEW_FORMAT_TOOLBAR 1522 -#define IDD_LAUNCH_HELPER 1523 -#define IDB_MSGATTACHBUTTON 1524 -#define IDB_MSGATTACHBUTTONMASK 1525 -#define IDB_MAILFOLDER 1526 -#define IDB_MAILFOLDEROPEN 1527 -#define IDD_PP_ATTACHMENT_GENERAL 1528 -#define IDB_ED_DRAG 1529 -#define IDD_QA_DIALOG 1529 -#define IDC_TABLE_SIZE 1530 -#define IDC_TABLE_VSIZE 1531 -#define IDD_ADVANCED_SEARCH 1532 -#define IDC_ROW_SIZE 1532 -#define IDC_COL_SIZE 1533 -#define IDD_BASIC_SEARCH 1533 -#define IDC_TABLE_SEL 1534 -#define IDD_NOTIFY 1534 -#define IDC_COL_SEL 1535 -#define IDD_ADVANCED_LDAP_SEARCH 1535 -#define IDC_ROW_SEL 1536 -#define IDD_PP_FOLDER 1537 -#define IDC_CELL_SEL 1537 -#define IDD_PP_MULTISEL 1538 -#define IDC_ADD_ROWS 1538 -#define IDS_PROFILE_RENAME 1539 -#define IDC_ADD_COLS 1539 -#define IDS_PROFILE_RENAME2 1540 -#define IDS_MISSING_CFG 1541 -#define IDS_INVALID_CFG 1542 -#define IDS_INVALID_WIN16_DIR 1543 -#define IDB_DIRLIST 1543 -#define IDS_UNABLE_WRITE_REG 1544 -#define IDB_MAILHCLOSEPANE_H 1545 -#define IDB_MAILHCLOSEPANE_N 1546 -#define IDB_MAILVCLOSEPANE_H 1547 -#define IDB_MAILVCLOSEPANE_N 1548 -#define IDB_MAILHSHOWPANE_H 1549 -#define IDB_MAILHSHOWPANE_N 1550 -#define IDB_MAILVSHOWPANE_H 1551 -#define IDB_MAILVSHOWPANE_N 1552 -#define IDC_UNSUBSCRIBE 1553 -#define IDD_PREF_LDAP_OFFLINE_SETTINGS 1553 -#define IDC_BUTTON_FILE_MESSAGE 1553 -#define IDC_UPDATE_NOW 1553 -#define IDC_EDIT_USERNAME 1554 -#define IDC_CHECK_OVERRIDE 1555 -#define IDC_BUTTON_NEW_FOLDER 1555 -#define IDD_XPPROGRESS 1556 -#define IDC_LINE1 1557 -#define IDC_LINE2 1558 -#define IDC_STATIC_HOST 1558 -#define IDB_NAV_BAR 1559 -#define IDD_MAILSERVER_GENERAL 1559 -#define IDB_NAV_BAR1 1560 -#define IDD_MAILSERVER_POP 1560 -#define IDC_STATIC_TYPE 1560 -#define IDD_MAILSERVER_IMAP 1561 -#define IDC_RADIO_POP3 1561 -#define IDD_MAILSERVER_ADVANCED 1562 -#define IDC_COMBO_TYPE 1562 -#define IDC_STATIC_MAIL_SERVER 1563 -#define IDC_RADIO_SEARCH_LOCAL 1570 -#define IDC_RADIO_SEARCH_SERVER 1571 -#define IDC_COPY_STYLE 1580 -#define IDC_TABLE_COPY 1581 -#define IDC_TABLE_MOVE 1582 -#define IDS_MERGE_NEXT_CELL 1583 -#define IDD_NETPROFILE_LOGIN 1599 -#define IDC_CONFIRM1 1600 -#define IDC_CONFIRM2 1601 -#define IDC_CONFIRM3 1602 -#define IDC_CONFIRM4 1603 -#define IDC_INTRO1 1604 -#define IDC_INTRO2 1605 -#define IDC_INTRO3 1606 -#define IDC_NAME1 1607 -#define IDC_NAME2 1608 -#define IDC_NAME3 1609 -#define IDC_NAME4 1610 -#define IDC_PROFILE1 1611 -#define IDC_PROFILE2 1612 -#define IDC_PROFILE3 1613 -#define IDC_PROFILE4 1614 -#define IDS_UNABLETRANSFER_SUBDIR 1615 -#define IDS_ANDTHE 1616 -#define IDS_ORTHE 1617 -#define IDS_EDIT_CUSTOM 1618 -#define IDS_HEADER_DELETED_WARN 1620 -#define IDS_HEADER_TEXT_WARN 1621 -#define IDS_CUSTOM_HEADER_ERROR 1622 -#define IDS_EDIT_HEADER_IN_USE 1623 -#define IDD_SEARCH 1650 -#define IDD_HEADER_LIST 1670 -#define IDC_DRAG_COLOR 1675 -#define IDC_DROP_COLOR 1676 -#define IDC_DRAG_ARROW 1677 -#define IDC_NO_DROP 1678 -#define ID_MERGE_TABLE_CELLS 1679 -#define IDC_ALL_CELLS_SEL 1680 -#define ID_SPLIT_TABLE_CELL 1681 -#define IDS_MERGE_SELECTED_CELLS 1682 -#define IDS_SPLIT_TABLE_CELL 1684 -#define IDS_COPY_STYLE 1685 -#define ID_COPY_STYLE 1686 -#define IDD_EDIT_HEADER 1700 -#define IDC_SHORTCUT_BASE 1800 -#define IDC_EMAIL_ADDR 1996 -#define IDC_PROFILE_NAME 1997 -#define IDC_PROFILE_DIR 1998 -#define IDC_USER_NAME 1999 -#define IDB_FILE_PICT_TOOLBAR 2001 -#define IDB_FILE_TEXT_TOOLBAR 2002 -#define IDB_FILE_MIXED_TOOLBAR 2003 -#define IDB_CHAR_FORMAT_TOOLBAR 2004 -#define IDB_PARA_FORMAT_TOOLBAR 2005 -#define IDB_FORMS_TOOLBAR 2006 -#define IDB_PICTURES_EDT 2007 -#define IDS_FONTNAME_SANS_SERIF 2007 -#define IDB_MAINFRAME_MIXED_EDT 2008 -#define IDD_PREF_EDITOR 2008 -#define IDB_MAINFRAME_TEXT_EDT 2009 -#define IDB_GOLD_SPLASH 2010 -#define IDW_FORMAT_TOOLBAR 2011 -#define IDW_EDIT_TOOLBAR 2012 -#define IDW_PARA_TOOLBAR 2013 -#define IDW_FORMS_TOOLBAR 2014 -#define IDC_CONFIG_EDITBAR 2014 -#define IDC_CONFIG_FORMATBAR 2015 -#define IDC_CONFIG_CHARBAR 2016 -#define IDS_SAVE_DOC_PROMPT 2018 -#define IDS_SAVE_HTTP_PROMPT 2019 -#define IDB_COMBOBOX 2019 -#define IDD_HREF_BOOKMARK 2021 -#define IDD_HINT_DLG 2022 -#define IDC_HREF_FILE 2023 -#define IDD_PROPS_HRULE 2024 -#define IDB_IMAGE_PREVIEW 2025 -#define IDC_ANCHOR_EDIT 2026 -#define IDD_PROPS_IMAGE 2027 -#define IDB_ALIGN_TOP 2029 -#define IDB_ALIGN_MIDDLE_BASELINE 2030 -#define IDB_ALIGN_ABSMIDDLE 2031 -#define IDB_ALIGN_BOTTOM_BASELINE 2032 -#define IDB_ALIGN_LEFT 2033 -#define IDB_ALIGN_RIGHT 2034 -#define IDB_ALIGN_ABSBOTTOM 2035 -#define IDC_HREF_UNLINK 2036 -#define IDD_LIST_DLG 2039 -#define IDC_HREF_URL 2040 -#define IDC_TARGET_LIST 2041 -#define IDC_ANCHOR_LABEL 2050 -#define IDC_ANCHOR 2051 -#define IDC_ANCHOR_FRAME 2052 -#define IDC_LINK_FRAME 2053 -#define IDC_TARGET_LABEL 2054 -#define IDC_SHOW_HINT_AGAIN 2055 -#define IDC_EDIT_HINT 2056 -#define IDC_HINT_ICON 2057 -#define IDC_HREF_LABEL 2058 -#define IDC_OVERWRITE_ICON 2059 -#define IDC_IMAGE_LINK_TO 2060 -#define IDC_HR_ALIGN_LEFT 2066 -#define IDC_HR_ALIGN_CENTER 2067 -#define IDC_HR_ALIGN_RIGHT 2068 -#define IDC_HR_WIDTH 2069 -#define IDC_HR_WIDTH_PIXELS 2070 -#define IDC_HR_WIDTH_PERCENT 2071 -#define IDC_HR_SHADOW 2073 -#define IDC_IMAGE_BORDER 2073 -#define IDC_HR_HEIGHT 2074 -#define IDC_IMAGE_SPACE_HORIZ 2074 -#define IDC_PREVIEW_FRAME 2075 -#define IDC_IMAGE_SPACE_VERT 2076 -#define IDC_IMAGE_ALT_TEXT 2077 -#define IDC_IMAGE_ALIGN_STYLES 2078 -#define IDC_IMAGE_FILE 2079 -#define IDC_LOWRES_FILE 2080 -#define IDC_NOWRAP_MSG 2092 -#define IDC_LIST_CONTAINER 2096 -#define IDC_LOWRES_URL 2096 -#define IDC_LIST_TYPE 2097 -#define IDC_COMPACT_LIST 2098 -#define IDC_KEEP_IMAGE_WITH_DOC 2099 -#define IDC_IMAGE_URL 2101 -#define IDD_LOADING_IMAGES 2102 -#define IDC_LOADING_IMAGES 2102 -#define IDD_PROPS_DOCUMENT 2103 -#define IDC_DOC_TITLE 2104 -#define IDD_PROPS_CHARACTER 2104 -#define IDC_DOC_URL 2105 -#define IDC_DOC_AUTHOR 2106 -#define IDC_DOC_CREATE_DATE 2107 -#define IDC_FONTDEF_LOCATION 2107 -#define IDC_DOC_CREATION_DATE 2107 -#define IDC_DOC_CREATE_DATE2 2108 -#define IDC_DOC_UPDATE_DATE 2108 -#define IDC_DOC_META_LIST 2109 -#define IDC_DOC_DESCRIPTION 2109 -#define IDC_META_NAME 2110 -#define IDC_META_CONTENT 2111 -#define IDC_ADD_META_TAG 2112 -#define IDC_NAV_OPENS_NEW_WINDOW 2113 -#define IDC_EDITOR_OPENS_NEW 2114 -#define IDC_CHECK_BOLD 2115 -#define IDC_CHECK_ITALIC 2116 -#define IDC_CHECK_STRIKETHROUGH 2117 -#define IDC_CHECK_SUPERSCRIPT 2118 -#define IDD_SAVE_REMOTE_DOCUMENT 2118 -#define IDC_CHECK_SUBSCRIPT 2119 -#define IDD_PROPS_META 2119 -#define IDC_FONT_PROPORTIONAL 2120 -#define IDC_CHECK_UNDERLINE 2120 -#define IDC_FONT_FIXED_WIDTH 2121 -#define IDD_PAGE_DOC_COLORS 2121 -#define IDC_FONT_SIZE_COMBO 2124 -#define IDD_SAVE_IMAGE 2124 -#define IDC_FONT_COLOR_COMBO 2125 -#define IDD_SAVE_IMAGE_OVERWRITE 2125 -#define IDC_CHANGE_COLOR 2126 -#define IDC_FONT_SIZE_COMBO2 2126 -#define IDC_CHECK_BLINK 2127 -#define IDC_COPY_IMAGES 2128 -#define IDC_CHECK_NOBREAK 2128 -#define IDC_ADJUSTLINKS 2129 -#define IDC_DONT_ADJUSTLINKS 2130 -#define IDC_EDIT_AUTHOR 2132 -#define IDC_DOC_COLOR_PREVIEW 2134 -#define IDC_EQUIV_LIST 2135 -#define IDC_META_LIST 2136 -#define IDC_VAR_NAME 2137 -#define IDC_VAR_VALUE 2138 -#define IDC_VAR_SET 2139 -#define IDC_VAR_DELETE 2140 -#define IDC_VAR_NEW 2141 -#define IDC_SAVEAS_MSG 2142 -#define IDC_SAVEAS_NEW_DOC 2143 -#define IDC_SCHEME_LIST 2146 -#define IDC_SAVE_SCHEME 2147 -#define IDC_REMOVE_SCHEME 2148 -#define IDC_COLOR_ITEMS_LIST 2149 -#define IDC_BKRND_COLOR_DEF 2156 -#define IDC_OVERWRITE_ONE 2160 -#define IDC_OVERWRITE_ALL 2161 -#define IDC_DONT_OVERWRITE_ONE 2162 -#define IDC_DONT_OVERWRITE_ALL 2163 -#define IDD_PAGE_IMAGE 2163 -#define IDD_PAGE_LINK 2164 -#define IDD_PAGE_CHARACTER 2165 -#define IDC_CHOOSE_TEXT_COLOR 2166 -#define IDC_CHOOSE_LINK_COLOR 2167 -#define IDD_PAGE_PARAGRAPH 2167 -#define IDC_CHOOSE_ACTIVELINK_COLOR 2168 -#define IDC_CHOOSE_FOLLOWEDLINK_COLOR 2169 -#define IDD_PAGE_DOC_ADVANCED 2169 -#define IDC_SWATCH_TEXT 2170 -#define IDD_CREATE_TARGET 2170 -#define IDD_PROPS_TARGET 2170 -#define IDC_SWATCH_LINK 2171 -#define IDC_SWATCH_ACTIVELINK 2172 -#define IDC_SWATCH_FOLLOWEDLINK 2173 -#define IDC_SWATCH_FOLLOWEDLINK2 2174 -#define IDC_SWATCH_BKGRND 2174 -#define IDD_PUBLISH 2175 -#define IDC_APPLY_TO_CURRENT_DOC 2176 -#define IDC_APPLY_SETTINGS_MSG 2177 -#define IDD_PAGE_PARAMETERS 2177 -#define IDC_COLOR_SCHEME_GROUP 2178 -#define IDD_PAGE_JAVA_APPLET 2178 -#define IDC_COLOR_TEXT_GROUP 2179 -#define IDD_PAGE_PLUGIN 2179 -#define IDC_COLOR_BKGRND_GROUP 2180 -#define IDD_PAGE_DOC_INFO 2180 -#define IDC_SET_DOC_COLORS 2183 -#define IDC_USE_BROWSER_COLORS 2184 -#define IDD_SAVE_NEW_DOCUMENT 2184 -#define IDD_PAGE_PLUG_IN 2185 -#define IDC_TEXT_COLOR_DEFAULT 2186 -#define IDC_TEXT_COLOR_CUSTOM 2187 -#define IDC_CHECK_FIXED_WIDTH 2188 -#define IDD_PREF_PUBLISH 2189 -#define IDC_CLEAR_ALL_STYLES 2190 -#define IDC_PARAGRAPH_COMBO 2191 -#define IDC_CLEAR_TEXT_STYLES 2191 -#define IDB_PLUGIN 2191 -#define IDC_PARAGRAPH_STYLES 2191 -#define IDB_TARGET 2192 -#define IDC_ALIGN_CENTER 2193 -#define IDB_PLUGIN_SMALL 2193 -#define IDC_ALIGN_RIGHT 2194 -#define IDD_PROPS_HTML_TAG 2194 -#define IDC_CONTAINER_COMBO 2195 -#define IDC_LISTSTYLES 2195 -#define IDC_LIST_STYLES 2195 -#define IDD_PREF_TAG_TEMPLATES 2195 -#define IDC_LIST_ITEM_LABEL 2196 -#define IDD_PROPS_JAVA_HEADER 2196 -#define IDC_LIST_ITEM_COMBO 2197 -#define IDC_LIST_ITEM_STYLES 2197 -#define IDD_OPEN_TEMPLATE 2198 -#define IDC_NETSCAPE_TEMPLATES 2198 -#define IDC_INDENT_LEVEL 2198 -#define IDC_LIST_START_NUMBER 2201 -#define IDC_HR_WIDTH_TYPE 2202 -#define IDC_TARGET_NAME 2204 -#define IDC_TARGETS_IN_CURRENT_DOC 2205 -#define IDC_TARGETS_IN_FILE 2206 -#define DC_TARGET_LIST 2208 -#define IDC_JAVA_SCRIPT_NONE 2210 -#define IDC_JAVA_SCRIPT_CLIENT 2211 -#define IDC_CONTAINER_TYPE 2211 -#define IDC_CONTAINER_STYLES 2211 -#define IDC_JAVA_SCRIPT_SERVER 2212 -#define IDC_HTML_EDITOR 2212 -#define IDC_IMAGE_EDITOR 2213 -#define IDC_IMAGE_ORIGINAL_SIZE 2213 -#define IDC_ALIGN_STYLE_FRAME 2214 -#define IDC_SELECT_HTML_EDITOR 2214 -#define IDC_IMAGE_HEIGHT 2215 -#define IDC_SELECT_IMAGE_EDITOR 2215 -#define IDC_PUBLISH_FILE_COUNT 2215 -#define IDC_IMAGE_WIDTH 2216 -#define IDC_PUBLISH_CURRENT_FILE 2216 -#define IDC_PUBLISH_TO_URL 2217 -#define IDC_TIME_REMAINING 2218 -#define IDC_PUBLISH_RATE 2219 -#define IDC_PUBLISH_DIRECTORY 2220 -#define IDC_EDIT_IMAGE 2220 -#define IDC_PUBLISH_FILE 2221 -#define IDC_AUTOADJUST_LINKS 2221 -#define IDC_PUBLISH_USER 2222 -#define IDC_NO_ADJUST_LINKS 2222 -#define IDC_ALT_TEXT 2223 -#define IDC_INFO_ICON 2223 -#define IDC_KEYWORDS 2224 -#define IDC_PLUGIN_IS_VISIBLE 2224 -#define IDC_PUBLISH_FILENAME 2225 -#define IDC_FULL_WINDOW_SIZE 2225 -#define IDC_SELECT_DIRECTORY 2226 -#define IDC_REMOVE_ISMAP 2227 -#define IDC_SAVE_INTL_CHARSET 2227 -#define IDC_SELECT_FILE 2228 -#define IDC_PLUGIN_PAL_FOREGROUND 2228 -#define IDC_PUBLISH_DIRNAME 2229 -#define IDC_PLUGIN_PAL_BACKGROUND 2229 -#define IDC_PUBLISH_LOCATION_LIST 2230 -#define IDC_BROWSE_FILE 2230 -#define IDC_APPLET_LOCATION 2231 -#define IDC_PUBLISH_FTP 2231 -#define IDC_DOC_CLASIFICATION 2232 -#define IDC_PUBLISH_HTTP 2232 -#define IDC_PUBLISH_PASSWORD 2233 -#define IDC_APPLET_CLASS_NAME 2234 -#define IDC_PUBLISH_SAVE_PASSWORD 2234 -#define IDC_PUBLISH_REMEMBER_PASSWORD 2235 -#define IDC_NEW_DOC_TEMPLATE 2236 -#define IDC_RESTORE_DEFAULT_TEMPLATE 2237 -#define IDC_EDAL_A 2238 -#define IDC_EDIT_TAG 2238 -#define IDC_EDAL_B 2239 -#define IDC_EDALCB 2240 -#define IDC_EDIT_TAG_MSG 2240 -#define IDC_EDAL_C 2241 -#define IDC_VERIFY_TAG 2241 -#define IDC_EDAL_T 2242 -#define IDC_TAG_LIST 2242 -#define IDC_EDAL_L 2243 -#define IDC_SAVE_DOC_ENCODE 2243 -#define IDC_EDAL_R 2244 -#define IDC_CLEAR_LINK 2244 -#define IDC_LINKED_TEX 2244 -#define IDC_COLOR_LABEL 2245 -#define IDC_MIXED_COLOR_LABEL 2246 -#define IDC_BROWSE_TO_LOCATION 2248 -#define IDC_NEW_DOC_BLANK 2249 -#define IDC_NEW_DOC_WIZARD 2251 -#define IDC_PUBLISH_OTHER_FILES 2252 -#define IDC_SELECT_ALL 2254 -#define IDC_SELECT_NONE 2255 -#define IDC_INCLUDE_IMAGE_FILES 2257 -#define IDC_INCLUDE_ALL_FILES 2258 -#define IDC_PUBLISH_DEFAULT_LOCATION 2259 -#define IDD_CREATE_TABLE 2266 -#define IDD_PAGE_TABLE 2267 -#define IDD_PAGE_TABLE_ROW 2268 -#define IDD_PAGE_TABLE_CELL 2269 -#define IDR_EDIT_INSERT_TABLE 2270 -#define IDR_EDIT_DELETE_TABLE 2271 -#define IDC_APPLY 2272 -#define IDR_CATEGORYFRAME 2273 -#define IDD_LOGIN_DIALOG 2274 -#define IDC_LOGIN_LIST 2275 -#define IDD_SETUPWIZARD_INTRO 2275 -#define IDC_CREATENEWPROFILE 2276 -#define IDD_SETUPWIZARD_PROFILENAME 2277 -#define IDD_SETUPWIZARD_NAMEEMAIL 2278 -#define IDD_UPDATE_STATUS 2279 -#define IDD_SETUPWIZARD_CONFIRMTYPE 2280 -#define IDD_SEARCHLDAP 2282 -#define IDD_PREF_MNDISKSPACE 2283 -#define IDD_SETUPWIZARD_WIN16 2284 -#define IDD_MUCWIZARD_INTRO 2290 -#define IDD_MUCWIZARD_VIEW 2291 -#define IDD_MUCWIZARD_ASWREADY 2292 -#define IDC_RADIO_KEEP4 2293 -#define IDD_MUCWIZARD_MUCREADY 2293 -#define IDD_MUCWIZARD_EDIT 2294 -#define IDD_MSGSRCHACTION 2295 -#define IDD_EXPORTRDF 2296 -#define IDD_NETPROFILE_ADVANCED 2297 -#define IDD_MAILSERVER_TYPE 2298 -#define IDC_COMBO_AND_OR2 2300 -#define IDC_COMBO_AND_OR3 2301 -#define IDC_COMBO_AND_OR4 2302 -#define IDC_COMBO_AND_OR5 2303 -#define IDC_PROFILENAME_TEXT 2400 -#define IDC_HEADER_HELP 2500 -#define FIRST_HISTORY_MENU_ID 16384 -#define LAST_HISTORY_MENU_ID 16600 -#define FIRST_HT_MENU_ID 16601 -#define LAST_HT_MENU_ID 16639 -#define FIRST_BOOKMARK_MENU_ID 16640 -#define LAST_BOOKMARK_MENU_ID 18687 -#define FIRST_FILE_BOOKMARK_MENU_ID 18688 -#define LAST_FILE_BOOKMARK_MENU_ID 20735 -#define FIRST_MOVE_MENU_ID 20736 -#define LAST_MOVE_MENU_ID 21759 -#define FIRST_COPY_MENU_ID 21760 -#define LAST_COPY_MENU_ID 22783 -#define FIRST_ATTACH_MENU_ID 22784 -#define LAST_ATTACH_MENU_ID 22847 -#define FIRST_SAVEATTACH_MENU_ID 22848 -#define LAST_SAVEATTACH_MENU_ID 22911 -#define FIRST_ATTACHPROP_MENU_ID 22912 -#define LAST_ATTACHPROP_MENU_ID 22975 -#define FIRST_ADDSENDER_MENU_ID 22976 -#define LAST_ADDSENDER_MENU_ID 24000 -#define FIRST_ADDALL_MENU_ID 24001 -#define LAST_ADDALL_MENU_ID 25025 -#define IDB_NEWTABS 30990 -#define IDB_DIRECTORYBUTTON 30991 -#define ID_TBAR_ALWAYSONTOP 32700 -#define ID_TBAR_SHOWTEXT 32701 -#define ID_TBAR_POSITION 32702 -#define ID_FILE_OPENURL 32769 -#define ID_NEW_FRAME 32770 -#define ID_NETSCAPE_SAVE_AS 32771 -#define ID_NETSCAPE_SAVEFRAME_AS 32772 -#define ID_FONT_10 32773 -#define ID_FONT_12 32774 -#define ID_FONT_14 32775 -#define ID_FONT_16 32776 -#define ID_FONT_24 32777 -#define ID_FONT_36 32778 -#define ID_FONT_48 32779 -#define ID_NAVIGATE_BACK 32780 -#define ID_NAVIGATE_FORWARD 32781 -#define ID_NAVIGATE_RELOAD 32782 -#define ID_NAVIGATE_REPAINT 32783 -#define ID_ENTERKEY 32784 -#define IDS_TASKBAR 32784 -#define ID_OPTIONS_BUTTONS 32785 -#define IDS_NOTIFY_MAIL1_TIP 32785 -#define ID_OPTIONS_TITLEURLBAR 32786 -#define IDS_NOTIFY_NEWS_TIP 32786 -#define ID_FILE_SAVECONFIGURATION 32787 -#define IDS_NOTIFY_WEB_TIP 32787 -#define ID_OPTIONS_TITLELOCATION_BAR 32788 -#define ID_FILE_VIEWSOURCE 32789 -#define ID_OPTIONS_STEVENSONBOX 32790 -#define ID_OPTIONS_STYLES 32791 -#define ID_OPTIONS_FANCYFTP 32792 -#define ID_OPTIONS_FANCYNEWS 32793 -#define ID_OPTIONS_FLUSHCACHE 32794 -#define IDS_TBAR_NAME 32794 -#define ID_NAVIGATE_INTERRUPT 32795 -#define IDS_NOTIFY_FOLDERS_TIP 32796 -#define ID_FONT_SMALL 32797 -#define IDS_NOTIFY_COMPOSE_TIP 32797 -#define ID_FONT_MEDIUM 32798 -#define IDS_NOTIFY_ADDRESSBOOK_TIP 32798 -#define ID_FONT_LARGE 32799 -#define IDS_NOTIFY_CALENDAR_TIP 32799 -#define IDS_NOTIFY_CALLPOINT_TIP 32800 -#define ID_OPTIONS_TOGGLENETDEBUG 32801 -#define ID_CONFIGURE_EXT_VIEWERS 32802 -#define ID_VIEW_LOADIMAGES 32804 -#define ID_VIEW_REFRESH 32805 -#define ID_GO_HOME 32807 -#define ID_GO_HISTORY 32808 -#define ID_FILE_MAILTO 32809 -#define ID_HOTLIST_ADDCURRENTTOHOTLIST 32810 -#define ID_HOTLIST_VIEW 32811 -#define ID_HOTLIST_MCOM 32812 -#define ID_HOTLIST_FISHCAM 32815 -#define IDS_DRAGURLTIP 32815 -#define ID_OPTIONS_LOADINLINEDIMAGES 32816 -#define ID_EDIT_FINDINCURRENT 32818 -#define ID_STARTERS_WELCOME 32820 -#define ID_STARTERS_WHATSNEW 32821 -#define ID_STARTERS_READNEWSGROUPS 32822 -#define ID_STARTERS_INTERNETINDEX 32823 -#define ID_STARTERS_INTERNETSEARCH 32824 -#define ID_STARTERS_INTERNETWHITEPAGES 32825 -#define ID_STARTERS_ABOUTTHEINTERNET 32826 -#define ID_STARTERS_HOWTOCREATEWEBSERVERS 32827 -#define ID_STARTERS_MCOM 32828 -#define ID_HELP_VERSION 32829 -#define ID_HELP_GUIDEDTOUR 32830 -#define ID_HELP_MANUAL 32831 -#define ID_HELP_FREQUENTLYASKEDQUESTIONS 32832 -#define ID_HELP_HOWTOGIVEFEEDBACK 32833 -#define ID_HELP_HOWTOGETSUPPORT 32834 -#define ID_OPTIONS_SAVE 32835 -#define ID_SAVE_OPTIONS 32836 -#define ID_OPTIONS_SHOWSTARTERBUTTONS 32837 -#define ID_OPTIONS_SHOWFTPFILEINFORMATION 32838 -#define ID_BASE_PROPORTIONAL_FONT 32839 -#define ID_BASE_FIXED_FONT 32840 -#define ID_HELP_LICENSE 32841 -#define ID_FILE_DOCINFO 32842 -#define ID_OPTIONS_SHOWSEC_BAR 32843 -#define ID_DOCUMENT_TOP 32844 -#define ID_FILE_PREFERENCES 32845 -#define ID_POPUP_GOTOLINK 32846 -#define IDS_POPUP_LOADLINK 32847 -#define ID_POPUP_PROPERTIES 32848 -#define ID_POPUP_FOLDUNFOLD 32850 -#define ID_POPUP_INTERNETSHORTCUT 32852 -#define IDS_POPUP_BREADCRUMBS 32853 -#define IDS_POPUP_BOOKMARKS 32854 -#define IDS_POPUP_ADDLINK2BOOKMARKS 32855 -#define IDS_POPUP_LOADLINKNEWWINDOW 32856 -#define IDS_POPUP_SAVELINKCONTENTS 32857 -#define IDS_POPUP_COPYLINKCLIPBOARD 32858 -#define IDS_POPUP_SAVEIMAGEAS 32859 -#define IDS_POPUP_COPYIMGLOC2CLIPBOARD 32860 -#define IDS_POPUP_LOAD_IMAGE 32862 -#define IDS_POPUP_LOADEMBED 32864 -#define IDS_POPUP_NOEMBED 32865 -#define IDS_POPUP_SAVEEMBEDAS 32866 -#define IDS_POPUP_ACTIVATE_EMBED 32867 -#define IDS_POPUP_COPYEMBEDLOC 32868 -#define IDS_POPUP_FRAMEBACK 32869 -#define IDS_POPUP_SAVEATTACHMENTAS 32869 -#define IDS_POPUP_FRAMEFORWARD 32870 -#define ID_EDIT_DELETE 32871 -#define ID_LOCATION_FOCUS 32872 -#define IDS_POPUP_BACK 32873 -#define ID_FILE_SAVEAS 32874 -#define IDS_POPUP_COPYEMBEDDATA 32875 -#define ID_DOCUMENT_BOTTOM 32876 -#define IDD_JAVACONSOLE 32877 -#define ID_OPTIONS_SHOWJAVACONSOLE 32878 -#define IDD_COMPLETION_PICKER 32878 -#define ID_FILE_MAILNEW 32879 -#define ID_EDIT_FINDAGAIN 32880 -#define ID_NAVIGATE_RELOADCELL 32881 -#define ID_OPTIONS_MAILANDNEWS 32882 -#define ID_OPTIONS_SECURITY 32883 -#define ID_OPTIONS_NETWORK 32884 -#define ID_WINDOW_ADDRESSBOOK 32885 -#define ID_POPUP_MAILNEW 32887 -#define ID_POPUP_CUT 32888 -#define ID_POPUP_COPY 32889 -#define ID_POPUP_PASTE 32890 -#define ID_POPUP_DELETE 32891 -#define ID_POPUP_DELETEBOOKMARK 32891 -#define ID_POPUP_MAKEALIAS 32892 -#define ID_POPUP_SETTOMENU 32893 -#define ID_POPUP_SETTOFOLDER 32894 -#define ID_POPUP_INSERTFOLDER 32895 -#define ID_POPUP_INSERTSEPARATOR 32896 -#define ID_POPUP_INSERTBOOKMARK 32897 -#define IDS_POPUP_FORWARD 32898 -#define IDS_TITLE_NOTITLE 32899 -#define IDS_TITLE_NOSUBJECT 32900 -#define IDS_TITLE_ADDRESSBOOK 32901 -#define IDS_TITLE_BOOKMARKS 32902 -#define IDS_TITLE_WEB 32903 -#define IDS_TITLE_COMPOSE_MESSAGE 32904 -#define IDS_TITLE_MESSAGE 32905 -#define IDS_TITLE_ARTICLE 32906 -#define IDS_TITLE_COLLECTIONS 32907 -#define ID_PLACES 32908 -#define ID_SECURITY 32909 -#define ID_NETSEARCH 32910 -#define ID_HISTORY_TITLE 32911 -#define ID_HISTORY_LOCATION 32912 -#define ID_HISTORY_FIRSTVISIT 32913 -#define ID_HISTORY_LASTVISIT 32914 -#define ID_HISTORY_EXPIRES 32915 -#define ID_HISTORY_VISITCOUNT 32916 -#define ID_HISTORY_LOGAND 32917 -#define ID_HISTORY_LOGOR 32918 -#define ID_POPUP_LOADFRAMENEWWINDOW 32919 -#define ID_POPUP_MAILTO 32920 -#define ID_NEXT_WINDOW 33013 -#define ID_HELP_SECURITY 33014 -#define ID_HELP_REGISTRATION 33015 -#define ID_CANCEL_EDIT 33016 -#define ID_POPUP_LOADLINK 33102 -#define ID_POPUP_ADDLINK2BOOKMARKS 33103 -#define ID_POPUP_LOADLINKNEWWINDOW 33104 -#define ID_POPUP_SAVELINKCONTENTS 33105 -#define ID_POPUP_COPYLINKCLIPBOARD 33106 -#define ID_POPUP_LOADIMAGE 33107 -#define ID_POPUP_SAVEIMAGEAS 33108 -#define ID_POPUP_COPYIMGLOC2CLIPBOARD 33109 -#define ID_POPUP_LOADIMAGEINLINE 33110 -#define ID_POPUP_ACTIVATEEMBED 33111 -#define ID_POPUP_SAVEEMBEDAS 33112 -#define ID_POPUP_COPYEMBEDLOC 33113 -#define ID_POPUP_COPYEMBEDDATA 33114 -#define ID_OPTIONS_TIPS 33125 -#define ID_REMOVE_FONTFACE 33126 -#define ID_FILE_OPENFOLDER 34000 -#define ID_FILE_OPENFOLDERNEW 34001 -#define ID_FILE_OPENFOLDERREUSE 34002 -#define ID_OPEN_MAIL_WINDOW 34003 -#define ID_MESSAGE_GETNEWMAIL 34004 -#define ID_OPEN_NEWS_WINDOW 34005 -#define ID_FILE_GETNEWMAIL 34006 -#define ID_FILE_DELIVERMAILNOW 34007 -#define ID_FILE_NEWFOLDER 34008 -#define ID_FILE_COMPRESSTHISFOLDER 34009 -#define ID_FILE_COMPRESSALLFOLDERS 34010 -#define ID_FILE_EMPTYTRASHFOLDER 34011 -#define ID_EDIT_DELETEMESSAGE 34022 -#define ID_POPUP_DELETEFOLDER 34023 -#define ID_EDIT_SELECTTHREAD 34024 -#define ID_EDIT_SELECTMARKEDMESSAGES 34025 -#define ID_EDIT_SELECTALLMESSAGES 34026 -#define ID_MESSAGE_REPLY 34029 -#define ID_MESSAGE_FORWARD 34031 -#define ID_MESSAGE_MOVE_TOFILE 34032 -#define ID_MESSAGE_MOVE_INBOXFOLDER 34033 -#define ID_MESSAGE_MOVE_TRASHFOLDER 34034 -#define ID_MESSAGE_OPEN 34035 -#define ID_POUP_COPYLINKCLIPBOARD 34035 -#define ID_WINDOW_NEWWINDOW 34036 -#define ID_UNROT13 34037 -#define ID_SORT_SORTMENUGOESHERE 34039 -#define ID_GO_FIRSTUNREAD 34043 -#define ID_VIEW_SHOWALLHEADERS 34044 -#define ID_SORT_THREADMESSAGES 34047 -#define ID_MAIL_THREAD 34048 -#define ID_SORT_ASCENDING 34049 -#define ID_SORT_BYDATE 34050 -#define ID_SORT_BYSUBJECT 34051 -#define ID_SORT_BYSENDER 34052 -#define ID_MAIL_ALLHEADERS 34054 -#define ID_MAIL_UNROT13 34055 -#define ID_WINDOW_BOOKMARKWINDOW 34056 -#define ID_VIEW_PAGESERVICES 34057 -#define ID_WINDOW_WINDOW_0 34060 -#define ID_WINDOW_WINDOW_1 34061 -#define ID_WINDOW_WINDOW_2 34062 -#define ID_WINDOW_WINDOW_3 34063 -#define ID_WINDOW_WINDOW_4 34064 -#define ID_WINDOW_WINDOW_5 34065 -#define ID_WINDOW_WINDOW_6 34066 -#define ID_WINDOW_WINDOW_7 34067 -#define ID_WINDOW_WINDOW_8 34068 -#define ID_WINDOW_WINDOW_9 34069 -#define ID_WINDOW_NEWBROWSER 34079 -#define ID_WINDOW_MAIL 34080 -#define ID_WINDOW_NEWS 34081 -#define ID_FILE_SEND 34084 -#define ID_FILE_ATTACH 34085 -#define ID_FILE_QUOTE 34086 -#define ID_FILE_OPENNEWSHOST 34087 -#define ID_FILE_REMOVENEWSHOST 34088 -#define ID_OPTIONS 34090 -#define ID_OPTIONS_SHOWACTIVENEWSGROUPS 34091 -#define ID_SHOWALLNEWSGROUPS 34092 -#define ID_OPTIONS_SHOWNEWNEWSGROUPS 34093 -#define ID_FILE_SENDLATER 34094 -#define IDS_FILE_SEND 34095 -#define IDS_FILE_SENDLATER 34096 -#define ID_OPTIONS_SHOWSUBSCRIBEDNEWSGROUPS 34098 -#define ID_MAIL_READTOPIC 34105 -#define ID_MAIL_READALL 34106 -#define ID_MAIL_SORTAGAIN 34111 -#define ID_OPTIONS_SAVEOPTIONS 34112 -#define ID_NEWS_POSTNEW 34116 -#define ID_MAIL_SHOWREAD 34119 -#define ID_MESSAGE_MARKASREAD 34120 -#define ID_MESSAGE_MARKASUNREAD 34121 -#define ID_MESSAGE_MARK 34125 -#define ID_MESSAGE_UNMARK 34126 -#define ID_MESSAGE_MOVE_SENT 34127 -#define ID_ITEM_MAILNEW 34134 -#define ID_ITEM_ADDUSER 34135 -#define ID_ITEM_ADDLIST 34136 -#define ID_ITEM_PROPERTIES 34137 -#define ID_FILE_IMPORT 34138 -#define ID_EDIT_PASTEASQUOTE 34139 -#define ID_ITEM_FOLD 34140 -#define ID_FOLDERINFO_ICON 34141 -#define ID_FOLDERINFO_NAME 34142 -#define ID_FOLDERINFO_UNREAD 34143 -#define ID_FOLDERINFO_COUNT 34144 -#define ID_FILE_NEWAB 34145 -#define ID_FILE_NEWDIR 34156 -#define ID_COMPOSE_QUOTE 34201 -#define ID_VIEW_SHOWALLFIELDS 34300 -#define ID_VIEW_SHOWREPLYTO 34301 -#define ID_VIEW_SHOWMAILTO 34302 -#define ID_VIEW_SHOWCC 34303 -#define ID_VIEW_SHOWBCC 34304 -#define ID_VIEW_SHOWPOSTTO 34305 -#define ID_VIEW_SHOWFOLLOWUPSTO 34306 -#define ID_VIEW_SHOWSUBJECT 34307 -#define ID_VIEW_SHOWATTACHMENT 34308 -#define ID_FILE_ADDNEWSGROUP 34312 -#define ID_FILE_GETMOREMESSAGES 34313 -#define ID_EDIT_CANCELMESSAGE 34315 -#define ID_MESSAGE_FORWARDQUOTED 34319 -#define ID_OPTIONS_SHOWONLYUNREADMESSAGES 34326 -#define ID_OPTIONS_SHOWUNREAD 34335 -#define ID_OLE_UPDATE 34336 -#define ID_FILE_WHATSNEW 34337 -#define ID_EDIT_SELECTALL 34338 -#define ID_ITEM_MAKEALIAS 34340 -#define ID_ITEM_SETTOFOLDER 34341 -#define ID_ITEM_SETTOMENU 34342 -#define ID_ITEM_INSERTBOOKMARK 34343 -#define ID_ITEM_INSERTFOLDER 34344 -#define ID_ITEM_INSERTSEPARATOR 34345 -#define ID_ITEM_GOTOBOOKMARK 34346 -#define ID_EDIT_SEARCH 34352 -#define ID_EDIT_SEARCHAGAIN 34353 -#define ID_VIEW_ATTACHINLINE 34355 -#define ID_VIEW_ATTACHLINKS 34356 -#define ID_FILE_PRINTPREVIEW 34357 -#define ID_OPTIONS_IMMEDIATEDELIVERY 34358 -#define ID_OPTIONS_DEFERREDDELIVERY 34359 -#define ID_SORT_BYMESSAGENUMBER 34364 -#define ID_VIEW_SHOWFROM 34365 -#define ID_FILE_UPLOADFILE 34366 -#define ID_MAIL_NORMALHEADERS 34367 -#define ID_MAIL_COMPRESSEDHEADERS 34368 -#define ID_FILE_NEWMESSAGE 34369 -#define ID_FILE_OPENMESSAGE 34370 -#define ID_FILE_OPENMESSAGENEW 34371 -#define ID_FILE_OPENMESSAGEREUSE 34372 -#define ID_EDIT_FILTERRULES 34378 -#define ID_EDIT_MAILPREFERENCES 34379 -#define ID_VIEW_NEXT 34380 -#define ID_EDIT_FILTER 34380 -#define ID_VIEW_PREVIOUS 34381 -#define ID_VIEW_REUSE 34384 -#define ID_MESSAGE_SEND 34390 -#define ID_MESSAGE_SENDLATER 34391 -#define ID_VIEW_ROT13 34394 -#define ID_TOOLS_BOOKMARKS 34398 -#define ID_TOOLS_ADDRESSBOOK 34399 -#define IDS_COMPRESSINGFOLDERS 34400 -#define ID_EDIT_DELETEFOLDER 34406 -#define ID_MESSAGE_NEXT 34410 -#define ID_MESSAGE_PREVIOUS 34411 -#define ID_MESSAGE_NEXTUNREAD 34412 -#define ID_MESSAGE_REUSE 34413 -#define ID_MESSAGE_REPLYALL 34415 -#define ID_TOOLS_MAIL 34420 -#define ID_TOOLS_NEWS 34421 -#define IF_FILE_EMPTYTRASH 34434 -#define ID_FILE_EMPTYTRASH 34434 -#define ID_MESSAGE_POSTREPLY 34435 -#define ID_MESSAGE_POSTANDREPLY 34436 -#define ID_FILE_SAVEMESSAGES 34437 -#define ID_MESSAGE_STOP 34438 -#define ID_MESSAGE_PREVIOUSUNREAD 34441 -#define ID_VIEW_FOLDER 34442 -#define ID_SORT_BYPRIORITY 34448 -#define ID_SORT_BYTHREAD 34449 -#define ID_VIEW_ADVANCEDTOOLBARS 34451 -#define ID_MESSAGE_SENDUNSENT 34452 -#define ID_MESSAGE_ADDSENDER 34453 -#define ID_MESSAGE_ADDALL 34454 -#define ID_FOLDER_RENAME 34455 -#define ID_FOLDER_MOVETO 34456 -#define ID_FOLDER_COPYTO 34457 -#define ID_TOOLS_WEB 34458 -#define ID_FOLDER_SELECT 34459 -#define ID_CATEGORY_SELECT 34460 -#define ID_TOOLS_EDITOR 34461 -#define ID_EDIT_FINDNEXT 34464 -#define ID_VIEW_HEADERS_MICRO 34467 -#define ID_VIEW_HEADERS_SHORT 34468 -#define ID_VIEW_HEADERS_ALL 34469 -#define ID_BLEH_DOUBLEBLEH 34473 -#define ID_DRAG_THIS_URL 34482 -#define ID_EDT_NEW_DOC_FROM_TEMPLATE 34483 -#define ID_GO_PUBLISH_LOCATION 34484 -#define IDS_DEF_PUB_LOC_NOT_SET 34485 -#define ID_VIEW_FRAME_SOURCE 34486 -#define ID_VIEW_FRAME_INFO 34487 -#define ID_MAIL_WRAPLONGLINES 34496 -#define ID_HOTLIST_ADDCURRENTTOHOTLIST2 34497 -#define IDS_PUBLISH_FILES 34503 -#define IDS_FILE_COUNT_FORMAT 34504 -#define IDS_UPLOADING_FILE 34505 -#define IDS_SAVING_FILE 34506 -#define IDS_PREPARING_PUBLISH 34507 -#define IDS_PUBLISH_REPORT_MSG 34508 -#define IDS_PUBLISH_REPORT_ONE_FILE 34509 -#define ID_LOCAL_POPUP 34512 -#define ID_ANIMATION_BONK 34513 -#define ID_VIEW_TWOPANE 34514 -#define ID_VIEW_ONEPANE 34515 -#define ID_DIRECTORY 34516 -#define ID_SWITCH_SORT 34517 -#define ID_FILE_NEWNEWSGROUP 34518 -#define ID_OPEN_NEWSGROUP 34519 -#define ID_FILE_DELETENEWSGROUP 34520 -#define ID_FILE_SUBSCRIBE 34521 -#define ID_FILE_UNSUBSCRIBE 34522 -#define ID_EDIT_SEARCHNEWSGROUPS 34523 -#define ID_MESSAGE_MARKALLREAD 34526 -#define ID_FILE_OPENNEWSGROUP 34527 -#define ID_SECURITY_ADVISOR 34528 -#define ID_FILE_OPENDRAFT 34529 -#define ID_MESSAGE_GETNEWNEWS 34535 -#define ID_SORT_TYPE 34547 -#define ID_SORT_TITLE 34547 -#define ID_SORT_NAME 34548 -#define ID_SORT_LOCATION 34548 -#define ID_SORT_NICKNAME 34549 -#define ID_SORT_FIRSTVISIT 34549 -#define ID_SORT_EMAILADDRESS 34550 -#define ID_SORT_LASTVISIT 34550 -#define ID_SORT_COMPANY 34551 -#define ID_SORT_EXPIREDATE 34551 -#define ID_SORT_LOCALITY 34552 -#define ID_SORT_VISITCOUNT 34552 -#define ID_ASCENDING 34553 -#define ID_DECENDING 34554 -#define ID_DESCENDING 34554 -#define ID_FILE_COMPOSE 34558 -#define ID_ITEM_MESSAGECC 34559 -#define ID_ITEM_MESSAGEBCC 34560 -#define ID_MESSAGE_CONTINUE 34561 -#define ID_MESSAGE_NEXTUNREADTHREAD 34563 -#define ID_MESSAGE_KILL 34564 -#define ID_MESSAGE_WATCH 34565 -#define ID_VIEW_ALLTHREADS 34566 -#define ID_VIEW_WATCHEDTHREADS 34567 -#define ID_VIEW_NEWTHREADS 34568 -#define ID_VIEW_KILLEDTHREADS 34569 -#define ID_EDIT_LDAPSEARCH 34570 -#define ID_MESSAGE_KILLCATEGORY 34574 -#define ID_MESSAGE_CATCHUP 34576 -#define ID_MESSAGE_MARKTHREADREAD 34579 -#define ID_MESSAGE_SELECT 34582 -#define ID_NAVIGATE_MSGCONTAINER 34582 -#define ID_NAVIGATE_CONTAINER 34583 -#define ID_MESSAGE_MARKASLATER 34584 -#define ID_MESSAGE_FILE 34585 -#define ID_BUTTON_CONTAINER 34586 -#define ID_APP_SUPER_EXIT 34593 -#define ID_MESSAGE_REPLYBUTTON 34594 -#define ID_MESSAGE_MARKBUTTON 34595 -#define ID_WINDOW_NETCASTER 34596 -#define ID_WINDOW_AIM 34597 -#define IDS_AIM_MENU 34598 -#define IDS_AIM_REGISTRY 34599 -#define ID_DELETE_BUTTON 34600 -#define IDS_DELETE_BUTTON 34601 -#define ID_RENAME_BUTTON 34602 -#define IDS_RENAME_BUTTON 34603 -#define ID_BUTTON_PROPERTIES 34604 -#define IDS_BUTTON_PROPERTIES 34605 -#define IDS_NETSCAPE_TIP 34606 -#define ID_OPTIONS_ENCODING_1 35001 -#define ID_OPTIONS_ENCODING_2 35002 -#define ID_OPTIONS_ENCODING_3 35003 -#define ID_OPTIONS_ENCODING_4 35004 -#define ID_OPTIONS_ENCODING_5 35005 -#define ID_OPTIONS_ENCODING_6 35006 -#define ID_OPTIONS_ENCODING_7 35007 -#define ID_OPTIONS_ENCODING_8 35008 -#define ID_OPTIONS_ENCODING_9 35009 -#define ID_OPTIONS_ENCODING_10 35010 -#define ID_OPTIONS_ENCODING_11 35011 -#define ID_OPTIONS_ENCODING_12 35012 -#define ID_OPTIONS_ENCODING_13 35013 -#define ID_OPTIONS_ENCODING_14 35014 -#define ID_OPTIONS_ENCODING_15 35015 -#define ID_OPTIONS_ENCODING_16 35016 -#define ID_OPTIONS_ENCODING_17 35017 -#define ID_OPTIONS_ENCODING_18 35018 -#define ID_OPTIONS_ENCODING_19 35019 -#define ID_OPTIONS_ENCODING_20 35020 -#define ID_OPTIONS_ENCODING_21 35021 -#define ID_OPTIONS_ENCODING_22 35022 -#define ID_OPTIONS_ENCODING_23 35023 -#define ID_OPTIONS_ENCODING_24 35024 -#define ID_OPTIONS_ENCODING_25 35025 -#define ID_OPTIONS_ENCODING_26 35026 -#define ID_OPTIONS_ENCODING_27 35027 -#define ID_OPTIONS_ENCODING_28 35028 -#define ID_OPTIONS_ENCODING_29 35029 -#define ID_OPTIONS_ENCODING_30 35030 -#define ID_OPTIONS_ENCODING_31 35031 -#define ID_OPTIONS_ENCODING_32 35032 -#define ID_OPTIONS_ENCODING_33 35033 -#define ID_OPTIONS_ENCODING_34 35034 -#define ID_OPTIONS_ENCODING_35 35035 -#define ID_OPTIONS_ENCODING_36 35036 -#define ID_OPTIONS_ENCODING_37 35037 -#define ID_OPTIONS_ENCODING_38 35038 -#define ID_OPTIONS_ENCODING_39 35039 -#define ID_OPTIONS_ENCODING_40 35040 -#define ID_OPTIONS_ENCODING_41 35041 -#define ID_OPTIONS_ENCODING_42 35042 -#define ID_OPTIONS_ENCODING_43 35043 -#define ID_OPTIONS_ENCODING_44 35044 -#define ID_OPTIONS_ENCODING_45 35045 -#define ID_OPTIONS_ENCODING_46 35046 -#define ID_OPTIONS_ENCODING_47 35047 -#define ID_OPTIONS_ENCODING_48 35048 -#define ID_OPTIONS_ENCODING_49 35049 -#define ID_OPTIONS_ENCODING_50 35050 -#define ID_OPTIONS_ENCODING_51 35051 -#define ID_OPTIONS_ENCODING_52 35052 -#define ID_OPTIONS_ENCODING_53 35053 -#define ID_OPTIONS_ENCODING_54 35054 -#define ID_OPTIONS_ENCODING_55 35055 -#define ID_OPTIONS_ENCODING_56 35056 -#define ID_OPTIONS_ENCODING_57 35057 -#define ID_OPTIONS_ENCODING_58 35058 -#define ID_OPTIONS_ENCODING_59 35059 -#define ID_OPTIONS_ENCODING_60 35060 -#define ID_OPTIONS_ENCODING_61 35061 -#define ID_OPTIONS_ENCODING_62 35062 -#define ID_OPTIONS_ENCODING_63 35063 -#define ID_OPTIONS_ENCODING_64 35064 -#define ID_OPTIONS_ENCODING_65 35065 -#define ID_OPTIONS_ENCODING_66 35066 -#define ID_OPTIONS_ENCODING_67 35067 -#define ID_OPTIONS_ENCODING_68 35068 -#define ID_OPTIONS_ENCODING_69 35069 -#define ID_OPTIONS_ENCODING_70 35070 -#define ID_EDT_FILE_SAVE 42001 -#define ID_EDT_FILE_SAVEAS 42002 -#define ID_EDIT_DOCUMENT 42003 -#define ID_OPT_EDITBAR_TOGGLE 42004 -#define ID_OPT_CHARBAR_TOGGLE 42005 -#define IDM_OPT_MESSAGEBAR_TOGGLE 42006 -#define ID_MAKE_LINK 42008 -#define ID_FORMAT_CHAR_BOLD 42010 -#define ID_FORMAT_CHAR_ITALIC 42011 -#define ID_FORMAT_CHAR_NOBREAKS 42012 -#define ID_FORMAT_CHAR_SUPER 42013 -#define ID_FORMAT_CHAR_SUB 42014 -#define ID_FORMAT_CHAR_STRIKEOUT 42015 -#define ID_FORMAT_CHAR_BLINK 42016 -#define ID_FORMAT_CHAR_NONE 42017 -#define ID_COMBO_FONTSIZE 42018 -#define ID_COMBO_FONTFACE 42019 -#define ID_COMBO_FONTCOLOR 42020 -#define ID_COMBO_PARA 42021 -#define ID_OPEN_NAV_WINDOW 42022 -#define ID_NEXT_WORD 42024 -#define ID_PREVIOUS_WORD 42025 -#define ID_NEXT_PARAGRAPH 42026 -#define IDS_LINK_TO_FILE 42026 -#define ID_PREVIOUS_PARAGRAPH 42027 -#define IDS_ANCHOR_IMAGE_FILE 42027 -#define IDS_ANCHOR_TEXT 42028 -#define IDS_ANCHOR_IMAGE 42029 -#define IDS_DRAG_SITEMAN_HINT 42030 -#define IDS_DRAG_BOOKMARK_HINT 42031 -#define ID_OPEN_EDITOR_WINDOW 42032 -#define ID_EDT_FINDREPLACE 42034 -#define IDS_TYPE_URL_OR_TARGET 42035 -#define IDS_TYPE_URL 42036 -#define IDS_NEW_EDITOR 42037 -#define IDS_NETSCAPE_COMPOSER 42037 -#define ID_ACTIVATE_SITE_MANAGER 42038 -#define ID_VIEW_NEWONLY 42039 -#define IDS_SITE_MANAGER 42041 -#define IDS_ANCHOR_SELECTED_TEXT 42042 -#define IDS_NEW_ANCHOR_TEXT 42043 -#define ID_EDITOR_UP 42044 -#define ID_EDITOR_DOWN 42045 -#define ID_EDITOR_NEXTCHAR 42046 -#define ID_EDITOR_PREVIOUSCHAR 42047 -#define ID_EDITOR_BEGINOFLINE 42048 -#define ID_EDITOR_ENDOFLINE 42049 -#define ID_EDITOR_PAGEUP 42050 -#define ID_EDITOR_PAGEDOWN 42051 -#define ID_EDITOR_BEGINOFDOCUMENT 42052 -#define ID_EDITOR_ENDOFDOCUMENT 42053 -#define ID_EDITOR_NEXTWORD 42054 -#define ID_EDITOR_PREVIOUSWORD 42055 -#define ID_EDITOR_SELECTUP 42056 -#define ID_EDITOR_SELECTDOWN 42057 -#define ID_EDITOR_SELECTNEXTCHAR 42058 -#define ID_EDITOR_SELECTPREVIOUSCHAR 42059 -#define ID_EDITOR_SELECTBEGINOFLINE 42060 -#define ID_EDITOR_SELECTENDOFLINE 42061 -#define ID_EDITOR_SELECTPAGEUP 42062 -#define ID_EDITOR_SELECTPAGEDOWN 42063 -#define ID_EDITOR_SELECTBEGINOFDOCUMENT 42064 -#define ID_EDITOR_SELECTENDOFDOCUMENT 42065 -#define ID_EDITOR_SELECTNEXTWORD 42066 -#define ID_EDITOR_SELECTPREVIOUSWORD 42067 -#define IDS_LEFT 42068 -#define IDS_CENTER 42069 -#define IDS_RIGHT 42070 -#define IDS_TOP 42071 -#define IDS_BOTTOM 42072 -#define IDS_BASELINE 42073 -#define IDS_SELECT_LOWRES_IMAGE 42074 -#define ID_PROPS_LOCAL 42075 -#define ID_PROPS_FONTDEF 42076 -#define ID_PROPS_IMAGE 42077 -#define ID_PROPS_HRULE 42078 -#define ID_PROPS_LINK 42079 -#define ID_PROPS_PARAGRAPH 42080 -#define ID_PROPS_CHARACTER 42081 -#define ID_PROPS_DOCUMENT 42082 -#define ID_PROPS_TEXT 42083 -#define ID_PROPS_JAVA 42084 -#define ID_PROPS_PLUGIN 42085 -#define ID_PROPS_TARGET 42086 -#define ID_PROPS_TAG 42087 -#define ID_PROPS_DOC_COLOR 42088 -#define ID_FORMAT_INDENT 42097 -#define ID_FORMAT_OUTDENT 42098 -#define ID_INSERT_IMAGE 42100 -#define ID_INSERT_HRULE 42101 -#define ID_INSERT_LINE_BREAK 42102 -#define ID_INSERT_BREAK_LEFT 42103 -#define ID_INSERT_BREAK_RIGHT 42104 -#define ID_INSERT_BREAK_BOTH 42105 -#define ID_INSERT_TARGET 42108 -#define ID_INSERT_TAG 42109 -#define IDS_CREATE_LINK 42110 -#define IDS_POPUP_CREATE_LINK 42111 -#define IDS_POPUP_INSERT_LINK 42112 -#define IDS_CAPTION_NONE 42113 -#define IDS_CAPTION_ABOVE 42114 -#define IDS_CAPTION_BELOW 42115 -#define IDS_PROPS_LINK 42116 -#define IDS_POPUP_PROPS_PAGE 42117 -#define IDS_POPUP_MAKE_IMAGE_BACKGROUND 42118 -#define ID_MAKE_IMAGE_BACKGROUND 42119 -#define IDS_EDIT_CUT 42121 -#define IDS_EDIT_COPY 42122 -#define IDS_EDIT_PASTE 42123 -#define IDS_EDIT_PASTE_LINK 42124 -#define IDS_EDIT_COPY_LINK 42125 -#define IDS_EDIT_SAVE_IMAGE 42126 -#define IDS_EDIT_ADD_LINK2BOOKMARKS 42127 -#define IDS_ERR_DIF_LOCAL_DEVICE_LINK 42128 -#define IDS_ERR_DIF_LOCAL_DEVICE_IMG 42129 -#define ID_INSERT_LINK 42134 -#define ID_EDIT_WINDOW_BOOKMARKS 42135 -#define IDS_INSERT_IMAGE 42136 -#define IDS_INSERT_HRULE 42137 -#define IDS_ERR_SRC_NOT_FOUND 42138 -#define IDS_ERR_COPY_FILE 42139 -#define IDS_WARN_REPLACE_FILE 42140 -#define IDS_COPY_FILE 42141 -#define IDS_RESOLVE_IMAGE_URL 42142 -#define IDS_RESOLVE_LINK_URL 42143 -#define IDS_EDIT_LINK 42144 -#define IDS_BROWSE_LINK 42145 -#define IDS_SAVE_AS_CAPTION 42146 -#define IDS_OVERWRITE_ACTIVE_FILE 42147 -#define IDS_DOC_PROPS_CAPTION 42150 -#define ID_FILE_OPEN_TO_EDIT 42151 -#define IDS_SAVEAS_REMOTE_MSG 42152 -#define IDS_SAVEAS_NEWDOC_MSG 42153 -#define IDS_SAVEAS_REMOTE_OR_NEWDOC_MSG 42154 -#define IDS_POPUP_LOAD_LINK_EDT 42155 -#define ID_POPUP_EDIT_IMAGE 42156 -#define IDS_POPUP_LOADLINKNEWWINDOW_EDT 42157 -#define IDS_POPUP_COPYLINKCLIPBOARD_EDT 42158 -#define IDS_POPUP_EDIT_LINK 42159 -#define IDS_POPUP_SAVELINKCONTENTS_EDT 42160 -#define IDS_POPUP_ADDLINK2BOOKMARKS_EDT 42162 -#define IDS_TEXT 42163 -#define IDS_LINK_TEXT 42164 -#define IDS_ACTIVE_LINK_TEXT 42165 -#define IDS_FOLLOWED_LINK 42166 -#define IDS_VALIDATE_IMAGE_FILE 42167 -#define IDS_COLOR_SCHEME_NS_DEFAULT 42169 -#define IDS_FILE_PRINT 42172 -#define IDS_FILE_PAGE_SETUP 42173 -#define IDS_FILE_PRINT_PREVIEW 42174 -#define ID_WEB_PAGE_STARTER 42177 -#define IDS_UNLINK_WARNING 42178 -#define IDS_CLEAR_CHAR_STYLES_CAPTION 42179 -#define ID_UNUM_LIST 42180 -#define ID_NUM_LIST 42181 -#define ID_INSERT_NONBREAK_SPACE 42182 -#define IDS_EDIT_TOOLBAR_CAPTION 42183 -#define IDS_CHAR_TOOLBAR_CAPTION 42185 -#define IDS_FORMS_TOOLBAR_CAPTION 42186 -#define IDS_EDIT_DOC_SOURCE 42187 -#define ID_FORMAT_CHAR_NO_TEXT_STYLES 42188 -#define ID_EDIT_HELP 42189 -#define IDS_TEXT_PROPS_CAPTION 42190 -#define IDS_IMAGE_PROPS_CAPTION 42191 -#define IDS_LINK_PROPS_CAPTION 42192 -#define IDS_REMOVE_LINKS_CAPTION 42192 -#define IDS_JAVA_PROPS_CAPTION 42193 -#define IDS_ERROR_READ_ONLY 42206 -#define IDS_FILE_ERROR_CAPTION 42207 -#define IDS_ERROR_BLOCKED 42208 -#define IDS_ERROR_BAD_URL 42209 -#define IDS_ERROR_FILE_OPEN 42210 -#define IDS_ERROR_FILE_WRITE 42211 -#define IDS_ERROR_CREATE_BAKNAME 42212 -#define IDS_ERROR_DELETE_BAKFILE 42213 -#define IDS_ERROR_WRITING_FILE 42214 -#define ID_FILE_PUBLISH 42216 -#define ID_FILE_EDITSOURCE 42217 -#define IDS_PROPS_IMAGE 42218 -#define IDS_PROPS_HRULE 42219 -#define IDS_PROPS_PARAGRAPH 42220 -#define IDS_PROPS_CHARACTER 42221 -#define IDS_PROPS_DOCUMENT 42222 -#define IDS_PROPS_IMAGE_LINK 42222 -#define IDS_PROPS_TAG 42223 -#define IDS_SELECT_IMAGE 42224 -#define IDS_PROPS_CAPTION 42226 -#define IDS_PERCENT_WINDOW 42227 -#define IDS_UNUM_LIST 42228 -#define IDS_NUM_LIST 42229 -#define IDS_BLOCK_QUOTE 42230 -#define IDS_DIRECTORY_LIST 42231 -#define IDS_MENU_LIST 42232 -#define IDS_DESCRIPTION_LIST 42233 -#define IDS_DEFAULT 42234 -#define IDS_LIST 42235 -#define IDS_DIGIT 42236 -#define IDS_BIG_ROMAN 42237 -#define IDS_SMALL_LETTERS 42238 -#define IDS_BIG_LETTERS 42239 -#define IDS_SOLID_CIRCLE 42240 -#define IDS_OPEN_CIRCLE 42241 -#define IDS_SOLID_SQUARE 42242 -#define IDS_NUMBER_STYLE 42243 -#define IDS_BULLET_STYLE 42244 -#define IDS_AUTOMATIC 42245 -#define IDS_PROPS_TARGET 42246 -#define IDS_EDIT_IMAGE 42247 -#define IDS_EDIT_TEMPLATE_PROMPT 42249 -#define IDS_SELECT_TEMPLATE_CAPTION 42250 -#define IDS_DEF_PUB_LOC_PROMPT 42251 -#define IDS_BROWSETO_PROMPT 42251 -#define IDS_SELECT_IMAGE_EDITOR 42255 -#define IDS_SELECT_HTML_EDITOR 42256 -#define IDS_OTHER_HREF_ATTRIBUTES 42257 -#define IDS_EDIT_HTML_ATTRIB_CAPTION 42258 -#define IDS_BAD_PUBLISH_URL 42261 -#define IDS_TARGETS_IN_CURRENT_DOC 42263 -#define IDS_TARGETS_IN_FILE 42264 -#define IDS_NO_TARGETS 42265 -#define IDS_REMOVE_OTHER_LINKS 42266 -#define IDS_REMOVE_LINK 42267 -#define IDS_REMOVE_LINKS 42268 -#define IDS_REMOVE_ALL_LINKS 42269 -#define ID_REMOVE_LINKS 42270 -#define IDS_UNABLE_TO_LAUNCH_EDITOR 42273 -#define IDS_IMAGE_IS_REMOTE 42274 -#define IDS_EDIT_IMAGE_CAPTION 42275 -#define IDS_SELECTION_MIXED_COLORS 42276 -#define IDS_DONT_CHANGE_COLORS 42277 -#define ID_EDT_NEW_DOC_BLANK 42279 -#define ID_EDT_NEW_DOC_TEMPLATE 42280 -#define ID_EDT_NEW_DOC_WIZARD 42281 -#define IDS_FILE_IS_MODIFIED 42282 -#define IDS_FILE_MODIFIED_CAPTION 42283 -#define IDS_PUBLISHING_DOCUMENT 42287 -#define IDS_COPYRIGHT_WARNING_HINT 42290 -#define ID_EDIT_DISPLAY_PARAGRAPH_MARKS 42291 -#define IDS_PIXELS 42292 -#define ID_POPUP_PROPS_LINK 42295 -#define IDS_BROWSE_AFTER_PUBLISH 42295 -#define IDS_ERROR_HTML_CAPTION 42296 -#define IDS_TAG_UNOPENED 42297 -#define IDS_TAG_UNCLOSED 42298 -#define IDS_TAG_PREMATURE_CLOSE 42299 -#define IDS_TAG_TAGNAME_EXPECTED 42300 -#define IDS_TAG_UNTERMINATED_STRING 42301 -#define IDS_TAG_ERROR 42302 -#define IDS_DOCUMENT_BUSY 42303 -#define IDS_SELECTION_CROSSES_TABLE_DATA_CELL 42304 -#define IDS_COPY_ERROR_CAPTION 42305 -#define IDS_SELECTION_EMPTY 42306 -#define IDS_WHITE_ON_BLACK 42307 -#define IDS_WHITE_ON_BLUE 42308 -#define IDS_BLUE_ON_ORANGE 42309 -#define IDS_BLACK_ON_YELLOW 42310 -#define IDS_BLACK_ON_LTYELLOW 42311 -#define IDS_BLACK_ON_OFFWHITE 42312 -#define IDS_BLACK_ON_LTBLUE 42313 -#define IDS_BLACK_ON_MEDBLUE 42314 -#define IDS_WHITE_ON_GREEN 42315 -#define IDS_WHITE_ON_VIOLET 42316 -#define IDS_BLACK_ON_WHITE 42317 -#define IDS_INTEGER_RANGE_ERROR 42318 -#define ID_POPUP_SETASWALLPAPER 42319 -#define IDS_SINGLE_CELL_CAPTION 42320 -#define IDS_SELECTED_CELLS_CAPTION 42321 -#define IDS_SELECTED_ROW_CAPTION 42322 -#define IDS_SELECTED_COLUMN_CAPTION 42323 -#define IDS_CHANGE_SEL_CAPTION 42324 -#define ID_PROPS_TABLE 42330 -#define ID_PROPS_TABLE_ROW 42331 -#define ID_PROPS_TABLE_COLUMN 42332 -#define ID_PROPS_TABLE_CELL 42333 -#define IDC_WIDTH_PERCENT 42334 -#define IDC_HEIGHT_PIXELS 42335 -#define IDC_HEIGHT_PERCENT 42336 -#define IDC_TABLE_CELL_ALIGN 42339 -#define IDS_PERCENT_PARENT_CELL 42339 -#define IDC_TABLE_CELL_VALIGN 42340 -#define ID_POPUP_DELETE_TABLE 42340 -#define ID_POPUP_INSERT_TABLE 42341 -#define IDS_POPUP_DELETE_TABLE 42342 -#define IDS_POPUP_INSERT_TABLE 42343 -#define IDS_DELETE_ROW 42344 -#define IDS_PROPS_TABLE_CAPTION 42345 -#define IDS_POPUP_TABLE_PROPS 42346 -#define IDS_POPUP_TABLE_CELL_PROPS 42347 -#define IDS_SUBMENU_SELECT_TABLE 42348 -#define IDS_SUBMENU_INSERT_TABLE 42349 -#define IDS_SUBMENU_DELETE_TABLE 42350 -#define IDS_CHANGE_SELECTED_CELL 42351 -#define IDS_CHANGE_SELECTED_ROW 42352 -#define IDS_CHANGE_SELECTED_COL 42353 -#define IDS_ROW 42355 -#define IDS_COLUMN 42356 -#define IDS_CELL 42357 -#define IDS_TABLE 42358 -#define IDS_PERCENT_TABLE 42359 -#define IDS_APPLY_CELL_MSG 42360 -#define IDS_SMALL_ROMAN 42363 -#define ID_FORMAT_CHAR_UNDERLINE 42364 -#define ID_NAVIGATE_CONTINUE 42365 -#define ID_DISPLAY_TABLES 42366 -#define IDS_PARAGRAPH_STYLE 42367 -#define IDS_CHECK_DISK_SPACE 42368 -#define IDS_AUTOSAVE_CAPTION 42369 -#define IDS_AUTOSAVE_OFF_MSG 42370 -#define ID_TOOLS_INBOX 42371 -#define ID_VIEW_PROPERTIES 42372 -#define ID_MESSAGE_RETRIEVEOFFLINE 42376 -#define ID_EDIT 42377 -#define ID_LIVE_CALL 42378 -#define ID_FILE_NEW_MAIL_MESSAGE 42379 -#define ID_FILE_OPEN_DRAF 42380 -#define ID_FILE_SAVE_DRAFT 42381 -#define ID_EDIT_FIND_IN_MESSAGE 42382 -#define ID_EDIT_FIND_AGAIN 42383 -#define ID_VIEW_ADDRESSES 42384 -#define ID_VIEW_ATTACHMENTS 42385 -#define ID_VIEW_MESSAGE_BODY_ONLY 42386 -#define ID_NAVIGATE_PLUGINS 42387 -#define ID_MESSAGE_SEND_NOW 42388 -#define ID_PRIORITY_HIGHEST 42390 -#define ID_PRIORITY_HIGH 42391 -#define ID_PRIORITY_NORMAL 42392 -#define ID_PRIORITY_LOW 42393 -#define ID_PRIORITY_LOWEST 42394 -#define ID_MESSAGE_ATTACH_FILE 42395 -#define ID_MESSAGE_ATTACH_WEB_PAGE 42396 -#define ID_MESSAGE_CONVERT2HTML 42397 -#define ID_EDIT_MAIL_WIZARD 42399 -#define IDS_DONT_CHANGE 42400 -#define IDS_FONTSIZE_NEG_2 42401 -#define IDS_FONTSIZE_NEG_1 42402 -#define IDS_FONTSIZE_0 42403 -#define IDS_FONTSIZE_1 42404 -#define IDS_FONTSIZE_2 42405 -#define IDS_FONTSIZE_3 42406 -#define IDS_FONTSIZE_4 42407 -#define ID_EDIT_BACKGROUND_IMAGE 42408 -#define ID_EDIT_PAGE_TITLE 42409 -#define ID_BLOCK_QUOTE 42410 -#define ID_NAVIGATE_MSG_BACK 42411 -#define ID_NAVIGATE_MSG_FORWARD 42412 -#define ID_MESSAGE_UNFLAGMESSAGE 42413 -#define ID_MESSAGE_PREVIOUSFLAGGED 42414 -#define ID_MESSAGE_NEXTFLAGGED 42415 -#define ID_MESSAGE_FIRSTFLAGGED 42416 -#define ID_MESSAGE_NEXTNEWSGROUP 42417 -#define ID_MESSAGE_NEXTUNREADNEWSGROUP 42418 -#define ID_VIEW_TASKBAR 42420 -#define ID_FILE_EDITMESSAGE 42422 -#define ID_VIEW_MESSAGE 42423 -#define IDM_CLOSE 42424 -#define IDM_SAVE 42425 -#define IDM_SAVEAS 42426 -#define IDM_SAVEASDRAFT 42427 -#define IDM_PRINTSETUP 42428 -#define IDM_PRINTPREVIEW 42429 -#define IDM_PRINT 42430 -#define IDM_EXIT 42431 -#define IDM_FINDINMESSAGE 42432 -#define IDM_FINDAGAIN 42433 -#define IDM_SEARCHADDRESSES 42434 -#define IDM_PREFERENCES 42435 -#define idm_redo 42436 -#define IDM_UNDO 42437 -#define IDM_CUT 42438 -#define IDM_COPY 42439 -#define IDM_PASTE 42440 -#define IDM_PASTEASQUOTE 42441 -#define IDM_SELECTALL 42442 -#define IDM_HIDETOOLBAR 42443 -#define IDM_HIDETASKBAR 42444 -#define IDM_ADDRESSES 42445 -#define IDM_ATTACHMENTS 42446 -#define IDM_MESSAGEBODYONLY 42447 -#define IDM_SENDNOW 42448 -#define IDM_SENDLATER 42449 -#define IDM_PRIORITY_HIGHEST 42450 -#define IDM_PRIORITYHIGH 42451 -#define IDM_PRIORITYNORMAL 42452 -#define IDM_PRIORITYLOW 42453 -#define IDM_PRIORITYLOWEST 42454 -#define IDM_ATTACHFILE 42455 -#define IDM_ATTACHWEBPAGE 42456 -#define IDM_ATTACHVCARD 42457 -#define IDM_QUOTEORIGINAL 42458 -#define IDM_BROWSER 42459 -#define IDM_INBOX 42460 -#define IDM_NEWSGROUPS 42461 -#define IDM_FOLDERS 42462 -#define IDM_EDITOR 42463 -#define IDM_CALENDAR 42464 -#define IDM_CALLPOINT 42465 -#define IDM_ADDRESSBOOK 42466 -#define IDM_HISTORY 42468 -#define IDM_JAVACONSOLE 42469 -#define IDM_HELP 42470 -#define IDM_DELETELAYER 42471 -#define IDM_REMOVELINK 42472 -#define IDM_SELECTTABLE 42473 -#define IDM_PARAGRAPHMARKS 42474 -#define IDM_TABLEBORDERS 42475 -#define IDM_CONVERTTOPLAINTEXT 42476 -#define IDM_SEND 42477 -#define IDM_SELECTEDOBJECT 42487 -#define IDM_CHARACTER 42488 -#define IDM_PARAGRAPH 42489 -#define IDM_FORMATLINK 42490 -#define IDM_FORMATLIST 42491 -#define IDM_FORMATTABLE 42492 -#define IDM_BACKGROUND 42493 -#define IDM_LINKCOLORS 42494 -#define IDM_PAGETITLE 42495 -#define IDM_STYLESHEET 42496 -#define IDM_MESSAGEPROPERTIES 42497 -#define ID_CREATE_CARD 42499 -#define ID_ITEM_SETTOTOOLBAR 42500 -#define ID_TOOLS_CHECK_SPELLING 42501 -#define IDM_ATTACHPERSONALCARD 42502 -#define ID_WINDOW_CALENDAR 42503 -#define ID_VIEW_CATEGORIES 42505 -#define ID_MESSAGE_IGNORECATEGORY 42506 -#define ID_MESSAGE_ADDCARD 42507 -#define ID_FILE_SELECTCATEGORY 42508 -#define ID_BIG_SWITCH 42509 -#define ID_EDIT_SERVER 42510 -#define ID_STOP_ANIMATION 42511 -#define ID_FILE_NEWCATEGORY 42512 -#define ID_NEW_DOC_BLANK 42513 -#define ID_DELETE_LAYER 42514 -#define ID_EDIT_REALLYDELETEMESSAGE 42515 -#define IDM_OFFLINE 42516 -#define IDM_DELETE 42517 -#define IDM_OPTIONS 42518 -#define IDM_CONVERT 42519 -#define IDM_EDITPLUGINS 42521 -#define ID_FILE_GETNEXT 42522 -#define ID_FILE_SYNCHRONIZE 42523 -#define ID_SORT_DESCENDING 42524 -#define ID_SORT_BYFLAG 42525 -#define ID_OPTIONS_PREFERENCES 42526 -#define ID_REMOVE_LIST 42527 -#define ID_SORT_BYSTATUS 42528 -#define ID_FILE_NEWNEWSHOST 42529 -#define ID_SORT_BYSIZE 42530 -#define ID_MESSAGE_RETRIEVESELECTED 42532 -#define ID_NEWS_MODERATE 42533 -#define IDM_ATTACHMYCARD 42534 -#define ID_SORT_BYUNREAD 42535 -#define ID_BOOKMARKS_FILE_ADDTOTOOLBAR 42536 -#define ID_BOOKMARKS_FILE_INTERNETSHORTCUT 42537 -#define ID_BOOKMARKS_FILE_GOOFFLINE 42538 -#define ID_EDIT_MANAGEMAILACCOUNT 42539 -#define ID_POPUP_SAVEAS 42540 -#define ID_INCREASE_FONT 42541 -#define ID_DECREASE_FONT 42542 -#define ID_EDIT_DOMAINS 42543 -#define ID_POPUP_EDIT_LINK 42544 -#define ID_FILE_UPDATECOUNTS 42545 -#define ID_VIEW_ABTOOLBAR 42545 -#define ID_POPUP_SETTOTOOLBAR 42546 -#define ID_DONEGETTINGMAIL 42547 -#define ID_DONEGOINGOFFLINE 42548 -#define IDS_CONVERT_TEXT_TO_TABLE 42700 -#define IDS_CONVERT_TABLE_TO_TEXT 42701 -#define IDS_ALIGN 42702 -#define IDS_ALIGN_TABLE 42703 -#define IDS_ALIGN_LEFT 42704 -#define IDS_ALIGN_RIGHT 42705 -#define IDS_ALIGN_CENTER 42706 -#define ID_ALIGN_LEFT 42710 -#define ID_ALIGN_RIGHT 42711 -#define ID_ALIGN_CENTER 42712 -#define ID_ALIGN_TABLE_LEFT 42713 -#define ID_ALIGN_TABLE_CENTER 42714 -#define ID_ALIGN_TABLE_RIGHT 42715 -#define ID_INSERT_TABLE_OR_PROPS 42719 -#define ID_INSERT_TABLE 42720 -#define ID_INSERT_TABLE_CAPTION 42721 -#define ID_INSERT_TABLE_ROW 42722 -#define ID_INSERT_TABLE_COLUMN 42723 -#define ID_INSERT_TABLE_CELL 42724 -#define ID_INSERT_TABLE_ROW_ABOVE 42725 -#define ID_INSERT_TABLE_COLUMN_BEFORE 42726 -#define ID_INSERT_TABLE_CELL_BEFORE 42727 -#define ID_INSERT_TABLE_MORE 42728 -#define ID_DELETE_TABLE 42729 -#define ID_DELETE_TABLE_CAPTION 42730 -#define ID_DELETE_TABLE_ROW 42731 -#define ID_DELETE_TABLE_COLUMN 42732 -#define ID_DELETE_TABLE_CELL 42733 -#define ID_DELETE_TABLE_MORE 42734 -#define ID_TOGGLE_TABLE_BORDER 42735 -#define ID_TOGGLE_HEADER_CELL 42736 -#define ID_TABLE_TEXT_CONVERT 42737 -#define ID_SELECT_TABLE 42740 -#define ID_SELECT_TABLE_ROW 42741 -#define ID_SELECT_TABLE_COLUMN 42742 -#define ID_SELECT_TABLE_CELL 42743 -#define ID_SELECT_TABLE_ALL_CELLS 42744 -#define IDS_CURRENT_COLOR 42750 -#define IDS_CURRENT_BKGRND_COLOR 42751 -#define IDS_DEFAULT_BKGRND_COLOR 42752 -#define IDS_CUSTOM_COLORS_LABEL 42753 -#define IDS_LAST_USED_COLOR 42754 -#define IDS_OTHER 42755 -#define IDS_OTHER_BUTTON 42756 -#define IDS_DEFAULT_BUTTON 42757 -#define ID_HISTORY_LOPCONTAINS 43000 -#define ID_HISTORY_LOPNOTCONTAINS 43001 -#define ID_HISTORY_LOPIS 43002 -#define ID_HISTORY_LOPNOTIS 43003 -#define ID_HISTORY_LOPISBEFORE 43004 -#define ID_HISTORY_LOPISAFTER 43005 -#define ID_HISTORY_LOPISLESSTHAN 43006 -#define ID_HISTORY_LOPISGREATERTHAN 43007 -#define ID_HISTORY_LOPAND 43008 -#define ID_HISTORY_LOPOR 43009 -#define ID_HISTORY_WINTITLE 43010 -#define ID_HISTORY_MENUUNDO 43011 -#define ID_HISTORY_MENUREDO 43012 -#define ID_HISTORY_URCUT 43013 -#define ID_HISTORY_URCOPY 43014 -#define ID_HISTORY_URDELETE 43015 -#define ID_HISTORY_MENUAND 43016 -#define ID_HISTORY_MENUOR 43017 -#define ID_HISTORY_SEARCH_WINTITLE 43018 -#define ID_INCREASE_INDENT 43019 -#define ID_HIST_FILE_ADDTOTOOLBAR 43020 -#define ID_HIST_FILE_INTERNETSHORTCUT 43021 -#define ID_OTHER_FONTFACE 43022 -#define IDS_TRANSFER_STATUS 59142 -#define IDS_SECURITY_STATUS 59143 -#define IDS_SIGNED_STATUS 59144 -#define ID_FORMAT_INCREASE_FONTSIZE 59395 -#define ID_FORMAT_DECREASE_FONTSIZE 59396 -#define ID_ALIGN_POPUP 59397 -#define ID_INSERT_POPUP 59398 -#define IDS_SHOW_EDITBAR 59400 -#define IDS_HIDE_EDITBAR 59401 -#define IDS_SHOW_FORMATBAR 59402 -#define IDS_HIDE_FORMATBAR 59403 -#define IDS_TOOLS_MENU 59404 -#define IDM_ADDRESSPICKER 59405 -#define IDS_PROPS_SELECTION 59406 -#define IDS_ALT_ENTER 59407 -#define IDS_EXTRA_HTML_MSG 59408 -#define IDS_IMG_TAG 59409 -#define IDS_HREF_TAG 59410 -#define IDS_HRULE_TAG 59411 -#define IDS_TABLE_TAG 59412 -#define IDS_TR_TAG 59413 -#define IDS_TD_TAG 59414 -#define IDS_CUSTOM_COLOR 59415 -#define IDS_MIXED_COLORS 59416 -#define IDS_MIXED_FONTS 59417 -#define IDS_MIXED_DONT_CHANGE 59418 -#define IDS_MIXED_STYLE 59419 -#define IDS_INVALID_WORD 59423 -#define IDS_ERR_ADD_WORD 59424 -#define IDS_CONFIRM_STOP_PLUGIN 59425 -#define IDS_ERR_LAUNCH_EDITOR_PLUGIN 59426 -#define IDS_CONVERR5 59428 -#define IDS_CONVERR6 59429 -#define IDS_CONVERR7 59430 -#define IDS_CONVERR8 59431 -#define IDS_CONVERR9 59432 -#define IDS_CONVERR10 59433 -#define IDS_CONVERR11 59434 -#define IDS_CONVERR12 59435 -#define IDS_CONVERR13 59436 -#define IDS_CONVERR14 59437 -#define IDS_CONVERR0 59438 -#define IDS_CONVERR1 59439 -#define IDS_CONVERR2 59440 -#define IDS_CONVERR3 59441 -#define IDS_CONVERR4 59442 -#define IDS_CMD_MAIL_STUB 59599 -#define IDS_CMDLINE_ERROR6 59600 -#define IDS_CMDLINE_ERROR1 59601 -#define IDS_CMDLINE_ERROR3 59603 -#define IDS_CMDLINE_ERROR4 59604 -#define IDS_HIDDEN_FRAME_STRING 59605 -#define IDS_CMDLINE_ERROR7 59606 -#define IDS_CMDLINE_ERROR8 59607 -#define IDS_COPYRIGHT_0 60010 -#define IDS_COPYRIGHT_1 60011 -#define IDS_COPYRIGHT_2 60012 -#define IDS_COPYRIGHT_3 60013 -#define IDS_COPYRIGHT_4 60014 -#define IDS_COPYRIGHT_5 60015 -#define IDS_COPYRIGHT_6 60016 -#define IDS_COPYRIGHT_7 60017 -#define IDS_COPYRIGHT_8 60018 -#define IDS_COPYRIGHT_9 60019 -#define IDS_COPYRIGHT_A 60020 -#define IDS_COPYRIGHT_B 60021 -#define IDS_COPYRIGHT_C 60022 -#define IDS_COPYRIGHT_D 60023 -#define IDS_AUTHORS_0 60030 -#define IDS_MAIL_0 60090 -#define IDS_MAIL_1 60091 -#define IDS_MAIL_2 60092 -#define IDS_MAIL_3 60093 -#define IDS_MAIL_4 60094 -#define IDS_MAIL_5 60095 -#define IDS_MAIL_6 60096 -#define IDS_MAIL_7 60097 -#define IDS_MAIL_8 60098 -#define IDS_MAIL_9 60099 -#define IDS_MAIL_A 60100 -#define IDS_MAIL_B 60101 -#define IDS_MAIL_C 60102 -#define IDS_MAIL_D 60103 -#define IDS_MAIL_E 60104 -#define IDS_MAIL_F 60105 -#define IDS_MAIL_G 60106 -#define IDS_MAIL_H 60107 -#define IDS_LICENSE_CLICKER 60109 -#define IDS_NONSEC_POST_FR_SEC_0 60110 -#define IDS_NONSEC_INLINES_0 60120 -#define IDS_NONSEC_INLINES_1 60121 -#define IDS_NONSEC_REDIRECT_0 60130 -#define IDS_NONSEC_UNKNOWN 60132 -#define IDS_DOCINFO_SECURE_0 60140 -#define IDS_DOCINFO_SECURE_1 60141 -#define IDS_DOCINFO_SECURE_2 60142 -#define IDS_DOCINFO_NONSECURE_0 60150 -#define IDS_DOCINFO_NONSECURE_1 60151 -#define IDS_DOCINFO_NONSECURE_2 60152 -#define IDS_ENTER_SECURE_0 60160 -#define IDS_ENTER_SECURE_1 60161 -#define IDS_LEAVE_SECURE_0 60170 -#define IDS_LEAVE_SECURE_1 60171 -#define IDS_NONSEC_POST_FR_NONSEC_0 60180 -#define IDS_MOZILLA_0 60190 -#define IDS_MOZILLA_1 60191 -#define IDS_MOZILLA_2 60192 -#define IDS_MOZILLA_3 60193 -#define IDS_MOZILLA_4 60194 -#define IDS_ABOUT_0 60200 -#define IDS_ABOUT_1 60201 -#define IDS_ABOUT_2 60202 -#define IDS_ABOUT_3 60203 -#define IDS_ABOUT_4 60204 -#define IDS_ABOUT_5 60205 -#define IDS_ABOUT_6 60206 -#define IDS_ABOUT_7 60207 -#define IDS_ABOUT_8 60208 -#define IDS_ABOUT_9 60209 -#define IDS_ABOUT_A 60210 -#define IDS_ABOUT_B 60211 -#define IDS_ABOUT_C 60212 -#define IDS_ABOUT_D 60213 -#define IDS_ABOUT_E 60214 -#define IDS_ABOUT_F 60215 -#define IDS_ABOUT_10 60216 -#define IDS_ABOUT_11 60217 -#define IDS_ABOUT_12 60218 -#define IDS_ABOUT_13 60219 -#define IDS_ABOUT_14 60220 -#define IDS_ABOUT_15 60221 -#define IDS_ABOUT_16 60222 -#define IDS_ABOUT_17 60223 -#define IDS_ABOUT_18 60224 -#define IDS_ABOUT_19 60225 -#define IDS_ABOUT_1A 60226 -#define IDS_ABOUT_1B 60227 -#define IDS_ABOUT_1C 60228 -#define IDS_ABOUT_1D 60229 -#define IDS_ABOUT_1E 60230 -#define IDS_ABOUT_1F 60231 -#define IDS_ABOUT_20 60232 -#define IDS_ABOUT_21 60233 -#define IDS_ABOUT_22 60234 -#define IDS_ABOUT_23 60235 -#define IDS_ABOUT_24 60236 -#define IDS_ABOUT_25 60237 -#define IDS_ABOUT_CUSTOM_0 60300 -#define IDS_ABOUT_CUSTOM_1 60301 -#define IDS_ABOUT_CUSTOM_2 60302 -#define IDS_ABOUT_CUSTOM_3 60303 -#define IDS_ABOUT_CUSTOM_4 60304 -#define IDS_MAIL_INVALID_EMAIL 61204 -#define IDS_MAIL_NORETURN 61205 -#define IDS_MAIL_INVALID_BUILD 61206 -#define IDS_MAIL_TOO_LONG 61207 -#define IDS_FIND_NOT_FOUND 61208 -#define IDS_AUTH_DEFAULT 61209 -#define IDS_NOLDAPSERVERS 61210 -#define IDS_DIRECT_WELCOME 61211 -#define IDS_DIRECT_WHATNEW 61212 -#define IDS_DIRECT_FAQ 61213 -#define IDS_DIRECT_TOUR 61214 -#define IDS_DIRECT_SUPPORT 61215 -#define IDS_DIRECT_FEEDBACK 61216 -#define IDS_DIRECT_MANUAL 61217 -#define IDS_DIRECT_VERSION 61218 -#define IDS_DIRECT_HOME 61219 -#define IDS_DIRECT_INTERNET_ABOUT 61220 -#define IDS_DIRECT_INTERNET_INDEX 61221 -#define IDS_DIRECT_INTERNET_SEARCH 61222 -#define IDS_DIRECT_INTERNET_WHITEPG 61223 -#define IDS_DIRECT_WEB_SERVICES 61224 -#define IDS_OPEN_CLIPBOARD 61226 -#define IDS_EMPTY_CLIPBOARD 61227 -#define IDS_EVIL 61228 -#define IDS_NET_INIT_FAILED 61229 -#define IDS_DIRECT_NETSCAPE_WHATSCOOL 61230 -#define IDS_DIRECT_LICENSE 61233 -#define IDS_LOCAL_HELP 61234 -#define IDP_OLE_INIT_FAILED 61234 -#define IDS_ABOUT_PAGE 61235 -#define IDS_HELP_SECURITY 61236 -#define IDS_DIRECT_MARKETPLACE 61237 -#define IDS_DDE_PROCESS_CMDLINE 61239 -#define IDS_DDE_SERVICE_NAME 61240 -#define IDS_DDE_OPENURL 61241 -#define IDS_DDE_SHOWFILE 61242 -#define IDS_DDE_ACTIVATE 61243 -#define IDS_DDE_LISTWINDOWS 61244 -#define IDS_DDE_GETWINDOWINFO 61245 -#define IDS_DDE_PARSEANCHOR 61246 -#define IDS_DDE_EXIT 61247 -#define IDS_DDE_REGISTERPROTOCOL 61248 -#define IDS_DDE_UNREGISTERPROTOCOL 61249 -#define IDS_DDE_REGISTERVIEWER 61250 -#define IDS_DDE_QUERYVIEWER 61251 -#define IDS_DDE_VIEWDOCCACHE 61252 -#define IDS_DDE_CMDLINE_SERVICE_NAME 61252 -#define IDS_DDE_VIEWDOCDATA 61253 -#define IDS_DDE_VIEWDOCFILE 61254 -#define IDS_DDE_UNREGISTERVIEWER 61255 -#define IDS_DDE_REGISTERURLECHO 61256 -#define IDS_DDE_URLECHO 61257 -#define IDS_DDE_UNREGISTERURLECHO 61258 -#define IDS_DDE_REGISTERWINDOWCLOSE 61259 -#define IDS_DDE_REGISTERWINDOWCHANGE 61259 -#define IDS_DDE_WINDOWCLOSE 61260 -#define IDS_DDE_WINDOWCHANGE 61260 -#define IDS_DDE_UNREGISTERWINDOWCLOSE 61261 -#define IDS_DDE_UNREGISTERWINDOWCHANGE 61261 -#define IDS_DDE_BEGINPROGRESS 61262 -#define IDS_DDE_SETPROGRESSRANGE 61263 -#define IDS_DDE_MAKINGPROGRESS 61264 -#define IDS_DDE_ENDPROGRESS 61265 -#define IDS_DDE_ALERT 61266 -#define IDS_DDE_VERSION 61270 -#define IDS_DDE_CANCELPROGRESS 61271 -#define IDS_DDE_QUERYURLFILE 61272 -#define IDS_DDE_LISTFRAMECHILDREN 61273 -#define IDS_DDE_GETFRAMEPARENT 61274 -#define IDS_HELP_REGISTRATION 61299 -#define IDS_WINEXEC_XX 61300 -#define IDS_WINEXEC_0_8 61301 -#define IDS_WINEXEC_2_3 61302 -#define IDS_WINEXEC_10_THRU_15 61303 -#define IDS_WINEXEC_16 61304 -#define IDS_WINEXEC_21 61305 -#define IDS_NO_NSMAPI32 61306 -#define IDS_MAPI_BACKUP_FAILED 61307 -#define IDS_NSMAPI32_COPY_FAILED 61308 -#define IDS_MAPI_BACKUP_MISSING 61309 -#define IDS_NSMAPI32_COPY_FAILED2 61310 -#define IDS_DDE_REGISTERSTATUSBARCHANGE 61311 -#define IDS_DDE_STATUSBARCHANGE 61312 -#define IDS_DDE_UNREGISTERSTATUSBARCHANGE 61313 -#define IDS_DDE_NAVIGATEBACK 61314 -#define IDS_DDE_NAVIGATEFORWARD 61315 -#define IDS_DDE_RELOAD 61316 -#define IDS_DDE_STOP 61317 -#define IDS_DDE_GETDOCWIDTH 61318 -#define IDS_DDE_GETDOCHEIGHT 61319 -#define IDS_DDE_USERAGENT 61320 -#define IDS_DDE_CACHE_CLEARCACHE 61321 -#define IDS_DDE_CACHE_FILENAME 61322 -#define IDS_DDE_CACHE_INCACHE 61323 -#define IDS_DDE_CACHE_REMOVEURL 61324 -#define IDS_DDE_CACHE_ADDURL 61325 -#define IDS_DDE_HISTORY_CLEARHISTORY 61326 -#define IDS_DDE_HISTORY_INHISTORY 61327 -#define IDS_DDE_HISTORY_ADDURL 61328 -#define IDS_DDE_HISTORY_REMOVEURL 61329 -#define IDS_DDE_HISTORY_NUMENTRIES 61330 -#define IDS_DDE_HISTORY_GETENTRY 61331 -#define IDS_DDE_GETWINDOWID 61332 -#define IDS_DDE_SUPPORTSMIMETYPE 61333 -#define IDS_DDE_EXECUTEJAVASCRIPT 61334 -#define IDS_DDE_PRINTWINDOW 61335 -#define IDS_DDE_PRINTURL 61336 -#define IDS_SELECT_APPROPRIATE_VIEWER 62000 -#define IDS_DOC_LOAD_COMPLETE 62001 -#define IDS_SPAWNING_EXTERNAL_VIEWER 62004 -#define IDS_SAVE_AS 62005 -#define IDS_FAILED_CREATE_TEMP_FILE 62006 -#define IDS_LOADING 62007 -#define IDS_NO_VIEWER_CONFIGD 62010 -#define IDS_UNABLE_FIND_APP 62011 -#define IDS_UNABLE_TO_LAUNCH_APP 62012 -#define IDS_SPAWNING_APP 62013 -#define IDS_LOGIN_AS 62014 -#define IDS_DOC_DONE 62015 -#define IDS_NOT_A_URL 62020 -#define IDS_REMOVE_CATEGORY 62021 -#define IDS_NO_ITEMS_TO_REMOVE 62022 -#define IDS_NEW_ITEM 62023 -#define IDS_NEW_HEADER 62024 -#define IDS_NO_SOURCE_LOADED 62026 -#define IDS_UNABLE_TO_LOAD_SOURCE 62027 -#define IDS_COULDNT_SELECT_PAL 62028 -#define IDS_ERR_CACHE_DIR_NOT_EXIST 62032 -#define IDS_ERR_TMP_DIR_NOT_EXIST 62033 -#define IDS_CURRENT_URL 62034 -#define IDS_NO_DOC_CURRENTLY_LOADED 62035 -#define IDS_THIS_IS_BOTTOM_LEDGE 62036 -#define IDS_CANNOT_PRINT_WHILE_LOADING 62037 -#define IDS_CANT_PREVIEW_WHILE_LOADING 62038 -#define IDS_SAVE_IN_PROGRESS 62039 -#define IDS_LAYING_OUT_DOC 62041 -#define IDS_LAYOUT_DOC_PERCENT_DONE 62042 -#define IDS_STYLES 62043 -#define IDS_MAIL_AND_NEWS 62044 -#define IDS_APPS_AND_DIRS 62046 -#define IDS_IMGS_AND_SECTY 62047 -#define IDS_PROXIES 62048 -#define IDS_HELPER_APPS 62049 -#define IDS_MARK_ALL_AS_UNVISITED 62050 -#define IDS_COMPLETE_BOTH 62051 -#define IDS_SELECT_VIEWER 62052 -#define IDS_SELECT_TELNET_APP 62053 -#define IDS_SELECT_HTML_VIEWER 62054 -#define IDS_SELECT_3270_APP 62055 -#define IDS_SELECT_NEWSRC_FILE 62056 -#define IDS_SIG_FILE 62057 -#define IDS_CONTINUE_CLEAR_CACHE 62060 -#define IDS_CONTINUE_CLEAR_MEM_CACHE 62061 -#define IDS_LOCATION 62062 -#define IDS_GOTO 62063 -#define IDS_SERVER_ERR_NUM 62064 -#define IDS_NETSITE 62065 -#define IDS_ACTIVATE_EMBED_STATUS 62069 -#define IDS_VIEWER_SEC_MESSAGE 62073 -#define IDS_VIEWER_SEC_DONTASK 62074 -#define IDS_DIRECT_CONTEST 62075 -#define IDS_PAGESETUP_INCHES 62076 -#define IDS_PAGESETUP_CENTIMETERS 62077 -#define IDS_PAGESETUP_CM 62078 -#define IDS_INTERRUPT_ONGOING 62080 -#define IDS_INVALID_INIFILE 62083 -#define IDS_DOCINFO_SECHIGH 62088 -#define IDS_DOCINFO_SECLOW 62089 -#define IDS_DOCINFO_SECDEF 62090 -#define IDS_ABOUT_SECURITY 62092 -#define IDS_RESOURCE_CHARSET 62093 -#define IDS_SOURCE_FILETYPE 62094 -#define IDS_OLE_CANTUSE_VIEWER 62095 -#define IDS_OLE_CANTUSE_HANDLER 62096 -#define IDS_OLE_CANTUSE_VIEWER2 62110 -#define IDS_LANGUAGE_USRDEF2 62120 -#define IDS_LANGUAGE_USRDEF3 62121 -#define IDS_LANGUAGE_USRDEF4 62122 -#define IDS_LANGUAGE_USRDEF5 62123 -#define IDS_LANGUAGE_USRDEF6 62124 -#define IDS_LANGUAGE_USRDEF7 62125 -#define IDS_LANGUAGE_LATIN1 62130 -#define IDS_LANGUAGE_JAPANESE 62131 -#define IDS_LANGUAGE_LATIN2 62132 -#define IDS_LANGUAGE_TAIWANESE 62133 -#define IDS_LANGUAGE_KOREAN 62134 -#define IDS_LANGUAGE_CHINESE 62135 -#define IDS_ACCEPTLANG_EN 62137 -#define IDS_ACCEPTLANG_ENUS 62138 -#define IDS_ACCEPTLANG_ENGB 62139 -#define IDS_ACCEPTLANG_FR 62140 -#define IDS_ACCEPTLANG_FRFR 62141 -#define IDS_ACCEPTLANG_FRCA 62142 -#define IDS_ACCEPTLANG_DE 62143 -#define IDS_ACCEPTLANG_JA 62144 -#define IDS_ACCEPTLANG_ZH 62145 -#define IDS_ACCEPTLANG_ZHCN 62146 -#define IDS_ACCEPTLANG_ZHTW 62147 -#define IDS_ACCEPTLANG_KO 62148 -#define IDS_ACCEPTLANG_ES 62149 -#define IDS_ACCEPTLANG_ESES 62150 -#define IDS_ACCEPTLANG_ESBR 62151 -#define IDS_ACCEPTLANG_IT 62152 -#define IDS_ACCEPTLANG_NL 62153 -#define IDS_ACCEPTLANG_SV 62154 -#define IDS_FILE_UPLOAD 62155 -#define IDS_MENU_MAIL 62156 -#define IDS_MENU_NEWS 62157 -#define IDS_MENU_BOOKMARK 62158 -#define IDS_MENU_HISTORY 62159 -#define IDS_MENU_POSTREPLY 62160 -#define IDS_MENU_POSTMAILREPLY 62161 -#define IDS_MENU_MAILREPLY 62162 -#define IDS_MENU_FORWARD 62163 -#define IDS_MENU_FORWARDQUOTED 62164 -#define IDS_MENU_TOADDRESS 62165 -#define IDS_MENU_UNSCRAMBLE 62166 -#define IDS_MENU_REPLY 62167 -#define IDS_MENU_REPLYALL 62168 -#define IDS_MENU_DELMSG 62169 -#define IDS_CLOSEWINDOWS_EXIT 62172 -#define IDS_EXIT_CONFIRMATION 62173 -#define IDS_REDIRECT_TO_SECURE 62177 -#define IDS_CONFIRM_DISK_SPACE 62178 -#define IDS_MAIL_FRAME 62179 -#define IDS_MAIL_NOFRAME 62181 -#define IDS_PRINT_NOFRAME 62183 -#define IDS_PRINT_FRAME 62184 -#define IDS_ABOUT_PLUGINS 62200 -#define IDS_LANGUAGE_USERDEFINED 62201 -#define IDS_MESSAGENOTSENT 62202 -#define IDS_MESSAGECOMPOSITION 62203 -#define IDS_COMPOSE_FROM 62204 -#define IDS_COMPOSE_REPLYTO 62205 -#define IDS_COMPOSE_MAILTO 62206 -#define IDS_COMPOSE_CC 62207 -#define IDS_COMPOSE_BLINDCC 62208 -#define IDS_COMPOSE_FILECC 62209 -#define IDS_COMPOSE_NEWSGROUPS 62210 -#define IDS_COMPOSE_FOLLOWUPTO 62211 -#define IDS_COMPOSE_SUBJECT 62212 -#define IDS_COMPOSE_ATTACHMENT 62213 -#define IDS_COMPOSE_NOSUBJECT 62214 -#define IDS_COMPOSE_DEFAULTNOSUBJECT 62215 -#define IDS_BOOKMARK_GOTO 62216 -#define IDS_POPUP_SHORTCUT 62217 -#define IDS_BOOKMARK_OPENFOLDER 62220 -#define IDS_BOOKMARK_CLOSEFOLDER 62221 -#define IDS_BOOKMARK_PROPERTIES 62222 -#define IDS_BOOKMARK_HEADER 62223 -#define IDS_BOOKMARK_SEPARATOR 62224 -#define IDS_BOOKMARK_NAME 62225 -#define IDS_BOOKMARK_CHANGED 62226 -#define IDS_BOOKMARK_UNCHANGED 62227 -#define IDS_BOOKMARK_DONE 62228 -#define IDS_BOOKMARK_BOOKMARK 62229 -#define IDS_BOOKMARK_ADDRESSPROPERTIES 62231 -#define IDS_BOOKMARK_BOOKMARKPROPERTIES 62232 -#define IDS_MAIL_COMPRESSFOLDER 62233 -#define IDS_MAIL_DELETEFOLDER 62234 -#define IDS_MAIL_UNSUBSCRIBE 62235 -#define IDS_MAIL_SUBSCRIBE 62236 -#define IDS_MAIL_GETMOREMESSAGES 62237 -#define IDS_MAIL_GETALLMESSAGES 62238 -#define IDS_MAIL_MARKNEWSGROUPREAD 62239 -#define IDS_MAIL_ADDNEWSGROUP 62240 -#define IDS_MAIL_SHOWALLNEWSGROUPS 62241 -#define IDS_MAIL_REMOVENEWSHOST 62242 -#define IDS_MAIL_REPLY 62244 -#define IDS_MAIL_REPLYALL 62245 -#define IDS_MAIL_FILETO 62245 -#define IDS_NEWSGROUPCOLON 62245 -#define IDS_MAIL_FORWARD 62246 -#define IDS_FOLDERCOLON 62246 -#define IDS_MAIL_FORWARDQUOTED 62247 -#define IDS_MAIL_SELECTTHREAD 62248 -#define IDS_NOTITLE 62248 -#define IDS_MAIL_DELETEMESSAGE 62249 -#define IDS_MAIL_BYRECIPIENT 62249 -#define IDS_MAIL_POSTREPLY 62250 -#define IDS_MAIL_POSTANDMAILREPLY 62251 -#define IDS_MAIL_NAME 62251 -#define IDS_MAIL_RE 62253 -#define IDS_MAIL_TOTAL 62255 -#define IDS_MAIL_SENDER 62256 -#define IDS_MAIL_SUBJECT 62257 -#define IDS_MAIL_DATE 62258 -#define IDS_MAIL_UNREAD 62259 -#define IDS_MAIL_RECIPIENT 62260 -#define IDS_BOOKMARK_ISALIAS 62261 -#define IDS_MAIL_PRIORITY 62262 -#define IDS_MAIL_STATUS 62263 -#define IDS_MAIL_LENGTH 62264 -#define IDS_MAIL_LOCATION 62265 -#define IDS_MESSAGESENTANYWAY 62266 -#define IDS_MAIL_CONTAINERS 62267 -#define IDS_MAIL_MYCONTAINERS 62268 -#define IDS_UNTITLED 62271 -#define IDS_FONT_FIXNAME 62272 -#define IDS_FONT_PROPNAME 62273 -#define IDS_FILTER_ALLFILES 62276 -#define IDS_SAVE_SAVING 62280 -#define IDS_SAVE_SAVINGLOCATION 62281 -#define IDS_SAVE_VIEWLOCATION 62282 -#define IDS_FRAME_NETPREF 62284 -#define IDS_FRAME_SECPREF 62285 -#define IDS_FRAME_GENPREF 62286 -#define IDS_FRAME_MAILPREF 62287 -#define IDS_FRAME_EDITORPREF 62288 -#define IDS_USER_PROMPT 62289 -#define IDS_LOAD_PREFS 62292 -#define IDS_LOAD_BOOKMARKS 62293 -#define IDS_LOAD_PLUGINS 62294 -#define IDS_DRAG_THIS_URL_TIP 62295 -#define IDS_OPEN 62296 -#define IDS_PROXIE_FOLDERS 62297 -#define IDS_BROWSE_TO_PUB_LOC_CAPTION 62298 -#define IDS_LOAD_JAVA 62298 -#define IDS_LANGUAGE_GREEK 62300 -#define IDS_LANGUAGE_TURKISH 62301 -#define IDS_SOURCE_SAMEAS_DEST 62302 -#define IDS_SAVING_LOCATION 62303 -#define IDS_VIEWING_LOCATION 62304 -#define IDS_LANGUAGE_WIN1251 62308 -#define IDS_CLOSE_BUTTON 62310 -#define IDS_LANGUAGE_UTF8 62311 -#define IDS_RES_VERSION 62312 -#define IDS_TITLE_ERROR 62313 -#define IDS_URL_INVALID 62314 -#define IDS_URL_UNREGISTERED 62315 -#define IDS_URL_SAVEFAILED 62316 -#define IDS_GETPATH_FAILED 62317 -#define IDS_CANT_WRITEFILE 62318 -#define IDS_NONAME 62319 -#define IDS_NOADDRESS 62320 -#define IDS_FILTER_HTM16 62323 -#define IDS_FILTER_HTM32 62324 -#define IDS_FILTERNT_HTM 62325 -#define IDS_FILTERNT 62326 -#define IDS_FILTER16 62327 -#define IDS_FILTER32 62328 -#define IDS_HTM_FILTER16 62329 -#define IDS_HTM_FILTER32 62330 -#define IDS_JPG_FILTER16 62331 -#define IDS_JPG_FILTER32 62332 -#define IDS_GIF_FILTER 62333 -#define IDS_XBM_FILTER 62334 -#define IDS_ALL_FILTER 62335 -#define IDS_IMAGE_FILTER16 62336 -#define IDS_IMAGE_FILTER32 62337 -#define IDS_POPUP_SETASWALLPAPER 62338 -#define IDS_POPUP_SAVEBACKGROUNDAS 62339 -#define IDS_PRINTING_PAGE 62341 -#define IDS_PAGE_N_OF_COUNT 62342 -#define IDS_SHORTCUT_TO 62343 -#define IDS_MORE_BOOKMARKS 62344 -#define IDS_UNSENT_MESSAGES 62345 -#define IDS_UPLOAD_FILES 62346 -#define IDS_NETSCAPE_MAIL_TITLE 62347 -#define IDS_CHARSET_LIST_FOR_UNICODE 62348 -#define IDS_BOOKMARK_QF_TIP 62351 -#define IDS_BREADCRUMB_QF_TIP 62352 -#define ID_CUSTOMIZE_TOOLBAR 62353 -#define IDS_NEWSGROUP_NAME 62354 -#define IDS_SUBSCRIBE 62355 -#define IDS_POSTINGS 62356 -#define IDS_SUBSCRIBE_GROUP 62357 -#define IDS_SCOPE_INSTR 62358 -#define IDS_SCOPE_ALLMAIL 62359 -#define IDS_SCOPE_SUBNEWS 62360 -#define IDS_SCOPE_ALLNEWS 62361 -#define IDS_SCOPE_SELECTED 62362 -#define IDS_MAIL_THISFOLDER 62363 -#define IDS_HIDE_TOOLBARS 62365 -#define IDS_HIDE_COMMANDTOOLBAR 62365 -#define IDS_SHOW_TOOLBARS 62366 -#define IDS_SHOW_COMMANDTOOLBAR 62366 -#define IDS_EXPANDO 62367 -#define IDS_ADDBOOKMARK 62368 -#define IDS_EDITBOOKMARK 62369 -#define IDS_PRIORITY_NONE 62370 -#define IDS_ADDBREADCRUMB 62370 -#define IDS_PRIORITY_LOWEST 62371 -#define IDS_EDITBREADCRUMB 62371 -#define IDS_PRIORITY_LOW 62372 -#define IDS_PRIORITY_NORMAL 62373 -#define IDS_PRIORITY_HIGH 62374 -#define IDS_PRIORITY_HIGHEST 62375 -#define ID_VIEW_COMMANDTOOLBAR 62376 -#define ID_VIEW_LOCATIONTOOLBAR 62377 -#define ID_VIEW_CUSTOMTOOLBAR 62378 -#define IDS_ACCEPTLANG_AF 62380 -#define IDS_ACCEPTLANG_SQ 62381 -#define IDS_ACCEPTLANG_EU 62382 -#define IDS_ACCEPTLANG_CA 62383 -#define IDS_ACCEPTLANG_DA 62384 -#define IDS_ACCEPTLANG_NLBE 62385 -#define IDS_ACCEPTLANG_FO 62386 -#define IDS_ACCEPTLANG_FI 62387 -#define IDS_ACCEPTLANG_FRBE 62388 -#define IDS_ACCEPTLANG_FRCH 62389 -#define IDS_ACCEPTLANG_DEDE 62390 -#define IDS_ACCEPTLANG_DEAU 62391 -#define IDS_ACCEPTLANG_DECH 62392 -#define IDS_ACCEPTLANG_GL 62393 -#define IDS_ACCEPTLANG_IS 62394 -#define IDS_ACCEPTLANG_IN 62395 -#define IDS_ACCEPTLANG_GA 62396 -#define IDS_ACCEPTLANG_GD 62397 -#define IDS_ACCEPTLANG_NO 62398 -#define IDS_ACCEPTLANG_HR 62399 -#define IDS_ACCEPTLANG_CS 62400 -#define IDS_ACCEPTLANG_HU 62401 -#define IDS_ACCEPTLANG_PL 62402 -#define IDS_ACCEPTLANG_RO 62403 -#define IDS_ACCEPTLANG_SK 62404 -#define IDS_ACCEPTLANG_SL 62405 -#define IDS_ACCEPTLANG_BG 62406 -#define IDS_ACCEPTLANG_BE 62407 -#define IDS_ACCEPTLANG_MK 62408 -#define IDS_ACCEPTLANG_RU 62409 -#define IDS_ACCEPTLANG_SR 62410 -#define IDS_ACCEPTLANG_UK 62411 -#define IDS_ACCEPTLANG_EL 62412 -#define IDS_ACCEPTLANG_TR 62413 -#define ID_WINDOW_TASKBAR 62414 -#define ID_BOOKMARKS_FILEROOT 62415 -#define IDS_HIDE_LOCATIONTOOLBAR 62416 -#define IDS_SHOW_LOCATIONTOOLBAR 62417 -#define IDS_MESSAGE_POSTREPLY 62418 -#define IDS_MESSAGE_POSTANDREPLY 62419 -#define IDS_MESSAGE_REPLY 62420 -#define IDS_MESSAGE_REPLYALL 62421 -#define IDS_HIDE_CUSTOMTOOLBAR 62424 -#define IDS_SHOW_CUSTOMTOOLBAR 62425 -#define IDS_HIDE 62426 -#define IDS_DOCK_TASKBAR 62427 -#define IDS_SHOW_TASKBAR 62428 -#define ID_WINDOW_LIVECALL 62429 -#define ID_FILE_SAVEFRAME_AS 62431 -#define ID_EDIT_FRAME 62432 -#define ID_HOTLIST_TOOLBAR 62433 -#define IDS_SPELL_CHECK_DONE 62433 -#define IDS_VIEWSOURCE 62434 -#define IDS_VIEWINFO 62435 -#define IDS_VIEWFRAMESOURCE 62436 -#define IDS_VIEWFRAMEINFO 62437 -#define IDS_MENU_CANCELMESSAGE 62438 -#define IDS_STATUS_CANCELMESSAGE 62439 -#define IDS_MENU_DELETEMESSAGE 62440 -#define IDS_POPUP_OPENFOLDER 62441 -#define IDS_POPUP_OPENFOLDERNEWWINDOW 62442 -#define IDS_POPUP_NEWSUBFOLDER 62443 -#define IDS_POPUP_DELETEFOLDER 62444 -#define IDS_POPUP_RENAMEFOLDER 62445 -#define IDS_POPUP_COMPRESSFOLDER 62446 -#define IDS_POPUP_NEWMESSAGE 62447 -#define IDS_POPUP_SEARCH 62448 -#define IDS_POPUP_OPENNEWSGROUP 62450 -#define IDS_POPUP_OPENNEWSGROUPNEWWINDOW 62451 -#define IDS_POPUP_REMOVENEWSGROUP 62452 -#define IDS_POPUP_INVITETONEWSGROUP 62453 -#define IDS_OPENACCEL 62453 -#define IDS_POPUP_MARKNEWSGROUPREAD 62454 -#define IDS_POPUP_UPDATEMESSAGECOUNT 62455 -#define IDS_POPUP_JOINNEWSGROUP 62456 -#define IDS_POPUP_REMOVENEWSHOST 62457 -#define IDS_POPUP_NEWFOLDER 62458 -#define IDS_POPUP_OPENMESSAGE 62459 -#define IDS_POPUP_OPENMESSAGENEWWINDOW 62460 -#define IDS_POPUP_ADDTOADDRESSBOOK 62461 -#define IDS_POPUP_IGNORETHREAD 62462 -#define IDS_POPUP_WATCHTHREAD 62463 -#define IDS_POPUP_FILE 62465 -#define IDS_POPUP_DELETEMESSAGE 62466 -#define IDS_POPUP_SAVEMESSAGE 62467 -#define IDS_POPUP_PRINTMESSAGE 62468 -#define IDS_POPUP_CANCELMESSAGE 62469 -#define IDS_POPUP_ADDSENDER 62470 -#define IDS_POPUP_ADDALL 62471 -#define IDS_NAVIGATION_TIP 62475 -#define ID_NAVIGATION_TOOLBAR 62475 -#define IDS_PERSONAL_TIP 62476 -#define ID_PERSONAL_TOOLBAR 62476 -#define IDS_LOCATION_TIP 62477 -#define ID_LOCATION_TOOLBAR 62477 -#define IDS_TOOLBARFOLDER 62478 -#define IDS_MENU_DELETENEWSGROUP 62479 -#define IDS_MENU_DELETENEWSHOST 62480 -#define IDS_MENU_DELETESELECTION 62481 -#define IDS_STATUS_DELETENEWSGROUP 62482 -#define IDS_STATUS_DELETENEWSHOST 62483 -#define IDS_STATUS_DELETESELECTION 62484 -#define IDS_CREATEDON 62485 -#define IDS_SEARCHING 62486 -#define IDS_SEARCHHITS 62487 -#define IDS_SEARCHNOHITS 62488 -#define IDS_SEARCH 62489 -#define IDS_STOP 62490 -#define IDS_SEARCHONEHIT 62491 -#define IDS_POPUP_PRIORITY 62492 -#define IDS_POPUP_LOWEST 62493 -#define IDS_POPUP_LOW 62494 -#define IDS_POPUP_NORMAL 62495 -#define IDS_POPUP_HIGH 62496 -#define IDS_POPUP_HIGHEST 62497 -#define IDS_MSGSTODOWNLOAD 62498 -#define IDS_PROGRESS 62499 -#define IDS_SET_PERSONALTOOLBAR 62500 -#define IDS_TURNOFF_PERSONALTOOLBAR 62501 -#define ID_COMPOSE_MESSAGE_TOOLBAR 62502 -#define ID_ADDRESS_BOOK_TOOLBAR 62503 -#define ID_MESSENGER_INFOBAR 62505 -#define ID_MESSENGER 62513 -#define ID_BROWSER 62514 -#define ID_MESSAGES 62515 -#define ID_FOLDERS 62516 -#define ID_ADDRESS_BOOK 62517 -#define IDS_MENU_HIDECATEGORIES 62519 -#define IDS_MENU_SHOWCATEGORIES 62520 -#define IDS_MENU_HIDEMESSAGE 62521 -#define IDS_MENU_SHOWMESSAGE 62522 -#define IDS_CALENDAR_MENU 62527 -#define IDS_HORIZONTAL 62528 -#define IDS_VERTICAL 62529 -#define IDS_CALENDAR_REGISTRY 62530 -#define IDS_INSTALL_DIRECTORY 62531 -#define ID_WINDOW_IBMHOSTONDEMAND 62532 -#define IDS_3270_REGISTRY 62533 -#define IDS_IBMHOSTONDEMAND_MENU 62534 -#define ID_VIEW_INCREASEFONT 62537 -#define ID_VIEW_DECREASEFONT 62538 -#define IDS_CURRENTVERSION 62539 -#define IDS_NSCPINI 62540 -#define IDS_CALENDAR32EXE 62541 -#define IDS_CALENDAR16EXE 62542 -#define IDS_POPUP_COPY 62543 -#define IDS_STATUS_MOVEMESSAGE 62543 -#define IDS_3270HTML 62544 -#define IDS_IBMHOSTONDEMAND 62545 -#define IDS_CALENDAR 62546 -#define IDS_3270 62547 -#define IDS_CANT3270 62548 -#define IDS_CANTCALENDAR 62549 -#define IDS_NETHELP_REGISTRY 62550 -#define IDS_NETHELP_DIRECTORY 62552 -#define IDS_COPYRIGHT 62553 -#define IDS_NETSCAPE_REGISTRY 62554 -#define IDS_YOUHAVENEWMAIL 62555 -#define IDS_FOLDERPROPS 62556 -#define IDS_STATUS_COPYMESSAGE 62556 -#define IDS_NEWSGROUPPROPS 62557 -#define IDS_STATUS_MOVEFOLDER 62557 -#define IDS_MAILHOSTPROPS 62558 -#define IDS_NEWSHOSTPROPS 62559 -#define IDS_FOLDERCOUNTS 62560 -#define IDS_FOLDERUNKNOWNCOUNTS 62561 -#define IDS_OPEN_STRING 62562 -#define IDS_CREATIONFAILED 62563 -#define IDS_WHYCREATIONFAILED 62564 -#define IDS_NOPRINTERFONT 62565 -#define IDS_NOPAGETOPRINT 62566 -#define IDS_NOPRINTJOB 62567 -#define IDS_FORMATTING 62568 -#define IDS_MAILSOUND 62569 -#define IDS_POPUP_MARKTHREADREAD 62570 -#define IDS_POPUP_MARKALLREAD 62571 -#define IDS_POPUP_CATCHUP 62572 -#define IDS_MAILSOUND16 62573 -#define IDS_CONFERENCE_REGISTRY 62574 -#define IDS_CONFERENCE 62575 -#define IDS_PATHNAME 62576 -#define IDS_SIZE 62577 -#define IDS_MENU_GETNEXT 62578 -#define IDS_ALTMAIL_MISSING_DLL 62579 -#define IDS_ALTMAIL_OLD_DLL 62580 -#define IDS_ALTMAIL_MISSING_FUNCTIONS 62581 -#define IDS_ALTMAIL_REGISTER_FAILED 62582 -#define IDS_UNKNOWN_DOCTYPE 62583 -#define IDS_SAVE_VIEWER 62584 -#define IDS_UNKNOWN_TIMELEFT 62585 -#define IDS_NO_OPEN_WRITE 62586 -#define IDS_CANT_WRITE 62587 -#define IDS_CANT_CLOSE 62588 -#define IDS_CANT_CLEANUP 62589 -#define IDS_FOLDERPROP 62590 -#define IDS_NEWSGROUPPROP 62591 -#define IDS_MAILSERVERPROP 62592 -#define IDS_NEWSHOSTPROP 62593 -#define IDS_CATEGORYPROP 62594 -#define IDS_SEARCHMESSAGES 62595 -#define IDS_SEARCHLDAP 62596 -#define IDS_MENU_ALL 62597 -#define IDS_MENU_ALLMESSAGES 62598 -#define IDS_MENU_ALLCATEGORIES 62599 -#define IDS_POPUP_FOLDERPROP 62600 -#define IDS_POPUP_MAILSERVERPROP 62601 -#define IDS_POPUP_NEWSHOSTPROP 62602 -#define IDS_POPUP_NEWSGROUPPROP 62603 -#define IDS_POPUP_SETTOTOOLBAR 62604 -#define IDS_POPUP_UNSETTOOLBAR 62605 -#define IDS_POPUP_SAVEAS 62606 -#define IDS_POPUP_LOADFRAMENEWWINDOW 62607 -#define IDS_POPUP_SENDPAGE 62608 -#define IDS_POPUP_RELOADFRAME 62609 -#define IDS_POPUP_RELOAD 62610 -#define IDS_POPUP_SHOWIMAGE 62611 -#define IDS_POPUP_STOP 62612 -#define IDS_QUICKFILE_FILEBOOKMARK 62613 -#define IDS_CANTPRINT_LOGIN 62614 -#define IDS_POPUP_CATEGORYPROP 62615 -#define IDS_SHOWHIDECOLUMNS 62616 -#define IDS_EMPTYINGTRASH 62617 -#define IDS_POPUP_ATTACHMENTPROP 62618 -#define IDS_ATTACHMENTPROP 62619 -#define IDS_TITLE_COMPOSE_PAGE 62620 -#define IDS_POPUP_LOADLINKNAVIGATOR 62621 -#define IDS_MENU_NEWFOLDER 62622 -#define IDS_MENU_NEWCATEGORY 62623 -#define IDS_POPUP_NEXTMESSAGE 62624 -#define IDS_POPUP_NEXTUNREADMSG 62625 -#define IDS_POPUP_NEXTFLAGGEDMSG 62626 -#define IDS_POPUP_NEXTUNREADTHREAD 62627 -#define IDS_POPUP_NEXTFOLDER 62630 -#define IDS_POPUP_NEXTGROUP 62631 -#define IDS_POPUP_NEXTUNREADFOLDER 62632 -#define IDS_POPUP_MARKASREAD 62634 -#define IDS_POPUP_MARKASUNREAD 62635 -#define IDS_POPUP_MARKFORLATER 62638 -#define IDS_MAIN 62639 -#define ID_EDIT_WITHFRAME_FINDINCURRENT 62640 -#define IDS_FINDINPAGE 62641 -#define IDS_FINDINFRAME 62642 -#define IDS_BROWSER_STOP_TIP 62643 -#define IDS_MENU_NEWNEWSGROUP 62644 -#define IDS_POPUP_OPENSELECTION 62647 -#define IDS_POPUP_OPENMESSAGEREUSEWINDOW 62648 -#define IDS_MENU_IGNORETHREAD 62648 -#define IDS_MENU_IGNORECATEGORY 62649 -#define IDS_MENU_NEXTFOLDER 62651 -#define IDS_MENU_NEXTNEWSGROUP 62652 -#define IDS_MENU_NEXTUNREADFOLDER 62653 -#define IDS_MENU_NEXTUNREADNEWSGROUP 62654 -#define IDS_NOATTACHMENTS 62655 -#define IDS_MENU_COMPRESSFOLDERS 62656 -#define IDS_MENU_COMPRESSFOLDER 62657 -#define IDC_FIRST_PLACES_MENU_ID 65000 -#define ID_COMMAND_PAGE_FROM_WIZARD 65197 -#define ID_COMMAND_HELPINDEX 65198 -#define IDS_COMMAND_HELPINDEX 65198 -#define ID_COMMAND_ABOUT 65199 -#define IDS_COMMAND_ABOUT 65199 -#define IDC_FIRST_HELP_MENU_ID 65200 -#define IDURL_COMMAND_ABOUT 65399 -#define IDS_BROWSETO_CAPTION 65400 -#define IDS_SELECT_BROWSETO_CAPTION 65401 -#define IDS_NEW_PAGE_TEMPLATE 65402 -#define IDS_EDITING_TEMPLATE 65403 -#define IDS_EXAMPLEHOSTNAME 65404 -#define IDS_DOWNLOADINGARTICLES 65406 -#define IDS_PUBLISH_CAPTION 65407 -#define IDS_PUBLISH_PAGE 65408 -#define IDS_ENTER_PUBLISH_FILENAME 65409 -#define IDS_TASKBAR_NEWS_HTEXT 65410 -#define IDS_TASKBAR_NEWS_VTEXT 65411 -#define IDS_TASKBAR_FLOAT_NAVTIP 65412 -#define IDS_TASKBAR_FLOAT_MAILTIP 65413 -#define IDS_TASKBAR_FLOAT_NEWSTIP 65414 -#define IDS_TASKBAR_FLOAT_COMPOSETIP 65415 -#define IDS_TASKBAR_ONTOP 65416 -#define IDS_TASKBAR_SHOWTEXT 65417 -#define IDS_TASKBAR_HIDETEXT 65418 -#define IDS_BOOKMARK_LASTVISITED 65419 -#define IDS_HELPCONTENTS 65420 -#define IDS_ABOUTNETSCAPE 65421 -#define IDS_ABOUTCOMMUNICATOR 65421 -#define ID_PRINT_PAGE 65422 -#define ID_PRINT_FRAME_NOSELECTION 65423 -#define ID_PRINT_FRAME_SELECTED 65424 -#define IDS_FILESAVEFAILED 65425 -#define IDS_POPUP_OPENATTACHMENT 65426 -#define IDS_STRING_FILE 65427 -#define IDS_SHOW_MESSAGE_TOOLBAR 65428 -#define IDS_HIDE_MESSAGE_TOOLBAR 65429 -#define IDS_SHOW_ADDRESS_AREA 65430 -#define IDS_HIDE_ADDRESS_AREA 65431 -#define IDS_CANT_LOAD_PREFS 65432 -#define IDS_HIDE_ABTOOLBAR 65433 -#define IDS_SHOW_ABTOOLBAR 65434 -#define IDS_AB_NEW_LIST 65435 -#define IDS_AB_PROPERTIES 65436 -#define IDS_AB_NEW_USER 65437 -#define IDS_STATUS_OFFLINE 65438 -#define IDS_MSGTOBIG 65439 -#define IDS_PTS 65440 -#define IDS_DEFAULT_NOCOLOR 65441 -#define IDS_CHOOSE_TEXT_COLOR 65442 -#define IDS_CHOOSE_LINK_COLOR 65443 -#define IDS_CHOOSE_ACTIVELINK_COLOR 65444 -#define IDS_CHOOSE_FOLLOWED_LINK_COLOR 65445 -#define IDS_CHOOSE_BACKGROUND_COLOR 65446 -#define IDS_DEFAULT_VARIABLE 65447 -#define IDS_DEFAULT_FIXED_WIDTH 65448 -#define IDS_XP_FONT 65449 -#define IDS_TRUE_TYPE 65450 -#define IDS_VECTOR_FONT 65450 -#define IDS_DYNAMIC_FONT 65450 -#define IDS_LOCAL_FONT 65451 -#define IDS_DEFAULT_SHORT 65452 -#define IDS_ADVANCED_FONTSIZE_MSG 65453 -#define IDS_SHOW_PARA_MARKS 65454 -#define IDS_HIDE_PARA_MARKS 65455 -#define IDS_SHOW_TABLE_BORDERS 65456 -#define IDS_HIDE_TABLE_BORDERS 65457 -#define ID_COMPOSER 65458 -#define IDS_NETCASTER_MENU 65460 -#define IDS_OPENING_FILE 65463 -#define IDS_ASK_HANDLEBYOLE 65464 -#define IDS_UNDO 65470 -#define IDS_REDO 65471 -#define IDS_COLOR_TIP_FORMAT 65472 -#define IDS_COLOR_TIP_RGB 65472 -#define IDS_COLOR_TIP_HTML 65473 -#define IDS_PKCS12_FILTER 65474 -#define IDS_UNTITLED_FOLDER 65476 -#define IDS_MULTIPLE_FONTS 65477 -#define IDS_NEW_DOC_BLANK 65490 -#define IDS_NEW_DOC_FROM_TEMPLATE 65491 -#define IDS_NEW_DOC_FROM_WIZARD 65492 -#define IDS_FILE_OPEN 65496 -#define IDS_FILE_OPENURL 65497 -#define IDS_EDIT_FINDINCURRENT 65498 -#define IDS_EDIT_FINDAGAIN 65499 -#define IDC_EMAIL_TEXT 65500 -#define IDS_EDIT_REPLACE 65500 -#define IDS_ADVSEARCH 65501 -#define IDS_BASICSEARCH 65502 -#define ID_FILE_NEW_NAVCENTER 65503 -#define IDS_SEARCH_PROMPT 65503 -#define ID_VIEW_NAV_CENTER 65504 -#define IDS_ADRSEARCH 65504 -#define IDM_SAVEASTEMPLATE 65504 -#define IDS_ADVSEARCH_TITLE 65505 -#define IDS_BASICSEARCH_TITLE 65506 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 1568 -#define _APS_NEXT_COMMAND_VALUE 42549 -#define _APS_NEXT_CONTROL_VALUE 1564 -#define _APS_NEXT_SYMED_VALUE 118 -#endif -#endif diff --git a/l10nkits/client/windows/docs/nav40/returnKit.html b/l10nkits/client/windows/docs/nav40/returnKit.html deleted file mode 100644 index bdda2ede2e0..00000000000 --- a/l10nkits/client/windows/docs/nav40/returnKit.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Returning the Kit - - - -

    -6. Returning the Finished Kit

    - -

    Once you are satisfied with the quality of your localization efforts, -you are required by the terms of the Unlimited Localization Program -license to make your localized product publicly available. The exact details of -how you do this is up to you, the most commonly acceptable method is to post -your localized product to a publicly accessible ftp site. -

    -You should post just the localized versions of the files mentioned in the Localize These -Files section of this document. For ease of transfer, you may create a compressed archive -in the .ZIP file format that contains the localized files. Create one .ZIP file for each -language/platform you do. If you are publishing more than one language or platform, you -may combine multiple .ZIP files into one master .ZIP file if this makes your life easier. -

    -If your localized product includes your own trademarks, you should identify these and any -restrictions you are placing on their use. You must also include a copy of the End User -License Agreement (EULA), as well as a notice stating that Netscape Communications -is not required to support your product, and that you are the Licensor referred to in the EULA. -Please refer to the Universal Localization Agreement for the exact legal requirements. -

    -Once your localized product is publicly available, you may inform the world in any manner you -choose, but we encourage you to also post the download location to the mozilla.org -Announcements newsgroup (netscape.public.mozilla.announce). -

    - -

    Congratulations! You are done!
    - -
    -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -

    -

    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - -
    - - - diff --git a/l10nkits/client/windows/docs/nav40/splash.html b/l10nkits/client/windows/docs/nav40/splash.html deleted file mode 100644 index dc57a775544..00000000000 --- a/l10nkits/client/windows/docs/nav40/splash.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Title Page - - - -
    -

    -NETSCAPE COMMUNICATOR

    - -
    - -
    -

    -Localization Kit

    - -
    -

    -for Microsoft® Windows (32-bit version)

    - -
    -

    -Revision 1.2

    - -
    Copyright © 1994-1998 Netscape® Communications Corporation, -All rights reserved.
    -  -
      -
    - - - - - -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    - - - diff --git a/l10nkits/client/windows/docs/nav40/testKit.html b/l10nkits/client/windows/docs/nav40/testKit.html deleted file mode 100644 index 68b8f6111b5..00000000000 --- a/l10nkits/client/windows/docs/nav40/testKit.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - Testing the Localized Resources - - - -

    -4. Ensuring Quality

    -The quality of your localized version will have a large impact on its acceptance -in the marketplace.  You can greatly enhance your chances of producing -a quality product by using experienced and skilled localizers, and by performing -post-translation testing. - -

    When performing the actual translation, you should be sensitive to a -number of issues: -

      -
    • -Completeness: you should aim for as thorough a translation as possible.  -Try not to leave portions of the product untranslated. However, be aware -that some terms may best be left in English, depending on local conventions.
    • - -
    • -Suitability: all translations should be suitable and appropriate for product, -the language, the market and the customers you intend to reach.  This -includes using the proper technical terminology for a give platform or -computer operation, as well as using language that is readily understood -by the average user of the product in a given language.  You should, -where possible, try to use terminology which is similar to other products -available on the same platform (without violating copyrights or trademarks, -of course).
    • - -
    • -Accuracy: you should be sure your translation conveys the same meaning -and intention as the original English.
    • - -
    • -Grammar and spelling: you should be sure your translation is grammatically -accurate and free from spelling errors.
    • -
    -Keep in mind that engineers do not necessarily make the best localizers! - -

    Once localization is complete, there are two basic types of post-translation -testing that should be done: -
      - - - - - - - - - - - - -
    Linguistic ReviewChecking all translations for accuracy and appropriateness in the actual -context in which they appear.
    Functional TestingEnsuring the product still functions as designed (or at least as well -as the US English product).
    - - -

    For the linguistic review, you should have an independent reviewer (i.e. -not the person who implemented the translations) check every string for -the items listed above.  In some cases, it may be enough to review -the running product itself; however, it is also valuable to print out your -translations (using ToolCool or your own translation tools) and review -them externally from the product. - -

    For the functional testing, your best resource are the directions contained -in the localization notes and this document. You should review the completed -product's localization notes with this document in hand, double checking -that you have followed all the instructions contained here and in the appropriate -.DOG file's COMMENT field. - -

    Consider the following general guidelines when testing: -

      -
    • -It is helpful to have a second copy of the product running with the English -version so you can compare them side by side (a second computer might be -helpful or required for this).
    • - -
    • -Walk through every menu in each module you have localized looking for translation -accuracy, pick letter conflicts and other problems.
    • - -
    • -Bring up as many dialogs as you can, looking for translation accuracy, -pick letter conflicts, truncated strings and functionality issues.
    • - -
    • -Use as many of the features of the product as possible: read web pages, -read and send mail and discussion group messages, set mail filters, search -mail and discussion groups, create web pages using the Composer, etc. If -functional problems are found, you should compare the same steps you took -in the localized product to the English product: if the two products fail -in the same way, it is a "core" bug, which can only be fixed by changing -the core product's executable. If the localized product fails while the -English product does not, then it is probably a translation-related bug; -these can be fixed by altering the way you localize the product (perhaps -by not translating a particular item, or by translating it differently).
    • -
    -The following section tells you how to report bugs in the localization -kit itself, or in the core product. -
      -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/toc.html b/l10nkits/client/windows/docs/nav40/toc.html deleted file mode 100644 index 9c8e6ca4024..00000000000 --- a/l10nkits/client/windows/docs/nav40/toc.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - Table of Contents - - - -

    -Table of Contents

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    i. Title Page
    -
    1. Project Overview  - -
    2. Getting Started  -
    3. Using the Kit  -
    4. Ensuring Quality -
    5. Troubleshooting  -
    6. Returning the Finished Kit  -
     
    7. References 
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/troubleshooting.html b/l10nkits/client/windows/docs/nav40/troubleshooting.html deleted file mode 100644 index 16c1d28d42f..00000000000 --- a/l10nkits/client/windows/docs/nav40/troubleshooting.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - Troubleshooting - - - -

    -5. Troubleshooting

    -This section discusses tools and tips for diagnosing, correcting or avoiding -problems encountered using this localization kit. -

    -Using the idBuild

    -A special build of the US English product is provided with this kit, called -the idBuild.  This version of the product is designed to help you -locate where specific strings are coming from within the resources.  -It does this by prepending to the resource string (putting in front) a -token representing the resource ID.  The token will be in the following -form: -
      -
    • -an initial letter, either M, D or S, which stands for MENU, DIALOG or STRINGTABLE.  -(RCDATA is ignored.)
    • - -
    • -the resource's numeric id
    • - -
    • -for Menus and Dialogs, a dash followed by the Item number
    • - - -

      Example: D2298-3 = DIALOG2298Item3

    -This knowledge can help expand upon the information provided in the localization -notes by giving you the actual context in which a specific string appears.  -It can also help you locate problematic issues, such as STRINGTABLE resources -being used in menus, concatenated strings, etc. - -

    NOTE: the idBuild is provided "AS IS" with no guarantees as to functionality, -stability or fitness for any purpose.  It may crash, or some features -may not work due to the unexpected way in which the resources have been -modified.  Use it at your own risk. - -

    To use the idBuild: -
      -

      -
    • -Install the current version of Communicator (4.03 as of this writing)
    • - -
    • -Make backup copies of the 8 resource binaries listed in the -table above.  Store these copies somewhere safe.
    • - -
    • -Copy the 8 resource binaries provided in the kitRoot\products\client\windows\32bit\en\nav40\program\idBuild -directory to the installed version's Program directory -(replacing the originals).
    • - -
    • -Start the program as usual.
    • -
    -What you will see will be the modified Communicator, with resource IDs -visible next to the actual English strings.  In some cases, you might -not be able to see the entire string because of the increased string length.  -If absolutely necessary, you can modify the idBuild's binaries using MSDEV -to produce a more useful version, or you may simply inspect the strings -you can't fully see at runtime. - -

    idBuild Main Menu -
    - -

    In the image above, you can see the Communicator's main menu and the -toolbar buttons displayed with attached resource IDs. Note how most of -the menu items begin with "M", telling you they are standard menu resources.  -However, a few begin "S", indicating they come from the STRINGTABLE resources.  -These require special attention when assigning pickletters. - -

    If you see a string in the product itself (not a web page being displayed) -that does not have a resource ID attached, there are 4 possibilities as -it's origin: - -

    1. It is part of a multipart string.  For example, the toolbar -buttons are made up of strings with 3 components, each separated by newline -characters (\n ).  The first part is the status bar message; -this will have the resource ID.  The second and third components are -the ToolTip (pop-up help message) and the button label itself.  These -won't show the resource ID because it is prepended to the first part. - -

    2. The string comes from an RCDATA resource.  For example, the -Help menu contains a number of entries that come from CONFIG_PREFS.  -These are not touched by the idBuild generation process. - -

    3. The string comes from an external source.  For example, the -idBuild doesn't contain the MFC resources, so any strings coming from MFC42.dll -will be in there original form. - -

    4. The string is hard coded in the Netscape binary.  There are -still several strings that have not been resourced (for example, the Java -Console is entirely hard coded).  You will not be able to localize -these for this version. -
      -
      -

    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/usingKit.html b/l10nkits/client/windows/docs/nav40/usingKit.html deleted file mode 100644 index 863d38a5b47..00000000000 --- a/l10nkits/client/windows/docs/nav40/usingKit.html +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - Using the Kit - - - -
     
    -  - - - - -
    -
    WARNING! Protect yourself from data loss -by making regular backups of your work.
    -
    - -

    -3. Using the Kit

    -Once your copy of the Windows Front End Localization Kit is correctly installed, -you may begin your localization work by following the instructions in the -remainder of this document. The next section discusses the contents of -the localization notes provided with this kit.  It is important that -you work properly with the instructions contained in these files or the -localized product you create may not function. -

    -Understanding the Localization Notes

    -Each binary file to be localized has an associated localization notes file, -called a "DOG" file.  These files are created by the Netscape translation -tool, ToolCool. For a complete description of the process used to create -these files, please consult the Netscape Translation Tool User's Guide -that comes with those tools. It is very important that you work properly -with these localization notes, as they contain the bulk of the instructions -for this project. Most importantly, the .DOG files identify the "forbidden" -resources - those resources that you must not change. - -

    Each DOG file associated with a. dll or .exe has the same name as the -binary file, but will have the extension .DOG. -

      E.g. RESDLL.DLL has an associated RESDLL.DOG
    -The .DOG file lists certain information about each resource contained in -the associated binary file; : -
    Field Name      Purpose
    -FILENAME        Not used.
    -IDENTIFIER      Resource ID.
    -US_STR          Original English string.
    -XL_STR          Target translated string.
    -COMMENT         Localization notes for translator.
    -REASON          Explanation of leveraging results.
    -TRANSLATE       Resource is forbidden from translation if this is "FALSE"
    -Resource IDs are made up of a combination of the resource type and a unique -identifier, depending on the type of resource.  See the individual -sections dealing with each resource type for a description of how resources -are identified. You must not change the contents of this field. - -

    The original English string is what you need to translate; however, -your translation must go in the XL_STR field. It is not useful to change -the contents of the US_STR field. - -

    Your translation will be done in the XL_STR field. If there is no leveraged -translation from a prior version, this string will originally match the -US_STR value. - -

    If a resource requires some extra explanation, this can be found in -the COMMENT field. - -

    The REASON field indicates the results of the leveraging process which -created the database, which in turn was used to generate the .DOG file. -Unless you are using the Netscape translation tools, this field is not -useful to you. - -

    The TRANSLATE field dictates whether or not you can change the value -of the XL_STR field. If this field is blank, the resource is OK to translate; -if the value is "FALSE", you must not translate it. (When viewed through -ToolCool, this field appears as a check box. When checked, you may translate -this resource; when unchecked, you may not.) - -

    The next section presents the basic localization process as a checklist. -

    -
    - -

    -Localization Checklist

    -The basic localization process is this: - -

    1. Create your working directories -
    Copy the English directory (kitRoot\products\client\windows\platform\en) -to a new directory at the same level.  Be sure to use the appropriate -naming convention for your new directory.  This is the ISO 639:1988 -standard (Code for the representation of names of languages).  -A sub-set of these codes can be found in the accompanying table.  -You can go here -for a complete listing of the standard. - -

    2. Identify files to localize -
    Consult the Localize These -Files page to learn which binary files contain localizable resources. - -

    For each file to be localized, follow these steps using the tool of -your choice, being careful to follow all instructions contained in the -Localization Notes for that resource.: -

      -
    • -Localize the STRINGTABLE resources
    • - -
    • -Localize the MENU resources
    • - -
    • -Localize the DIALOG resources
    • - -
    • -Localize the Javascript preferences stored in DATA resources (RESDLL.DLL -only)
    • - -
    • -Localize the remaining DATA resources (RESDLL.DLL only)
    • -
    -3. Localize external files -
    In addition to the binary resource modules requiring localization, -there are a number of external files which may need to be localized1: -these are listed in the Localize -These Files page. Further instructions can be found there. - -

    4. Complete post-translation processing -
    After translation is complete, you need to test your work and deal -with any problems: -

      -
    • -Test the localized product.
    • - -
    • -Fix translation bugs using your localization tools or a resource editor.
    • - -
    • -Fix dialog size bugs using your localization tools or a resource editor.
    • - -
    • -Report core bugs to Netscape.
    • -
    -5. Return kits (optional) -
    Finally, you may be required to deliver files back to Netscape: -
      -
    • -Return the necessary files to Netscape (if required).
    • - -
    • -Inform us that the localized files have been returned (if required).
    • -
    - -
    -

    -Product Branding Issues

    -If you are using this kit under the auspices of the Unlimited Localization -Program, you must remove or replace Netscape trademarked strings, images -and icons in your localized version. Click here -for instructions. - -

    -


    -

    -How to Localize Different Resource Types

    -This section provides you with general information about localizing the -various resource types and files found with this kit.  (Remember, -specific localization notes for binary resources is found in the associated -.DOG file.) -

    -Localizing URLs

    - -
      Many resources of all types in the Communicator contain Internet addresses -in the form of URLs (Universal Resource Locators). Because many of these -URLs originally point to locations within the Netscape domain, how they -are localized depends on whether you are creating a branded Netscape version -or not.  The rules for how to handle URLs are found here.
    - -

    -Localizing String Tables

    - -
      STRINGTABLE resources are the most sensitive, potentially problematic -resource type you will be working with. Therefore, you must pay close attention -to the instructions provided in the localization notes. -

      -Localization Notes

      -String table resources are identified by the word STRINGTABLE, followed -by the numeric resource ID generated from the project's header files.  -For example, in the file BRPREF32.DLL, STRINGTABLE109 contains the label -and explanatory text for the Languages pane of the preference dialog.  -Localization notes for string table resources are provided in the comments -field for each resource contained in the associated .DOG file. Please pay -special attention to these notes and to the TRANSLATE field. In general, -be aware of the following: -
        -
        -
      • -Many strings contain C++ print format strings, such as %s, %ld, %lu, etc.  -Do not modify these while translating the rest of the string.
      • - -
      • -Many strings contain new line characters: \n.  In general, you should -try leave these as you find them.  In some cases, the new line is -used to delimit a matched set of strings used to build a button label, -a ToolTip and a status bar message all relating to single control. In these -cases, you must preserve the new line characters.
      • - -
      • -Many strings actually show up as part of an HTML or Javascript document -or dialog.  Be careful not to break format tags, like <TITLE>, -<FONT>, etc. by translating these.
      • -
      -
    - -

    -Localizing Menus

    - -
      Menu translation is usually not as tricky as localizing string tables; -however, you should take care to assign unique pickletters to menu choices.  -This process can be made difficult by the fact that some strings that appear -in menus at runtime actually come from string tables.  The special -ID Build provided in this kit can help you find these. -

      -Localization Notes

      -Menu resources are identified first by the word MENU, then by a resource -number, then by a sequential Item number. For example, in RESDLL.DLL, MENU2ITEM0 -contains the word "&File". This resource is the first item in menu -structure structure #2 (the File menu).  The ampersand character (&) -denotes the pickletter is the letter "F".  Localization notes for -individual MENU resource items are provided in the comments field for that -item in the localization databases. Not all MENU resource items need to -be translated so again, please pay special attention to these notes and -to the TRANSLATE field!
    - -

    -Localizing Dialogs

    - -
      Dialog translation is usually not as tricky as localizing string tables; -however, you should take care to assign unique pickletters to dialog controls.  -This process can be made difficult by the fact that some strings that appear -in menus and dialogs at runtime actually come from string tables.  -The special ID Build provided in this kit can help you find these. Once -a DIALOG resource has been translated, the dialog may need to be resized -using a visual resource editor, such as MSDEV (Microsoft® -Visual C++ 4.0 or greater) or Borland® -Resource Workshop. -

      -Localization Notes

      -Dialog resources are identified first by the word DIALOG , then by a resource -number, then by a sequential Item number. For example, in NSMAILUI.DLL, -DIALOG129Item0 contains the word "Password". This resource is the first -item (the dialog title) in DIALOG129. Localization notes for individual -DIALOG resource items are provided in the comments field for that item -in the localization databases. Not all DIALOG resource items need to be -translated so again, please pay special attention to these notes and to -the TRANSLATE field!
    - -
      A special note on Dialog fonts: -
      The second item in each dialog definition (e.g. DIALOGnnnITEM1) is -the font information for that dialog.  If you find it necessary to -change the font name or size, be aware of the following fact: the font -size is represented in the translation database by the ASCII character -corresponding to that size.  In the US product the default font size -is 9, which appears as a Horizontal Tab (Font size = 9 = ASCII character -9 = tab).  In the database, this will appear as an unprintable character, -such as a black box.  There are two concerns here: first, if you change -the font name, be careful not to accidentally delete the tab character.  -Second, if you decide to change the font size, you can do so by substituting -the appropriate ASCII character which matches the new size you want.  -For example, to change the font size to 10, replace the tab with a Line -Feed character (ASCII 10).  This is rather confusing, so it is probably -best to avoid changing the fonts if possible.
    - -

    -Localizing Javascript Preferences

    - -
      Javascript is used to define default preference information for the -Communicator and it's components.  These preferences end up stored -in the DATA section of RESDLL.DLL. You can use the ToolCool to edit these -just as you would STRINGTABLE resources, or use your preferred localization -tools. - -

      There are two groups of localizable Javascript preferences: ALL_PREFS -and CONFIG_PREFS.  Most of these preference settings are not localizable; -these are marked as forbidden in the localization notes.  Those that -are localizable should be treated very carefully, as Javascript is rather -particular about the format of the data it receives.  Pay special -attention not to unbalance quotes, delete the preceding tab characters, -etc.

    - -
      -

      -Localization Notes for ALL_PREFS

      -The entries in the ALL_PREFS section contain the default values for certain -cross-platform preferences, including some crucial for the correct operation -of localized versions.  The rules for how to handle this section are -found here. -

      -Localization Notes for CONFIG_PREFS

      -The entries in the CONFIG_PREFS section make up the configurable Toolbar -and Help menu items and their functions.  How they are localized depends -on whether you are creating a branded Netscape version or not.  The -rules for how to handle this section are found here.
    - -

    -Localizing DATA

    - -
      There are several additional resources stored as DATA that cannot be -edited using ToolCool.  Therefore, you must use a resource editor -and a text editor to localize these by following this procedure.  -(This example uses Microsoft® MSDEV; -if you prefer a different resource editor you may need to execute slightly -different steps).
    - -
      -
        -
      • -Open the file containing the DATA resources (usually RESDLL.DLL)
      • - -
      • -Expand the DATA resource type.
      • - -
      • -Select the resource you want to localize
      • - -
      • -Choose Edit | Select All.
      • - -
      • -Choose Edit | Copy.
      • - -
      • -Open a text editor window by clicking on the new document icon (or if you -prefer, you may use any other text editor).
      • - -
      • -Choose Edit | Paste.
      • - -
      • -You should now have the text representation of the DATA resource in your -text editor window. You may localize it according to the instructions in -the Localization Notes section for each DATA resource.
      • - -
      • -When done, save your work, then select ALL the text (use Edit | Select -All if your editor supports this).
      • - -
      • -Choose Edit | Copy.
      • - -
      • -Go back to the RESDLL.DLL in MSDEV and select the DATA resource you have -translated.
      • - -
      • -Choose Edit | Select All.
      • - -
      • -Choose Edit | Paste.
      • - -
      • -You should now see the original English DATA resource replaced by your -translated version.
      • - -
      • -IMPORTANT: Go to the end of -the resource and insert a NULL value by typing the number zero (0) in the -first empty byte position.
      • - -
      • -Close the resource and save your work.
      • -
      -
    - - - -

    -Localizing External Files

    - -
      As mentioned above, you may choose (or be required) to translate several -external files.  If this is the case, the links contained in the text -file section of Localize These -Files will tell you what to do. (Note: this may be nothing at all).
    - -

    -Localizing the NULL Plugin

    - -
      The so-called "NULL" plugin is the default plugin that ships with all -versions of the Communicator.  It's job is to list the plugins that -you have installed, and if you don't have a requested plugin, to help you -get it. - -

      The name and location of the NULL plugin is given in the Localize -These Files binary file section. Localization notes have been provided -for you to use when localizing the resources for this file.  Instructions -for individual resources can be found in the COMMENT field of the matching -.DOG file. - -

      -


    - -

    -Notes

    - -
      1. Whether or not you have to incorporate or create -localized version of these files depends on your agreement with Netscape, -if any; or if localization is occurring as part of the Universal Localization -Program, upon your desire to perform this work.[BACK]
    -  -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/nav40/winfekit.jpg b/l10nkits/client/windows/docs/nav40/winfekit.jpg deleted file mode 100644 index 099ecfed62677189d7c5b1dfa926d46ff93a5362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4486 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 s7v_D!(MgF8J8> - - - - - Cross-Product Encoding UI Names - - - -
    -

    -Cross-Product Encoding UI Names

    - -
    Uppercase and lowercase are treated distinctly
    - -
     
    - - - - - - - - - - - - - - - - - -
    UNIXWindowsMacintosh
    Western (ISO-8859-1)  -
    Western (Windows-1252)  -
    Central European (ISO-8859-2)  -
    Central European (Windows-1250)  -
    Japanese (Auto-Detect)  -
    Japanese (Shift_JIS)  -
    Japanese (EUC-JP)  -
    Japanese (ISO-2022-JP)  -
    Traditional Chinese (Big5)  -
    Traditional Chinese (EUC-TW)  -
    Simplified Chinese (GB2312)  -
    Simplified Chinese (HZ)  -
    Korean (Auto-Detect)  -
    Korean (EUC-KR)  -
    Korean (ISO-2022-KR)  -
    Cyrillic (KOI8-R)  -
    Cyrillic (ISO-8859-5)  -
    Cyrillic (Windows-1251)  -
    Greek (ISO-8859-7)  -
    Greek (Windows-1253)  -
    Turkish (ISO-8859-9)  -
    Unicode (UTF-8)  -
    Unicode (UCS-2)  -
    Unicode (UTF-7)  -
    User-Defined  -
    Western (ISO-8859-1)  -
    Western (Windows-1252)  -
    Central European (ISO-8859-2)  -
    Central European (Windows-1250)  -
    Japanese (Auto-Detect)  -
    Japanese (Shift_JIS)  -
    Japanese (EUC-JP)  -
    Japanese (ISO-2022-JP)  -
    Traditional Chinese (Big5)  -
    Traditional Chinese (EUC-TW)  -
    Simplified Chinese (GB2312)  -
    Simplified Chinese (HZ)  -
    Korean (Auto-Detect)  -
    Korean (EUC-KR)  -
    Korean (ISO-2022-KR)  -
    Cyrillic (KOI8-R)  -
    Cyrillic (ISO-8859-5)  -
    Cyrillic (Windows-1251)  -
    Greek (ISO-8859-7)  -
    Greek (Windows-1253)  -
    Turkish (ISO-8859-9)  -
    Unicode (UTF-8)  -
    Unicode (UCS-2)  -
    Unicode (UTF-7)  -
    User-Defined  -
    Western (ISO-8859-1)  -
    Western (MacRoman)  -
    Western (Windows-1252)  -
    Central European (ISO-8859-2)  -
    Central European (Windows -1250)  -
    Central European (MacCE)  -
    Japanese (Auto-Detect)  -
    Japanese (Shift_JIS)  -
    Japanese (EUC-JP)  -
    Japanese (ISO-2022-JP)  -
    Traditional Chinese (Big5)  -
    Traditional Chinese (EUC-TW)  -
    Simplified Chinese (GB2312)  -
    Simplified Chinese (HZ)  -
    Korean (Auto-Detect)  -
    Korean (EUC-KR)  -
    Korean (ISO-2022-KR)  -
    Cyrillic (KOI8-R)  -
    Cyrillic (ISO-8859-5)  -
    Cyrillic (Windows-1251)  -
    Cyrillic (MacCyrillic)  -
    Greek (ISO-8859-7)  -
    Greek (Windows-1253)  -
    Greek (MacGreek)  -
    Turkish (ISO-8859-9)  -
    Turkish (MacTurkish)  -
    Unicode (UTF-8)  -
    Unicode (UCS-2)  -
    Unicode (UTF-7)  -
    User-Defined  -
    - -
    -
    -

    -Cross-Product Encoding Names to be Transmitted

    - -
    Uppercase and lowercase are not distinct
    - -
     
    - - - - - - - - - - - - - - - - - -
    UNIXWindowsMacintosh
    Western (ISO-8859-1)  -
    Central European (ISO-8859-2)  -
    Central European (Windows-1250)  -
    Japanese (Shift_JIS)  -
    Japanese (EUC-JP)  -
    Japanese (ISO-2022-JP)  -
    Traditional Chinese (Big5)  -
    Traditional Chinese (x-EUC-TW)  -
    Simplified Chinese (GB2312)  -
    Simplified Chinese (HZ-GB-2312)  -
    Korean (EUC-KR)  -
    Korean (ISO-2022-KR)  -
    Cyrillic (KOI8-R)  -
    Cyrillic (ISO-8859-5)  -
    Cyrillic (Windows-1251)  -
    Greek (ISO-8859-7)  -
    Greek (Windows-1253)  -
    Turkish (ISO-8859-9)  -
    Unicode (UTF-8)  -
    Unicode (ISO-10646-UCS-2)  -
    Unicode (UNICODE-1-1-UTF-7)  -
    Western (ISO-8859-1)  -
    Central European (ISO-8859-2)  -
    Central European (Windows-1250)  -
    Japanese (Shift_JIS)  -
    Japanese (EUC-JP)  -
    Japanese (ISO-2022-JP)  -
    Traditional Chinese (Big5)  -
    Traditional Chinese (x-EUC-TW)  -
    Simplified Chinese (GB2312)  -
    Simplified Chinese (HZ-GB-2312)  -
    Korean (EUC-KR)  -
    Korean (ISO-2022-KR)  -
    Cyrillic (KOI8-R)  -
    Cyrillic (ISO-8859-5)  -
    Cyrillic (Windows-1251)  -
    Greek (ISO-8859-7)  -
    Greek (Windows-1253)  -
    Turkish (ISO-8859-9)  -
    Unicode (UTF-8)  -
    Unicode (ISO-10646-UCS-2)  -
    Unicode (UNICODE-1-1-UTF-7)  -
    Western (ISO-8859-1)  -
    Western (x-MacRoman)  -
    Central European (ISO-8859-2)  -
    Central European (Windows-1250)  -
    Central European (x-MacCE)  -
    Japanese (Shift_JIS)  -
    Japanese (EUC-JP)  -
    Japanese (ISO-2022-JP)  -
    Traditional Chinese (Big5)  -
    Traditional Chinese (x-EUC-TW)  -
    Simplified Chinese (GB2312)  -
    Simplified Chinese (HZ-GB-2312)  -
    Korean (EUC-KR)  -
    Korean (ISO-2022-KR)  -
    Cyrillic (KOI8-R)  -
    Cyrillic (ISO-8859-5)  -
    Cyrillic (Windows-1251)  -
    Cyrillic (x-MacCyrillic)  -
    Greek (ISO-8859-7)  -
    Greek (Windows-1253)  -
    Greek (x-MacGreek)  -
    Turkish (ISO-8859-9)  -
    Turkish (x-MacTurkish)  -
    Unicode (UTF-8)  -
    Unicode (ISO-10646-UCS-2)  -
    Unicode (UNICODE-1-1-UTF-7)  -
    -  -
     1998, Copyright -Netscape Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/xp/docs/mozilla.org/kitDownload.html b/l10nkits/client/xp/docs/mozilla.org/kitDownload.html deleted file mode 100644 index 6dee6ba1700..00000000000 --- a/l10nkits/client/xp/docs/mozilla.org/kitDownload.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - Download L10n Kits - - -Download Your Localization Kit - -

    Make your selections from the links below. If the Localization kit for -the product or operating system you need is not shown list, we aren't supporting -freely downloadable localization kits for that product or platform (yet). -Kits have been broken into separate components for faster downloads. - -

    Before downloading any localization kit, please read the License -Agreement! By downloading and using any of the information, -software or tools linked from this page, you affirm that you have read -this Agreement and agree to abide by the terms and conditions contained -therein. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Windows (NT)
    Description
    win32Kit.zip32 bit Localization Notes - version 4.03. Contains translation databases -in binary (.dbf) and text (.dog) format.
    winDocs.zipWindows Localization Kit Documentation. Contains .HTML documentation -(identical to the on-line -version).
    nstools.exeWindows Translation Tools. A self-extracting installer for ToolCool -and DogLev. Includes documentation.
    win32Bits.zip32 bit English export binaries - version 4.03. Contains the localizable -resources matching the most recent localization notes.
    Installer
    Description
    winInstDocs.zipWindows Installer Localization Kit Documentation. Contains .HTML documentation -(identical to the on-line -version).
    C32E403.EXEWindows 32 bit English export installer, complete version.
    - -

    -

    -
    - -
    - - - - - - - - - - - - - - - - - -
    ADDITIONAL INFORMATION
    Program Terms:Universal Localization -Program License
    Product Info:Overview of -Localization Kits | FAQ
    - -
    - - - -
    -
    -
    - -
    Copyright -© 1998 Netscape -Communications Corporation
    -
    - - - diff --git a/l10nkits/client/xp/docs/mozilla.org/l10nLibrary.html b/l10nkits/client/xp/docs/mozilla.org/l10nLibrary.html deleted file mode 100644 index a946b79c2ad..00000000000 --- a/l10nkits/client/xp/docs/mozilla.org/l10nLibrary.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - L10n Library - - - -

    -L10n Library

    -This is where you will find localization kit documentation on-line.  -Documentation will also be provided within the localization kits themselves.  -Theoretically, the on-line docs and the in-kit docs should be the same; -however, if there is a discrepancy, you should: -
      a) believe the in-kit docs over the on-line docs, and -
      b) inform us that there is a mismatch between the two versions.  -We'll fix it as soon as possible.
    - -
    - -

    Documentation is grouped into "pods" of related HTML pages. Select the -pod you wish to read from the links below. -
      -

    - - - - - - - - - - - - - - - - - - - - - - - - -
    Documentation PodDescription
    Windows -32 bit Front EndInstructions for localizing the client for Windows NT and Windows -'95.
    Netscape -Translation ToolsInstructions for using the freely available Netscape Translation Tools: -ToolCool and DogLev (note: DogLev docs are under -construction.)
    Windows -InstallerInstructions for localizing the Windows installer program.
    -  - - diff --git a/l10nkits/client/xp/docs/mozilla.org/l10nkitintro.html b/l10nkits/client/xp/docs/mozilla.org/l10nkitintro.html deleted file mode 100644 index ae1426ef812..00000000000 --- a/l10nkits/client/xp/docs/mozilla.org/l10nkitintro.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - universal localization kits - - - -
    -

    -they're here!

    - -
    -

    -localization kits

    - -

    -purpose

    -This page details the localization kits that are being made publicly available -as part of the universal localization program. As the program's FAQ -stated, there are two dimensions to this program: what is permitted versus -what is facilitated. Localization kits are the primary way in which the -universal localization program facilitates translation of the branded Netscape -Communicator Standard Edition and Netscape Navigator products, as well -as the Mozilla product and its derivatives. - -

    A localization kit contains the tools, instructions and resources necessary -to produce a localized version of the target software. Currently, these -kits are derived from the Netscape Communicator Standard Edition and Netscape -Navigator version 4.x products. By following the instructions in the kits, -you will be able to produce a localized client product in any supported -language. By extension, you may be able to apply the tools and information -provided in the localization kits to localize the Mozilla client. Finally, -following this model, we anticipate developers publishing their own localization -kits based on their derivatives of the mozilla.org source code. - -

    -kit contents

    -While the exact contents of each localization kit differs according to -the platform and product it is intended for, each kit is composed of the -following general pieces: -
      -
    • -The English language resources (in exportable, binary form)
    • - -
    • -Localization notes
    • - -
    • -Kit documentation
    • - -
    • -Tools
    • -
    - -
    -Resources
    - -
    -The English language resources are provided as the base for your localization -work. These resources will match the version used to generate the localization -notes. For Microsoft Windows and Apple Macintosh platforms, the English -language resources are provided as binaries. (You may also download a later -version of the product by visiting Netscape's download -pages. Be sure you only localize the export version! -Otherwise, you will not be able to legally distribute your localized product.) -Netscape's experience with localization has convinced us that localizing -resource binaries is more efficient than working on source files (at least -on Windows and Macintosh).
    - -

    -

    -Localization notes
    - -
    -Localization notes are the heart of the kits: this is where you will find -detailed information on the exact way in which particularly sensitive resources -must be handled. For example, the localization notes tell you which resources -must not be changed from their original values; they will also identify -resources that appear as HTML or Javascript, or that must match other resources -in order for the product to function properly.
    - -

    -

    -Documentation
    - -
    -The localization kit documentation is a series of HTML files which give -you an overview of the localization process, as well as generic instructions -on localizing the different data types found in the product.
    - -

    -

    -Tools
    - -
    -We have attempted to make our Localization Kits "tools agnostic," meaning -you are free to use whichever localization tools you desire to accomplish -your aims. At the same time, we have chosen to release some of our internally -developed localization tools; these are provided "as is", with no support -(but we use them daily with great success).
    - - -

    -


    -

    -next steps

    -If you have questions about the universal localization program, try the -FAQ. - -

    Read the Press -Release announcing the universal localization program. - -

    To download any of the localization kits, proceed to the -download pages. - -

    To read the localization kit documentation on-line, visit the L10n -Library. - -

    If you're looking for more information about localization, internationalization -or links to related subjects, visit the Links & Resources page. [coming -soon!] -
    -


    -
    - - - - - - - - - -
    -
    [Download]
    -
    -
    [L10n Library]
    -
    -
    [FAQ]
    -
    [Links & Resources]
    - -
    Copyright 1998, Netscape Communications Corp., All -Rights Reserved.
    - - - diff --git a/l10nkits/client/xp/docs/mozilla.org/ulpFAQ.html b/l10nkits/client/xp/docs/mozilla.org/ulpFAQ.html deleted file mode 100644 index 6158a5801ae..00000000000 --- a/l10nkits/client/xp/docs/mozilla.org/ulpFAQ.html +++ /dev/null @@ -1,375 +0,0 @@ - - - - universal localization program FAQ - - - -

    -universal localization program FAQ

    - -Last Updated: 23 Mar. 1998 3:40 pm -
    -
    - -

    -OVERVIEW

    - -

    Netscape's universal localization program furthers the goals of mozilla.org by -publishing tools and documentation to aid developers who wish to localize Mozilla. In addition, -participants in the universal localization program may freely translate the Netscape Navigator -and Netscape Communicator Standard Edition version 4.x. These localized products may be freely distributed under -the participant's branding. -

    -This document answers some frequently asked questions about the universal localization program. -

    -

      -

      -GENERAL

      - -
    1. -What is localization?
    2. - -
    3. -How does the universal localization program relate to mozilla.org?
    4. - -
    5. -How does the universal localization program relate to the unlimited distribution program?
    6. - -
    7. -What are the terms of the universal localization program's License?
    8. - -
    9. -What products may I localize?
    10. - -
    11. -Who should participate in the universal localization program?
    12. - -

      -DISTRIBUTION

      - -
    13. -Where can I distribute the localized version?
    14. - -
    15. -How much does this cost?
    16. - -
    17. -Am I allowed to use the Netscape brand, trademarks and logo?
    18. - -
    19. -Will there be any end user support from Netscape for my finished -product?
    20. - -
    21. -Am I required to give my localization back to the Net?
    22. - -
    23. -Can I download software from the general download page on -the Netscape web site and localize it?
    24. - -

      -TECHNICAL INFORMATION

      - -
    25. -What is a localization kit?
    26. - -
    27. -Why do I need a localization kit?
    28. - -
    29. -What platforms does this Program support?
    30. - -
    31. -Into what languages can I translate the software?
    32. - -
    33. -How can I get technical assistance?
    34. - -
    35. -I understand that the source code distributed by mozilla.org will not -include certain 3rd-party components, and cryptography. If I localize -Netscape Navigator 4.x, will I lose the ability to use those components?
    36. - -
    37. -Will this work for Communicator Professional Edition components?
    38. - -
    39. -What about products in France?
    40. - -
    41. -What spell checkers can I use?
    42. - -
    43. -What about installers?
    44. -
    - -
    - -
      - -

      -GENERAL

      - - -
    1. -What is Localization?
    2. - -
      Localization is the process of adapting software for a specific international market; -this process includes translating the user interface, resizing dialog boxes, replacing icons -and other culturally sensitive graphics (if necessary), customizing features (if necessary), -and testing the localized product to ensure that the program still works. - -

      -

    3. -How does the universal localization program relate to mozilla.org?
    4. - -
      The universal localization program is an extension of the philosophy -behind mozilla.org. The goal of the program is to enable developers on the -Internet to freely localize and distribute products based on the Netscape -client and on derivatives based on the mozilla.org source. mozilla.org -will host the content for this program, and provide a forum for developers -to correspond on their work. - -

      -

    5. -How does the universal localization program relate to the unlimited distribution program?
    6. - -
      Whereas the unlimited distribution program allows you to -freely distribute Netscape Navigator and Netscape Communicator -Standard Edition client binaries, and to make slight modifications to these products, -the universal localization program allows you to create localized, -independently branded versions of these products. You may then distribute these localized -products according to the terms of the License. -

      -For more information on the -unlimited distribution program, please visit -http://home.netscape.com/comprod/netscape_partner_programs/browser_distrib/index.html. - -

      -

    7. -What are the terms of the universal localization program's License?
    8. - -
      We are still working out some of the details of the License Agreement -under which this program will be administered. References to the License Agreement in -this document are, therefore, regrettably vague. We hope to have this ironed out soon. - -

      -

    9. -What products may I localize?
    10. - -
      You may localize the Netscape Navigator, Netscape Communicator Standard -Edition, or any client based on the Mozilla source code available from mozilla.org (or its -mirror sites). -Note that localizing products not directly documented in the localization -kits probably will be more difficult than localizing those that are directly documented. - - -

      -

    11. -Who should participate in the universal localization program?
    12. - -
      This program is intended for professional software localizers, localization engineers, -or others who are knowledgeable in software localization concepts and techniques. -However, if you are familiar with common tools, such as resource editors, and if you -are fluent in a particular language, you could use the tools and information provided by -this program to localize Navigator or Communicator in your language. - -

      -DISTRIBUTION

      - -

      -

    13. -Where can I distribute the localized version?
    14. - -
      The terms of the License do not change due to translation of the software: -you may distribute localized versions of the Netscape branded binaries anywhere -allowed by the export license. (A copy of this license comes with every Netscape product). -For localized Mozilla product derivatives, you may distribute them anywhere allowable under -the final free source License (whatever that turns out to be). - -

      -

    15. -How much does this cost?
    16. - -
      There is no cost to participate in the universal localization program. - -

      -

    17. -Am I allowed to use the Netscape brand, trademarks and logo?
    18. - -
      You may not use the name "Netscape" nor the "N" logo -in your localized product. However, you may use the trademarks "Navigator," -"Communicator," "Messenger," "Collabra", and the "Ship's Wheel icon". The universal -localization program License will give you the exact legal details. - -

      -

    19. -Will there be any end user support from Netscape for my finished product?
    20. - -
      No. The products derived from the mozilla.org source and Netscape binaries -are not entitled to Netscape end user support. The level of support you provide -your end users is up to you to decide. - -

      -

    21. -Am I required to give my localization back to the Net?
    22. - -
      The terms of the License are not yet set on this issue. - -

      -

    23. -Can I download software from the general download page on the Netscape -web site and localize it?
    24. - -
      Yes. You may download, localize and distribute any Netscape Navigator -and Netscape Communicator Standard Edition product. However, we may not produce a -localization kit for all versions and platforms. You may try -to use the instructions and tools in the kits we do release for these other versions -and platforms, but successful localization could be quite difficult under these circumstances. - -

      -TECHNICAL INFORMATION

      - -

      -

    25. -What is a localization kit?
    26. - -
      A localization kit contains the tools, instructions and resources necessary -to produce a localized version of a specific software product. The -detailed instructions contained in a given localization kit are usually -specific to a single platform and/or version of a product. These instructions -may, however, be broadly applicable to more than one version or platform. -Therefore, when we say a localization kit "supports" a given platform, -version or language, what we mean is that kit contains detailed instructions -that directly apply to that platform or version or language. It may -be possible to use a localization kit for one platform to successfully -localize another. On the other hand, it may be quite difficult. - -

      -

    27. -Why do I need a localization kit?
    28. - -
      The primary goal of a localization kit is to convey information about -the product being localized so that the over-translation of restricted -resources does not occur. Over-translation occurs when a resource changes -that must not be changed. It can also occur when a resource must be changed -in a particular way, but is not done so. In both cases, the product may -not function properly or may cease to function at all (e.g. crash). The -information contained in the localization kits is designed to help -avoid these situations and to help you correctly localize the product. -Attempting to translate the source files directly without such a kit could -be a frustrating and error-prone operation. - -

      -

    29. -What platforms does this program support?
    30. - -
      This question has two dimensions: what platforms are permissible versus what platforms -are made easy for me to localize onto. The first issue is addressed by the program, the second, -by the localization kits. -

      -The universal localization program allows you to create and distribute localized -products for any platform, except Caldera Linux. Netscape has an exclusive agreement -with Caldera, so this platform is off the list. -

      -Localization kits are currently planned for Windows (32 bit) and Macintosh platforms. -Windows 16 bit and Unix localization kits are not available at this time. You are welcome to -try to localize the software for any platform (except Caldera Linux), with or without the benefit of -a localization kit (but doing so without will be harder than with). - -

      -

    31. -Into what languages can I translate the software?
    32. - -
      This is the same issue as above: under the universal localization program, you are free -to localize the product into any language you desire. On the other hand, not every language -is fully supported by current (version 4.x) client software. In general, if the target language you desire -is supported by one of the encodings listed in the Navigator's View | Encoding menu, -localization into that language should be successful. This is because parts of the product's -user interface is HTML, which depends on the encoding support built into the HTML rendering -engine to display properly. -

      -You will need an operating system that also supports that language. This is because the fonts -necessary to display the standard (non-HTML) localized resources, as well as the input methods, -keyboard mappings, etc., required to input your language's characters, are provided by the -OS. -

      -Please note that at this time, Communicator does not support bidirectional languages, such -as Arabic and Hebrew, nor languages with complex scripts, such as Devanagari. Languages -with contextual line breaking algorithms, such as Thai, are also not supported (although -partial localization and display of web pages may still be possible through various means). -

      -To provide support for additional languages, you will be able modify the 5.x source -code which will be distributed by mozilla.org. - -

      -

    33. -How can I get technical assistance?
    34. - -
      There is no formal technical support; you are on your own. However, -we expect that you will find the newsgroups and mailing lists hosted on -mozilla.org to be a valuable resource. You can find the list of newsgroups -by going to the mozilla.org Community pages: - http://www.mozilla.org/community.html - -

      -

    35. -I understand that the source code distributed by mozilla.org will not -include certain 3rd-party components or cryptography. If I localize -Netscape Navigator 4.x, will I lose the ability to use those components?
    36. - -
      No. Since the localization process does not depend on having -the source code to the program available (all you are doing, really, is -changing strings in an existing executable) you will retain all of the -functionality present in the executable you started with. It will -just be in a different language. - -

      -

    37. -Will this work for Communicator Professional Edition components?
    38. - -
      No. The Professional Edition includes 3rd Party components that are -not covered by the Unlimited Distribution or NPL programs. These -components cannot be modified under this program. - -

      -

    39. -What about products in France?
    40. - -
      You are free to create French versions. However, to comply with French law, -if you distribute a product which has cryptographic -capabilities, that product must use the special encryption level for France. -Compliant versions of Communicator and Navigator are available from Netscape's -download page. The English Export version of Netscape Navigator -and Netscape Communicator Standard Edition are not authorized for import -into France. -

      -Netscape's download page can be found -here: -http://home.netscape.com/download/client_download.html - -

      -

    41. -What Spell Checkers can I use?
    42. - -
      The spell checker module built into Composer is licensed from Inso -Software. Inso permits you to bundle two spell checkers with -your product. For additional spell check dictionaries, contact Inso Corporation. -

      -Visit Inso Corp.'s web site at: http://www.inso.com/ - -

      -

    43. -What about Installers?
    44. - -
      Currently, Netscape's installer programs are built using 3rd party -modules, for which we do not have redistribution rights. Therefore, -we are not releasing a complete installer kit; however, guidelines for -creating your own installer will be available. You may use any commercially -available installer software to package your localized product and obtain -authorization for distribution directly from the provider of the installer -software.
    - - - diff --git a/l10nkits/client/xp/docs/mozilla.org/ulpLicense.html b/l10nkits/client/xp/docs/mozilla.org/ulpLicense.html deleted file mode 100644 index a704fd622db..00000000000 --- a/l10nkits/client/xp/docs/mozilla.org/ulpLicense.html +++ /dev/null @@ -1,330 +0,0 @@ - - - - Universal Localization Program License Agreement - - - -

    -Universal Localization Program License Agreement

    - -
    1.  Definitions.
    -
    -(a) "Agreement" shall mean this Universal Localization
    -Agreement.
    -
    -(b) "Netscape Products" shall mean the Netscape
    -Navigator 4.x and / or Netscape Communicator Standard
    -Edition 4.x on all platforms made generally available
    -by Netscape (excluding Linux).
    -
    -(c) "Licensee" shall mean the person or entity who may
    -avail itself of the rights granted in this Agreement by
    -agreeing to the terms and conditions set forth in this
    -Agreement.
    -
    -(d) "Localized Product" shall mean the version of the
    -Netscape Product that Licensee localizes pursuant to
    -the provisions set forth in the localization kit and
    -Section 3 of this Agreement.
    -
    -(e) "EULA" shall mean the end user license agreement
    -that is provided with the Netscape Product
    -
    -2.  License Grant.  (a) Netscape grants to Licensee,
    -subject to these terms and conditions, a nonexclusive,
    -royalty free and nontransferable right to (i) create a
    -Localized Product; (ii) reproduce the Localized Product
    -in executable code form only on any media and (iii)
    -distribute by sublicense such Localized Product copies
    -to end users, directly or through
    -distributors. Licensee may electronically distribute
    -the Localized Product, in exportable version only,
    -pursuant to the terms and conditions set forth herein.
    -
    -(b) Except as expressly permitted herein or by
    -applicable law, Licensee shall not and, shall not
    -permit any distributor or other person to,
    -re-configure, modify, decompile, reverse engineer,
    -disassemble, or otherwise determine or attempt to
    -determine source code from the Netscape Product or
    -Localized Products or to create any derivative works
    -based upon the Netscape Product or Localized Products
    -including the Netscape user interface.  If Licensee or
    -any distributor fails to comply with this Section 2(b),
    -the Agreement shall immediately terminate (in addition
    -to all other remedies it may have and except for end
    -user licenses), and all licenses granted hereunder
    -shall be revoked.
    -
    -(c) Licensee is not granted any right in this Agreement
    -to use any Netscape trademark, even if provided with
    -the Netscape Product.  A current list of Netscape’s
    -trademarks may be found at
    -http://home.netscape.com/misc/trademarks.html.
    -
    -3. Localization Requirements and Guidelines.  (a)
    -Licensee agrees to use all reasonable efforts to
    -complete the localization in accordance with the
    -following requirements: (i) the localization process
    -shall consist of Licensee translating and localizing
    -the Netscape Products, to the extent practical without
    -having access to the source code of such products; (ii)
    -Licensee may localize the EULA for the convenience of
    -the end users, however, the English language version of
    -the EULA shall be controlling in the event of any
    -inconsistency between the translated end user license
    -agreement and EULA; and (iii) Licensee must localize
    -the content behind the following links, making
    -appropriate URL changes to reflect the Maintenance and
    -Technical Support available by Licensee, How to Give
    -Feedback and How to Get Support.  For notices, updates
    -and changes to this Agreement, Licensee shall regularly
    -check the URL where this Agreement was viewed and
    -agreed to.
    -
    -(b) Licensee should use reasonable efforts to complete
    -the localization in accordance with the following
    -guidelines: (a) In the About Box of the Localized
    -Product, Licensee should identify itself as the company
    -or individual that localized the Netscape Product(s);
    -and (b) the guidelines set forth in the localization
    -kit.
    -
    -4.  Support.  Netscape shall not provide any support to
    -Licensee for the Netscape Products, Localized Products
    -or services called for by this Agreement.  Netscape
    -shall not provide any support to end users for the
    -Netscape Products or Localized Products.
    -
    -5.  Distribution.  (a) Licensee shall and shall cause
    -its distributors to comply with all then-current
    -applicable laws, regulations and other legal
    -requirements in its performance of this Agreement,
    -including without limitation, all applicable export
    -laws, rules and regulations of any agency of the
    -U.S. Government or other applicable agencies.  Licensee
    -shall ensure the inclusion of appropriate notices
    -required by the U.S. Government agencies or other
    -applicable agencies.
    -
    -(b) Licensee shall use commercially reasonable best
    -efforts to ensure that its distributors and
    -sub-distributors comply with all of the relevant terms
    -contained in this Agreement. The Localized Products
    -distributed pursuant to this Agreement must be
    -distributed with the EULA.
    -
    -(c) This is a nonexclusive relationship, and each party
    -agrees that the other may enter into similar
    -arrangements with third parties.  Licensee shall and
    -shall cause its distributors to treat all Localized
    -Products at least as favorably as it treats any
    -competitive products it distributes.
    -
    -(d) Licensee agrees to distribute documentation or
    -packaging relating to the Localized Product that shall
    -conspicuously state that, notwithstanding anything in
    -the EULA to the contrary, (i) Netscape will not supply,
    -and end users are not entitled to, any support,
    -warranty or documentation associated with the Localized
    -Product; and (ii) that Licensee is the Licensor
    -referred to in the EULA.
    -
    -(e) During the term of this Agreement, Licensee agrees
    -that each Localized Product created by Licensee must be
    -made publicly available in executable code form, free
    -of charge, for electronic delivery via a mechanism
    -generally accepted in the software development
    -community.
    -
    -6.  Proprietary Rights.  Title to and ownership of all
    -copies of the Netscape Products, including all
    -copyrights thereto, whether in machine-readable or
    -printed form, and including without limitation
    -derivative works, compilations, or collective works
    -thereof and all related technical know-how and all
    -rights therein are and shall remain the exclusive
    -property of Netscape or its suppliers.  Licensee
    -acknowledges that Netscape is the owner of the
    -Netscape, Navigator and Communicator trademarks, and
    -any trademark applications and/or registrations
    -thereto, agrees that it will do nothing inconsistent
    -with such ownership. Licensee and distributor shall not
    -take any action to jeopardize, limit or interfere in
    -any manner with Netscape’s ownership rights set
    -forth herein.  Further, Licensee or its distributors
    -shall not remove or alter any copyright or other
    -proprietary notices, legends, symbols, or labels
    -appearing on the Netscape Products and/or Localized
    -Products delivered to Licensee and Licensee shall
    -reproduce such notices on all copies of the Localized
    -Products made hereunder.
    -
    -7.  Warranty. THE NETSCAPE PRODUCTS ARE PROVIDED UNDER
    -THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT WARRANTY OF
    -ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
    -WITHOUT LIMITATION, WARRANTIES THAT THE NETSCAPE
    -PRODUCTS OR LOCALIZED PRODUCTS ARE FREE OF DEFECTS,
    -MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR
    -NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND
    -PERFORMANCE OF THE NETSCAPE PRODUCTS OR LOCALIZED
    -PRODUCTS ARE WITH LICENSEE. SHOULD A NETSCAPE PRODUCT
    -OR LOCALIZED PRODUCT PROVE DEFECTIVE IN ANY RESPECT,
    -LICENSE (NOT NETSCAPE OR ITS SUPPLIERS) ASSUME THE COST
    -OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS
    -DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF
    -THIS LICENSE. NO USE OF ANY NETSCAPE PRODUCT OR
    -LOCALIZED PRODUCT IS AUTHORIZED HEREUNDER EXCEPT UNDER
    -THIS DISCLAIMER.
    -
    -       Licensee warrants that Licensee’s performance
    -of the services called for by this Agreement and its
    -resulting work product does not and shall not violate
    -any applicable law, rule or regulation; any contracts
    -with third parties; or any third-party rights in any
    -patent, trademark, copyright, trade secret or other
    -intellectual property right.
    -
    -8.  Indemnity. Netscape shall have no obligation or
    -liability for, and Licensee shall defend, indemnify and
    -hold Netscape harmless from and against any claim
    -(including reasonable attorneys' fees and costs)
    -arising from Licensee's localization and/or
    -distribution of the Localized Products under, and/or
    -
    -compliance with the terms and conditions set forth in,
    -this Agreement.
    -
    -9.  Limitation of Liability.  (a) TO THE EXTENT ALLOWED
    -BY APPLICABLE LAW, IN NO EVENT SHALL NETSCAPE OR ITS
    -SUPPLIERS BE LIABLE (UNDER ANY LEGAL THEORY, WHETER
    -TORT, CONTRACT OR OTHERWISE) FOR ANY DAMAGES
    -WHATSOEVER, INCLUDING WITHOUT LIMITATION, ANY LOSS OF
    -PROFITS, LOSS OF BUSINESS, LOSS OF USE OR DATA,
    -INTERRUPTION OF BUSINESS, DAMAGES FOR LOSS OF GOODWILL,
    -COMPUTER FAILURE OR MALFUNCTION OR FOR DIRECT,
    -INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
    -OF ANY KIND, EVEN IF NETSCAPE HAS BEEN ADVISED OF THE
    -POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING ANY
    -FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY.
    -(b) IN NO EVENT WILL NETSCAPE OR ITS SUPPLIERS BE
    -LIABLE FOR ANY CLAIM AGAINST LICENSEE BY ANY THIRD
    -PARTY.  (c) IN NO EVENT SHALL NETSCAPE OR ITS SUPPLIERS
    -BE LIABLE FOR (I) ANY REPRESENTATION OR WARRANTY MADE
    -TO ANY THIRD PARTY BY LICENSEE, ANY DISTRIBUTOR OR
    -THEIR RESPECTIVE AGENTS; (II) FAILURE OF THE PRODUCTS
    -TO PERFORM; (III) FAILURE OF THE PRODUCTS TO PROVIDE
    -SECURITY; OR (IV) THE RESULTS OR INFORMATION OBTAINED
    -OR DECISIONS MADE BY END USERS OF THE PRODUCTS OR THE
    -DOCUMENTATION.  THIS LIMITATION OF LIABILITY IS AN
    -ESSENTIAL PART OF THE BARGAIN UNDER THIS AGREEMENT.
    -
    -10. Term and Termination.  This Agreement shall remain
    -in effect until terminated pursuant to the terms and
    -conditions set forth in this Agreement.
    -Notwithstanding anything in this Agreement to the
    -contrary, in the event Microsoft Corporation ceases to
    -distribute free of charge products with features
    -comparable to the Netscape Products, Netscape reserves
    -the right to terminate this Agreement upon 90 days
    -notice to Licensee.
    -
    -This Agreement shall be terminated: (a) automatically
    -in the event Licensee or a distributor of Licensee
    -attempts to derive the source code of the Netscape
    -Product and/or the Localized Products; or (b) upon 60
    -days prior notice by either party.  Immediately upon
    -termination or expiration hereof, all licenses granted
    -hereunder (except for validly granted end user licenses
    -for Localized Products) shall terminate, and Licensee
    -shall deliver to Netscape or destroy all copies of the
    -Localized Products and/or Netscape Products in its
    -possession or control, and shall furnish to Netscape an
    -affidavit signed by an officer of Licensee certifying
    -such delivery or destruction. Termination by either
    -party shall not act as a waiver or release of any
    -breach hereof or any liability hereunder. Sections
    -2(b), 4, 5, 6, 7, 8, 9, 10, 11 and 12 shall survive any
    -expiration or termination of this Agreement.
    -
    -11.  Notice.  Any notice required or permitted
    -hereunder shall be in English, in writing and shall be
    -deemed to be properly given by Netscape upon posting of
    -such notice to a URL which corresponds to the URL where
    -this Agreement was viewed and agreed to or where the
    -details of this program are generally made available by
    -Netscape.  Notices to Netscape shall be to the
    -attention of the Legal Department, Netscape
    -Communications Corporation, 501 East Middlefield Road,
    -Mountain View, California 94043.
    -
    -12.  Miscellaneous.  (a) Neither party’s waiver of a
    -breach or delay or omission to exercise any right or
    -remedy shall be construed as a waiver of any subsequent
    -breach or as a waiver of such right or remedy.  (b)
    -This Agreement shall be governed by and construed under
    -the laws of the State of California, U.S.A., without
    -reference to its conflicts of law provisions.  (c)
    -Unless otherwise agreed in writing, all disputes
    -relating to this Agreement (except any dispute relating
    -to intellectual property rights) shall be subject to
    -final and binding arbitration in Santa Clara County,
    -California under the auspices of JAMS/End Dispute, with
    -the losing party bearing all costs of such arbitration.
    -Notwithstanding the foregoing, Netscape reserves the
    -right to invoke the jurisdiction of any competent court
    -to remedy or prevent violation of any provision under
    -this Agreement relating to Netscape Confidential
    -Information.  (d) This Agreement will not be governed
    -by the United Nations Convention of Contracts for the
    -International Sale of Goods. (e) This Agreement creates
    -no agency, partnership, joint venture, or employment
    -relationship and neither Licensee nor its agents have
    -any authority to bind Netscape in any respect
    -whatsoever. (f) If the application of any provision
    -hereof to any particular facts shall be held to be
    -unenforceable by any competent court, then (x) the
    -enforceability of such provision as applied to any
    -other facts and the validity of other provisions hereof
    -shall not be affected and (y) such provision shall be
    -reformed without further action by the parties hereto
    -only to the extent necessary to make such provision
    -valid and enforceable when applied to the particular
    -facts.  (g) This Agreement constitutes the entire
    -agreement between the parties concerning the subject
    -matter hereof and supersedes all prior and
    -contemporaneous agreements, and communications, whether
    -oral or written, between the parties relating to the
    -subject matter of this Agreement and all past courses
    -of dealing or industry custom. (h) If Licensee has an
    -effective agreement with Netscape ("Prior Agreement")
    -covering only the distribution of the Localized
    -Products set forth herein, then this Agreement shall
    -supersede the Prior Agreement.  If any Prior Agreement
    -covers any Netscape products in addition to the
    -Localized Products, for example Netscape server
    -products, then this Agreement shall supersede only
    -those portions of the Prior Agreement covering the
    -Localized Products. (i) This Agreement is written in
    -the English language only, which language shall be
    -controlling in all respects. (j) Netscape reserves the
    -right to amend the terms contained in this Agreement
    -provided Licensee is given 30 days notice as set forth
    -in Section 11. (k) If any dispute arises under this
    -Agreement, the prevailing party shall be reimbursed by
    -the other party for any and all legal fees and costs
    -associated therewith. ((l) Les parties aux
    -présentés confirment leur volonté que cette
    -convention de même que tous les documents y compris
    -tout avis qui s'y rattaché, soient redigés en
    -langue anglaise (translation: The parties confirm that
    -this Agreement and all related documentation will be in
    -the English language").
    -
    -
    -
    -Universal Localization Agreement Rev. 032798
    - - - diff --git a/mozilla/base/Makefile b/mozilla/base/Makefile deleted file mode 100644 index def05c31f80..00000000000 --- a/mozilla/base/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = .. - -DIRS = public src tests - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/base/macbuild/base.mcp b/mozilla/base/macbuild/base.mcp deleted file mode 100644 index 188a8be7c8855d5e4fe083dbf96b908c76895d9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94410 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 diff --git a/mozilla/base/makefile.win b/mozilla/base/makefile.win deleted file mode 100644 index b7f84e8a5a2..00000000000 --- a/mozilla/base/makefile.win +++ /dev/null @@ -1,23 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=.. -IGNORE_MANIFEST=1 - -DIRS=public src tests - -include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/base/public/MANIFEST b/mozilla/base/public/MANIFEST deleted file mode 100644 index 4eb9882bdee..00000000000 --- a/mozilla/base/public/MANIFEST +++ /dev/null @@ -1,5 +0,0 @@ -# -# This is a list of local files which get copied to the mozilla:dist:base directory -# - -nsISizeOfHandler.h \ No newline at end of file diff --git a/mozilla/base/public/Makefile b/mozilla/base/public/Makefile deleted file mode 100644 index 7d4fce97311..00000000000 --- a/mozilla/base/public/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../.. - -DEFINES = -D_IMPL_NS_BASE - -EXPORTS = \ - nsISizeOfHandler.h \ - $(NULL) - -MODULE = raptor - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/base/public/makefile.win b/mozilla/base/public/makefile.win deleted file mode 100644 index 404ffd9763c..00000000000 --- a/mozilla/base/public/makefile.win +++ /dev/null @@ -1,30 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\.. -IGNORE_MANIFEST=1 - -DEFINES = -D_IMPL_NS_BASE - -EXPORTS = \ - nsISizeOfHandler.h \ - $(NULL) - -MODULE = raptor - -include <$(DEPTH)\config\rules.mak> - diff --git a/mozilla/base/public/nsISizeOfHandler.h b/mozilla/base/public/nsISizeOfHandler.h deleted file mode 100644 index af035d6db6e..00000000000 --- a/mozilla/base/public/nsISizeOfHandler.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsISizeOfHandler_h___ -#define nsISizeOfHandler_h___ - -#include "nscore.h" -#include "nsISupports.h" - -/* c028d1f0-fc9e-11d1-89e4-006008911b81 */ -#define NS_ISIZEOF_HANDLER_IID \ -{ 0xc028d1f0, 0xfc9e, 0x11d1, {0x89, 0xe4, 0x00, 0x60, 0x08, 0x91, 0x1b, 0x81}} - -/** - * An API to managing a sizeof computation of an arbitrary graph. - * The handler is responsible for remembering which objects have been - * seen before. Note that the handler doesn't hold references to - * nsISupport's objects; the assumption is that the objects being - * sized are stationary and will not be modified during the sizing - * computation and therefore do not need an extra reference count. - */ -class nsISizeOfHandler : public nsISupports { -public: - /** - * Add in a simple size value to the running total. - * Always returns NS_OK. - */ - NS_IMETHOD Add(size_t aSize) = 0; - - /** - * Update aResult with PR_TRUE if the object has been traversed - * by the sizeof computation before. Otherwise aResult is set to - * PR_FALSE and the object is added to the internal database - * of objects that have been traversed. It's ok to pass a null - * pointer in; aResult will be set to PR_TRUE so you won't accidently - * try to traverse through null pointer. - * - * Note: This violates the COM API standard on purpose; so there! - */ - virtual PRBool HaveSeen(void* anObject) = 0; - - /** - * Return the currently computed size. - * Always returns NS_OK. - */ - NS_IMETHOD GetSize(PRUint32& aResult) = 0; -}; - -extern NS_BASE nsresult -NS_NewSizeOfHandler(nsISizeOfHandler** aInstancePtrResult); - -#endif /* nsISizeofHandler_h___ */ diff --git a/mozilla/base/src/MANIFEST b/mozilla/base/src/MANIFEST deleted file mode 100644 index c26f38284ec..00000000000 --- a/mozilla/base/src/MANIFEST +++ /dev/null @@ -1,22 +0,0 @@ -# -# This is a list of local files which get copied to the mozilla:dist directory -# - -nscore.h -nsIArena.h -nsIAtom.h -nsIByteBuffer.h -nsBTree.h -nsCRT.h -nsDeque.h -nsITimer.h -nsITimerCallback.h -nsIUnicharBuffer.h -nsRBTree.h -nsIUnicharInputStream.h -nsString.h -nsVoidArray.h -nsUnitConversion.h -nsIBaseStream.h -nsIInputStream.h -nsIOutputStream.h diff --git a/mozilla/base/src/Makefile b/mozilla/base/src/Makefile deleted file mode 100644 index 788665215ce..00000000000 --- a/mozilla/base/src/Makefile +++ /dev/null @@ -1,70 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../.. - -DEFINES =-D_IMPL_NS_BASE - -DIRS = unix - -LIBRARY_NAME = raptorbase - -CPPSRCS = \ - nsArena.cpp \ - nsAtomTable.cpp \ - nsBTree.cpp \ - nsByteBuffer.cpp \ - nsCRT.cpp \ - nsDeque.cpp \ - nsRBTree.cpp \ - nsSizeOfHandler.cpp \ - nsString.cpp \ - nsUnicharBuffer.cpp \ - nsUnicharInputStream.cpp \ - nsVoidArray.cpp \ - $(NULL) - -EXPORTS = \ - nscore.h \ - nsBTree.h \ - nsCRT.h \ - nsDeque.h \ - nsIArena.h \ - nsIAtom.h \ - nsIByteBuffer.h \ - nsIBaseStream.h \ - nsIInputStream.h \ - nsIOutputStream.h \ - nsITimer.h \ - nsITimerCallback.h \ - nsIUnicharBuffer.h \ - nsIUnicharInputStream.h \ - nsRBTree.h \ - nsString.h \ - nsVoidArray.h \ - nsUnitConversion.h \ - $(NULL) - -MODULE = raptor - -REQUIRES = xpcom netlib raptor - -include $(DEPTH)/config/config.mk - -TARGET = $(LIBARY) - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/base/src/mac/nsTimerMac.cpp b/mozilla/base/src/mac/nsTimerMac.cpp deleted file mode 100644 index 829a666d962..00000000000 --- a/mozilla/base/src/mac/nsTimerMac.cpp +++ /dev/null @@ -1,283 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -// -// Mac implementation of the nsITimer interface -// - -// nsMacTimerPeriodical idles, - - -#include "nsITimer.h" -#include "nsITimerCallback.h" -#include "prlog.h" -#include -#include -#include -#include - -#pragma mark class TimerImpl -// -// TimerImpl implements nsITimer API -// -class TimerImpl : public nsITimer -{ - private: - nsTimerCallbackFunc mCallbackFunc; - nsITimerCallback * mCallbackObject; - void * mClosure; - PRUint32 mDelay; - UInt32 mFireTime; // Timer should fire when TickCount >= this number - - public: - - // constructors - - TimerImpl(); - - virtual ~TimerImpl(){}; - - NS_DECL_ISUPPORTS - - UInt32 GetFireTime() { return mFireTime; } - - void Fire(); - - // nsITimer overrides - - virtual nsresult Init(nsTimerCallbackFunc aFunc, - void *aClosure, - PRUint32 aDelay); - - virtual nsresult Init(nsITimerCallback *aCallback, - PRUint32 aDelay); - - virtual void Cancel(); - - virtual PRUint32 GetDelay(); - - virtual void SetDelay(PRUint32 aDelay); - - private: - // Calculates mFireTime too - void SetDelaySelf( PRUint32 aDelay ); -}; - -#pragma mark class TimerPeriodical -// -// TimerPeriodical is a singleton LPeriodical subclass that fires -// off TimerImpl. The firing is done on idle -// -class TimerPeriodical : public LPeriodical -{ - static TimerPeriodical * gPeriodical; - - LArray * mTimers; // List of TimerImpl * - - public: - // Returns the singleton instance - static TimerPeriodical * GetPeriodical(); - - TimerPeriodical(); - - virtual ~TimerPeriodical(); - - nsresult AddTimer( TimerImpl * aTimer); - - nsresult RemoveTimer( TimerImpl * aTimer); - - virtual void SpendTime( const EventRecord &inMacEvent); -}; - -#pragma mark class TimerImplComparator -// -// TimerImplComparator compares two TimerImpl -// -class TimerImplComparator : public LComparator -{ - virtual Int32 Compare( - const void* inItemOne, - const void* inItemTwo, - Uint32 inSizeOne, - Uint32 inSizeTwo) const; -}; - - -// -// TimerImpl implementation -// - -static NS_DEFINE_IID(kITimerIID, NS_ITIMER_IID); -NS_IMPL_ISUPPORTS(TimerImpl, kITimerIID) - -TimerImpl::TimerImpl() -{ - NS_INIT_REFCNT(); - mCallbackFunc = NULL; - mCallbackObject = NULL; - mClosure = NULL; - mDelay = 0; - mFireTime = 0; -} - -nsresult TimerImpl::Init(nsTimerCallbackFunc aFunc, - void *aClosure, - PRUint32 aDelay) -{ - mCallbackFunc = aFunc; - mClosure = aClosure; - SetDelaySelf(aDelay); - return TimerPeriodical::GetPeriodical()->AddTimer(this); -} - -nsresult TimerImpl::Init(nsITimerCallback *aCallback, - PRUint32 aDelay) -{ - mCallbackObject = aCallback; - SetDelaySelf(aDelay); - return TimerPeriodical::GetPeriodical()->AddTimer(this); -} - -void TimerImpl::Cancel() -{ - TimerPeriodical::GetPeriodical()->RemoveTimer(this); -} - -PRUint32 TimerImpl::GetDelay() -{ - return mDelay; -} - -void TimerImpl::SetDelay(PRUint32 aDelay) -{ - SetDelaySelf(aDelay); - // Make sure that timer was sorted - NS_ADDREF(this); - TimerPeriodical::GetPeriodical()->RemoveTimer(this); - TimerPeriodical::GetPeriodical()->AddTimer(this); - NS_RELEASE(this); -} - -void TimerImpl::Fire() -{ - if (mCallbackFunc != NULL) { - (*mCallbackFunc)(this, mClosure); - } - else if (mCallbackObject != NULL) { - mCallbackObject->Notify(this); // Fire the timer - } -} - -void TimerImpl::SetDelaySelf( PRUint32 aDelay ) -{ - mDelay = aDelay; - mFireTime = TickCount() + mDelay / 100 * 6; // We need mFireTime in ticks, 1/60th of a second -} - -TimerPeriodical * TimerPeriodical::gPeriodical = NULL; - -TimerPeriodical * TimerPeriodical::GetPeriodical() -{ - if (gPeriodical == NULL) - gPeriodical = new TimerPeriodical(); - return gPeriodical; -} - -TimerPeriodical::TimerPeriodical() -{ - mTimers = new LArray( sizeof(TimerImpl*)); - mTimers->SetComparator( new TimerImplComparator()); - mTimers->SetKeepSorted( true ); -} - -TimerPeriodical::~TimerPeriodical() -{ - PR_ASSERT(mTimers->GetCount() == 0); - delete mTimers; -} - -nsresult TimerPeriodical::AddTimer( TimerImpl * aTimer) -{ - try - { - NS_ADDREF(aTimer); - mTimers->AddItem( aTimer ); - StartRepeating(); - } - catch(...) - { - return NS_ERROR_UNEXPECTED; - } - return NS_OK; -} - -nsresult TimerPeriodical::RemoveTimer( TimerImpl * aTimer) -{ - mTimers->Remove( aTimer ); - NS_RELEASE( aTimer ); - if ( mTimers->GetCount() == 0 ) - StopRepeating(); - return NS_OK; -} - -// Called through every event loop -// Loops through the list of available timers, and -// fires off the available ones -void TimerPeriodical::SpendTime( const EventRecord &inMacEvent) -{ - LArrayIterator iter( *mTimers, LArrayIterator::from_Start); - TimerImpl * timer; - while (iter.Next( &timer)) - { - if ( timer->GetFireTime() <= inMacEvent.when ) - { - NS_ADDREF(timer); - RemoveTimer(timer); - timer->Fire(); - NS_RELEASE(timer); - } - else - break; // Items are sorted, so we do not need to iterate until the end - } -} - -// -// class TimerImplComparator implementation -// -Int32 TimerImplComparator::Compare( - const void* inItemOne, - const void* inItemTwo, - Uint32 inSizeOne, - Uint32 inSizeTwo) const -{ - return (( TimerImpl *) inItemOne)->GetFireTime() - (( TimerImpl *) inItemTwo)->GetFireTime(); -} - -NS_BASE nsresult NS_NewTimer(nsITimer** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - TimerImpl *timer = new TimerImpl(); - if (nsnull == timer) { - return NS_ERROR_OUT_OF_MEMORY; - } - - return timer->QueryInterface(kITimerIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/base/src/makefile.win b/mozilla/base/src/makefile.win deleted file mode 100644 index 1976497e597..00000000000 --- a/mozilla/base/src/makefile.win +++ /dev/null @@ -1,95 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\.. -IGNORE_MANIFEST=1 - -DIRS = windows - -DEFINES=-D_IMPL_NS_BASE -DWIN32_LEAN_AND_MEAN -LIBRARY_NAME=raptorbase - -CPPSRCS = \ - nsArena.cpp \ - nsAtomTable.cpp \ - nsBTree.cpp \ - nsByteBuffer.cpp \ - nsCRT.cpp \ - nsDeque.cpp \ - nsRBTree.cpp \ - nsSizeOfHandler.cpp \ - nsString.cpp \ - nsUnicharBuffer.cpp \ - nsUnicharInputStream.cpp \ - nsVoidArray.cpp \ - $(NULL) - -CPP_OBJS = \ - .\$(OBJDIR)\nsArena.obj \ - .\$(OBJDIR)\nsAtomTable.obj \ - .\$(OBJDIR)\nsBTree.obj \ - .\$(OBJDIR)\nsByteBuffer.obj \ - .\$(OBJDIR)\nsCRT.obj \ - .\$(OBJDIR)\nsDeque.obj \ - .\$(OBJDIR)\nsRBTree.obj \ - .\$(OBJDIR)\nsSizeOfHandler.obj \ - .\$(OBJDIR)\nsString.obj \ - .\$(OBJDIR)\nsUnicharBuffer.obj \ - .\$(OBJDIR)\nsUnicharInputStream.obj \ - .\$(OBJDIR)\nsVoidArray.obj \ - $(NULL) - -EXPORTS=nscore.h nsIArena.h nsIAtom.h nsIByteBuffer.h \ - nsBTree.h nsCRT.h nsDeque.h nsITimer.h \ - nsITimerCallback.h nsIUnicharBuffer.h nsRBTree.h \ - nsIUnicharInputStream.h nsString.h nsVoidArray.h \ - nsUnitConversion.h \ - nsIBaseStream.h nsIInputStream.h nsIOutputStream.h - -MODULE=raptor - -REQUIRES=xpcom netlib raptor - -LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\netlib \ - -I$(PUBLIC)\raptor - -MAKE_OBJ_TYPE = DLL -DLLNAME = raptorbase -DLL=.\$(OBJDIR)\$(DLLNAME).dll - -OBJS = $(OBJS) .\$(OBJDIR)\nsTimer.obj - -LCFLAGS = \ - $(LCFLAGS) \ - $(DEFINES) \ - $(NULL) - -# These are the libraries we need to link with to create the dll -LLIBS= \ - $(DIST)\lib\xpcom32.lib \ - $(DIST)\lib\libplc21.lib \ - $(LIBNSPR) - -include <$(DEPTH)\config\rules.mak> - -libs:: $(DLL) - $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).dll $(DIST)\bin - $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).lib $(DIST)\lib - -clobber:: - rm -f $(DIST)\bin\$(DLLNAME).dll - rm -f $(DIST)\lib\$(DLLNAME).lib diff --git a/mozilla/base/src/nsArena.cpp b/mozilla/base/src/nsArena.cpp deleted file mode 100644 index a38ef687f58..00000000000 --- a/mozilla/base/src/nsArena.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIArena.h" -#include "nsCRT.h" - -#define PL_ARENA_CONST_ALIGN_MASK 7 -#include "plarena.h" - -static NS_DEFINE_IID(kArenaIID, NS_IARENA_IID); - -// Simple arena implementation layered on plarena -class ArenaImpl : public nsIArena { -public: - ArenaImpl(PRInt32 aBlockSize); - - NS_DECL_ISUPPORTS - - virtual void* Alloc(PRInt32 aSize); - -protected: - ~ArenaImpl(); - - PLArenaPool mPool; - PRInt32 mBlockSize; -}; - -ArenaImpl::ArenaImpl(PRInt32 aBlockSize) -{ - NS_INIT_REFCNT(); - if (aBlockSize < NS_MIN_ARENA_BLOCK_SIZE) { - aBlockSize = NS_DEFAULT_ARENA_BLOCK_SIZE; - } - PL_INIT_ARENA_POOL(&mPool, "nsIArena", aBlockSize); - mBlockSize = aBlockSize; -} - -NS_IMPL_ISUPPORTS(ArenaImpl,kArenaIID) - -ArenaImpl::~ArenaImpl() -{ - PL_FinishArenaPool(&mPool); -} - -void* ArenaImpl::Alloc(PRInt32 size) -{ - // Adjust size so that it's a multiple of sizeof(double) - PRInt32 align = size & (sizeof(double) - 1); - if (0 != align) { - size += sizeof(double) - align; - } - - void* p; - PL_ARENA_ALLOCATE(p, &mPool, size); - return p; -} - -NS_BASE nsresult NS_NewHeapArena(nsIArena** aInstancePtrResult, - PRInt32 aArenaBlockSize) -{ - ArenaImpl* it = new ArenaImpl(aArenaBlockSize); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kArenaIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/base/src/nsAtomTable.cpp b/mozilla/base/src/nsAtomTable.cpp deleted file mode 100644 index 41c5de0282b..00000000000 --- a/mozilla/base/src/nsAtomTable.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIAtom.h" -#include "nsString.h" -#include "nsCRT.h" -#include "plhash.h" -#include "nsISizeOfHandler.h" - -/** - * The shared hash table for atom lookups. - */ -static nsrefcnt gAtoms; -static struct PLHashTable* gAtomHashTable; - -class AtomImpl : public nsIAtom { -public: - AtomImpl(); - ~AtomImpl(); - - NS_DECL_ISUPPORTS - - void* operator new(size_t size, const PRUnichar* us, PRInt32 uslen); - - virtual void ToString(nsString& aBuf) const; - - virtual const PRUnichar* GetUnicode() const; - - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - - // Actually more; 0 terminated. This slot is reserved for the - // terminating zero. - PRUnichar mString[1]; -}; - -AtomImpl::AtomImpl() -{ - NS_INIT_REFCNT(); - // Every live atom holds a reference on the atom hashtable - gAtoms++; -} - -AtomImpl::~AtomImpl() -{ - NS_PRECONDITION(nsnull != gAtomHashTable, "null atom hashtable"); - if (nsnull != gAtomHashTable) { - PL_HashTableRemove(gAtomHashTable, mString); - nsrefcnt cnt = --gAtoms; - if (0 == cnt) { - // When the last atom is destroyed, the atom arena is destroyed - NS_ASSERTION(0 == gAtomHashTable->nentries, "bad atom table"); - PL_HashTableDestroy(gAtomHashTable); - gAtomHashTable = nsnull; - } - } -} - -static NS_DEFINE_IID(kIAtomIID, NS_IATOM_IID); -NS_IMPL_ISUPPORTS(AtomImpl, kIAtomIID); - -void* AtomImpl::operator new(size_t size, const PRUnichar* us, PRInt32 uslen) -{ - size = size + uslen * sizeof(PRUnichar); - AtomImpl* ii = (AtomImpl*) new char[size]; - nsCRT::memcpy(ii->mString, us, uslen * sizeof(PRUnichar)); - ii->mString[uslen] = 0; - return ii; -} - -void AtomImpl::ToString(nsString& aBuf) const -{ - aBuf.SetLength(0); - aBuf.Append(mString, nsCRT::strlen(mString)); -} - -const PRUnichar* AtomImpl::GetUnicode() const -{ - return mString; -} - -NS_IMETHODIMP -AtomImpl::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this) + nsCRT::strlen(mString) * sizeof(PRUnichar)); - return NS_OK; -} - -//---------------------------------------------------------------------- - -static PLHashNumber HashKey(const PRUnichar* k) -{ - return (PLHashNumber) nsCRT::HashCode(k); -} - -static PRIntn CompareKeys(const PRUnichar* k1, const PRUnichar* k2) -{ - return nsCRT::strcmp(k1, k2) == 0; -} - -NS_BASE nsIAtom* NS_NewAtom(const char* isolatin1) -{ - nsAutoString tmp(isolatin1); - return NS_NewAtom(tmp.GetUnicode()); -} - -NS_BASE nsIAtom* NS_NewAtom(const nsString& aString) -{ - return NS_NewAtom(aString.GetUnicode()); -} - -NS_BASE nsIAtom* NS_NewAtom(const PRUnichar* us) -{ - if (nsnull == gAtomHashTable) { - gAtomHashTable = PL_NewHashTable(8, (PLHashFunction) HashKey, - (PLHashComparator) CompareKeys, - (PLHashComparator) nsnull, - nsnull, nsnull); - } - PRInt32 uslen; - PRInt32 hashCode = nsCRT::HashCode(us, &uslen); - PLHashEntry** hep = PL_HashTableRawLookup(gAtomHashTable, hashCode, us); - PLHashEntry* he = *hep; - if (nsnull != he) { - nsIAtom* id = (nsIAtom*) he->value; - NS_ADDREF(id); - return id; - } - AtomImpl* id = new(us, uslen) AtomImpl(); - PL_HashTableRawAdd(gAtomHashTable, hep, hashCode, id->mString, id); - NS_ADDREF(id); - return id; -} - -NS_BASE nsrefcnt NS_GetNumberOfAtoms(void) -{ - if (nsnull != gAtomHashTable) { - NS_PRECONDITION(nsrefcnt(gAtomHashTable->nentries) == gAtoms, "bad atom table"); - } - return gAtoms; -} diff --git a/mozilla/base/src/nsBTree.cpp b/mozilla/base/src/nsBTree.cpp deleted file mode 100644 index a771d94aaac..00000000000 --- a/mozilla/base/src/nsBTree.cpp +++ /dev/null @@ -1,403 +0,0 @@ - -/** - * This file defines the binary tree class and it - * nsNode child class. - * - * This simple version stores nodes, and the - * nodes store void* ptrs. - * - * @update gess 4/11/98 - * @param - * @return - */ - -#include "nsBTree.h" - -/** - * default constructor - * - * @update gess 4/11/98 - */ -nsNode::nsNode(){ - mLeft=0; - mRight=0; - mParent=0; - mColor=eBlack; -} - - -/** - * Copy constructor - * - * @update gess 4/11/98 - * @param - * @return - */ -nsNode::nsNode(const nsNode& aNode){ - mLeft=aNode.mLeft; - mRight=aNode.mRight; - mParent=aNode.mParent; - mColor=aNode.mColor; -} - -/** - * destructor - * - * @update gess 4/11/98 - */ -nsNode::~nsNode(){ -} - -/** - * Retrive ptr to parent node - * - * @update gess 4/11/98 - * @return ptr to parent node - */ -nsNode* nsNode::GetParentNode(void) const{ - return mParent; -} - -/** - * Retrieve ptr to left (less) node - * - * @update gess 4/11/98 - * @return ptr to left (may be NULL) - */ -nsNode* nsNode::GetLeftNode(void) const{ - return mLeft; -} - -/** - * Retrieve ptr to right (more) node - * - * @update gess 4/11/98 - * @return ptr to right node (may be NULL) - */ -nsNode* nsNode::GetRightNode(void) const{ - return mRight; -} - - -/** - * - * - * @update gess 4/11/98 - * @param - * @return - */ -nsNode& nsNode::operator=(const nsNode& aNode){ - if(this!=&aNode){ - mLeft=aNode.mLeft; - mRight=aNode.mRight; - mParent=aNode.mParent; - mColor=aNode.mColor; - } - return *this; -} - -/******************************************************** - * Here comes the BTREE class... - ********************************************************/ - -/** - * nsBTree constructor - * - * @update gess 4/11/98 - */ -nsBTree::nsBTree(){ - mRoot=0; -} - - -/** - * destructor - * - * @update gess 4/11/98 - */ -nsBTree::~nsBTree(){ - if(mRoot){ - //walk the tree and destroy the children. - } -} - -/** - * Given a node, we're supposed to add it into - * our tree. - * - * @update gess 4/11/98 - * @param aNode to be added to tree - * @return ptr to added node or NULL - */ -nsNode* nsBTree::Add(nsNode& aNode){ - PRBool result=PR_TRUE; - - nsNode* node1=mRoot; //x - nsNode* node2=0; //y - while(node1) { - node2=node1; - if(aNode<*node1) - node1=node1->mLeft; - else node1=node1->mRight; - } - aNode.mParent=node2; - if(!node2){ - mRoot=&aNode; - } - else{ - if(aNode<*node2) - node2->mLeft=&aNode; - else node2->mRight=&aNode; - } - - return &aNode; -} - - -/** - * Removes given node from tree if present. - * - * @update gess 4/11/98 - * @param aNode to be found and removed - * @return ptr to remove node, or NULL - */ -nsNode* nsBTree::Remove(nsNode& aNode){ - nsNode* result=0; - nsNode* node3=Find(aNode); - - if(node3) { - nsNode* node1; - nsNode* node2; - - if((!node3->mLeft) || (!node3->mRight)) - node2=node3; - else node2=After(*node3); - - if(node2->mLeft) - node1=node2->mLeft; - else node1=node2->mRight; - - if(node1) - node1->mParent=node2->mParent; - - if(node2->mParent) { - if(node2==node2->mParent->mLeft) - node2->mParent->mLeft=node1; - else node2->mParent->mRight=node1; - } - else mRoot=node1; - - if(node2!=node3) - (*node3)==(*node2); - - if(node2->mColor == nsNode::eBlack) - ReBalance(*node1); - - delete node2; - result=&aNode; - } - return result; -} - -/** - * Clears the tree of any data. - * Be careful here if your objects are heap based! - * This method doesn't free the objects, so if you - * don't have your own pointers, they will become - * orphaned. - * - * @update gess 4/11/98 - * @param - * @return this - */ -nsBTree& nsBTree::Empty(nsNode* aNode) { - mRoot=0; - return *this; -} - -/** - * This method destroys all the objects in the tree. - * WARNING: Never call this method on stored objects - * that are stack-based! - * - * @update gess 4/11/98 - * @param - * @return this - */ -nsBTree& nsBTree::Erase(nsNode* aNode){ - nsNode* node1 =(aNode) ? aNode : mRoot; - - if(aNode) { - Erase(aNode->mLeft); //begin by walking left side - Erase(aNode->mRight); //then search right side - delete aNode; //until a leaf, then delete - } - return *this; -} - -/** - * Retrieve ptr to first node in tree - * - * @update gess 4/11/98 - * @return - */ -nsNode* nsBTree::First(void) const{ - if(mRoot) - return First(*mRoot); - return 0; -} - -/** - * Retrive ptr to first node rel to given node - * - * @update gess 4/11/98 - * @param node to begin scan from - * @return ptr to first node from given node or NULL - */ -nsNode* nsBTree::First(const nsNode& aNode) const{ - nsNode* result=0; - - if(mRoot) { - result=mRoot; - while(result->GetLeftNode()) { - result=result->GetLeftNode(); - } - } - return result; -} - -/** - * Retrive ptr to last node - * - * @update gess 4/11/98 - * @return ptr to last node rel to root or NULL - */ -nsNode* nsBTree::Last(void) const{ - if(mRoot) - return Last(*mRoot); - return 0; -} - -/** - * Retrive ptr to last node rel to given node - * - * @update gess 4/11/98 - * @param node to begin scan from - * @return ptr to first node from given node or NULL - */ -nsNode* nsBTree::Last(const nsNode& aNode) const{ - nsNode* result=0; - - if(mRoot) { - result=mRoot; - while(result->GetRightNode()) { - result=result->GetRightNode(); - } - } - return result; -} - - -/** - * Retrive ptr to prior node rel to given node - * - * @update gess 4/11/98 - * @param node to begin scan from - * @return ptr to prior node from given node or NULL - */ -nsNode* nsBTree::Before(const nsNode& aNode) const{ - - if(aNode.GetLeftNode()) - return Last(*aNode.GetLeftNode()); - - //otherwise... - - nsNode* node1=(nsNode*)&aNode; - nsNode* node2=aNode.GetParentNode(); - - while((node2) && (node1==node2->GetLeftNode())) { - node1=node2; - node2=node2->GetParentNode(); - } - return node2; -} - - -/** - * Retrive ptr to next node rel to given node - * - * @update gess 4/11/98 - * @param node to begin scan from - * @return ptr to next node from given node or NULL - */ -nsNode* nsBTree::After(const nsNode& aNode) const{ - - if(aNode.GetRightNode()) - return First(*aNode.GetRightNode()); - - //otherwise... - - nsNode* node1=(nsNode*)&aNode; - nsNode* node2=aNode.GetParentNode(); - - while((node2) && (node1==node2->GetRightNode())) { - node1=node2; - node2=node2->GetParentNode(); - } - - return node2; -} - -/** - * Scan for given node - * - * @update gess 4/11/98 - * @param node to find - * @return ptr to given node, or NULL - */ -nsNode* nsBTree::Find(const nsNode& aNode) const{ - nsNode* result=mRoot; - - while((result) && (!(aNode==(*result)))) { - if(aNode<*result) - result=result->mLeft; - else result=result->mRight; - } - return (nsNode*)result; -} - -/** - * Rebalances tree around the given node. This only - * needs to be called after a node is deleted. - * This method does nothing for btrees, but is - * needed for RBTrees. - * - * @update gess 4/11/98 - * @param aNode -- node to balance around - * @return this - */ -nsBTree& nsBTree::ReBalance(nsNode& aNode){ - return *this; -} - - -/** - * - * - * @update gess 4/11/98 - * @param - * @return - */ -const nsBTree& nsBTree::ForEach(nsNodeFunctor& aFunctor,nsNode* aNode) const{ - nsNode* node1 =(aNode) ? aNode : mRoot; - - if(node1) { - if(node1->mLeft) - ForEach(aFunctor,node1->mLeft); //begin by walking left side - aFunctor(*node1); - if(node1->mRight) - ForEach(aFunctor,node1->mRight); //then search right side - } - return *this; -} - diff --git a/mozilla/base/src/nsBTree.h b/mozilla/base/src/nsBTree.h deleted file mode 100644 index 62b79b8b654..00000000000 --- a/mozilla/base/src/nsBTree.h +++ /dev/null @@ -1,283 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -/** - * This file defines the binary tree class and it - * nsNode child class. Note that like all nsBTree - * containers, this one does not automatically balance. - * (Find for random data, bad for pre-ordered data). - * - * This simple version stores nodes, and the - * nodes store void* ptrs. - * - * @update gess 4/11/98 - */ - - -/** - * nsNode - * - * @update gess 4/11/98 - * @param - * @return - */ - -#ifndef _BTREE_H -#define _BTREE_H - -#include "nscore.h" - -struct NS_BASE nsNode { - - /** - * - * @update gess4/20/98 - * @param - * @return - */ - nsNode(); - - /** - * Copy constructor - * @update gess 4/11/98 - */ - nsNode(const nsNode& aNode); - - /** - * destructor - * @update gess 4/11/98 - */ - virtual ~nsNode(); - - /** - * Retrieve parent node - * - * @update gess 4/11/98 - * @return - */ - nsNode* GetParentNode(void) const; - - /** - * - * @update gess 4/11/98 - * @param - * @return - */ - nsNode* GetLeftNode() const; - - /** - * - * @update gess 4/11/98 - * @param - * @return - */ - nsNode* GetRightNode() const; - - /** - * - * @update gess 4/11/98 - * @param - * @return - */ - virtual nsNode& operator=(const nsNode& aNode); - - - /** - * This method gets called to determine which of - * two nodes is less. When you create your own - * subclass of nsNode, this is the most important - * method for you to overload. - * - * @update gess 4/11/98 - * @param - * @return - */ - virtual PRBool operator<(const nsNode& aNode) const=0; - - /** - * This method gets called to determine which of - * two nodes is less. When you create your own - * subclass of nsNode, this is the most important - * method for you to overload. - * - * @update gess 4/11/98 - * @param - * @return - */ - virtual PRBool operator==(const nsNode& aNode) const=0; - - enum eRBColor {eRed,eBlack}; - - nsNode* mParent; - nsNode* mLeft; - nsNode* mRight; - eRBColor mColor; -}; - -/** - * The Nodefunctor class is used when you want to create - * callbacks between the nsRBTree and your generic code. - * - * @update gess4/20/98 - */ -class NS_BASE nsNodeFunctor { -public: - virtual nsNodeFunctor& operator()(nsNode& aNode)=0; -}; - - -/**************************************************** - * Here comes the nsBTree class... - ****************************************************/ - -class NS_BASE nsBTree { -public: -friend class nsBTreeIterator; - - nsBTree(); - ~nsBTree(); - - /** - * Add given node reference into our tree. - * - * @update gess 4/11/98 - * @param aNode is a ref to a node to be added - * @return newly added node - */ - nsNode* Add(nsNode& aNode); - - /** - * Remove given node reference into our tree. - * - * @update gess 4/11/98 - * @param aNode is a ref to a node to be removed - * @return Ptr to node if found (and removed) or NULL - */ - nsNode* Remove(nsNode& aNode); - - /** - * Clears the tree of any data. - * Be careful here if your objects are heap based! - * This method doesn't free the objects, so if you - * don't have your own pointers, they will become - * orphaned. - * - * @update gess 4/11/98 - * @param - * @return this - */ - nsBTree& Empty(nsNode* aNode=0); - - /** - * This method destroys all the objects in the tree. - * WARNING: Never call this method on stored objects - * that are stack-based! - * - * @update gess 4/11/98 - * @param - * @return this - */ - nsBTree& Erase(nsNode* aNode=0); - - /** - * Retrieve ptr to 1st node in tree (starting at root) - * - * @update gess 4/11/98 - * @return ptr to 1st node, possible to be NULL - */ - nsNode* First(void) const; - - /** - * Find first node in tree starting at given node - * - * @update gess 4/11/98 - * @param aNode node to begin 1st search from - * @return ptr to 1st node below given node - */ - nsNode* First(const nsNode& aNode) const; - - /** - * Retrieve ptr to last node in tree relative to root. - * - * @update gess 4/11/98 - * @return ptr to last node or NULL - */ - nsNode* Last(void) const; - - /** - * Retrieve ptr to last node in tree relative to given node. - * - * @update gess 4/11/98 - * @param node to find last node from - * @return ptr to last node or NULL - */ - nsNode* Last(const nsNode& aNode) const; - - /** - * Retrieve a ptr to the node that preceeds given node - * - * @update gess 4/11/98 - * @param aNode used as reference to find prev. - * @return ptr to prev node or NULL - */ - nsNode* Before(const nsNode& aNode) const; - - /** - * Retrieve a ptr to the node after given node - * - * @update gess 4/11/98 - * @param aNode used as reference to find next. - * @return ptr to next node or NULL - */ - nsNode* After(const nsNode& aNode) const; - - /** - * Find given node in tree. - * (Why would you want to find a node you already have?) - * - * @update gess 4/11/98 - * @param aNode is the node you're searching for - * @return ptr to node if found, or NULL - */ - nsNode* Find(const nsNode& aNode) const; - - /** - * Walks the tree, starting with root. - * - * @update gess 4/11/98 - */ - virtual const nsBTree& ForEach(nsNodeFunctor& aFunctor,nsNode* aNode=0) const; - -protected: - - /** - * Rebalances tree around the given node. This only - * needs to be called after a node is deleted. - * - * @update gess 4/11/98 - * @param aNode -- node to balance around - * @return this - */ - virtual nsBTree& ReBalance(nsNode& aNode); - - - nsNode* mRoot; -}; - -#endif - diff --git a/mozilla/base/src/nsByteBuffer.cpp b/mozilla/base/src/nsByteBuffer.cpp deleted file mode 100644 index a27f8cbf2c9..00000000000 --- a/mozilla/base/src/nsByteBuffer.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIByteBuffer.h" -#include "nsIInputStream.h" -#include "nsCRT.h" - -#define MIN_BUFFER_SIZE 32 - -class ByteBufferImpl : public nsIByteBuffer { -public: - ByteBufferImpl(PRInt32 aBufferSize); - ~ByteBufferImpl(); - - NS_DECL_ISUPPORTS - virtual PRInt32 GetLength() const; - virtual PRInt32 GetBufferSize() const; - virtual char* GetBuffer() const; - virtual PRBool Grow(PRInt32 aNewSize); - virtual PRInt32 Fill(PRInt32* aErrorCode, nsIInputStream* aStream, - PRInt32 aKeep); - - char* mBuffer; - PRInt32 mSpace; - PRInt32 mLength; -}; - -ByteBufferImpl::ByteBufferImpl(PRInt32 aBufferSize) -{ - if (PRUint32(aBufferSize) < MIN_BUFFER_SIZE) { - aBufferSize = MIN_BUFFER_SIZE; - } - mSpace = aBufferSize; - mBuffer = new char[aBufferSize]; - mLength = 0; - NS_INIT_REFCNT(); -} - -NS_DEFINE_IID(kByteBufferIID,NS_IBYTE_BUFFER_IID); -NS_IMPL_ISUPPORTS(ByteBufferImpl,kByteBufferIID) - -ByteBufferImpl::~ByteBufferImpl() -{ - if (nsnull != mBuffer) { - delete mBuffer; - mBuffer = nsnull; - } - mLength = 0; -} - -PRInt32 ByteBufferImpl::GetLength() const -{ - return mLength; -} - -PRInt32 ByteBufferImpl::GetBufferSize() const -{ - return mSpace; -} - -char* ByteBufferImpl::GetBuffer() const -{ - return mBuffer; -} - -PRBool ByteBufferImpl::Grow(PRInt32 aNewSize) -{ - if (PRUint32(aNewSize) < MIN_BUFFER_SIZE) { - aNewSize = MIN_BUFFER_SIZE; - } - char* newbuf = new char[aNewSize]; - if (nsnull != newbuf) { - if (0 != mLength) { - nsCRT::memcpy(newbuf, mBuffer, mLength); - } - delete mBuffer; - mBuffer = newbuf; - return PR_TRUE; - } - return PR_FALSE; -} - -PRInt32 ByteBufferImpl::Fill(PRInt32* aErrorCode, nsIInputStream* aStream, - PRInt32 aKeep) -{ - NS_PRECONDITION(nsnull != aStream, "null stream"); - NS_PRECONDITION(PRUint32(aKeep) <= PRUint32(mLength), "illegal keep count"); - if ((nsnull == aStream) || (PRUint32(aKeep) > PRUint32(mLength))) { - // whoops - *aErrorCode = NS_INPUTSTREAM_ILLEGAL_ARGS; - return -1; - } - - if (0 != aKeep) { - // Slide over kept data - nsCRT::memmove(mBuffer, mBuffer + (mLength - aKeep), aKeep); - } - - // Read in some new data - mLength = aKeep; - PRInt32 amount = mSpace - aKeep; - PRInt32 nb = aStream->Read(aErrorCode, mBuffer, aKeep, amount); - if (nb > 0) { - mLength += nb; - } - return nb; -} - -NS_BASE nsresult NS_NewByteBuffer(nsIByteBuffer** aInstancePtrResult, - nsISupports* aOuter, - PRInt32 aBufferSize) -{ - if (nsnull != aOuter) { - return NS_ERROR_NO_AGGREGATION; - } - ByteBufferImpl* it = new ByteBufferImpl(aBufferSize); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kByteBufferIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/base/src/nsCRT.cpp b/mozilla/base/src/nsCRT.cpp deleted file mode 100644 index c4ac141a2ad..00000000000 --- a/mozilla/base/src/nsCRT.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsCRT.h" - -// XXX Bug: These tables don't lowercase the upper 128 characters properly - -// This table maps uppercase characters to lower case characters; -// characters that are neither upper nor lower case are unaffected. -static const unsigned char kUpper2Lower[256] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, - - // upper band mapped to lower [A-Z] => [a-z] - 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119,120,121,122, - - 91, 92, 93, 94, 95, - 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, - 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 -}; - -static const unsigned char kLower2Upper[256] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, - - // lower band mapped to upper [a-z] => [A-Z] - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - - 123,124,125,126,127, - 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 -}; - -static const PRUnichar kIsoLatin1ToUCS2[256] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, - 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 -}; - -//---------------------------------------------------------------------- - -#define TOLOWER(_ucs2) \ - (((_ucs2) < 256) ? PRUnichar(kUpper2Lower[_ucs2]) : _ToLower(_ucs2)) - -#define TOUPPER(_ucs2) \ - (((_ucs2) < 256) ? PRUnichar(kLower2Upper[_ucs2]) : _ToUpper(_ucs2)) - -static PRUnichar _ToLower(PRUnichar aChar) -{ - // XXX need i18n code here - return aChar; -} - -static PRUnichar _ToUpper(PRUnichar aChar) -{ - // XXX need i18n code here - return aChar; -} - -//---------------------------------------------------------------------- - -PRUnichar nsCRT::ToUpper(PRUnichar aChar) -{ - return TOUPPER(aChar); -} - -PRUnichar nsCRT::ToLower(PRUnichar aChar) -{ - return TOLOWER(aChar); -} - -PRInt32 nsCRT::strlen(const PRUnichar* s) -{ - PRInt32 len = 0; - while (*s++ != 0) { - len++; - } - return len; -} - -PRInt32 nsCRT::strcmp(const PRUnichar* s1, const PRUnichar* s2) -{ - for (;;) { - PRUnichar c1 = *s1++; - PRUnichar c2 = *s2++; - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - if (c1 == 0) break; - } - return 0; -} - -// characters following a null character are not compared -PRInt32 nsCRT::strncmp(const PRUnichar* s1, const PRUnichar* s2, PRInt32 n) -{ - while (--n >= 0) { - PRUnichar c1 = *s1++; - PRUnichar c2 = *s2++; - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strcasecmp(const PRUnichar* s1, const PRUnichar* s2) -{ - for (;;) { - PRUnichar c1 = *s1++; - PRUnichar c2 = *s2++; - if (c1 != c2) { - c1 = TOLOWER(c1); - c2 = TOLOWER(c2); - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strncasecmp(const PRUnichar* s1, const PRUnichar* s2, PRInt32 n) -{ - while (--n >= 0) { - PRUnichar c1 = *s1++; - PRUnichar c2 = *s2++; - if (c1 != c2) { - c1 = TOLOWER(c1); - c2 = TOLOWER(c2); - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strcmp(const PRUnichar* s1, const char* s2) -{ - for (;;) { - PRUnichar c1 = *s1++; - PRUnichar c2 = kIsoLatin1ToUCS2[*(const unsigned char*)s2++]; - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strncmp(const PRUnichar* s1, const char* s2, PRInt32 n) -{ - while (--n >= 0) { - PRUnichar c1 = *s1++; - PRUnichar c2 = kIsoLatin1ToUCS2[*(const unsigned char*)s2++]; - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strcasecmp(const PRUnichar* s1, const char* s2) -{ - for (;;) { - PRUnichar c1 = *s1++; - PRUnichar c2 = kIsoLatin1ToUCS2[*(const unsigned char*)s2++]; - if (c1 != c2) { - c1 = TOLOWER(c1); - c2 = TOLOWER(c2); - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strncasecmp(const PRUnichar* s1, const char* s2, PRInt32 n) -{ - while (--n >= 0) { - PRUnichar c1 = *s1++; - PRUnichar c2 = kIsoLatin1ToUCS2[*(const unsigned char*)s2++]; - if (c1 != c2) { - c1 = TOLOWER(c1); - c2 = TOLOWER(c2); - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::HashCode(const PRUnichar* us) -{ - PRInt32 rv = 0; - PRUnichar ch; - while ((ch = *us++) != 0) { - // FYI: rv = rv*37 + ch - rv = ((rv << 5) + (rv << 2) + rv) + ch; - } - return rv; -} - -PRInt32 nsCRT::HashCode(const PRUnichar* us, PRInt32* uslenp) -{ - PRInt32 rv = 0; - PRInt32 len = 0; - PRUnichar ch; - while ((ch = *us++) != 0) { - // FYI: rv = rv*37 + ch - rv = ((rv << 5) + (rv << 2) + rv) + ch; - len++; - } - *uslenp = len; - return rv; -} - -PRInt32 nsCRT::atoi( const PRUnichar *string ) -{ - return atoi(string); -} - diff --git a/mozilla/base/src/nsCRT.h b/mozilla/base/src/nsCRT.h deleted file mode 100644 index 0161c67e129..00000000000 --- a/mozilla/base/src/nsCRT.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsCRT_h___ -#define nsCRT_h___ - -#include -#include -#include "plstr.h" -#include "nscore.h" - -/// This is a wrapper class around all the C runtime functions. - -class NS_BASE nsCRT { -public: - /** Copy bytes from aSrc to aDest. - @param aDest the destination address - @param aSrc the source address - @param aCount the number of bytes to copy - */ - static void memcpy(void* aDest, const void* aSrc, PRInt32 aCount) { - ::memcpy(aDest, aSrc, (size_t)aCount); - } - - static void memmove(void* aDest, const void* aSrc, PRInt32 aCount) { - ::memmove(aDest, aSrc, (size_t)aCount); - } - - static void memset(void* aDest, PRUint8 aByte, PRInt32 aCount) { - ::memset(aDest, aByte, aCount); - } - - static void zero(void* aDest, PRInt32 aCount) { - ::memset(aDest, 0, (size_t)aCount); - } - - /** Compute the string length of s - @param s the string in question - @return the length of s - */ - static PRInt32 strlen(const char* s) { - return PRInt32(::strlen(s)); - } - - /// Compare s1 and s2. - static PRInt32 strcmp(const char* s1, const char* s2) { - return PRInt32(PL_strcmp(s1, s2)); - } - - /// Case-insensitive string comparison. - static PRInt32 strcasecmp(const char* s1, const char* s2) { - return PRInt32(PL_strcasecmp(s1, s2)); - } - - /// Case-insensitive string comparison with length - static PRInt32 strncasecmp(const char* s1, const char* s2, PRInt32 aMaxLen) { - return PRInt32(PL_strncasecmp(s1, s2, aMaxLen)); - } - - /// Like strlen except for ucs2 strings - static PRInt32 strlen(const PRUnichar* s); - - /// Like strcmp except for ucs2 strings - static PRInt32 strcmp(const PRUnichar* s1, const PRUnichar* s2); - /// Like strcmp except for ucs2 strings - static PRInt32 strncmp(const PRUnichar* s1, const PRUnichar* s2, - PRInt32 aMaxLen); - - /// Like strcasecmp except for ucs2 strings - static PRInt32 strcasecmp(const PRUnichar* s1, const PRUnichar* s2); - /// Like strncasecmp except for ucs2 strings - static PRInt32 strncasecmp(const PRUnichar* s1, const PRUnichar* s2, - PRInt32 aMaxLen); - - /// Like strcmp with a char* and a ucs2 string - static PRInt32 strcmp(const PRUnichar* s1, const char* s2); - /// Like strncmp with a char* and a ucs2 string - static PRInt32 strncmp(const PRUnichar* s1, const char* s2, - PRInt32 aMaxLen); - - /// Like strcasecmp with a char* and a ucs2 string - static PRInt32 strcasecmp(const PRUnichar* s1, const char* s2); - /// Like strncasecmp with a char* and a ucs2 string - static PRInt32 strncasecmp(const PRUnichar* s1, const char* s2, - PRInt32 aMaxLen); - - /// Compute a hashcode for a ucs2 string - static PRInt32 HashCode(const PRUnichar* s1); - - /// Same as above except that we return the length in s1len - static PRInt32 HashCode(const PRUnichar* s1, PRInt32* s1len); - - /// String to integer. - static PRInt32 atoi( const PRUnichar *string ); - - static PRUnichar ToUpper(PRUnichar aChar); - - static PRUnichar ToLower(PRUnichar aChar); -}; - -#endif /* nsCRT_h___ */ diff --git a/mozilla/base/src/nsDeque.cpp b/mozilla/base/src/nsDeque.cpp deleted file mode 100644 index c221ec9aaf3..00000000000 --- a/mozilla/base/src/nsDeque.cpp +++ /dev/null @@ -1,433 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - - -#include "nsDeque.h" -#include "nsCRT.h" - -/** - * Standard constructor - * @update gess4/18/98 - * @return new deque - */ -nsDeque::nsDeque(nsDequeFunctor& aMemDestroyer) : mMemDestroyer(aMemDestroyer) { - mMemDestroyer=aMemDestroyer; - mCapacity=eGrowthDelta; - mOrigin=mSize=0; - mData=new void*[mCapacity]; -} - - -/** - * Destructor - * @update gess4/18/98 - */ -nsDeque::~nsDeque() { - Erase(); - delete [] mData; - mData=0; -} - - -/** - * Returns the number of elements currently stored in - * this deque. - * - * @update gess4/18/98 - * @param - * @return int contains element count - */ -PRInt32 nsDeque::GetSize(void) const { - return mSize; -} - -/** - * Remove all items from container without destroying them. - * - * @update gess4/18/98 - * @param - * @return - */ -nsDeque& nsDeque::Empty() { - nsCRT::zero(mData,mCapacity*sizeof(mData)); - mSize=0; - mOrigin=0; - return *this; -} - -/** - * Remove and delete all items from container - * - * @update gess4/18/98 - * @return this - */ -nsDeque& nsDeque::Erase() { - ForEach(mMemDestroyer); - return Empty(); -} - - -/** - * This method adds an item to the end of the queue. - * This operation has the potential to cause the - * underlying buffer to resize. - * - * @update gess4/18/98 - * @param anItem: new item to be added to queue - * @return nada - */ -nsDeque& nsDeque::Push(void* anItem) { - if(mSize==mCapacity) { - void** temp=new void*[mCapacity+eGrowthDelta]; - - //Here's the interesting part: You can't just move the elements - //directy (in situ) from the old buffer to the new one. - //Since capacity has changed, the old origin doesn't make - //sense anymore. It's better to resequence the elements now. - - int tempi=0; - int i=0; - int j=0; - for(i=mOrigin;i0) { - result=mData[mOrigin]; - mData[mOrigin++]=0; //zero it out for debugging purposes. - mSize--; - if(0==mSize) - mOrigin=0; - } - return result; -} - -/** - * Remove and return the last item in the container. - * - * @update gess4/18/98 - * @param none - * @return ptr to last item in container - */ -void* nsDeque::PopBack(void) { - void* result=0; - if(mSize>0) { - int offset=mOrigin+mSize; - if(offset>=mCapacity) - offset-=mCapacity; - result=mData[offset-1]; - mData[offset-1]=0; - mSize--; - if(0==mSize) - mOrigin=0; - } - return result; -} - -/** - * Call this to retrieve the ith element from this container. - * Keep in mind that accessing the underlying elements is - * done in a relative fashion. Object 0 is not necessarily - * the first element (the first element is at mOrigin). - * - * @update gess4/18/98 - * @param anIndex : 0 relative offset of item you want - * @return void* or null - */ -void* nsDeque::ObjectAt(PRInt32 anIndex) const { - void* result=0; - - if((anIndex>=0) && (anIndexoperator==(anIter)); -} - - -/** - * Compare 2 iterators for equivalence. - * - * @update gess4/18/98 - * @param anIter is the other iterator to be compared to - * @return TRUE if EQUAL - */ -PRBool nsDequeIterator::operator<(nsDequeIterator& anIter) { - return PRBool(((mIndex=(nsDequeIterator& anIter) { - return PRBool(((mIndex>=anIter.mIndex) && (&mDeque==&anIter.mDeque))); -} - -/** - * Pre-increment operator - * - * @update gess4/18/98 - * @return object at preincremented index - */ -void* nsDequeIterator::operator++() { - return mDeque.ObjectAt(++mIndex); -} - -/** - * Post-increment operator - * - * @update gess4/18/98 - * @param param is ignored - * @return object at post-incremented index - */ -void* nsDequeIterator::operator++(int) { - return mDeque.ObjectAt(mIndex++); -} - -/** - * Pre-decrement operator - * - * @update gess4/18/98 - * @return object at pre-decremented index - */ -void* nsDequeIterator::operator--() { - return mDeque.ObjectAt(--mIndex); -} - -/** - * Post-decrement operator - * - * @update gess4/18/98 - * @param param is ignored - * @return object at post-decremented index - */ -void* nsDequeIterator::operator--(int) { - return mDeque.ObjectAt(mIndex--); -} - -/** - * Dereference operator - * - * @update gess4/18/98 - * @return object at ith index - */ -void* nsDequeIterator::GetCurrent(void) { - return mDeque.ObjectAt(mIndex); -} - -/** - * Call this method when you wanto to iterate all the - * members of the container, passing a functor along - * to call your code. - * - * @update gess4/20/98 - * @param aFunctor object to call for each member - * @return *this - */ -const void* nsDequeIterator::ForEach(nsDequeFunctor& aFunctor) const{ - return mDeque.ForEach(aFunctor); -} - - -/** - * conduct automated self test for this class - * - * @update gess4/18/98 - * @param - * @return - */ -void nsDeque::SelfTest(void) { -#undef _SELFTEST_DEQUE -#ifdef _SELFTEST_DEQUE -#include - - { - nsDeque theDeque(PR_FALSE); //construct a simple one... - - int ints[10]={100,200,300,400,500,600,700,800,900,1000}; - int count=sizeof(ints)/sizeof(int); - - int i=0; - for(i=0;i
    -Broken tags are shown, only if no gt sign can be found.
    -
    -
    -ccccccc
    -
    \ No newline at end of file
    diff --git a/mozilla/htmlparser/tests/html/pre015.html b/mozilla/htmlparser/tests/html/pre015.html
    deleted file mode 100644
    index f07de01c753..00000000000
    --- a/mozilla/htmlparser/tests/html/pre015.html
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -The following is copied from test tag005.html
    -first line -
    empty brakets are displayed as text -This -and this eat next br tag. -and another one. -Last text. -
    Now wrapped with a PRE tag. -
    -first line
    -
    empty brakets are displayed as text -This -and this eat next br tag. -and another one. -Last text. -
    \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/pre016.html b/mozilla/htmlparser/tests/html/pre016.html deleted file mode 100644 index cfd595dce40..00000000000 --- a/mozilla/htmlparser/tests/html/pre016.html +++ /dev/null @@ -1,17 +0,0 @@ -The following is copied from test tag006.html
    -first line -
    invalide tags are ignored by 4.0 - - - -Note: no line break here. - -
    Now wrapped with a PRE tag. -
    -first line
    -
    invalide tags are ignored by 4.0 -
    - - -Note: no line break here. - \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/q001.html b/mozilla/htmlparser/tests/html/q001.html deleted file mode 100644 index e7cd998188b..00000000000 --- a/mozilla/htmlparser/tests/html/q001.html +++ /dev/null @@ -1,18 +0,0 @@ - - -test BLOCKQUOTE and Q tag - - -test BLOCKQUOTE and Q tag
    -1normal text in body line 1. -
    -A This text is in blockquote -
    B line 2 -
    -2normal text in body line 2. - -this text is in Q tag - -3normal text in body line 3. - - diff --git a/mozilla/htmlparser/tests/html/quote001.html b/mozilla/htmlparser/tests/html/quote001.html deleted file mode 100644 index 6b591b9193c..00000000000 --- a/mozilla/htmlparser/tests/html/quote001.html +++ /dev/null @@ -1,51 +0,0 @@ - - - HTML test for quoted string - - - - This was created on 9/12/97, for Xena bug # 85121 -
    Testing the quoted value string. -
    tag A is used so you can check the string by moving mouse on the link. -
    use view source or text editor to compare with browser display. - -
    The goal is to be compatible with Navigator 4.0 -
    Test results are compared with Nav4.0 display. Relavent Nav4.0 source - files are ns\lib\libparse\pa_parse.c and others. -
    Differences between 4.0 and xena are indecated. Search for XENA60 - to find all the defferences. - -

    comments from ns\xena\lego\src\lego\html\scanner\HTMLScanner.java: -
    // For quoted value string : -
    // Double/single quote only take effect as the first char -
    // of the value string, -
    // Quoted string is terminated by the second double/single quote -
    // respectively. -
    // In other places, double/single quote is treated literally. -
    // Entity & quot; is always treated literally, enven it is the -
    // first char. -
    // -
    // Unquoted value string is terminated by while space, or '>' sign. -

    - - Test lines: - -
    10(quote / quote ) good syntax: both quotes striped from string -
    20( / ) value not quoted, not recommented, but still good syntax. -
    30 - Navigator 4.0 value string trunketed at 82 characters XENA60 limit is MAX_STRING_LENGTH = 2000. - -
    40 The following are illegal HTML, but handled by Nav4.0 in different ways. -
    50( / ) string not quoted, whight space terminates the value -
    60( / ) string not quoted, CR terminates the string -
    70(escaped-quote / quote ) both quotes remain in string -
    80(quote / ) - move mouse on this. If we didn't have a quote in the text, the value string would - run through the end of the A tag. -
    90(quote / escaped-quote ) same as above, escaped quote does NOT terminate quote -
    100( / quote) if no opening quote, quotes are included in string -
    110( / quote) no opening quote, value terminated at right brack - - - diff --git a/mozilla/htmlparser/tests/html/quote002.html b/mozilla/htmlparser/tests/html/quote002.html deleted file mode 100644 index 2873a8c8fe8..00000000000 --- a/mozilla/htmlparser/tests/html/quote002.html +++ /dev/null @@ -1,33 +0,0 @@ - - - HTML test for quoted string - - - - This was created on 9/15/97, for Xena bug # 85121 -
    Testing the quoted value string. -
    tag A is used so you can check the string by moving mouse on the link. -
    use view source or text editor to compare with browser display. -
    10 2 quoted string stick together -
    20 2 quoted string seperated by space -
    30 Navigator doesn't support nested quote. -
    40 quoted string can have escaped quote. -
    50 unquoted string can have escaped quote. -
    60 unquoted string can have other entities. -
    70 entity missing ';', ended by > -
    80 entity missing ';', not treated as entity inside a value word. -
    90 ending entity with a space, missing ';', value terminated. -
    100 ending entity with a '=', missing ';', value not terminated. -
    110 unquoted script is treated as text. -
    120 Navigator 4.0 does not support script - entity in quoted string. - - -
    130 this is fisrt quote " and second quote " in text area. -
    140 this is fisrt escaped-quote " and second escaped-quote " in text area. - -
    -
    In the following test line, quote is the last char in the html file. -
    Navigator 4.0 displace the line as text. -
    XENA60 appends a closing quote and display it as link with empty href="". -
    150 - - - -Test SPAN001 - - - - -

    -In HTML standard, SPANs are not allowed to cross Paragraphs. -
    In Vav4.0, SPAN tags go thour paragraphs and other block-level elements, -except tbles. -
    It be compatable with Nav4.0 and HTML standard, HTMLParser -close all SPANs before open a new paragraph, and reopen SPANs -inside the new paragraph -
    - - - Text ater the color=red SPAN is opend. -

    - Text in a new paragraph. -

    -

    - Text after the new paragrapg is closed, still in color=red SPAN. - -
    -Text ater the color=red SPAN is closed. - - diff --git a/mozilla/htmlparser/tests/html/span002.html b/mozilla/htmlparser/tests/html/span002.html deleted file mode 100644 index 5f3c497ff84..00000000000 --- a/mozilla/htmlparser/tests/html/span002.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -Test SPAN001 - - - - -Normal text - -Text after the color=red SPAN is opend. -

    - Text in a new paragraph. -

    - Text after the new paragrapg is closed, still in color=red SPAN. - -Text ater the color=red SPAN is closed. -
    another line. - - diff --git a/mozilla/htmlparser/tests/html/span003.html b/mozilla/htmlparser/tests/html/span003.html deleted file mode 100644 index c4ea303d8c9..00000000000 --- a/mozilla/htmlparser/tests/html/span003.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - -Test SPAN001 - - - - -

    - - bold - italic - B closed(but actualy it closed the last span tag, which is I tag. - I closed - - diff --git a/mozilla/htmlparser/tests/html/strike002.html b/mozilla/htmlparser/tests/html/strike002.html deleted file mode 100644 index 65d505d595a..00000000000 --- a/mozilla/htmlparser/tests/html/strike002.html +++ /dev/null @@ -1,17 +0,0 @@ - - -Nested STRIKE - - -nested STRIKE
    -1normal text in body line 1. - -A This text is in STRIKE - -
    B line 2 in STRIKE -
    -C line 3 in STRIKE -
    -2normal text in body line 2. - - diff --git a/mozilla/htmlparser/tests/html/strike005.html b/mozilla/htmlparser/tests/html/strike005.html deleted file mode 100644 index 4040627aca8..00000000000 --- a/mozilla/htmlparser/tests/html/strike005.html +++ /dev/null @@ -1,22 +0,0 @@ - - -strikeover a whole TABLE - - -strikeover a whole TABLE, no visual effect, no strikeover on text in table
    -1normal text in body line 1. - -text with strikeover -

    - - -
    This is the first cell in the table - This is the second cell in the table -
    This is the third cell in the table - This is the fourth cell in the table -
    -text still inside strikeover. - -2normal text in body line 2. - - diff --git a/mozilla/htmlparser/tests/html/strike006.html b/mozilla/htmlparser/tests/html/strike006.html deleted file mode 100644 index 979198c12b3..00000000000 --- a/mozilla/htmlparser/tests/html/strike006.html +++ /dev/null @@ -1,18 +0,0 @@ - - -strikeover in a table cell TD - - -strikeover in a table cell TD
    -1normal text in body line 1. - - - -
    This is the first cell in the table - This is strikeover -
    This is the third cell in the table - This is the fourth cell in the table -
    -2normal text in body line 2. - - diff --git a/mozilla/htmlparser/tests/html/strike007.html b/mozilla/htmlparser/tests/html/strike007.html deleted file mode 100644 index eaa80db9961..00000000000 --- a/mozilla/htmlparser/tests/html/strike007.html +++ /dev/null @@ -1,20 +0,0 @@ - - -strikeover a whole table cell TD - - -strikeover a whole table cell TD -1normal text in body line 1. - - - - - -
    This is the first cell in the table - - This cell is in strikeover
    This is the third cell in the table - This is the fourth cell in the table -
    -2normal text in body line 2. - - diff --git a/mozilla/htmlparser/tests/html/strike008.html b/mozilla/htmlparser/tests/html/strike008.html deleted file mode 100644 index cc95b6ebf47..00000000000 --- a/mozilla/htmlparser/tests/html/strike008.html +++ /dev/null @@ -1,26 +0,0 @@ - - -strikeover cross scope with a table - - -

    strikeover cross scope with a table
    -It starts before table, but ends inside table. -
    It does not effect the table, but the strikeover is terminated after the table. -
    1normal text in body line 1. - -text in strikeover. - - - - - -
    This is the first cell in the table - This cell 2
    This is the third cell in the table - This is the fourth cell in the table -
    -

    -text not in strikeover - -
    2normal text in body line 2. - - diff --git a/mozilla/htmlparser/tests/html/table05a.html b/mozilla/htmlparser/tests/html/table05a.html deleted file mode 100644 index a6df8ca395e..00000000000 --- a/mozilla/htmlparser/tests/html/table05a.html +++ /dev/null @@ -1,14 +0,0 @@ -Caption before end of table -
    Nav 4.0: caption is accepted. (terminate tr) -
    Xena6.0: ignore misplaced caption tag. - - - - - -
    cell 1-1 - cell 1-2 -
    cell 2-1 - cell 2-2
    caption1
    - -last text diff --git a/mozilla/htmlparser/tests/html/table05b.html b/mozilla/htmlparser/tests/html/table05b.html deleted file mode 100644 index e05836f3ee2..00000000000 --- a/mozilla/htmlparser/tests/html/table05b.html +++ /dev/null @@ -1,14 +0,0 @@ -Caption after tr. -
    Nav 4.0: caption is accepted, terminate an empty tr, -
    Xena6.0: ignore misplaced caption tag. - - - taxeA - -
    caption1
    cell 1-1 - cell 1-2 -
    cell 2-1 - cell 2-2 -
    - -last text diff --git a/mozilla/htmlparser/tests/html/table05c.html b/mozilla/htmlparser/tests/html/table05c.html deleted file mode 100644 index 1b55afcc3a5..00000000000 --- a/mozilla/htmlparser/tests/html/table05c.html +++ /dev/null @@ -1,14 +0,0 @@ -Caption between table cell -
    Nav 4.0: caption is accepted, terminate tr, -
    Xena6.0: ignore misplaced caption tag. - - - - textA - -
    cell 1-1
    caption1
    cell 1-2 -
    cell 2-1 - cell2-2 -
    - -last text diff --git a/mozilla/htmlparser/tests/html/table05d.html b/mozilla/htmlparser/tests/html/table05d.html deleted file mode 100644 index 3144e70f146..00000000000 --- a/mozilla/htmlparser/tests/html/table05d.html +++ /dev/null @@ -1,13 +0,0 @@ -Caption inside cell -
    Nav 4.0: caption is accepted, terminates both td and tr. -
    Xena6.0: ignore misplaced caption tag. - - - textA - -
    cell 1-1
    caption1
    cell 1-2 -
    cell 2-1 - cell 2-2 -
    - -last text diff --git a/mozilla/htmlparser/tests/html/table05k.html b/mozilla/htmlparser/tests/html/table05k.html deleted file mode 100644 index d05228d0811..00000000000 --- a/mozilla/htmlparser/tests/html/table05k.html +++ /dev/null @@ -1,19 +0,0 @@ -Table in caption works. - - - -
    caption1
    text1 text2 - - - -
    cell 1-1 - cell 1-2 -
    still in - caption -
    -
    cell 2-1-1 - cell 2-1-2 -
    cell 2-2-1 -
    - -last text diff --git a/mozilla/htmlparser/tests/html/table05l.html b/mozilla/htmlparser/tests/html/table05l.html deleted file mode 100644 index c7dbd30c4e9..00000000000 --- a/mozilla/htmlparser/tests/html/table05l.html +++ /dev/null @@ -1,14 +0,0 @@ -Table in caption, and Nav4.0 show blank page if the window is wide. -Table in caption is part of the caption, leave the table body empty. - - - -
    caption1
    text1 text2 - - - -
    cell 1-1 - cell 1-2 -
    cell 2-1 - cell 2-2 -
    - -Nev. 4.0 ignore empty tables. \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/table05m.html b/mozilla/htmlparser/tests/html/table05m.html deleted file mode 100644 index 18c01e22dfa..00000000000 --- a/mozilla/htmlparser/tests/html/table05m.html +++ /dev/null @@ -1,5 +0,0 @@ -Start table tag alone is ignored. - - - -last text diff --git a/mozilla/htmlparser/tests/html/table05n.html b/mozilla/htmlparser/tests/html/table05n.html deleted file mode 100644 index 83aede59060..00000000000 --- a/mozilla/htmlparser/tests/html/table05n.html +++ /dev/null @@ -1,11 +0,0 @@ -End table tag terminates caption and table. -
    -
    caption1
    text1 text2 -
    -
    cell1 -
    cell2 -
    - -last text diff --git a/mozilla/htmlparser/tests/html/table05o.html b/mozilla/htmlparser/tests/html/table05o.html deleted file mode 100644 index 34fa22e5fd1..00000000000 --- a/mozilla/htmlparser/tests/html/table05o.html +++ /dev/null @@ -1,6 +0,0 @@ -caption is not shown for empty table. - - -
    caption1
    text1 text2
    - -last text diff --git a/mozilla/htmlparser/tests/html/table07.html b/mozilla/htmlparser/tests/html/table07.html deleted file mode 100644 index 64a0edfbe9c..00000000000 --- a/mozilla/htmlparser/tests/html/table07.html +++ /dev/null @@ -1,13 +0,0 @@ -text1 - text2 - - - -
    cell 1-1 - cell 1-2 -
    still in - caption -
    -text3 -
    -last text diff --git a/mozilla/htmlparser/tests/html/table200.html b/mozilla/htmlparser/tests/html/table200.html deleted file mode 100644 index e43c788bf7b..00000000000 --- a/mozilla/htmlparser/tests/html/table200.html +++ /dev/null @@ -1,21 +0,0 @@ -Table in table, but not in tr-td. -
    the outter table is ignored. - - -
    - - - -
    caption of table1.
    first cell in table1 - second cell in table1 -
    third cell in table1 - fourth cell in table1 -
    - -This is the first cell in table2. - - -NOTE, even no line break here! -
    -Caption of outer table is ignored. -Data of outer table is treated as text. \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/table201.html b/mozilla/htmlparser/tests/html/table201.html deleted file mode 100644 index 62e9665d5e8..00000000000 --- a/mozilla/htmlparser/tests/html/table201.html +++ /dev/null @@ -1,22 +0,0 @@ -Table in table, but not in tr-td. -
    the outter table is ignored. - - - -
    caption of table2.
    - - - -
    caption of table1.
    first cell in table1 - second cell in table1 -
    third cell in table1 - fourth cell in table1 -
    - -This is the first cell in table2. - - -NOTE, even no line break here! -
    -Caption of outer table is ignored. -Data of outer table is treated as text. \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/table202.html b/mozilla/htmlparser/tests/html/table202.html deleted file mode 100644 index 5f5c81afdcf..00000000000 --- a/mozilla/htmlparser/tests/html/table202.html +++ /dev/null @@ -1,23 +0,0 @@ -Table in table, after tr, but not td. -
    the outter table and tr are ignored. - - - - -
    caption of table2.
    - - - -
    caption of table1.
    first cell in table1 - second cell in table1 -
    third cell in table1 - fourth cell in table1 -
    - -This is the first cell in table2. - - -NOTE, even no line break here! -
    -Caption of outer table is ignored. -Data of outer table is treated as text. \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/table203.html b/mozilla/htmlparser/tests/html/table203.html deleted file mode 100644 index 8d0075d53ef..00000000000 --- a/mozilla/htmlparser/tests/html/table203.html +++ /dev/null @@ -1,29 +0,0 @@ -Table nested 3 levels, table3 be the out most. -
    Table 1 is not in table2's tr-td. That makes table2 invalid. -
    Table3 is still valid, and table2's tr and td are used for -table3. - - - - - -
    caption of table3.
    - - - Text after table2, not in tr-td, but in table3's tr-td. -
    caption of table2.
    - - - -
    caption of table1.
    first cell in table1 - second cell in table1 -
    third cell in the table1 - fourth cell in the table1 -
    -
    first cell in table2, but displayed in table 3. -
    - - second cell in table3. but table2's end tag closed table3. - So, this will be displayed out of table3. - - diff --git a/mozilla/htmlparser/tests/html/table204.html b/mozilla/htmlparser/tests/html/table204.html deleted file mode 100644 index 0842245cc02..00000000000 --- a/mozilla/htmlparser/tests/html/table204.html +++ /dev/null @@ -1,23 +0,0 @@ -nested table missing end td. -
    Nav. 4.0(bug): For inner table td does NOT terminate previous td. -
    Xena 6.0: end td is always optional. - - - - - -
    caption of table1.
    cell 1-1 - cell 1-2 -
    cell 1-3 - cell 1-4 - - - - -
    caption of table2.
    cell1 in table2 - cell2 in table2 -
    cell3 in table2 - cell4 in table2 -
    -
    -
    Last text. \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/table205.html b/mozilla/htmlparser/tests/html/table205.html deleted file mode 100644 index 905659196c3..00000000000 --- a/mozilla/htmlparser/tests/html/table205.html +++ /dev/null @@ -1,28 +0,0 @@ -Table in table, but not in tr-td. -
    The only thing missing is the end tag of the -first table! -Nav. 4.0: the outter table is ignored. -Xena 6.0: second table start tag is ignored. Contents put in 1 table. - - - - - - - - -
    caption of table1.
    first cell in table1 - second cell in table1 -
    third cell in table1 - fourth cell in table1 -
    - - - -
    caption of table2.
    cell1 in table2 - cell2 in table2 -
    cell3 in table2 - cell4 in table2 -
    - -
    Last text. \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/tableall.html b/mozilla/htmlparser/tests/html/tableall.html deleted file mode 100644 index 0381ca289ca..00000000000 --- a/mozilla/htmlparser/tests/html/tableall.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    table test cases
    Test case description -
    good syntax
    -
    table01.html <table> <tr> <td> -
    table02.html <table> <tr> <td> <table> nested -
    table03.html <table border align=left> -
    table04.html <table> mixed with list. - -
    table05 The correct position for Caption is after table start tag. - - -
    bad syntax
    -
    *table05a Caption before </table>. 4.0: Accepted, 6.0: ignored. -
    *table05b Caption after tr. 4.0: Accepted, 6.0: ignored. -
    *table05c Caption between table cell. 4.0: Accepted, 6.0: ignored. -
    *table05d Caption inside cell. 4.0: terminates both td and tr. 6.0: Ignored. -
    table05e Multiple caption outside cells. 4.0 takes first as Caption, others as text. -
    *table05f Captions inside cells, 4.0 takes last one, terminate td tr, 6.0 Ignore misplaced tag. -
    table05g Captions outside of table are treated as text. -
    table05h tr terminates caption -
    table05i tr terminates Caption, and close open(font) tags in caption. -
    table05j TD does NOT terminate Caption. TD's contents are used in caption. -
    table05k Table in caption works. -
    table05l Table in caption, table empty. 4.0(bug): shows blank page. -
    table05m <table> alone is ignored. -
    table05n </table> terminates caption and table. -
    table05o caption is not shown for empty table.
    table110.htm <tr> <td> missing <table> -
    table115.htm <table> text1 <tr> test2 <td> test3 -
    table120.htm <table> </table> table totally empty . -
    table125.htm <table> text </table>, no tr, td -
    table130.htm <table> <td> , missing tr -
    table135.htm <table> <tr> <tr> <td> , empty tr. -
    table140.htm <table> <tr> text <tr> <td> , empty tr. -
    table150.htm <table> <tr> <td> <td> , empty td. - -
    table201.html <table> <table> -
    table202.html <table> <tr> <table> -
    table203.html Table nested 3 levels, T1 not in T2's td -
    *table204.htm nested table missing end td. 4.0(bug) inner table need </td> -
    *table205.htm table in table. 4.0: discard outer, 6.0: put into 1 table. -
    - - diff --git a/mozilla/htmlparser/tests/html/tag001.html b/mozilla/htmlparser/tests/html/tag001.html deleted file mode 100644 index dd2b5698dca..00000000000 --- a/mozilla/htmlparser/tests/html/tag001.html +++ /dev/null @@ -1,3 +0,0 @@ -first line -second line -third line < \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/tag002.html b/mozilla/htmlparser/tests/html/tag002.html deleted file mode 100644 index 5083bee2948..00000000000 --- a/mozilla/htmlparser/tests/html/tag002.html +++ /dev/null @@ -1,23 +0,0 @@ -Broken tags are shown, only if no gt sign can be found. - - -aaaaaaaaaaaa - - -bbbbbbbb - -< - -open tag without name, stat with space, treated as text. -
    -KKKKKKKKKK - -< open tag has no tag name, stat with space, treated as text. -
    -ccccccc - -second line -

    Here is next paragraph. -
    -They ignored by 4,0. -Everything between the brakets is consummed. \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/tag004.html b/mozilla/htmlparser/tests/html/tag004.html deleted file mode 100644 index 00b6cc77073..00000000000 --- a/mozilla/htmlparser/tests/html/tag004.html +++ /dev/null @@ -1,4 +0,0 @@ -first line -
    empty brakets are displayed as text -<> -more text. diff --git a/mozilla/htmlparser/tests/html/tag005.html b/mozilla/htmlparser/tests/html/tag005.html deleted file mode 100644 index cb46e427796..00000000000 --- a/mozilla/htmlparser/tests/html/tag005.html +++ /dev/null @@ -1,7 +0,0 @@ -first line -
    empty brakets are displayed as text -This -and this eat next br tag. -and another one. -Last text. diff --git a/mozilla/htmlparser/tests/html/tag006.html b/mozilla/htmlparser/tests/html/tag006.html deleted file mode 100644 index 36d3dcc0d02..00000000000 --- a/mozilla/htmlparser/tests/html/tag006.html +++ /dev/null @@ -1,6 +0,0 @@ -first line -
    invalide tags are ignored by 4.0 - - - -Note: no line break here. diff --git a/mozilla/htmlparser/tests/html/tag007.html b/mozilla/htmlparser/tests/html/tag007.html deleted file mode 100644 index 596b5484dc5..00000000000 --- a/mozilla/htmlparser/tests/html/tag007.html +++ /dev/null @@ -1,5 +0,0 @@ -first line -
    Unmacthed opening tag in next line is ignored by 4.0 - -
    -Note: no line break inserted here. diff --git a/mozilla/htmlparser/tests/html/tag008.html b/mozilla/htmlparser/tests/html/tag008.html deleted file mode 100644 index 6b67931e732..00000000000 --- a/mozilla/htmlparser/tests/html/tag008.html +++ /dev/null @@ -1,4 +0,0 @@ -first line -
    Unmacthed end tag in next line is ignored by 4.0 -
    -Note: no line break inserted here. diff --git a/mozilla/htmlparser/tests/html/target01.html b/mozilla/htmlparser/tests/html/target01.html deleted file mode 100644 index 44c34fdbb29..00000000000 --- a/mozilla/htmlparser/tests/html/target01.html +++ /dev/null @@ -1,7 +0,0 @@ - -Target outside of quoted HREF. -
    example: -
    -two days - - \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/tbody001.html b/mozilla/htmlparser/tests/html/tbody001.html deleted file mode 100644 index d639a01c606..00000000000 --- a/mozilla/htmlparser/tests/html/tbody001.html +++ /dev/null @@ -1,17 +0,0 @@ - - -Welcome to Netscape - - -
    - - - - - -
    - table element with no attributes. The required embedded - elements are used - TBODY-TR-TD. -
    - - diff --git a/mozilla/htmlparser/tests/html/text001.html b/mozilla/htmlparser/tests/html/text001.html deleted file mode 100644 index 55c4e5ee38e..00000000000 --- a/mozilla/htmlparser/tests/html/text001.html +++ /dev/null @@ -1,8 +0,0 @@ - - -Welcome to Netscape - - -Text-001 - - diff --git a/mozilla/htmlparser/tests/html/text002.html b/mozilla/htmlparser/tests/html/text002.html deleted file mode 100644 index 68b070ca308..00000000000 --- a/mozilla/htmlparser/tests/html/text002.html +++ /dev/null @@ -1,8 +0,0 @@ - - -Welcome to Netscape - - -Text-002 - - diff --git a/mozilla/htmlparser/tests/html/text003.html b/mozilla/htmlparser/tests/html/text003.html deleted file mode 100644 index aa1f7ae9ccc..00000000000 --- a/mozilla/htmlparser/tests/html/text003.html +++ /dev/null @@ -1,12 +0,0 @@ - - - -Welcome to Netscape - - -Text-001 -
    -
    -Text after closing font tag. - - diff --git a/mozilla/htmlparser/tests/html/thead001.html b/mozilla/htmlparser/tests/html/thead001.html deleted file mode 100644 index b517ea769be..00000000000 --- a/mozilla/htmlparser/tests/html/thead001.html +++ /dev/null @@ -1,25 +0,0 @@ -Normal case for thead, tfoot, tbody - - - - - - - - - - - - - - - - - -
    caption of table2.
    text in thead
    text in tfoot
    first cell in table1 - second cell in table1 -
    third cell in table1 - fourth cell in table1 -
    - -last text. \ No newline at end of file diff --git a/mozilla/htmlparser/tests/html/title01.html b/mozilla/htmlparser/tests/html/title01.html deleted file mode 100644 index c6404098244..00000000000 --- a/mozilla/htmlparser/tests/html/title01.html +++ /dev/null @@ -1,6 +0,0 @@ - - -<!-- still in comment --> - -some text - diff --git a/mozilla/htmlparser/tests/html/usascii.html b/mozilla/htmlparser/tests/html/usascii.html deleted file mode 100644 index 834856339d0..00000000000 --- a/mozilla/htmlparser/tests/html/usascii.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - Juan Gotoh's Visual Workshop - - - - - - - - - - - - -<BODY> - -<P>If your brouser can not display frame, please click -<A HREF="home_E.html">here.</A> it has same contents as frame -version.</P> - -</BODY> - - diff --git a/mozilla/htmlparser/tests/html/utf8001.html b/mozilla/htmlparser/tests/html/utf8001.html deleted file mode 100644 index 017a3d7c652..00000000000 --- a/mozilla/htmlparser/tests/html/utf8001.html +++ /dev/null @@ -1,9 +0,0 @@ - - - -Welcome to Netscape - - -Text-001 - - diff --git a/mozilla/htmlparser/tests/html/value001.html b/mozilla/htmlparser/tests/html/value001.html deleted file mode 100644 index 55c926e7eb7..00000000000 --- a/mozilla/htmlparser/tests/html/value001.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Welcome to Netscape - - - - - - - - - diff --git a/mozilla/htmlparser/tests/html/xmp005.html b/mozilla/htmlparser/tests/html/xmp005.html deleted file mode 100644 index ac952f5b849..00000000000 --- a/mozilla/htmlparser/tests/html/xmp005.html +++ /dev/null @@ -1,48 +0,0 @@ - - -use a XMP tag for C or JAVA source code. -
    The lt and gt signes are problematic. - - - - cc = 123; - // test lt - if( cc < hhh ) { - if(cc<xxx || as > gh) { - //do womthing here; - } - } - if( cc <= iii ) { - if(cc<=yyy) { - //do womthing here; - } - } - // test gt - if( cc > rrr ) { - if(cc>eee) { - //do womthing here; - } - } - if( cc >= www ) { - if(cc>=qqq) { - //do womthing here; - } - } - // what if the variable name is a valid tag name. - if( cc < B && cc > kk ) { - if(cc<B && cc > gg) { - //do womthing here; - } - } - cc = aa<<I; - cc = B>>3; - gt = true; - for(a=0,gt=true; (a>0)&&gt; a++) { - } - a = 0x0004; - lt = 0x0002; - for(; a&lt; ) { - } - - - \ No newline at end of file diff --git a/mozilla/htmlparser/tests/windows/Selftest.cpp b/mozilla/htmlparser/tests/windows/Selftest.cpp deleted file mode 100644 index 0660fc576ba..00000000000 --- a/mozilla/htmlparser/tests/windows/Selftest.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include -#include -#include -#include -#include -#include - -#include "nsScanner.h" -#include "nsTokenizer.h" -#include "nsHTMLDelegate.h" - - -bool compareFiles(const char* file1,const char* file2) { - bool result=true; - bool done=false; - char ch1,ch2; - int eof1,eof2; - - ifstream input1(file1,ios::in && ios::binary,filebuf::openprot); - ifstream input2(file2,ios::in && ios::binary,filebuf::openprot); - - while(!done) { - - while(!(eof1=input1.eof())) { - input1.read(&ch1,1); - if(('\n'!=ch1) && (' '!=ch1)) - break; - } - - while(!(eof2=input2.eof())) { - input2.read(&ch2,1); - if(('\n'!=ch2) && (' '!=ch2)) - break; - } - - if(eof1==eof2) { - if(eof1) - done=true; - else if(ch1!=ch2) { - done=true; - result=false; - } - } - else done=true; - } - return result; -} - -void parseFile (const char* aFilename,int size) -{ - //debug - aFilename="s:\\ns\\raptor\\parser\\tests\\html\\tag001.html"; - //aFilename="c:\\temp\\temp.html"; - - char filename[_MAX_PATH]; - strcpy(filename,aFilename); - strcat(filename,".tokens"); - { - ofstream out(filename); - ifstream input(aFilename); - CScanner scanner(input); - CHTMLTokenizerDelegate delegate; - CTokenizer tokenizer(scanner,delegate); - tokenizer.tokenize(); - tokenizer.debugDumpSource(out); - } - cout << aFilename; - if(compareFiles(aFilename,filename)) - cout << " PASS " << endl; - else cout << " FAIL" << endl; -} - -int walkDirectoryTree(char* aPath) { - int result=0; - char fullPath[_MAX_PATH]; - struct _finddata_t c_file; - long hFile; - - strcpy(fullPath,aPath); - strcat(fullPath,"\\*.*"); - /* Find first .c file in current directory */ - if((hFile = _findfirst( fullPath, &c_file )) == -1L ) - printf( "No matching files in current directory!\n" ); - else { - - bool done=false; - while(!done) { - if(c_file.attrib & _A_SUBDIR) { - if(strlen(c_file.name)>2){ - char newPath[_MAX_PATH]; - strcpy(newPath,aPath); - strcat(newPath,"\\"); - strcat(newPath,c_file.name); - walkDirectoryTree(newPath); - } - } - else { - int len=strlen(c_file.name); - if(len>5) { - if(0==strnicmp(&c_file.name[len-5],".HTML",5)) { - char filepath[_MAX_PATH]; - strcpy(filepath,aPath); - strcat(filepath,"\\"); - strcat(filepath,c_file.name); - parseFile(filepath,c_file.size); - } - } - } - if(_findnext( hFile, &c_file )!=0) - done=true; - } - _findclose( hFile ); - } - return 0; -} - -int main(int argc, char* argv []) -{ - int result=0; - char buffer[_MAX_PATH]; - - if(argc==2) - strcpy(buffer,argv[1]); - else _getcwd(buffer,_MAX_PATH); - walkDirectoryTree(buffer); - return 0; -} - - - diff --git a/mozilla/htmlparser/tools/gentags.pl b/mozilla/htmlparser/tools/gentags.pl deleted file mode 100644 index 5e589e6d8f4..00000000000 --- a/mozilla/htmlparser/tools/gentags.pl +++ /dev/null @@ -1,331 +0,0 @@ -#! /usr/local/bin/perl - -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See -# the License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -###################################################################### - -# Table of tag names; it doesn't have to be sorted because code -# below will do it. However, for the sake of ease of additions, keep -# it sorted so that its easy to tell where to add a new tag and that -# the tag hasn't already been added. -$i = 0; -$tags[$i++] = "a"; -$tags[$i++] = "abbr"; -$tags[$i++] = "acronym"; -$tags[$i++] = "address"; -$tags[$i++] = "applet"; -$tags[$i++] = "area"; -$tags[$i++] = "b"; -$tags[$i++] = "base"; -$tags[$i++] = "basefont"; -$tags[$i++] = "bdo"; -$tags[$i++] = "big"; -$tags[$i++] = "blink"; -$tags[$i++] = "blockquote"; -$tags[$i++] = "body"; -$tags[$i++] = "br"; -$tags[$i++] = "button"; -$tags[$i++] = "caption"; -$tags[$i++] = "center"; -$tags[$i++] = "cite"; -$tags[$i++] = "code"; -$tags[$i++] = "col"; -$tags[$i++] = "colgroup"; -$tags[$i++] = "dd"; -$tags[$i++] = "del"; -$tags[$i++] = "dfn"; -$tags[$i++] = "dir"; -$tags[$i++] = "div"; -$tags[$i++] = "dl"; -$tags[$i++] = "dt"; -$tags[$i++] = "em"; -$tags[$i++] = "embed"; -$tags[$i++] = "fieldset"; -$tags[$i++] = "font"; -$tags[$i++] = "form"; -$tags[$i++] = "frame"; -$tags[$i++] = "frameset"; -$tags[$i++] = "h1"; -$tags[$i++] = "h2"; -$tags[$i++] = "h3"; -$tags[$i++] = "h4"; -$tags[$i++] = "h5"; -$tags[$i++] = "h6"; -$tags[$i++] = "head"; -$tags[$i++] = "hr"; -$tags[$i++] = "html"; -$tags[$i++] = "i"; -$tags[$i++] = "iframe"; -$tags[$i++] = "ilayer"; -$tags[$i++] = "img"; -$tags[$i++] = "input"; -$tags[$i++] = "ins"; -$tags[$i++] = "isindex"; -$tags[$i++] = "kbd"; -$tags[$i++] = "keygen"; -$tags[$i++] = "label"; -$tags[$i++] = "layer"; -$tags[$i++] = "legend"; -$tags[$i++] = "li"; -$tags[$i++] = "link"; -$tags[$i++] = "listing"; -$tags[$i++] = "map"; -$tags[$i++] = "menu"; -$tags[$i++] = "meta"; -$tags[$i++] = "multicol"; -$tags[$i++] = "nobr"; -$tags[$i++] = "noembed"; -$tags[$i++] = "noframes"; -$tags[$i++] = "nolayer"; -$tags[$i++] = "noscript"; -$tags[$i++] = "object"; -$tags[$i++] = "ol"; -$tags[$i++] = "optgroup"; -$tags[$i++] = "option"; -$tags[$i++] = "p"; -$tags[$i++] = "param"; -$tags[$i++] = "plaintext"; -$tags[$i++] = "pre"; -$tags[$i++] = "q"; -$tags[$i++] = "s"; -$tags[$i++] = "samp"; -$tags[$i++] = "script"; -$tags[$i++] = "select"; -$tags[$i++] = "server"; -$tags[$i++] = "small"; -$tags[$i++] = "spacer"; -$tags[$i++] = "span"; -$tags[$i++] = "strike"; -$tags[$i++] = "strong"; -$tags[$i++] = "style"; -$tags[$i++] = "sub"; -$tags[$i++] = "sup"; -$tags[$i++] = "table"; -$tags[$i++] = "tbody"; -$tags[$i++] = "td"; -$tags[$i++] = "textarea"; -$tags[$i++] = "tfoot"; -$tags[$i++] = "th"; -$tags[$i++] = "thead"; -$tags[$i++] = "title"; -$tags[$i++] = "tr"; -$tags[$i++] = "tt"; -$tags[$i++] = "u"; -$tags[$i++] = "ul"; -$tags[$i++] = "var"; -$tags[$i++] = "wbr"; -$tags[$i++] = "xmp"; - -###################################################################### - -# These are not tags; rather they are extra values to place into the -# tag enumeration after the normal tags. These do not need to be sorted -# and they do not go into the tag table, just into the tag enumeration. -$extra = 0; -$extra_tags[$extra++] = "text"; -$extra_tags[$extra++] = "whitespace"; -$extra_tags[$extra++] = "newline"; -$extra_tags[$extra++] = "comment"; -$extra_tags[$extra++] = "entity"; -$extra_tags[$extra++] = "userdefined"; -$extra_tags[$extra++] = "secret_h1style"; -$extra_tags[$extra++] = "secret_h2style"; -$extra_tags[$extra++] = "secret_h3style"; -$extra_tags[$extra++] = "secret_h4style"; -$extra_tags[$extra++] = "secret_h5style"; -$extra_tags[$extra++] = "secret_h6style"; - -###################################################################### - -# Sort the tag table before using it -@tags = sort @tags; - -$copyright = "/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the \"License\"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an \"AS IS\" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is Netscape Communications - * Corporation. Portions created by Netscape are Copyright (C) 1998 - * Netscape Communications Corporation. All Rights Reserved. - */ - -/* Do not edit - generated by gentags.pl */ -"; - -###################################################################### - -$file_base = @ARGV[0]; - -# Generate the header file first -open(HEADER_FILE, ">$file_base.h"); - -# Print out copyright and do not edit notice -print HEADER_FILE $copyright; -print HEADER_FILE "#ifndef " . $file_base . "_h___\n"; -print HEADER_FILE "#define " . $file_base . "_h___\n"; -print HEADER_FILE "#include \"nshtmlpars.h\"\n"; - -# Print out enum's for the tag symbols -print HEADER_FILE "enum nsHTMLTag {\n"; -print HEADER_FILE " /* this enum must be first and must be zero */\n"; -print HEADER_FILE " eHTMLTag_unknown=0,\n\n"; -print HEADER_FILE " /* begin tag enums */\n "; -$width = 2; -print HEADER_FILE $str; -for ($j = 0; $j < $i; $j++) { - $lower = $tags[$j]; - $lower =~ tr/A-Z/a-z/; - $str = "eHTMLTag_" . $lower . "=" . ($j + 1); - $str = $str . ", "; - $len = length($str); - if ($width + $len > 78) { - print HEADER_FILE "\n "; - $width = 2; - } - print HEADER_FILE $str; - $width = $width + $len; -} -print HEADER_FILE "\n\n /* The remaining enums are not for tags */\n "; - -# Print out extra enum's that are not in the tag table -$width = 2; -for ($k = 0; $k < $extra; $k++) { - $lower = $extra_tags[$k]; - $lower =~ tr/A-Z/a-z/; - $str = "eHTMLTag_" . $lower . "=" . ($j + $k + 1); - if ($k < $extra - 1) { - $str = $str . ", "; - } - $len = length($str); - if ($width + $len > 78) { - print HEADER_FILE "\n "; - $width = 2; - } - print HEADER_FILE $str; - $width = $width + $len; -} - -print HEADER_FILE "\n};\n#define NS_HTML_TAG_MAX " . $j . "\n\n"; -print HEADER_FILE - "extern NS_HTMLPARS nsHTMLTag NS_TagToEnum(const char* aTag);\n"; -print HEADER_FILE - "extern NS_HTMLPARS const char* NS_EnumToTag(nsHTMLTag aEnum);\n\n"; -print HEADER_FILE "#endif /* " . $file_base . "_h___ */\n"; -close(HEADER_FILE); - -###################################################################### - -# Generate the source file -open(CPP_FILE, ">$file_base.cpp"); -print CPP_FILE $copyright; -print CPP_FILE "#include \n"; -print CPP_FILE "#include \"$file_base.h\"\n\n"; - -# Print out table of tag names -print CPP_FILE "static char* tagTable[] = {\n "; -$width = 2; -for ($j = 0; $j < $i; $j++) { - $upper = $tags[$j]; - $upper =~ tr/a-z/A-Z/; - $str = "\"" . $upper . "\""; - if ($j < $i - 1) { - $str = $str . ", "; - } - $len = length($str); - if ($width + $len > 78) { - print CPP_FILE "\n "; - $width = 2; - } - print CPP_FILE $str; - $width = $width + $len; -} -print CPP_FILE "\n};\n"; - -# Finally, dump out the search routine that takes a char* and finds it -# in the table. -print CPP_FILE " -nsHTMLTag NS_TagToEnum(const char* aTagName) { - int low = 0; - int high = NS_HTML_TAG_MAX - 1; - while (low <= high) { - int middle = (low + high) >> 1; - int result = strcmp(aTagName, tagTable[middle]); - if (result == 0) - return (nsHTMLTag) (middle + 1); - if (result < 0) - high = middle - 1; - else - low = middle + 1; - } - return eHTMLTag_userdefined; -} - -const char* NS_EnumToTag(nsHTMLTag aTagID) { - if ((int(aTagID) <= 0) || (int(aTagID) > NS_HTML_TAG_MAX)) { - return 0; - } - return tagTable[int(aTagID) - 1]; -} - -#ifdef NS_DEBUG -#include - -class nsTestTagTable { -public: - nsTestTagTable() { - const char *tag; - nsHTMLTag id; - - // Make sure we can find everything we are supposed to - for (int i = 0; i < NS_HTML_TAG_MAX; i++) { - tag = tagTable[i]; - id = NS_TagToEnum(tag); - NS_ASSERTION(id != eHTMLTag_userdefined, \"can't find tag id\"); - const char* check = NS_EnumToTag(id); - NS_ASSERTION(check == tag, \"can't map id back to tag\"); - } - - // Make sure we don't find things that aren't there - id = NS_TagToEnum(\"@\"); - NS_ASSERTION(id == eHTMLTag_userdefined, \"found @\"); - id = NS_TagToEnum(\"zzzzz\"); - NS_ASSERTION(id == eHTMLTag_userdefined, \"found @\"); - - tag = NS_EnumToTag((nsHTMLTag) 0); - NS_ASSERTION(0 == tag, \"found enum 0\"); - tag = NS_EnumToTag((nsHTMLTag) -1); - NS_ASSERTION(0 == tag, \"found enum -1\"); - tag = NS_EnumToTag((nsHTMLTag) (NS_HTML_TAG_MAX + 1)); - NS_ASSERTION(0 == tag, \"found past max enum\"); - } -}; -nsTestTagTable validateTagTable; -#endif - -"; - -close(CPP_FILE); diff --git a/mozilla/layout/Makefile b/mozilla/layout/Makefile deleted file mode 100644 index 77f2a7a3fa0..00000000000 --- a/mozilla/layout/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = .. - -DIRS = base css html events build - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/base/Makefile b/mozilla/layout/base/Makefile deleted file mode 100644 index 4135f9605a8..00000000000 --- a/mozilla/layout/base/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../.. - -DIRS = public src tests - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/base/makefile.win b/mozilla/layout/base/makefile.win deleted file mode 100644 index 9526eb16178..00000000000 --- a/mozilla/layout/base/makefile.win +++ /dev/null @@ -1,22 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\.. - -DIRS=public src tests - -include <$(DEPTH)\layout\config\rules.mak> diff --git a/mozilla/layout/base/nsCSSRendering.cpp b/mozilla/layout/base/nsCSSRendering.cpp deleted file mode 100644 index 7a8148d3969..00000000000 --- a/mozilla/layout/base/nsCSSRendering.cpp +++ /dev/null @@ -1,923 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsCSSRendering.h" -#include "nsStyleConsts.h" -#include "nsIPresContext.h" -#include "nsIImage.h" -#include "nsIFrame.h" -#include "nsPoint.h" -#include "nsRect.h" -#include "nsIViewManager.h" -#include "nsIPresShell.h" -#include "nsIFrameImageLoader.h" -#include "nsGlobalVariables.h" - -#define BORDER_FULL 0 //entire side -#define BORDER_INSIDE 1 //inside half -#define BORDER_OUTSIDE 2 //outside half - -//thickness of dashed line relative to dotted line -#define DOT_LENGTH 1 //square -#define DASH_LENGTH 3 //3 times longer than dot - - - -// Weird color computing code stolen from winfe which was stolen -// from the xfe which was written originally by Eric Bina. So there. - -const int nsCSSRendering::RED_LUMINOSITY = 30; -const int nsCSSRendering::GREEN_LUMINOSITY = 59; -const int nsCSSRendering::BLUE_LUMINOSITY = 11; -const int nsCSSRendering::INTENSITY_FACTOR = 25; -const int nsCSSRendering::LIGHT_FACTOR = 0; -const int nsCSSRendering::LUMINOSITY_FACTOR = 75; -const int nsCSSRendering::MAX_COLOR = 255; -const int nsCSSRendering::COLOR_DARK_THRESHOLD = 51; -const int nsCSSRendering::COLOR_LIGHT_THRESHOLD = 204; - - -void nsCSSRendering::Get3DColors(nscolor aResult[2], nscolor aColor) -{ - int rb = NS_GET_R(aColor); - int gb = NS_GET_G(aColor); - int bb = NS_GET_B(aColor); - int intensity = (rb + gb + bb) / 3; - int luminosity = - ((RED_LUMINOSITY * rb) / 100) + - ((GREEN_LUMINOSITY * gb) / 100) + - ((BLUE_LUMINOSITY * bb) / 100); - int brightness = ((intensity * INTENSITY_FACTOR) + - (luminosity * LUMINOSITY_FACTOR)) / 100; - int f0, f1; - if (brightness < COLOR_DARK_THRESHOLD) { - f0 = 30; - f1 = 50; - } else if (brightness > COLOR_LIGHT_THRESHOLD) { - f0 = 45; - f1 = 50; - } else { - f0 = 30 + (brightness * (45 - 30) / MAX_COLOR); - f1 = f0; - } - int r = rb - (f0 * rb / 100); - int g = gb - (f0 * gb / 100); - int b = bb - (f0 * bb / 100); - aResult[0] = NS_RGB(r, g, b); - r = rb + (f1 * (MAX_COLOR - rb) / 100); - if (r > 255) r = 255; - g = gb + (f1 * (MAX_COLOR - gb) / 100); - if (g > 255) g = 255; - b = bb + (f1 * (MAX_COLOR - bb) / 100); - if (b > 255) b = 255; - aResult[1] = NS_RGB(r, g, b); -} - - -/** - * Special method to brighten a Color and have it shift to white when - * fully saturated. - */ -nscolor nsCSSRendering::Brighten(nscolor inColor) -{ - PRIntn r, g, b, max, over; - - r = NS_GET_R(inColor); - g = NS_GET_G(inColor); - b = NS_GET_B(inColor); - - //10% of max color increase across the board - r += 25; - g += 25; - b += 25; - - //figure out which color is largest - if (r > g) - { - if (b > r) - max = b; - else - max = r; - } - else - { - if (b > g) - max = b; - else - max = g; - } - - //if we overflowed on this max color, increase - //other components by the overflow amount - if (max > 255) - { - over = max - 255; - - if (max == r) - { - g += over; - b += over; - } - else if (max == g) - { - r += over; - b += over; - } - else - { - r += over; - g += over; - } - } - - //clamp - if (r > 255) - r = 255; - if (g > 255) - g = 255; - if (b > 255) - b = 255; - - return NS_RGBA(r, g, b, NS_GET_A(inColor)); -} - -/** - * Special method to darken a Color and have it shift to black when - * darkest component underflows - */ -nscolor nsCSSRendering::Darken(nscolor inColor) -{ - PRIntn r, g, b, max; - - r = NS_GET_R(inColor); - g = NS_GET_G(inColor); - b = NS_GET_B(inColor); - - //10% of max color decrease across the board - r -= 25; - g -= 25; - b -= 25; - - //figure out which color is largest - if (r > g) - { - if (b > r) - max = b; - else - max = r; - } - else - { - if (b > g) - max = b; - else - max = g; - } - - //if we underflowed on this max color, decrease - //other components by the underflow amount - if (max < 0) - { - if (max == r) - { - g += max; - b += max; - } - else if (max == g) - { - r += max; - b += max; - } - else - { - r += max; - g += max; - } - } - - //clamp - if (r < 0) - r = 0; - if (g < 0) - g = 0; - if (b < 0) - b = 0; - - return NS_RGBA(r, g, b, NS_GET_A(inColor)); -} - -/** - * Make a bevel color - */ -nscolor nsCSSRendering::MakeBevelColor(PRIntn whichSide, PRUint8 style, - nscolor baseColor, - PRBool printing) -{ - - PRBool blackLines = nsGlobalVariables::Instance()->GetBlackLines(); - nscolor colors[2]; - nscolor theColor; - - // Get the background color that applies to this HR - if (printing && blackLines) - { - colors[0] = NS_RGB(0,0,0); - colors[1] = colors[0]; - } - else - { - // Given a background color and a border color - // calculate the color used for the shading - Get3DColors(colors, baseColor); - } - - - if ((style == NS_STYLE_BORDER_STYLE_OUTSET) || - (style == NS_STYLE_BORDER_STYLE_RIDGE)) { - // Flip colors for these two border style - switch (whichSide) { - case NS_SIDE_BOTTOM: whichSide = NS_SIDE_TOP; break; - case NS_SIDE_RIGHT: whichSide = NS_SIDE_LEFT; break; - case NS_SIDE_TOP: whichSide = NS_SIDE_BOTTOM; break; - case NS_SIDE_LEFT: whichSide = NS_SIDE_RIGHT; break; - } - } - - switch (whichSide) { - case NS_SIDE_BOTTOM: - theColor = colors[1]; - break; - case NS_SIDE_RIGHT: - theColor = colors[1]; - break; - case NS_SIDE_TOP: - theColor = colors[0]; - break; - case NS_SIDE_LEFT: - theColor = colors[0]; - break; - } - return theColor; -} - -// Maximum poly points in any of the polygons we generate below -#define MAX_POLY_POINTS 4 - -// a nifty helper function to create a polygon representing a -// particular side of a border. This helps localize code for figuring -// mitered edges. It is mainly used by the solid, inset, and outset -// styles. -// -// If the side can be represented as a line segment (because the thickness -// is one pixel), then a line with two endpoints is returned -PRIntn nsCSSRendering::MakeSide(nsPoint aPoints[], - nsIRenderingContext& aContext, - PRIntn whichSide, - const nsRect& outside, const nsRect& inside, - PRIntn borderPart, float borderFrac, - nscoord twipsPerPixel) -{ - float borderRest = 1.0f - borderFrac; - - // XXX QQQ We really should decide to do a bevel based on whether there - // is a side adjacent or not. This could let you join borders across - // block elements (paragraphs). - - PRIntn np = 0; - nscoord thickness; - - // Base our thickness check on the segment being less than a pixel and 1/2 - twipsPerPixel += twipsPerPixel >> 2; - - switch (whichSide) { - case NS_SIDE_TOP: - if (borderPart == BORDER_FULL) { - thickness = inside.y - outside.y; - - aPoints[np++].MoveTo(outside.XMost(), outside.y); - if (thickness >= twipsPerPixel) { - aPoints[np++].MoveTo(inside.XMost(), inside.y); - aPoints[np++].MoveTo(inside.x, inside.y); - } - aPoints[np++].MoveTo(outside.x, outside.y); - } else if (borderPart == BORDER_INSIDE) { - aPoints[np++].MoveTo(nscoord(outside.x * borderFrac + - inside.x * borderRest), - nscoord(outside.y * borderFrac + - inside.y * borderRest)); - aPoints[np++].MoveTo(nscoord(outside.XMost() * borderFrac + - inside.XMost() * borderRest), - nscoord(outside.y * borderFrac + - inside.y * borderRest)); - aPoints[np++].MoveTo(inside.XMost(), inside.y); - aPoints[np++].MoveTo(inside.x, inside.y); - } else { - aPoints[np++].MoveTo(outside.x, outside.y); - aPoints[np++].MoveTo(outside.XMost(), outside.y); - aPoints[np++].MoveTo(nscoord(inside.XMost() * borderFrac + - outside.XMost() * borderRest), - nscoord(inside.y * borderFrac + - outside.y * borderRest)); - aPoints[np++].MoveTo(nscoord(inside.x * borderFrac + - outside.x * borderRest), - nscoord(inside.y * borderFrac + - outside.y * borderRest)); - } - break; - - case NS_SIDE_LEFT: - if (borderPart == BORDER_FULL) { - thickness = inside.x - outside.x; - - aPoints[np++].MoveTo(outside.x, outside.y); - if (thickness >= twipsPerPixel) { - aPoints[np++].MoveTo(inside.x, inside.y); - aPoints[np++].MoveTo(inside.x, inside.YMost()); - } - aPoints[np++].MoveTo(outside.x, outside.YMost()); - } else if (borderPart == BORDER_INSIDE) { - aPoints[np++].MoveTo(nscoord(outside.x * borderFrac + - inside.x * borderRest), - nscoord(outside.y * borderFrac + - inside.y * borderRest)); - aPoints[np++].MoveTo(inside.x, inside.y); - aPoints[np++].MoveTo(inside.x, inside.YMost()); - aPoints[np++].MoveTo(nscoord(outside.x * borderFrac + - inside.x * borderRest), - nscoord(outside.YMost() * borderFrac + - inside.YMost() * borderRest)); - } else { - aPoints[np++].MoveTo(outside.x, outside.y); - aPoints[np++].MoveTo(nscoord(inside.x * borderFrac + - outside.x * borderRest), - nscoord(inside.y * borderFrac + - outside.y * borderRest)); - aPoints[np++].MoveTo(nscoord(inside.x * borderFrac + - outside.x * borderRest), - nscoord(inside.YMost() * borderFrac + - outside.YMost() * borderRest)); - aPoints[np++].MoveTo(outside.x, outside.YMost()); - } - break; - - case NS_SIDE_BOTTOM: - if (borderPart == BORDER_FULL) { - thickness = outside.YMost() - inside.YMost(); - - aPoints[np++].MoveTo(outside.x, outside.YMost()); - if (thickness >= twipsPerPixel) { - aPoints[np++].MoveTo(inside.x, inside.YMost()); - aPoints[np++].MoveTo(inside.XMost(), inside.YMost()); - } - aPoints[np++].MoveTo(outside.XMost(), outside.YMost()); - } else if (borderPart == BORDER_INSIDE) { - aPoints[np++].MoveTo(nscoord(outside.x * borderFrac + - inside.x * borderRest), - nscoord(outside.YMost() * borderFrac + - inside.YMost() * borderRest)); - aPoints[np++].MoveTo(inside.x, inside.YMost()); - aPoints[np++].MoveTo(inside.XMost(), inside.YMost()); - aPoints[np++].MoveTo(nscoord(outside.XMost() * borderFrac + - inside.XMost() * borderRest), - nscoord(outside.YMost() * borderFrac + - inside.YMost() * borderRest)); - } else { - aPoints[np++].MoveTo(outside.x, outside.YMost()); - aPoints[np++].MoveTo(nscoord(inside.x * borderFrac + - outside.x * borderRest), - nscoord(inside.YMost() * borderFrac + - outside.YMost() * borderRest)); - aPoints[np++].MoveTo(nscoord(inside.XMost() * borderFrac + - outside.XMost() * borderRest), - nscoord(inside.YMost() * borderFrac + - outside.YMost() * borderRest)); - aPoints[np++].MoveTo(outside.XMost(), outside.YMost()); - } - break; - - case NS_SIDE_RIGHT: - if (borderPart == BORDER_FULL) { - thickness = outside.XMost() - inside.XMost(); - - aPoints[np++].MoveTo(outside.XMost(), outside.YMost()); - aPoints[np++].MoveTo(outside.XMost(), outside.y); - if (thickness >= twipsPerPixel) { - aPoints[np++].MoveTo(inside.XMost(), inside.y); - aPoints[np++].MoveTo(inside.XMost(), inside.YMost()); - } - } else if (borderPart == BORDER_INSIDE) { - aPoints[np++].MoveTo(inside.XMost(), inside.y); - aPoints[np++].MoveTo(nscoord(outside.XMost() * borderFrac + - inside.XMost() * borderRest), - nscoord(outside.y * borderFrac + - inside.y * borderRest)); - aPoints[np++].MoveTo(nscoord(outside.XMost() * borderFrac + - inside.XMost() * borderRest), - nscoord(outside.YMost() * borderFrac + - inside.YMost() * borderRest)); - aPoints[np++].MoveTo(inside.XMost(), inside.YMost()); - } else { - aPoints[np++].MoveTo(nscoord(inside.XMost() * borderFrac + - outside.XMost() * borderRest), - nscoord(inside.y * borderFrac + - outside.y * borderRest)); - aPoints[np++].MoveTo(outside.XMost(), outside.y); - aPoints[np++].MoveTo(outside.XMost(), outside.YMost()); - aPoints[np++].MoveTo(nscoord(inside.XMost() * borderFrac + - outside.XMost() * borderRest), - nscoord(inside.YMost() * borderFrac + - outside.YMost() * borderRest)); - } - break; - } - return np; -} - -void nsCSSRendering::DrawSide(nsIRenderingContext& aContext, - PRIntn whichSide, - const PRUint8 borderStyles[], - const nscolor borderColors[], - const nsRect& borderOutside, - const nsRect& borderInside, - PRBool printing, - nscoord twipsPerPixel) -{ - nsPoint theSide[MAX_POLY_POINTS]; - nscolor theColor = borderColors[whichSide]; - PRUint8 theStyle = borderStyles[whichSide]; - PRInt32 np; - switch (theStyle) { - case NS_STYLE_BORDER_STYLE_NONE: - case NS_STYLE_BORDER_STYLE_BLANK: - return; - - case NS_STYLE_BORDER_STYLE_DOTTED: //handled a special case elsewhere - case NS_STYLE_BORDER_STYLE_DASHED: //handled a special case elsewhere - break; // That was easy... - - case NS_STYLE_BORDER_STYLE_GROOVE: - case NS_STYLE_BORDER_STYLE_RIDGE: - np = MakeSide (theSide, aContext, whichSide, borderOutside, borderInside, - BORDER_INSIDE, 0.5f, twipsPerPixel); - aContext.SetColor ( MakeBevelColor (whichSide, theStyle, theColor, printing)); - if (2 == np) { - aContext.DrawLine (theSide[0].x, theSide[0].y, theSide[1].x, theSide[1].y); - } else { - aContext.FillPolygon (theSide, np); - } - np = MakeSide (theSide, aContext, whichSide, borderOutside, borderInside, - BORDER_OUTSIDE, 0.5f, twipsPerPixel); - aContext.SetColor ( MakeBevelColor (whichSide, - (theStyle == NS_STYLE_BORDER_STYLE_RIDGE) - ? NS_STYLE_BORDER_STYLE_GROOVE - : NS_STYLE_BORDER_STYLE_RIDGE, theColor,printing)); - if (2 == np) { - aContext.DrawLine (theSide[0].x, theSide[0].y, theSide[1].x, theSide[1].y); - } else { - aContext.FillPolygon (theSide, np); - } - break; - - case NS_STYLE_BORDER_STYLE_SOLID: - np = MakeSide (theSide, aContext, whichSide, borderOutside, borderInside, - BORDER_FULL, 1.0f, twipsPerPixel); - aContext.SetColor (borderColors[whichSide]); - if (2 == np) { - aContext.DrawLine (theSide[0].x, theSide[0].y, theSide[1].x, theSide[1].y); - } else { - aContext.FillPolygon (theSide, np); - } - break; - - case NS_STYLE_BORDER_STYLE_DOUBLE: - np = MakeSide (theSide, aContext, whichSide, borderOutside, borderInside, - BORDER_INSIDE, 0.333333f, twipsPerPixel); - aContext.SetColor (borderColors[whichSide]); - if (2 == np) { - aContext.DrawLine (theSide[0].x, theSide[0].y, theSide[1].x, theSide[1].y); - } else { - aContext.FillPolygon (theSide, np); - } - np = MakeSide (theSide, aContext, whichSide, borderOutside, borderInside, - BORDER_OUTSIDE, 0.333333f, twipsPerPixel); - if (2 == np) { - aContext.DrawLine (theSide[0].x, theSide[0].y, theSide[1].x, theSide[1].y); - } else { - aContext.FillPolygon (theSide, np); - } - break; - - case NS_STYLE_BORDER_STYLE_OUTSET: - case NS_STYLE_BORDER_STYLE_INSET: - np = MakeSide (theSide, aContext, whichSide, borderOutside, borderInside, - BORDER_FULL, 1.0f, twipsPerPixel); - aContext.SetColor ( MakeBevelColor (whichSide, theStyle, theColor,printing)); - if (2 == np) { - aContext.DrawLine (theSide[0].x, theSide[0].y, theSide[1].x, theSide[1].y); - } else { - aContext.FillPolygon (theSide, np); - } - break; - } -} - -/** - * Draw a dotted/dashed sides of a box - */ -//XXX dashes which span more than two edges are not handled properly MMP -void nsCSSRendering::DrawDashedSides(PRIntn startSide, - nsIRenderingContext& aContext, - const PRUint8 borderStyles[], - const nscolor borderColors[], - const nsRect& borderOutside, - const nsRect& borderInside, - PRIntn aSkipSides) -{ - PRIntn dashLength; - nsRect dashRect, firstRect, currRect; - - PRBool bSolid = PR_TRUE; - float over = 0.0f; - PRUint8 style = borderStyles[startSide]; - PRBool skippedSide = PR_FALSE; - for (PRIntn whichSide = startSide; whichSide < 4; whichSide++) { - PRUint8 prevStyle = style; - style = borderStyles[whichSide]; - if ((1< 0.0f) { - firstRect.x = dashRect.x; - firstRect.width = dashRect.width; - firstRect.height = nscoord(dashRect.height * over); - firstRect.y = dashRect.y + (dashRect.height - firstRect.height); - over = 0.0f; - currRect = firstRect; - } else { - currRect = dashRect; - } - - while (currRect.YMost() > borderInside.y) { - //clip if necessary - if (currRect.y < borderInside.y) { - over = float(borderInside.y - dashRect.y) / - float(dashRect.height); - currRect.height = currRect.height - (borderInside.y - currRect.y); - currRect.y = borderInside.y; - } - - //draw if necessary - if (bSolid) { - aContext.FillRect(currRect); - } - - //setup for next iteration - if (over == 0.0f) { - bSolid = PRBool(!bSolid); - } - dashRect.y = dashRect.y - currRect.height; - currRect = dashRect; - } - break; - - case NS_SIDE_TOP: - //if we are continuing a solid rect, fill in the corner first - if (bSolid) { - aContext.FillRect(borderOutside.x, borderOutside.y, - borderInside.x - borderOutside.x, - borderInside.y - borderOutside.y); - } - - dashRect.height = borderInside.y - borderOutside.y; - dashRect.width = dashRect.height * dashLength; - dashRect.x = borderInside.x; - dashRect.y = borderOutside.y; - - if (over > 0.0f) { - firstRect.x = dashRect.x; - firstRect.y = dashRect.y; - firstRect.width = nscoord(dashRect.width * over); - firstRect.height = dashRect.height; - over = 0.0f; - currRect = firstRect; - } else { - currRect = dashRect; - } - - while (currRect.x < borderInside.XMost()) { - //clip if necessary - if (currRect.XMost() > borderInside.XMost()) { - over = float(dashRect.XMost() - borderInside.XMost()) / - float(dashRect.width); - currRect.width = currRect.width - - (currRect.XMost() - borderInside.XMost()); - } - - //draw if necessary - if (bSolid) { - aContext.FillRect(currRect); - } - - //setup for next iteration - if (over == 0.0f) { - bSolid = PRBool(!bSolid); - } - dashRect.x = dashRect.x + currRect.width; - currRect = dashRect; - } - break; - - case NS_SIDE_RIGHT: - //if we are continuing a solid rect, fill in the corner first - if (bSolid) { - aContext.FillRect(borderInside.XMost(), borderOutside.y, - borderOutside.XMost() - borderInside.XMost(), - borderInside.y - borderOutside.y); - } - - dashRect.width = borderOutside.XMost() - borderInside.XMost(); - dashRect.height = nscoord(dashRect.width * dashLength); - dashRect.x = borderInside.XMost(); - dashRect.y = borderInside.y; - - if (over > 0.0f) { - firstRect.x = dashRect.x; - firstRect.y = dashRect.y; - firstRect.width = dashRect.width; - firstRect.height = nscoord(dashRect.height * over); - over = 0.0f; - currRect = firstRect; - } else { - currRect = dashRect; - } - - while (currRect.y < borderInside.YMost()) { - //clip if necessary - if (currRect.YMost() > borderInside.YMost()) { - over = float(dashRect.YMost() - borderInside.YMost()) / - float(dashRect.height); - currRect.height = currRect.height - - (currRect.YMost() - borderInside.YMost()); - } - - //draw if necessary - if (bSolid) { - aContext.FillRect(currRect); - } - - //setup for next iteration - if (over == 0.0f) { - bSolid = PRBool(!bSolid); - } - dashRect.y = dashRect.y + currRect.height; - currRect = dashRect; - } - break; - - case NS_SIDE_BOTTOM: - //if we are continuing a solid rect, fill in the corner first - if (bSolid) { - aContext.FillRect(borderInside.XMost(), borderInside.YMost(), - borderOutside.XMost() - borderInside.XMost(), - borderOutside.YMost() - borderInside.YMost()); - } - - dashRect.height = borderOutside.YMost() - borderInside.YMost(); - dashRect.width = nscoord(dashRect.height * dashLength); - dashRect.x = borderInside.XMost() - dashRect.width; - dashRect.y = borderInside.YMost(); - - if (over > 0.0f) { - firstRect.y = dashRect.y; - firstRect.width = nscoord(dashRect.width * over); - firstRect.height = dashRect.height; - firstRect.x = dashRect.x + (dashRect.width - firstRect.width); - over = 0.0f; - currRect = firstRect; - } else { - currRect = dashRect; - } - - while (currRect.XMost() > borderInside.x) { - //clip if necessary - if (currRect.x < borderInside.x) { - over = float(borderInside.x - dashRect.x) / float(dashRect.width); - currRect.width = currRect.width - (borderInside.x - currRect.x); - currRect.x = borderInside.x; - } - - //draw if necessary - if (bSolid) { - aContext.FillRect(currRect); - } - - //setup for next iteration - if (over == 0.0f) { - bSolid = PRBool(!bSolid); - } - dashRect.x = dashRect.x - currRect.width; - currRect = dashRect; - } - break; - } - } - skippedSide = PR_FALSE; - } -} - -// XXX improve this to constrain rendering to the damaged area -void nsCSSRendering::PaintBorder(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - nsIFrame* aForFrame, - const nsRect& aDirtyRect, - const nsRect& aBounds, - const nsStyleSpacing& aStyle, - PRIntn aSkipSides) -{ - PRIntn cnt; - nsMargin border; - PRBool printing = nsGlobalVariables::Instance()->GetPrinting(&aPresContext); - - aStyle.CalcBorderFor(aForFrame, border); - if ((0 == border.left) && (0 == border.right) && - (0 == border.top) && (0 == border.bottom)) { - // Empty border area - return; - } - - - nsRect inside(0, 0, aBounds.width, aBounds.height); - nsRect outside(inside); - outside.Deflate(border); - - //see if any sides are dotted or dashed - for (cnt = 0; cnt < 4; cnt++) { - if ((aStyle.mBorderStyle[cnt] == NS_STYLE_BORDER_STYLE_DOTTED) || - (aStyle.mBorderStyle[cnt] == NS_STYLE_BORDER_STYLE_DASHED)) { - break; - } - } - if (cnt < 4) { - // Draw the dashed/dotted lines first - DrawDashedSides(cnt, aRenderingContext, aStyle.mBorderStyle, - aStyle.mBorderColor, inside, outside, - aSkipSides); - } - - // Draw all the other sides - nscoord twipsPerPixel = (nscoord)aPresContext.GetPixelsToTwips(); - - if (0 == (aSkipSides & (1<GetImage(image), (nsnull == image))) { - NS_IF_RELEASE(loader); - // Redraw will happen later - if (0 == (aColor.mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT)) { - aRenderingContext.SetColor(aColor.mBackgroundColor); - aRenderingContext.FillRect(0, 0, aBounds.width, aBounds.height); - } - return; - } - loader->GetSize(imageSize); - NS_RELEASE(loader); - -#if XXX - // XXX enable this code as soon as nsIImage can support it - if (image->NeedsBlend()) { - if (0 == (aColor.mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT)) { - aRenderingContext.SetColor(aColor.mBackgroundColor); - aRenderingContext.FillRect(0, 0, aBounds.width, aBounds.height); - } - } -#endif - - // Convert image dimensions into nscoord's - float p2t = aPresContext.GetPixelsToTwips(); - nscoord tileWidth = nscoord(p2t * imageSize.width); - nscoord tileHeight = nscoord(p2t * imageSize.height); - - PRIntn repeat = aColor.mBackgroundRepeat; - PRIntn xcount, ycount; - switch (aColor.mBackgroundRepeat) { - case NS_STYLE_BG_REPEAT_OFF: - default: - xcount = 0; - ycount = 0; - break; - case NS_STYLE_BG_REPEAT_X: - xcount = (tileWidth == 0) ? 0 : (PRIntn) (aBounds.width / tileWidth); - ycount = 0; - break; - case NS_STYLE_BG_REPEAT_Y: - xcount = 0; - ycount = (tileHeight == 0) ? 0 : (PRIntn) (aBounds.height / tileHeight); - break; - case NS_STYLE_BG_REPEAT_XY: - xcount = (tileWidth == 0) ? 0 : (PRIntn) (aBounds.width / tileWidth); - ycount = (tileHeight == 0) ? 0 : (PRIntn) (aBounds.height / tileHeight); - break; - } - - // Tile the background - nscoord xpos = 0, ypos = 0; - nscoord xpos0 = 0; -#if XXX - // XXX support offset positioning - PRIntn xPos = aColor.mBackgroundXPosition; - PRIntn yPos = aColor.mBackgroundXPosition; -#endif - aRenderingContext.PushState(); - aRenderingContext.SetClipRect(aDirtyRect, nsClipCombine_kIntersect); - PRIntn x, y; - for (y = 0; y <= ycount; ++y, ypos += tileHeight) { - for (x = 0, xpos = xpos0; x <= xcount; ++x, xpos += tileWidth) { - aRenderingContext.DrawImage(image, xpos, ypos); - } - } - aRenderingContext.PopState(); - } else { - if (0 == (aColor.mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT)) { - // XXX This step can be avoided if we have an image and it doesn't - // have any transparent pixels and the image is tiled in both - // the x and the y - aRenderingContext.SetColor(aColor.mBackgroundColor); - aRenderingContext.FillRect(0, 0, aBounds.width, aBounds.height); - } - } -} diff --git a/mozilla/layout/base/nsCSSRendering.h b/mozilla/layout/base/nsCSSRendering.h deleted file mode 100644 index b3d0f5816b6..00000000000 --- a/mozilla/layout/base/nsCSSRendering.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsCSSRendering_h___ -#define nsCSSRendering_h___ - -#include "nsIRenderingContext.h" -#include "nsIStyleContext.h" -struct nsPoint; - -class nsCSSRendering { -public: - /** - * Render the border for an element using css rendering rules - * for borders. aSkipSides is a bitmask of the sides to skip - * when rendering. If 0 then no sides are skipped. - */ - static void PaintBorder(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - nsIFrame* aForFrame, - const nsRect& aDirtyRect, - const nsRect& aBounds, - const nsStyleSpacing& aStyle, - PRIntn aSkipSides); - - /** - * Render the background for an element using css rendering rules - * for backgrounds. - */ - static void PaintBackground(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - nsIFrame* aForFrame, - const nsRect& aDirtyRect, - const nsRect& aBounds, - const nsStyleColor& aColor); - - /** - * Special method to brighten a Color and have it shift to white when - * fully saturated. - */ - static nscolor Brighten(nscolor inColor); - - /** - * Special method to darken a Color and have it shift to black when - * darkest component underflows - */ - static nscolor Darken(nscolor inColor); - - // Weird color computing code stolen from winfe which was stolen - // from the xfe which was written originally by Eric Bina. So there. - static void Get3DColors(nscolor aResult[2], nscolor aColor); - static const int RED_LUMINOSITY; - static const int GREEN_LUMINOSITY; - static const int BLUE_LUMINOSITY; - static const int INTENSITY_FACTOR; - static const int LIGHT_FACTOR; - static const int LUMINOSITY_FACTOR; - static const int MAX_COLOR; - static const int COLOR_DARK_THRESHOLD; - static const int COLOR_LIGHT_THRESHOLD; - -protected: - static nscolor MakeBevelColor(PRIntn whichSide, PRUint8 style, - nscolor baseColor, - PRBool printing); - - static PRIntn MakeSide(nsPoint aPoints[], - nsIRenderingContext& aContext, - PRIntn whichSide, - const nsRect& outside, const nsRect& inside, - PRIntn borderPart, float borderFrac, - nscoord twipsPerPixel); - - static void DrawSide(nsIRenderingContext& aContext, - PRIntn whichSide, - const PRUint8 borderStyles[], - const nscolor borderColors[], - const nsRect& borderOutside, - const nsRect& borderInside, - PRBool printing, - nscoord twipsPerPixel); - - static void DrawDashedSides(PRIntn startSide, - nsIRenderingContext& aContext, - const PRUint8 borderStyles[], - const nscolor borderColors[], - const nsRect& borderOutside, - const nsRect& borderInside, - PRIntn aSkipSides); -}; - -#endif /* nsCSSRendering_h___ */ diff --git a/mozilla/layout/base/nsIPresShell.h b/mozilla/layout/base/nsIPresShell.h deleted file mode 100644 index 2c03346afc0..00000000000 --- a/mozilla/layout/base/nsIPresShell.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIPresShell_h___ -#define nsIPresShell_h___ - -#include "nslayout.h" -#include "nsISupports.h" -#include "nsCoord.h" -class nsIContent; -class nsIDocument; -class nsIDocumentObserver; -class nsIFrame; -class nsIPresContext; -class nsIStyleSet; -class nsIViewManager; -class nsIReflowCommand; -class nsIDeviceContext; - -#define NS_IPRESSHELL_IID \ -{ 0x76e79c60, 0x944e, 0x11d1, \ - {0x93, 0x23, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } - -/** - * Presentation shell interface. Presentation shells are the - * controlling point for managing the presentation of a document. The - * presentation shell holds a live reference to the document, the - * presentation context, the style manager, the style set and the root - * frame.

    - * - * When this object is Release'd, it will release the document, the - * presentation context, the style manager, the style set and the root - * frame. - */ -class nsIPresShell : public nsISupports { -public: - NS_IMETHOD Init(nsIDocument* aDocument, - nsIPresContext* aPresContext, - nsIViewManager* aViewManager, - nsIStyleSet* aStyleSet) = 0; - - virtual nsIDocument* GetDocument() = 0; - - virtual nsIPresContext* GetPresContext() = 0; - - virtual nsIViewManager * GetViewManager() = 0; - - virtual nsIStyleSet* GetStyleSet() = 0; - - NS_IMETHOD EnterReflowLock() = 0; - - NS_IMETHOD ExitReflowLock() = 0; - - // Make shell be a document observer - virtual void BeginObservingDocument() = 0; - - // Make shell stop being a document observer - virtual void EndObservingDocument() = 0; - - /** - * Reflow the frame model into a new width and height. The - * coordinates for aWidth and aHeight must be in standard nscoord's. - */ - virtual void ResizeReflow(nscoord aWidth, nscoord aHeight) = 0; - - virtual nsIFrame* GetRootFrame() = 0; - - virtual nsIFrame* FindFrameWithContent(nsIContent* aContent) = 0; - - virtual void AppendReflowCommand(nsIReflowCommand* aReflowCommand) = 0; - - virtual void ProcessReflowCommands() = 0; - - // XXX events - // XXX selection -}; - -/** - * Create a new empty presentation shell. Upon success, call Init - * before attempting to use the shell. - */ -extern NS_LAYOUT nsresult - NS_NewPresShell(nsIPresShell** aInstancePtrResult); - -#endif /* nsIPresShell_h___ */ diff --git a/mozilla/layout/base/nsPresContext.cpp b/mozilla/layout/base/nsPresContext.cpp deleted file mode 100644 index 15b4add6b32..00000000000 --- a/mozilla/layout/base/nsPresContext.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsPresContext.h" -#include "nsIPresShell.h" -#include "nsILinkHandler.h" -#include "nsIStyleSet.h" -#include "nsFrameImageLoader.h" -#include "nsIImageGroup.h" -#include "nsIFrame.h" -#include "nsIRenderingContext.h" -#include "nsEventStateManager.h" - -#define NOISY_IMAGES - -static NS_DEFINE_IID(kIPresContextIID, NS_IPRESCONTEXT_IID); - -nsPresContext::nsPresContext() - : mVisibleArea(0, 0, 0, 0), - mDefaultFont("Times", NS_FONT_STYLE_NORMAL, - NS_FONT_VARIANT_NORMAL, - NS_FONT_WEIGHT_NORMAL, - 0, - NS_POINTS_TO_TWIPS_INT(12)) -{ - NS_INIT_REFCNT(); - mShell = nsnull; - mDeviceContext = nsnull; - mImageGroup = nsnull; - mLinkHandler = nsnull; - mContainer = nsnull; - mEventManager = nsnull; - -#ifdef DEBUG - mInitialized = PR_FALSE; -#endif -} - -nsPresContext::~nsPresContext() -{ - mShell = nsnull; - - // XXX there is a race between an async notify and this code because - // the presentation shell code deletes the frame tree first and then - // deletes us. We need an "Deactivation" hook for this code too - - // Release all the image loaders - PRInt32 n = mImageLoaders.Count(); - for (PRInt32 i = 0; i < n; i++) { - nsIFrameImageLoader* loader; - loader = (nsIFrameImageLoader*) mImageLoaders.ElementAt(i); - NS_RELEASE(loader); - } - - // XXX Tell the image library we are done with the cached images? - - if (nsnull != mImageGroup) { - /*XXX mImageGroup->Interrupt(); required? */ - NS_RELEASE(mImageGroup); - } - - NS_IF_RELEASE(mLinkHandler); - NS_IF_RELEASE(mContainer); - NS_IF_RELEASE(mEventManager); - NS_IF_RELEASE(mDeviceContext); -} - -nsrefcnt -nsPresContext::AddRef(void) -{ - return ++mRefCnt; -} - -nsrefcnt -nsPresContext::Release(void) -{ - NS_PRECONDITION(0 != mRefCnt, "bad refcnt"); - if (--mRefCnt == 0) { - delete this; - return 0; - } - return mRefCnt; -} - -NS_IMPL_QUERY_INTERFACE(nsPresContext, kIPresContextIID); - -nsresult -nsPresContext::Init(nsIDeviceContext* aDeviceContext) -{ - NS_ASSERTION(!(mInitialized == PR_TRUE), "attempt to reinit pres context"); - - mDeviceContext = aDeviceContext; - NS_IF_ADDREF(mDeviceContext); - -#ifdef DEBUG - mInitialized = PR_TRUE; -#endif - - return NS_OK; -} - -// Note: We don't hold a reference on the shell; it has a reference to -// us -void -nsPresContext::SetShell(nsIPresShell* aShell) -{ - mShell = aShell; -} - -nsIPresShell* -nsPresContext::GetShell() -{ - NS_IF_ADDREF(mShell); - return mShell; -} - -nsIStyleContext* -nsPresContext::ResolveStyleContextFor(nsIContent* aContent, - nsIFrame* aParentFrame, - PRBool aForceUnique) -{ - nsIStyleContext* result = nsnull; - - nsIStyleSet* set = mShell->GetStyleSet(); - if (nsnull != set) { - result = set->ResolveStyleFor(this, aContent, aParentFrame, aForceUnique); - NS_RELEASE(set); - } - - return result; -} - -nsIStyleContext* -nsPresContext::ResolvePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique) -{ - nsIStyleContext* result = nsnull; - - nsIStyleSet* set = mShell->GetStyleSet(); - if (nsnull != set) { - result = set->ResolvePseudoStyleFor(this, aPseudoTag, aParentFrame, aForceUnique); - NS_RELEASE(set); - } - - return result; -} - -nsIStyleContext* -nsPresContext::ProbePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique) -{ - nsIStyleContext* result = nsnull; - - nsIStyleSet* set = mShell->GetStyleSet(); - if (nsnull != set) { - result = set->ProbePseudoStyleFor(this, aPseudoTag, aParentFrame, aForceUnique); - NS_RELEASE(set); - } - - return result; -} - -nsIFontMetrics* -nsPresContext::GetMetricsFor(const nsFont& aFont) -{ - if (nsnull != mDeviceContext) - return mDeviceContext->GetMetricsFor(aFont); - return nsnull; -} - -const nsFont& -nsPresContext::GetDefaultFont(void) -{ - return mDefaultFont; -} - -void -nsPresContext::GetVisibleArea(nsRect& aResult) -{ - aResult = mVisibleArea; -} - -void -nsPresContext::SetVisibleArea(const nsRect& r) -{ - mVisibleArea = r; -} - -float -nsPresContext::GetPixelsToTwips() const -{ - if (nsnull != mDeviceContext) { - return mDeviceContext->GetDevUnitsToAppUnits(); - } - return 1.0f; -} - -float -nsPresContext::GetTwipsToPixels() const -{ - if (nsnull != mDeviceContext) { - return mDeviceContext->GetAppUnitsToDevUnits(); - } - return 1.0f; -} - -nsIDeviceContext* -nsPresContext::GetDeviceContext() const -{ - NS_IF_ADDREF(mDeviceContext); - return mDeviceContext; -} - -NS_METHOD -nsPresContext::GetImageGroup(nsIImageGroup*& aGroupResult) -{ - if (nsnull == mImageGroup) { - // Create image group - nsresult rv = NS_NewImageGroup(&mImageGroup); - if (NS_OK != rv) { - return rv; - } - - // Initialize the image group - nsIWidget* window; - nsIFrame* rootFrame; - rootFrame = mShell->GetRootFrame(); - rootFrame->GetWindow(window); - nsIRenderingContext* drawCtx = window->GetRenderingContext(); - drawCtx->Scale(mDeviceContext->GetAppUnitsToDevUnits(), - mDeviceContext->GetAppUnitsToDevUnits()); - rv = mImageGroup->Init(drawCtx); - NS_RELEASE(drawCtx); - NS_RELEASE(window); - if (NS_OK != rv) { - return rv; - } - } - aGroupResult = mImageGroup; - NS_IF_ADDREF(mImageGroup); - return NS_OK; -} - -NS_METHOD -nsPresContext::LoadImage(const nsString& aURL, - nsIFrame* aTargetFrame, - PRBool aNeedSizeUpdate, - nsIFrameImageLoader*& aLoaderResult) -{ - aLoaderResult = nsnull; - - // Lookup image request in our loaders array. Note that we need - // to get a loader that is observing the same image and that has - // the same value for aNeedSizeUpdate. - PRInt32 i, n = mImageLoaders.Count(); - nsIFrameImageLoader* loader; - nsAutoString loaderURL; - for (i = 0; i < n; i++) { - loader = (nsIFrameImageLoader*) mImageLoaders.ElementAt(i); - nsIFrame* targetFrame; - loader->GetTargetFrame(targetFrame); - if (targetFrame == aTargetFrame) { - loader->GetURL(loaderURL); - // XXX case doesn't matter for all of the url so using Equals - // isn't quite right - if (aURL.Equals(loaderURL)) { - // Make sure the size update flags are the same, if not keep looking - PRIntn status; - loader->GetImageLoadStatus(status); - PRBool wantSize = 0 != (status & NS_IMAGE_LOAD_STATUS_SIZE_REQUESTED); - if (aNeedSizeUpdate == wantSize) { - NS_ADDREF(loader); - aLoaderResult = loader; - return NS_OK; - } - } - } - } - - // Create image group if needed - nsresult rv; - if (nsnull == mImageGroup) { - nsIImageGroup* group; - rv = GetImageGroup(group); - if (NS_OK != rv) { - return rv; - } - NS_RELEASE(group); - } - - // We haven't seen that image before. Create a new loader and - // start it going. - rv = NS_NewFrameImageLoader(&loader); - if (NS_OK != rv) { - return rv; - } - mImageLoaders.AppendElement(loader); - - // Return new loader - NS_ADDREF(loader); - - rv = loader->Init(this, mImageGroup, aURL, aTargetFrame, aNeedSizeUpdate); - if (NS_OK != rv) { - return rv; - } - aLoaderResult = loader; - return NS_OK; -} - -NS_METHOD -nsPresContext::StopLoadImage(nsIFrame* aForFrame) -{ - nsIFrameImageLoader* loader; - PRInt32 i, n = mImageLoaders.Count(); - for (i = 0; i < n;) { - loader = (nsIFrameImageLoader*) mImageLoaders.ElementAt(i); - nsIFrame* loaderFrame; - loader->GetTargetFrame(loaderFrame); - if (loaderFrame == aForFrame) { - loader->StopImageLoad(); - NS_RELEASE(loader); - mImageLoaders.RemoveElementAt(i); - n--; - continue; - } - i++; - } - return NS_OK; -} - -NS_IMETHODIMP -nsPresContext::SetLinkHandler(nsILinkHandler* aHandler) -{ // XXX should probably be a WEAK reference - NS_IF_RELEASE(mLinkHandler); - mLinkHandler = aHandler; - NS_IF_ADDREF(aHandler); - return NS_OK; -} - -NS_IMETHODIMP -nsPresContext::GetLinkHandler(nsILinkHandler** aResult) -{ - NS_PRECONDITION(nsnull != aResult, "null ptr"); - if (nsnull == aResult) { - return NS_ERROR_NULL_POINTER; - } - *aResult = mLinkHandler; - NS_IF_ADDREF(mLinkHandler); - return NS_OK; -} - -NS_IMETHODIMP -nsPresContext::SetContainer(nsISupports* aHandler) -{ // XXX should most likely be a WEAK reference - NS_IF_RELEASE(mContainer); - mContainer = aHandler; - NS_IF_ADDREF(aHandler); - return NS_OK; -} - -NS_IMETHODIMP -nsPresContext::GetContainer(nsISupports** aResult) -{ - NS_PRECONDITION(nsnull != aResult, "null ptr"); - if (nsnull == aResult) { - return NS_ERROR_NULL_POINTER; - } - *aResult = mContainer; - NS_IF_ADDREF(mContainer); - return NS_OK; -} - -NS_METHOD -nsPresContext::GetEventStateManager(nsIEventStateManager** aManager) -{ - NS_PRECONDITION(nsnull != aManager, "null ptr"); - if (nsnull == aManager) { - return NS_ERROR_NULL_POINTER; - } - - if (nsnull == mEventManager) { - nsresult rv = NS_NewEventStateManager(&mEventManager); - if (NS_OK != rv) { - return rv; - } - } - - *aManager = mEventManager; - NS_IF_ADDREF(mEventManager); - return NS_OK; -} - diff --git a/mozilla/layout/base/nsPresContext.h b/mozilla/layout/base/nsPresContext.h deleted file mode 100644 index ec58c5125f9..00000000000 --- a/mozilla/layout/base/nsPresContext.h +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIPresContext_h___ -#define nsIPresContext_h___ - -#include "nslayout.h" -#include "nsISupports.h" -#include "nsRect.h" - -struct nsFont; - -class nsIContent; -class nsIDeviceContext; -class nsIFontMetrics; -class nsIFrame; -class nsIFrameImageLoader; -class nsIImageGroup; -class nsILinkHandler; -class nsIPresShell; -class nsIStyleContext; -class nsIAtom; -class nsString; -class nsIEventStateManager; - -#define NS_IPRESCONTEXT_IID \ -{ 0x0a5d12e0, 0x944e, 0x11d1, \ - {0x93, 0x23, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } - - -// An interface for presentation contexts. Presentation contexts are -// objects that provide an outer context for a presentation shell. -class nsIPresContext : public nsISupports { -public: - /** - * Initialize the presentation context from a particular device. - */ - virtual nsresult Init(nsIDeviceContext* aDeviceContext) = 0; - - /** - * Set the presentation shell that this context is bound to. - * A presentation context may only be bound to a single shell. - */ - virtual void SetShell(nsIPresShell* aShell) = 0; - - /** - * Get the PresentationShell that this context is bound to. - */ - virtual nsIPresShell* GetShell() = 0; - - /** - * Resolve style for the given piece of content that will be a child - * of the aParentFrame frame. Don't use this for pseudo frames. - */ - virtual nsIStyleContext* ResolveStyleContextFor(nsIContent* aContent, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - - /** - * Resolve style for a pseudo frame within the given aParentFrame frame. - * The tag should be uppercase and inclue the colon. - * ie: NS_NewAtom(":FIRST-LINE"); - */ - virtual nsIStyleContext* ResolvePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - - /** - * Probe style for a pseudo frame within the given aParentFrame frame. - * This will return nsnull id there are no explicit rules for the pseudo element. - * The tag should be uppercase and inclue the colon. - * ie: NS_NewAtom(":FIRST-LINE"); - */ - virtual nsIStyleContext* ProbePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - /** - * Get the font metrics for a given font. - */ - virtual nsIFontMetrics* GetMetricsFor(const nsFont& aFont) = 0; - - /** - * Get the default font - */ - virtual const nsFont& GetDefaultFont(void) = 0; - - NS_IMETHOD GetImageGroup(nsIImageGroup*& aGroupResult) = 0; - - /** - * Load an image for the target frame. This call can be made - * repeated with only a single image every being loaded. If - * aNeedSizeUpdate is PR_TRUE then when the image's size is - * determined the target frame will be reflowed (via a - * ContentChanged notification on the presentation shell). When the - * image's data is ready for rendering the target frames Paint - * method will be invoked (via the ViewManager so that the - * appropriate damage repair is done). - */ - NS_IMETHOD LoadImage(const nsString& aURL, - nsIFrame* aTargetFrame, - PRBool aNeedSizeUpdate, - nsIFrameImageLoader*& aLoader) = 0; - - /** - * Stop any image loading being done on behalf of the argument frame. - */ - NS_IMETHOD StopLoadImage(nsIFrame* aForFrame) = 0; - - NS_IMETHOD SetContainer(nsISupports* aContainer) = 0; - - NS_IMETHOD GetContainer(nsISupports** aResult) = 0; - - NS_IMETHOD SetLinkHandler(nsILinkHandler* aHandler) = 0; - - NS_IMETHOD GetLinkHandler(nsILinkHandler** aResult) = 0; - - /** - * Get the currently visible portion of the RootContent ILayoutable. - * The units returned are in pixels. An acceptable answer is "null" - * which means "I don't know". - *

    Speculative

    - */ - virtual void GetVisibleArea(nsRect& aResult) = 0; - - /** - * Set the currently visible area. This is the size and location - * of the visible portion of the RootContent ILayoutable. - */ - virtual void SetVisibleArea(const nsRect& r) = 0; - - /** - * Return true if this presentation context is a paginated - * context. - */ - virtual PRBool IsPaginated() = 0; - - /** - * Return the page width if this is a paginated context. - */ - virtual nscoord GetPageWidth() = 0; - - /** - * Return the page height if this is a paginated context - */ - virtual nscoord GetPageHeight() = 0; - - virtual float GetPixelsToTwips() const = 0; - virtual float GetTwipsToPixels() const = 0; - - //be sure to Relase() after you are done with the Get() - virtual nsIDeviceContext * GetDeviceContext() const = 0; - - NS_IMETHOD GetEventStateManager(nsIEventStateManager** aManager) = 0; -}; - -// Bit values for LoadImage's aImageStatus -#define NS_LOAD_IMAGE_STATUS_ERROR 0x1 -#define NS_LOAD_IMAGE_STATUS_SIZE 0x2 -#define NS_LOAD_IMAGE_STATUS_BITS 0x4 - -// Factory method to create a "galley" presentation context (galley is -// a kind of view that has no limit to the size of a page) -extern NS_LAYOUT nsresult - NS_NewGalleyContext(nsIPresContext** aInstancePtrResult); - -// Factory method to create a "paginated" presentation context for -// the screen. -extern NS_LAYOUT nsresult - NS_NewPrintPreviewContext(nsIPresContext** aInstancePtrResult); - -#endif /* nsIPresContext_h___ */ diff --git a/mozilla/layout/base/public/MANIFEST b/mozilla/layout/base/public/MANIFEST deleted file mode 100644 index 86cd2a4342b..00000000000 --- a/mozilla/layout/base/public/MANIFEST +++ /dev/null @@ -1,24 +0,0 @@ -# -# This is a list of local files which get copied to the mozilla:dist:layout directory -# -nslayout.h -nsIContent.h -nsIContentDelegate.h -nsIDocument.h -nsIDocumentContainer.h -nsIDocumentObserver.h -nsIFrame.h -nsIFrameImageLoader.h -nsIPresContext.h -nsIPresShell.h -nsIReflowCommand.h -nsIRunaround.h -nsISelection.h -nsISpaceManager.h -nsStyleCoord.h -nsStyleStruct.h -nsIStyleContext.h -nsIStyleRule.h -nsIStyleSet.h -nsIStyleSheet.h -nsITextContent.h diff --git a/mozilla/layout/base/public/Makefile b/mozilla/layout/base/public/Makefile deleted file mode 100644 index 7ee095837d6..00000000000 --- a/mozilla/layout/base/public/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../../.. - -MODULE = raptor - -EXPORTS = \ - nslayout.h \ - nsIContent.h \ - nsIContentDelegate.h \ - nsIDocument.h \ - nsIDocumentContainer.h \ - nsIDocumentObserver.h \ - nsIFrame.h \ - nsIFrameImageLoader.h \ - nsIPresContext.h \ - nsIPresShell.h \ - nsIReflowCommand.h \ - nsIRunaround.h \ - nsISelection.h \ - nsISpaceManager.h \ - nsStyleCoord.h \ - nsStyleStruct.h \ - nsIStyleContext.h \ - nsIStyleRule.h \ - nsIStyleSet.h \ - nsIStyleSheet.h \ - nsITextContent.h \ - $(NULL) - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/base/public/makefile.win b/mozilla/layout/base/public/makefile.win deleted file mode 100644 index 94293acd8c7..00000000000 --- a/mozilla/layout/base/public/makefile.win +++ /dev/null @@ -1,47 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. - -EXPORTS = \ - nslayout.h \ - nsIContent.h \ - nsIContentDelegate.h \ - nsIDocument.h \ - nsIDocumentContainer.h \ - nsIDocumentObserver.h \ - nsIFrame.h \ - nsIFrameImageLoader.h \ - nsIPresContext.h \ - nsIPresShell.h \ - nsIReflowCommand.h \ - nsIRunaround.h \ - nsISelection.h \ - nsISpaceManager.h \ - nsStyleCoord.h \ - nsStyleStruct.h \ - nsIStyleContext.h \ - nsIStyleRule.h \ - nsIStyleSet.h \ - nsIStyleSheet.h \ - nsITextContent.h \ - $(NULL) - -MODULE=raptor - -include <$(DEPTH)\layout\config\rules.mak> - diff --git a/mozilla/layout/base/public/nsIContent.h b/mozilla/layout/base/public/nsIContent.h deleted file mode 100644 index d6a5027bd7a..00000000000 --- a/mozilla/layout/base/public/nsIContent.h +++ /dev/null @@ -1,141 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIContent_h___ -#define nsIContent_h___ - -#include -#include "nslayout.h" -#include "nsISupports.h" -#include "nsGUIEvent.h" -class nsIAtom; -class nsIContentDelegate; -class nsIDocument; -class nsIPresContext; -class nsISizeOfHandler; -class nsString; -class nsString; -class nsVoidArray; -class nsIDOMEvent; - -// IID for the nsIContent interface -#define NS_ICONTENT_IID \ -{ 0x78030220, 0x9447, 0x11d1, \ - {0x93, 0x23, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } - -/** - * Content attribute states - */ -enum nsContentAttr { - // Attribute does not exist on the piece of content - eContentAttr_NotThere, - - // Attribute exists, but has no value, e.g. "BORDER" in - eContentAttr_NoValue, - - // Attribute exists and has a value. However, value may be the - // empty string. e.g.
    or
    - eContentAttr_HasValue -}; - -// A node of content in a documents content model. This interface -// is supported by all content objects. -class nsIContent : public nsISupports -{ -public: - NS_IMETHOD GetDocument(nsIDocument*& aResult) const = 0; - virtual void SetDocument(nsIDocument* aDocument) = 0; - - virtual nsIContent* GetParent() const = 0; - virtual void SetParent(nsIContent* aParent) = 0; - - virtual PRBool CanContainChildren() const = 0; - virtual PRInt32 ChildCount() const = 0; - virtual nsIContent* ChildAt(PRInt32 aIndex) const = 0; - virtual PRInt32 IndexOf(nsIContent* aPossibleChild) const = 0; - - NS_IMETHOD InsertChildAt(nsIContent* aKid, - PRInt32 aIndex, - PRBool aNotify) = 0; - - NS_IMETHOD ReplaceChildAt(nsIContent* aKid, - PRInt32 aIndex, - PRBool aNotify) = 0; - - NS_IMETHOD AppendChild(nsIContent* aKid, - PRBool aNotify) = 0; - - NS_IMETHOD RemoveChildAt(PRInt32 aIndex, - PRBool aNotify) = 0; - - /** - * Test and see if this piece of content is synthetic. Synthetic content - * is content generated stylistically and should normally be ignored - * during content saving. - */ - NS_IMETHOD IsSynthetic(PRBool& aResult) = 0; - - virtual nsIAtom* GetTag() const = 0; - - /** - * Set attribute values. All attribute values are assumed to have a - * canonical String representation that can be used for these - * methods. The setAttribute method is assumed to perform a translation - * of the canonical form into the underlying content specific - * form. - * - * aValue may legitimately be the empty string. - */ - virtual void SetAttribute(const nsString& aName, const nsString& aValue) = 0; - - /** - * Get the current value of the attribute. This returns a form that is - * suitable for passing back into setAttribute. - * - *
      - * - *
    • If the attribute is not set and has no default value, return - * eContentAttr_NotThere. - * - *
    • If the attribute exists, but has no value, return - * eContentAttr_NoValue. - * - *
    • If the attribute has a value, empty or otherwise, set ret to - * be the value, and return eContentAttr_HasValue. - * - *
    */ - virtual nsContentAttr GetAttribute(const nsString& aName, - nsString& aResult) const = 0; - - virtual nsIContentDelegate* GetDelegate(nsIPresContext* aCX) = 0; - - virtual void List(FILE* out = stdout, PRInt32 aIndent = 0) const = 0; - - /** - * Add this object's size information to the sizeof handler and - * any objects that it can reach. - */ - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const = 0; - - NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus) = 0; - -}; - -#endif /* nsIContent_h___ */ diff --git a/mozilla/layout/base/public/nsIContentDelegate.h b/mozilla/layout/base/public/nsIContentDelegate.h deleted file mode 100644 index f0cf8643ba5..00000000000 --- a/mozilla/layout/base/public/nsIContentDelegate.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIContentDelegate_h___ -#define nsIContentDelegate_h___ - -#include "nslayout.h" -class nsIFrame; -class nsIPresContext; -class nsIStyleContext; - -#define NS_ICONTENTDELEGATE_IID \ - { 0x0f135ce0, 0xa286, 0x11d1, \ - {0x89, 0x73, 0x00, 0x60, 0x08, 0x91, 0x1b, 0x81} } - -/** - * API for content delegation. Content objects create these objects to - * provide hooks to creating their visual presentation. - */ -class nsIContentDelegate : public nsISupports { -public: - /** - * Create a new frame object that will be responsible for the layout - * and presentation of the content. - */ - NS_IMETHOD CreateFrame(nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aFrame) = 0; -}; - -#endif /* nsIContentDelegate_h___ */ diff --git a/mozilla/layout/base/public/nsIDocument.h b/mozilla/layout/base/public/nsIDocument.h deleted file mode 100644 index 1ba93e5ffa7..00000000000 --- a/mozilla/layout/base/public/nsIDocument.h +++ /dev/null @@ -1,213 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIDocument_h___ -#define nsIDocument_h___ - -#include "nslayout.h" -#include "nsISupports.h" -#include "nsIUnicharInputStream.h" -#include "nsGUIEvent.h" - -class nsIArena; -class nsIContent; -class nsIDocumentContainer; -class nsIDocumentObserver; -class nsIPresContext; -class nsIPresShell; -class nsISelection; -class nsIStreamListener; -class nsIStreamObserver; -class nsIStyleSet; -class nsIStyleSheet; -class nsIURL; -class nsIViewManager; -class nsString; -class nsIScriptContextOwner; -class nsIWebWidget; -class nsIDOMEvent; -class nsIDeviceContext; - -// IID for the nsIDocument interface -#define NS_IDOCUMENT_IID \ -{ 0x94c6ceb0, 0x9447, 0x11d1, \ - {0x93, 0x23, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } - -// specification for data to be sent via form "post" -// IID for the nsIPostData interface - 152ab6e0-ff13-11d1-beb9-00805f8a66dc -#define NS_IPOSTDATA_IID \ -{ 0x152ab6e0, 0xff13, 0x11d1, \ - {0xbe, 0xb9, 0x00, 0x80, 0x5f, 0x8a, 0x66, 0xdc} } - -class nsIPostData : public nsISupports { -public: - virtual PRBool IsFile() = 0; // is the data a file (or raw data) - virtual const char* GetData() = 0; // get the file name or raw data - virtual PRInt32 GetDataLength() = 0; -}; - -//---------------------------------------------------------------------- - -// Document interface -class nsIDocument : public nsISupports { -public: - // All documents have a memory arena associated with them which is - // used for memory allocation during document creation. This call - // returns the arena associated with this document. - virtual nsIArena* GetArena() = 0; - - NS_IMETHOD StartDocumentLoad(nsIURL *aUrl, - nsIWebWidget* aWebWidget, - nsIStreamListener **aDocListener) = 0; - - /** - * Return the title of the document. May return null. - */ - virtual const nsString* GetDocumentTitle() const = 0; - - /** - * Return the URL for the document. May return null. - */ - virtual nsIURL* GetDocumentURL() const = 0; - - /** - * Return a standard name for the document's character set. This will - * trigger a startDocumentLoad if necessary to answer the question. - */ - virtual nsCharSetID GetDocumentCharacterSet() const = 0; - virtual void SetDocumentCharacterSet(nsCharSetID aCharSetID) = 0; - - /** - * Create a new presentation shell that will use aContext for - * it's presentation context (presentation context's must not be - * shared among multiple presentation shell's). - */ - virtual nsresult CreateShell(nsIPresContext* aContext, - nsIViewManager* aViewManager, - nsIStyleSet* aStyleSet, - nsIPresShell** aInstancePtrResult) = 0; - virtual PRBool DeleteShell(nsIPresShell* aShell) = 0; - virtual PRInt32 GetNumberOfShells() = 0; - virtual nsIPresShell* GetShellAt(PRInt32 aIndex) = 0; - - /** - * Return the parent document of this document. Will return null - * unless this document is within a compound document and has a parent. - */ - virtual nsIDocument* GetParentDocument() = 0; - virtual void SetParentDocument(nsIDocument* aParent) = 0; - virtual void AddSubDocument(nsIDocument* aSubDoc) = 0; - virtual PRInt32 GetNumberOfSubDocuments() = 0; - virtual nsIDocument* GetSubDocumentAt(PRInt32 aIndex) = 0; - - /** - * Return the root content object for this document. - */ - virtual nsIContent* GetRootContent() = 0; - virtual void SetRootContent(nsIContent* aRoot) = 0; - - /** - * Get the style sheets owned by this document. - */ - virtual PRInt32 GetNumberOfStyleSheets() = 0; - virtual nsIStyleSheet* GetStyleSheetAt(PRInt32 aIndex) = 0; - virtual void AddStyleSheet(nsIStyleSheet* aSheet) = 0; - - /** - * Set the object from which a document can get a script context. - * This is the context within which all scripts (during document - * creation and during event handling) will run. - */ - virtual nsIScriptContextOwner *GetScriptContextOwner() = 0; - virtual void SetScriptContextOwner(nsIScriptContextOwner *aScriptContextOwner) = 0; - - //---------------------------------------------------------------------- - - // Document notification API's - - /** - * Add a new observer of document change notifications. Whenever - * content is changed, appended, inserted or removed the observers are - * informed. - */ - virtual void AddObserver(nsIDocumentObserver* aObserver) = 0; - - /** - * Remove an observer of document change notifications. This will - * return false if the observer cannot be found. - */ - virtual PRBool RemoveObserver(nsIDocumentObserver* aObserver) = 0; - - // Observation hooks used by content nodes to propagate - // notifications to document observers. - NS_IMETHOD BeginLoad() = 0; - NS_IMETHOD EndLoad() = 0; - virtual void ContentChanged(nsIContent* aContent, - nsISupports* aSubContent) = 0; - - virtual void ContentAppended(nsIContent* aContainer) = 0; - - virtual void ContentInserted(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) = 0; - - virtual void ContentReplaced(nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInContainer) = 0; - - virtual void ContentWillBeRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) = 0; - - virtual void ContentHasBeenRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) = 0; - /** - * Returns the Selection Object - */ - virtual nsISelection * GetSelection() = 0; - - /** - * Selects all the Content - */ - virtual void SelectAll() = 0; - - /** - * Copies all text from the selection - */ - virtual void GetSelectionText(nsString & aText) = 0; - - NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus) = 0; - -}; - - -// XXX Belongs somewhere else -extern NS_LAYOUT nsresult - NS_NewHTMLDocument(nsIDocument** aInstancePtrResult); - -// Note: The buffer passed into NewPostData(...) becomes owned by the IPostData -// instance and is freed when the instance is destroyed... -// -extern NS_LAYOUT nsresult - NS_NewPostData(PRBool aIsFile, char *aData, nsIPostData** aInstancePtrResult); - -#endif /* nsIDocument_h___ */ diff --git a/mozilla/layout/base/public/nsIDocumentContainer.h b/mozilla/layout/base/public/nsIDocumentContainer.h deleted file mode 100644 index 96862447dc2..00000000000 --- a/mozilla/layout/base/public/nsIDocumentContainer.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIDocumentContainer_h___ -#define nsIDocumentContainer_h___ - -#include "nsISupports.h" -class nsIScriptable; -class nsIScriptEnvironment; -class nsIURL; - -#define NS_IDOCUMENT_CONTAINER_IID \ -{ 0x8efd4470, 0x944d, 0x11d1, \ - {0x93, 0x23, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } - -class nIDocumentContainer : public nsISupports { -public: - /** - * Display the specified URL with the given connection. - * - * @param url the URL to display - * @param connection the connection to use. - */ - virtual void Display(nsIURL* aURL) = 0; - - /** - * Returns a script environment for the specified language and version. - * The expectation is that the script environment already has been - * set up with a container object. If a script environment has already - * been requested for the given language, the same instance should - * be returned. - * - * @param language the scripting language for the environment. If this - * is null, returns the default scripting environment. - * @param majorVersion the major version number of the language - * @param minorVersion the minor version number of the language - * @return the script environment for the language - * @see mg.magellan.script.IScriptEnvrionment - */ - virtual nsIScriptEnvironment* - GetScriptEnvironment(nsString* aLanguage, - PRInt32 aMajorVersion, - PRInt32 aMinorVersion) = 0; - - /** - * Returns the scriptable container object for the document container. - * The scriptable object will be used as the scoping object in the - * definition of scriptable classes used in the Document Object Model. - * - * @return the scriptable container for the application - * @see mg.magellan.script.IScriptable - * @see mg.magellan.script.IScriptEnvrionment - */ - virtual nsIScriptable* GetScriptableContainer() = 0; -} - -#endif /* nsIDocumentContainer_h___ */ diff --git a/mozilla/layout/base/public/nsIDocumentObserver.h b/mozilla/layout/base/public/nsIDocumentObserver.h deleted file mode 100644 index aa8ce220cdf..00000000000 --- a/mozilla/layout/base/public/nsIDocumentObserver.h +++ /dev/null @@ -1,180 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIDocumentObserver_h___ -#define nsIDocumentObserver_h___ - -#include "nsISupports.h" -class nsIContent; -class nsIPresShell; -class nsIStyleSheet; -class nsString; - -#define NS_IDOCUMENT_OBSERVER_IID \ -{ 0xb3f92460, 0x944c, 0x11d1, {0x93, 0x23, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}} - -// Document observer interface -class nsIDocumentObserver : public nsISupports { -public: - /** - * This is called when the documents title has arrived. - */ - NS_IMETHOD SetTitle(const nsString& aTitle) = 0; - - /** - * Notify that a content model update is beginning. This call can be - * nested. - */ - NS_IMETHOD BeginUpdate() = 0; - - /** - * Notify that a content model update is finished. This call can be - * nested. - */ - NS_IMETHOD EndUpdate() = 0; - - /** - * Notify the observer that a document load is beginning. - */ - NS_IMETHOD BeginLoad() = 0; - - /** - * Notify the observer that a document load has finished. Note that - * the associated reflow of the document will be done before - * EndLoad is invoked, not after. - */ - NS_IMETHOD EndLoad() = 0; - - /** - * Notify the observer that the document is being reflowed in - * the given presentation shell. - */ - NS_IMETHOD BeginReflow(nsIPresShell* aShell) = 0; - - /** - * Notify the observer that the document is done being reflowed in - * the given presentation shell. - */ - NS_IMETHOD EndReflow(nsIPresShell* aShell) = 0; - - /** - * Notification that the content model has changed. This method is - * called automatically by content objects when their state is changed - * (therefore there is normally no need to invoke this method - * directly). The notification is passed to any - * IDocumentObservers. The notification is passed on to all of the - * document observers.

    - * - * This notification is not sent when a piece of content is - * added/removed from the document (the other notifications are used - * for that). - * - * @param aContent the piece of content that changed - * @param aSubContent subrange information about the piece of content - * that changed - */ - NS_IMETHOD ContentChanged(nsIContent* aContent, - nsISupports* aSubContent) = 0; - - /** - * Notifcation that the content model has had data appended to the - * given content object. This method is called automatically by the - * content container objects when a new content object is appended to - * the container (therefore there is normally no need to invoke this - * method directly). The notification is passed on to all of the - * document observers. - * - * @param aContainer the container that had a new child appended - */ - NS_IMETHOD ContentAppended(nsIContent* aContainer) = 0; - - /** - * Notification that content has been inserted. This method is called - * automatically by the content container objects when a new content - * object is inserted in the container (therefore there is normally no - * need to invoke this method directly). The notification is passed on - * to all of the document observers. - * - * @param aContainer the container that now contains aChild - * @param aChild the child that was inserted - * @param aIndexInContainer the index of the child in the container - */ - NS_IMETHOD ContentInserted(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) = 0; - - /** - * Notification that content has been replaced. This method is called - * automatically by the content container objects when a content object - * is replaced in the container (therefore there is normally no need to - * invoke this method directly). The notification is passed on to all - * of the document observers. - * - * @param aContainer the container that now contains aChild - * @param aOldChild the child that was replaced - * @param aNewChild the child that replaced aOldChild - * @param aIndexInContainer the index of the old and new child in the - * container - */ - NS_IMETHOD ContentReplaced(nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInContainer) = 0; - - /** - * Content is going to be removed immediately after this call. This - * method is called automatically by content container objects when a - * content object is about to be removed from the container (therefore - * there is normally no need to invoke this method directly). The - * notification is passed on to all of the document observers. - * - * @param aContainer the container that contains aChild - * @param aChild the child that will be removed - * @param aIndexInContainer the index of the child in the container - */ - NS_IMETHOD ContentWillBeRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) = 0; - - /** - * Content has just been removed. This method is called automatically - * by content container objects when a content object has just been - * removed from the container (therefore there is normally no need to - * invoke this method directly). The notification is passed on to all - * of the document observers. - * - * @param aContainer the container that had a child removed - * @param aChild the child that was just removed - * @param aIndexInContainer the index of the child in the container - * before it was removed - */ - NS_IMETHOD ContentHasBeenRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) = 0; - - /** - * A StyleSheet has just been added to the document. - * This method is called automatically when a StyleSheet gets added - * to the document. The notification is passed on to all of the - * document observers. - * - * @param aStyleSheet the StyleSheet that has been added - */ - NS_IMETHOD StyleSheetAdded(nsIStyleSheet* aStyleSheet) = 0; -}; - -#endif /* nsIDocumentObserver_h___ */ diff --git a/mozilla/layout/base/public/nsIFrame.h b/mozilla/layout/base/public/nsIFrame.h deleted file mode 100644 index 1c87fe134f1..00000000000 --- a/mozilla/layout/base/public/nsIFrame.h +++ /dev/null @@ -1,663 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIFrame_h___ -#define nsIFrame_h___ - -#include -#include "nslayout.h" -#include "nsISupports.h" -#include "nsSize.h" -#include "nsGUIEvent.h" -#include "nsStyleStruct.h" - -class nsIContent; -class nsIFrame; -class nsIPresContext; -class nsIPresShell; -class nsIRenderingContext; -class nsISizeOfHandler; -class nsISpaceManager; -class nsIStyleContext; -class nsIView; -class nsIWidget; -class nsIReflowCommand; - -struct nsPoint; -struct nsRect; -struct nsReflowMetrics; -struct nsStyleStruct; - -struct PRLogModuleInfo; - -// IID for the nsIFrame interface {12B193D0-9F70-11d1-8500-00A02468FAB6} -#define NS_IFRAME_IID \ -{ 0x12b193d0, 0x9f70, 0x11d1, \ - {0x85, 0x0, 0x0, 0xa0, 0x24, 0x68, 0xfa, 0xb6}} - -/** - * Reflow metrics used to return the frame's desired size and alignment - * information. - * - * @see #Reflow() - * @see #GetReflowMetrics() - */ -struct nsReflowMetrics { - nscoord width, height; // desired width and height - nscoord ascent, descent; - nsSize* maxElementSize; // null if you don't need to compute the max element size - - nsReflowMetrics(nsSize* aMaxElementSize) {maxElementSize = aMaxElementSize;} -}; - -/** - * Constant used to indicate an unconstrained size. - * - * @see #Reflow() - */ -#define NS_UNCONSTRAINEDSIZE NS_MAXSIZE - -enum nsReflowReason { - eReflowReason_Initial = 0, // initial reflow of a newly created frame - eReflowReason_Incremental = 1, // an incremental change has occured. see the reflow command for details - eReflowReason_Resize = 2 // general request to determine a desired size -}; - -/** - * Reflow state passed to a frame during reflow. The reflow states are linked - * together. The max size represents the available space on which to reflow - * your frame, and is computed as the parent frame's available content area - * minus any room for margins that your frame requests. - * - * @see #Reflow() - */ -struct nsReflowState { - nsReflowReason reason; // the reason for the reflow - nsIReflowCommand* reflowCommand; // only used for incremental changes - nsSize maxSize; // the available space in which to reflow - const nsReflowState* parentReflowState; // pointer to parent's reflow state - nsIFrame* frame; // the frame being reflowed - - // Constructs an initial reflow state (no parent reflow state) for a - // non-incremental reflow command - nsReflowState(nsIFrame* aFrame, - nsReflowReason aReason, - const nsSize& aMaxSize); - - // Constructs an initial reflow state (no parent reflow state) for an - // incremental reflow command - nsReflowState(nsIFrame* aFrame, - nsIReflowCommand& aReflowCommand, - const nsSize& aMaxSize); - - // Construct a reflow state for the given frame, parent reflow state, and - // max size. Uses the reflow reason and reflow command from the parent's - // reflow state - nsReflowState(nsIFrame* aFrame, - const nsReflowState& aParentReflowState, - const nsSize& aMaxSize); - - // Constructs a reflow state that overrides the reflow reason of the parent - // reflow state. Sets the reflow command to NULL - nsReflowState(nsIFrame* aFrame, - const nsReflowState& aParentReflowState, - const nsSize& aMaxSize, - nsReflowReason aReflowReason); -}; - -//---------------------------------------------------------------------- - -/** - * Reflow status returned by the reflow methods. - * - * NS_FRAME_NOT_COMPLETE bit flag means the frame does not map all its - * content, and that the parent frame should create a continuing frame. - * If this bit isn't set it means the frame does map all its content. - * - * NS_FRAME_REFLOW_NEXTINFLOW bit flag means that the next-in-flow is - * dirty, and also needs to be reflowed. This status only makes sense - * for a frame that is not complete, i.e. you wouldn't set both - * NS_FRAME_COMPLETE and NS_FRAME_REFLOW_NEXTINFLOW - * - * The low 8 bits of the nsReflowStatus are reserved for future extensions; - * the remaining 24 bits are zero (and available for extensions; however - * API's that accept/return nsReflowStatus must not receive/return any - * extension bits). - * - * @see #Reflow() - * @see #CreateContinuingFrame() - */ -typedef PRUint32 nsReflowStatus; - -#define NS_FRAME_COMPLETE 0 // Note: not a bit! -#define NS_FRAME_NOT_COMPLETE 0x1 -#define NS_FRAME_REFLOW_NEXTINFLOW 0x2 - -#define NS_FRAME_IS_COMPLETE(status) \ - (0 == ((status) & NS_FRAME_NOT_COMPLETE)) - -#define NS_FRAME_IS_NOT_COMPLETE(status) \ - (0 != ((status) & NS_FRAME_NOT_COMPLETE)) - -// This macro tests to see if an nsReflowStatus is an error value -// or just a regular return value -#define NS_IS_REFLOW_ERROR(_status) (PRInt32(_status) < 0) - -//---------------------------------------------------------------------- - -/** - * Indication of how the frame can be split. This is used when doing runaround - * of floaters, and when pulling up child frames from a next-in-flow. - * - * The choices are splittable, not splittable at all, and splittable in - * a non-rectangular fashion. This last type only applies to block-level - * elements, and indicates whether splitting can be used when doing runaround. - * If you can split across page boundaries, but you expect each continuing - * frame to be the same width then return frSplittable and not - * frSplittableNonRectangular. - * - * @see #IsSplittable() - */ -typedef PRUint32 nsSplittableType; - -#define NS_FRAME_NOT_SPLITTABLE 0 // Note: not a bit! -#define NS_FRAME_SPLITTABLE 0x1 -#define NS_FRAME_SPLITTABLE_NON_RECTANGULAR 0x3 - -#define NS_FRAME_IS_SPLITTABLE(type)\ - (0 != ((type) & NS_FRAME_SPLITTABLE)) - -#define NS_FRAME_IS_NOT_SPLITTABLE(type)\ - (0 == ((type) & NS_FRAME_SPLITTABLE)) - -//---------------------------------------------------------------------- - -/** - * Frame state bits. Any bits not listed here are reserved for future - * extensions, but must be stored by the frames. - */ -typedef PRUint32 nsFrameState; - -#define NS_FRAME_IN_REFLOW 0x00000001 - -// This bit is set when a frame is created. After it has been reflowed -// once (during the DidReflow with a finished state) the bit is -// cleared. -#define NS_FRAME_FIRST_REFLOW 0x00000002 - -//---------------------------------------------------------------------- - -/** - * DidReflow status values. - */ -typedef PRBool nsDidReflowStatus; - -#define NS_FRAME_REFLOW_NOT_FINISHED PR_FALSE -#define NS_FRAME_REFLOW_FINISHED PR_TRUE - -//---------------------------------------------------------------------- - -/** - * A frame in the layout model. This interface is supported by all frame - * objects. - * - * Frames are NOT reference counted. Use the DeleteFrame() member function - * to delete a frame - */ -class nsIFrame : private nsISupports -{ -public: - /** - * QueryInterface() defined in nsISupports. This is the only member - * function of nsISupports that is public. - */ - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr) = 0; - - /** - * Add this object's size information to the sizeof handler. Note that - * this does not add in the size of content, style, or view's - * (those are sized seperately). - */ - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const = 0; - - /** - * Deletes this frame and each of its child frames (recursively calls - * DeleteFrame() for each child) - */ - NS_IMETHOD DeleteFrame() = 0; - - /** - * Get the content object associated with this frame. Adds a reference to - * the content object so the caller must do a release. - * - * @see nsISupports#Release() - */ - NS_IMETHOD GetContent(nsIContent*& aContent) const = 0; - - /** - * Get the index in parent of the frame's content object - */ - NS_IMETHOD GetContentIndex(PRInt32& aIndexInParent) const = 0; - - /** - * Get the style context associated with this frame. Note that GetStyleContext() - * adds a reference to the style context so the caller must do a release. - * - * @see nsISupports#Release() - */ - NS_IMETHOD GetStyleContext(nsIPresContext* aContext, - nsIStyleContext*& aStyleContext) = 0; - NS_IMETHOD SetStyleContext(nsIPresContext* aPresContext, - nsIStyleContext* aContext) = 0; - - /** - * Get the style data associated with this frame - */ - NS_IMETHOD GetStyleData(nsStyleStructID aSID, const nsStyleStruct*& aStyleStruct) const = 0; - - /** - * Accessor functions for geometric and content parent. - */ - NS_IMETHOD GetContentParent(nsIFrame*& aParent) const = 0; - NS_IMETHOD SetContentParent(const nsIFrame* aParent) = 0; - NS_IMETHOD GetGeometricParent(nsIFrame*& aParent) const = 0; - NS_IMETHOD SetGeometricParent(const nsIFrame* aParent) = 0; - - /** - * Bounding rect of the frame. The values are in twips, and the origin is - * relative to the upper-left of the geometric parent. The size includes the - * content area, borders, and padding. - */ - NS_IMETHOD GetRect(nsRect& aRect) const = 0; - NS_IMETHOD GetOrigin(nsPoint& aPoint) const = 0; - NS_IMETHOD GetSize(nsSize& aSize) const = 0; - NS_IMETHOD SetRect(const nsRect& aRect) = 0; - NS_IMETHOD MoveTo(nscoord aX, nscoord aY) = 0; - NS_IMETHOD SizeTo(nscoord aWidth, nscoord aHeight) = 0; - - /** - * Child frame enumeration - */ - NS_IMETHOD ChildCount(PRInt32& aChildCount) const = 0; - NS_IMETHOD ChildAt(PRInt32 aIndex, nsIFrame*& aFrame) const = 0; - NS_IMETHOD IndexOf(const nsIFrame* aChild, PRInt32& aIndex) const = 0; - NS_IMETHOD FirstChild(nsIFrame*& aFirstChild) const = 0; - NS_IMETHOD NextChild(const nsIFrame* aChild, nsIFrame*& aNextChild) const = 0; - NS_IMETHOD PrevChild(const nsIFrame* aChild, nsIFrame*& aPrevChild) const = 0; - NS_IMETHOD LastChild(nsIFrame*& aLastChild) const = 0; - - /** - * Painting - */ - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) = 0; - - /** - * Handle an event. - */ - NS_IMETHOD HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus) = 0; - - /** - * Get the cursor for a given point in the frame tree. The - * call returns the desired cursor (or NS_STYLE_CURSOR_INHERIT if - * no cursor is wanted). In addition, if a cursor is desired - * then *aFrame is set to the frame that wants the cursor. - */ - NS_IMETHOD GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor) = 0; - - /** - * Get the current frame-state value for this frame. aResult is - * filled in with the state bits. The return value has no - * meaning. - */ - NS_IMETHOD GetFrameState(nsFrameState& aResult) = 0; - - /** - * Set the current frame-state value for this frame. The return - * value has no meaning. - */ - NS_IMETHOD SetFrameState(nsFrameState aNewState) = 0; - - /** - * Pre-reflow hook. Before a frame is incrementally reflowed or - * resize-reflowed this method will be called warning the frame of - * the impending reflow. This call may be invoked zero or more times - * before a subsequent DidReflow call. This method when called the - * first time will set the NS_FRAME_IN_REFLOW bit in the frame - * state bits. - */ - NS_IMETHOD WillReflow(nsIPresContext& aPresContext) = 0; - - /** - * The frame is given a maximum size and asked for its desired size. - * This is the frame's opportunity to reflow its children. - * - * @param aDesiredSize out parameter where you should return the - * desired size and ascent/descent info. You should include any - * space you want for border/padding in the desired size you return. - * - * It's okay to return a desired size that exceeds the max - * size if that's the smallest you can be, i.e. it's your - * minimum size. - * - * maxElementSize is an optional parameter for returning your - * maximum element size. If may be null in which case you - * don't have to compute a maximum element size. The - * maximum element size must be less than or equal to your - * desired size. - * - * @param aReflowState information about your reflow including the reason - * for the reflow and the available space in which to lay out. Each - * dimension of the available space can either be constrained or - * unconstrained (a value of NS_UNCONSTRAINEDSIZE). If constrained - * you should choose a value that's less than or equal to the - * constrained size. If unconstrained you can choose as - * large a value as you like. - * - * Note that the available space can be negative. In this case you - * still must return an accurate desired size. If you're a container - * you must always reflow at least one frame regardless of the - * available space - */ - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) = 0; - - /** - * Post-reflow hook. After a frame is incrementally reflowed or - * resize-reflowed this method will be called telling the frame of - * the outcome. This call may be invoked many times, while - * NS_FRAME_IN_REFLOW is set, before it is finally called once with - * a NS_FRAME_REFLOW_COMPLETE value. When called with a - * NS_FRAME_REFLOW_COMPLETE value the NS_FRAME_IN_REFLOW bit in the - * frame state will be cleared. - */ - NS_IMETHOD DidReflow(nsIPresContext& aPresContext, - nsDidReflowStatus aStatus) = 0; - - /** - * This call is invoked when content is appended to the content tree. - * - * This frame is the frame that maps the content object that has appended - * content. A typical response to this notification is to generate a - * FrameAppended incremental reflow command. You then handle the incremental - * reflow command by creating frames for the appended content. - */ - NS_IMETHOD ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) = 0; - - /** - * This call is invoked when content is inserted in the content - * tree. - * - * This frame is the frame that maps the content object that has inserted - * content. A typical response to this notification is to update the - * index-in-parent values for the affected child frames, create and insert - * new frame(s), and generate a FrameInserted incremental reflow command. - * - * You respond to the incremental reflow command by reflowing the newly - * inserted frame and any impacted frames. - * - * @param aIndexInParent the index in the content container where - * the new content was inserted. - */ - NS_IMETHOD ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) = 0; - - /** - * This call is invoked when content is replaced in the content - * tree. The container frame that maps that content is asked to deal - * with the replaced content by deleting old frames and then - * creating new frames and updating the index-in-parent values for - * it's affected children. In addition, the call must generate - * reflow commands that will incrementally reflow and repair the - * damaged portion of the frame tree. - * - * @param aIndexInParent the index in the content container where - * the new content was inserted. */ - NS_IMETHOD ContentReplaced(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInParent) = 0; - - /** - * This call is invoked when content is deleted from the content - * tree. The container frame that maps that content is asked to deal - * with the deleted content by deleting frames and updating the - * index-in-parent values for it's affected children. In addition, - * the call must generate reflow commands that will incrementally - * reflow and repair the damaged portion of the frame tree. - * - * @param aIndexInParent the index in the content container where - * the new content was deleted. - */ - NS_IMETHOD ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) = 0; - - /** - * This call is invoked when content is changed in the content tree. - * The first frame that maps that content is asked to deal with the - * change by generating an incremental reflow command. - * - * @param aIndexInParent the index in the content container where - * the new content was deleted. - */ - NS_IMETHOD ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent) = 0; - - /** - * Return the reflow metrics for this frame. If the frame is a - * container then the values for ascent and descent are computed - * across the the various children in the appropriate manner - * (e.g. for a line frame the ascent value would be the maximum - * ascent of the line's children). Note that the metrics returned - * apply to the frame as it exists at the time of the call. - */ - NS_IMETHOD GetReflowMetrics(nsIPresContext* aPresContext, - nsReflowMetrics& aMetrics) = 0; - - /** - * Return how your frame can be split. - */ - NS_IMETHOD IsSplittable(nsSplittableType& aIsSplittable) const = 0; - - /** - * Flow member functions. CreateContinuingFrame() is responsible for - * appending the continuing frame to the flow. - */ - NS_IMETHOD CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame) = 0; - - NS_IMETHOD GetPrevInFlow(nsIFrame*& aPrevInFlow) const = 0; - NS_IMETHOD SetPrevInFlow(nsIFrame*) = 0; - NS_IMETHOD GetNextInFlow(nsIFrame*& aNextInFlow) const = 0; - NS_IMETHOD SetNextInFlow(nsIFrame*) = 0; - - NS_IMETHOD AppendToFlow(nsIFrame* aAfterFrame) = 0; - NS_IMETHOD PrependToFlow(nsIFrame* aBeforeFrame) = 0; - NS_IMETHOD RemoveFromFlow() = 0; - NS_IMETHOD BreakFromPrevFlow() = 0; - NS_IMETHOD BreakFromNextFlow() = 0; - - /** - * Accessor functions to get/set the associated view object - */ - NS_IMETHOD GetView(nsIView*& aView) const = 0; // may be null - NS_IMETHOD SetView(nsIView* aView) = 0; - - /** - * Find the first geometric parent that has a view - */ - NS_IMETHOD GetParentWithView(nsIFrame*& aParent) const = 0; - - /** - * Returns the offset from this frame to the closest geometric parent that - * has a view. Also returns the containing view or null in case of error - */ - NS_IMETHOD GetOffsetFromView(nsPoint& aOffset, nsIView*& aView) const = 0; - - /** - * Returns the window that contains this frame. If this frame has a - * view and the view has a window, then this frames window is - * returned, otherwise this frame's geometric parent is checked - * recursively upwards. - */ - NS_IMETHOD GetWindow(nsIWidget*&) const = 0; - - /** - * Is this frame a "containing block"? - */ - NS_IMETHOD IsPercentageBase(PRBool& aBase) const = 0; - - /** - * Gets the size of an "auto" margin. - */ - NS_IMETHOD GetAutoMarginSize(PRUint8 aSide, nscoord& aSize) const = 0; - - /** - * Sibling pointer used to link together frames - */ - NS_IMETHOD GetNextSibling(nsIFrame*& aNextSibling) const = 0; - NS_IMETHOD SetNextSibling(nsIFrame* aNextSibling) = 0; - - /** - * Does this frame have content that is considered "transparent"? - * This is binary transparency as opposed to translucency. MMP - */ - NS_IMETHOD IsTransparent(PRBool& aTransparent) const = 0; - - // Debugging - NS_IMETHOD List(FILE* out = stdout, PRInt32 aIndent = 0) const= 0; - NS_IMETHOD ListTag(FILE* out = stdout) const = 0; - NS_IMETHOD VerifyTree() const = 0; - - /** - * See if tree verification is enabled. To enable tree verification add - * "frameverifytree:1" to your NSPR_LOG_MODULES environment variable - * (any non-zero debug level will work). Or, call SetVerifyTreeEnable - * with PR_TRUE. - */ - static NS_LAYOUT PRBool GetVerifyTreeEnable(); - - /** - * Set the verify-tree enable flag. - */ - static NS_LAYOUT void SetVerifyTreeEnable(PRBool aEnabled); - - /** - * The frame class and related classes share an nspr log module - * for logging frame activity. - * - * Note: the log module is created during library initialization which - * means that you cannot perform logging before then. - */ - static NS_LAYOUT PRLogModuleInfo* GetLogModuleInfo(); - - // Show frame borders when rendering - static NS_LAYOUT void ShowFrameBorders(PRBool aEnable); - static NS_LAYOUT PRBool GetShowFrameBorders(); - -protected: - static NS_LAYOUT PRLogModuleInfo* gLogModule; -}; - -// Constructs an initial reflow state (no parent reflow state) for a -// non-incremental reflow command -inline nsReflowState::nsReflowState(nsIFrame* aFrame, - nsReflowReason aReason, - const nsSize& aMaxSize) -{ - NS_PRECONDITION(aReason != eReflowReason_Incremental, "unexpected reflow reason"); -#ifdef NS_DEBUG - nsIFrame* parent; - aFrame->GetGeometricParent(parent); - NS_PRECONDITION(nsnull == parent, "not root frame"); -#endif - reason = aReason; - reflowCommand = nsnull; - maxSize = aMaxSize; - parentReflowState = nsnull; - frame = aFrame; -} - -// Constructs an initial reflow state (no parent reflow state) for an -// incremental reflow command -inline nsReflowState::nsReflowState(nsIFrame* aFrame, - nsIReflowCommand& aReflowCommand, - const nsSize& aMaxSize) -{ -#ifdef NS_DEBUG - nsIFrame* parent; - aFrame->GetGeometricParent(parent); - NS_PRECONDITION(nsnull == parent, "not root frame"); -#endif - reason = eReflowReason_Incremental; - reflowCommand = &aReflowCommand; - maxSize = aMaxSize; - parentReflowState = nsnull; - frame = aFrame; -} - -// Construct a reflow state for the given frame, parent reflow state, and -// max size. Uses the reflow reason and reflow command from the parent's -// reflow state -inline nsReflowState::nsReflowState(nsIFrame* aFrame, - const nsReflowState& aParentReflowState, - const nsSize& aMaxSize) -{ - reason = aParentReflowState.reason; - reflowCommand = aParentReflowState.reflowCommand; - maxSize = aMaxSize; - parentReflowState = &aParentReflowState; - frame = aFrame; -} - -// Constructs a reflow state that overrides the reflow reason of the parent -// reflow state. Sets the reflow command to NULL -inline nsReflowState::nsReflowState(nsIFrame* aFrame, - const nsReflowState& aParentReflowState, - const nsSize& aMaxSize, - nsReflowReason aReflowReason) -{ - reason = aReflowReason; - reflowCommand = nsnull; - maxSize = aMaxSize; - parentReflowState = &aParentReflowState; - frame = aFrame; -} - -#endif /* nsIFrame_h___ */ diff --git a/mozilla/layout/base/public/nsIFrameImageLoader.h b/mozilla/layout/base/public/nsIFrameImageLoader.h deleted file mode 100644 index e09fc889bf0..00000000000 --- a/mozilla/layout/base/public/nsIFrameImageLoader.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIFrameImageLoader_h___ -#define nsIFrameImageLoader_h___ - -#include "nslayout.h" -#include "nsIImageObserver.h" -class nsIFrame; -class nsIImage; -class nsIImageGroup; -class nsIPresContext; -class nsISizeOfHandler; -class nsString; -struct nsSize; - -/* a9970300-e918-11d1-89cc-006008911b81 */ -#define NS_IFRAME_IMAGE_LOADER_IID \ - { 0xa9970300,0xe918,0x11d1,{0x89, 0xcc, 0x00, 0x60, 0x08, 0x91, 0x1b, 0x81} } - -/** - * Abstract interface for frame image loaders. Frame image loaders - * know how to respond to nsIImageRequestObserver notifications and - * generate the appropriate rendering/reflow operation for a target - * frame. - */ -class nsIFrameImageLoader : public nsIImageRequestObserver { -public: - NS_IMETHOD Init(nsIPresContext* aPresContext, - nsIImageGroup* aGroup, - const nsString& aURL, - nsIFrame* aTargetFrame, - PRBool aNeedSizeUpdate) = 0; - - NS_IMETHOD StopImageLoad() = 0; - - NS_IMETHOD AbortImageLoad() = 0; - - NS_IMETHOD GetTargetFrame(nsIFrame*& aFrameResult) const = 0; - - NS_IMETHOD GetURL(nsString& aResult) const = 0; - - NS_IMETHOD GetImage(nsIImage*& aResult) const = 0; - - NS_IMETHOD GetSize(nsSize& aResult) const = 0; - - NS_IMETHOD GetImageLoadStatus(PRIntn& aLoadStatus) const = 0; - - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const = 0; -}; - -// Image load status bit values -#define NS_IMAGE_LOAD_STATUS_NONE 0x0 -#define NS_IMAGE_LOAD_STATUS_SIZE_REQUESTED 0x1 -#define NS_IMAGE_LOAD_STATUS_SIZE_AVAILABLE 0x2 -#define NS_IMAGE_LOAD_STATUS_IMAGE_READY 0x4 -#define NS_IMAGE_LOAD_STATUS_ERROR 0x8 - -#endif /* nsIFrameImageLoader_h___ */ diff --git a/mozilla/layout/base/public/nsIPresContext.h b/mozilla/layout/base/public/nsIPresContext.h deleted file mode 100644 index ec58c5125f9..00000000000 --- a/mozilla/layout/base/public/nsIPresContext.h +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIPresContext_h___ -#define nsIPresContext_h___ - -#include "nslayout.h" -#include "nsISupports.h" -#include "nsRect.h" - -struct nsFont; - -class nsIContent; -class nsIDeviceContext; -class nsIFontMetrics; -class nsIFrame; -class nsIFrameImageLoader; -class nsIImageGroup; -class nsILinkHandler; -class nsIPresShell; -class nsIStyleContext; -class nsIAtom; -class nsString; -class nsIEventStateManager; - -#define NS_IPRESCONTEXT_IID \ -{ 0x0a5d12e0, 0x944e, 0x11d1, \ - {0x93, 0x23, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } - - -// An interface for presentation contexts. Presentation contexts are -// objects that provide an outer context for a presentation shell. -class nsIPresContext : public nsISupports { -public: - /** - * Initialize the presentation context from a particular device. - */ - virtual nsresult Init(nsIDeviceContext* aDeviceContext) = 0; - - /** - * Set the presentation shell that this context is bound to. - * A presentation context may only be bound to a single shell. - */ - virtual void SetShell(nsIPresShell* aShell) = 0; - - /** - * Get the PresentationShell that this context is bound to. - */ - virtual nsIPresShell* GetShell() = 0; - - /** - * Resolve style for the given piece of content that will be a child - * of the aParentFrame frame. Don't use this for pseudo frames. - */ - virtual nsIStyleContext* ResolveStyleContextFor(nsIContent* aContent, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - - /** - * Resolve style for a pseudo frame within the given aParentFrame frame. - * The tag should be uppercase and inclue the colon. - * ie: NS_NewAtom(":FIRST-LINE"); - */ - virtual nsIStyleContext* ResolvePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - - /** - * Probe style for a pseudo frame within the given aParentFrame frame. - * This will return nsnull id there are no explicit rules for the pseudo element. - * The tag should be uppercase and inclue the colon. - * ie: NS_NewAtom(":FIRST-LINE"); - */ - virtual nsIStyleContext* ProbePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - /** - * Get the font metrics for a given font. - */ - virtual nsIFontMetrics* GetMetricsFor(const nsFont& aFont) = 0; - - /** - * Get the default font - */ - virtual const nsFont& GetDefaultFont(void) = 0; - - NS_IMETHOD GetImageGroup(nsIImageGroup*& aGroupResult) = 0; - - /** - * Load an image for the target frame. This call can be made - * repeated with only a single image every being loaded. If - * aNeedSizeUpdate is PR_TRUE then when the image's size is - * determined the target frame will be reflowed (via a - * ContentChanged notification on the presentation shell). When the - * image's data is ready for rendering the target frames Paint - * method will be invoked (via the ViewManager so that the - * appropriate damage repair is done). - */ - NS_IMETHOD LoadImage(const nsString& aURL, - nsIFrame* aTargetFrame, - PRBool aNeedSizeUpdate, - nsIFrameImageLoader*& aLoader) = 0; - - /** - * Stop any image loading being done on behalf of the argument frame. - */ - NS_IMETHOD StopLoadImage(nsIFrame* aForFrame) = 0; - - NS_IMETHOD SetContainer(nsISupports* aContainer) = 0; - - NS_IMETHOD GetContainer(nsISupports** aResult) = 0; - - NS_IMETHOD SetLinkHandler(nsILinkHandler* aHandler) = 0; - - NS_IMETHOD GetLinkHandler(nsILinkHandler** aResult) = 0; - - /** - * Get the currently visible portion of the RootContent ILayoutable. - * The units returned are in pixels. An acceptable answer is "null" - * which means "I don't know". - *

    Speculative

    - */ - virtual void GetVisibleArea(nsRect& aResult) = 0; - - /** - * Set the currently visible area. This is the size and location - * of the visible portion of the RootContent ILayoutable. - */ - virtual void SetVisibleArea(const nsRect& r) = 0; - - /** - * Return true if this presentation context is a paginated - * context. - */ - virtual PRBool IsPaginated() = 0; - - /** - * Return the page width if this is a paginated context. - */ - virtual nscoord GetPageWidth() = 0; - - /** - * Return the page height if this is a paginated context - */ - virtual nscoord GetPageHeight() = 0; - - virtual float GetPixelsToTwips() const = 0; - virtual float GetTwipsToPixels() const = 0; - - //be sure to Relase() after you are done with the Get() - virtual nsIDeviceContext * GetDeviceContext() const = 0; - - NS_IMETHOD GetEventStateManager(nsIEventStateManager** aManager) = 0; -}; - -// Bit values for LoadImage's aImageStatus -#define NS_LOAD_IMAGE_STATUS_ERROR 0x1 -#define NS_LOAD_IMAGE_STATUS_SIZE 0x2 -#define NS_LOAD_IMAGE_STATUS_BITS 0x4 - -// Factory method to create a "galley" presentation context (galley is -// a kind of view that has no limit to the size of a page) -extern NS_LAYOUT nsresult - NS_NewGalleyContext(nsIPresContext** aInstancePtrResult); - -// Factory method to create a "paginated" presentation context for -// the screen. -extern NS_LAYOUT nsresult - NS_NewPrintPreviewContext(nsIPresContext** aInstancePtrResult); - -#endif /* nsIPresContext_h___ */ diff --git a/mozilla/layout/base/public/nsIPresShell.h b/mozilla/layout/base/public/nsIPresShell.h deleted file mode 100644 index 2c03346afc0..00000000000 --- a/mozilla/layout/base/public/nsIPresShell.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIPresShell_h___ -#define nsIPresShell_h___ - -#include "nslayout.h" -#include "nsISupports.h" -#include "nsCoord.h" -class nsIContent; -class nsIDocument; -class nsIDocumentObserver; -class nsIFrame; -class nsIPresContext; -class nsIStyleSet; -class nsIViewManager; -class nsIReflowCommand; -class nsIDeviceContext; - -#define NS_IPRESSHELL_IID \ -{ 0x76e79c60, 0x944e, 0x11d1, \ - {0x93, 0x23, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } - -/** - * Presentation shell interface. Presentation shells are the - * controlling point for managing the presentation of a document. The - * presentation shell holds a live reference to the document, the - * presentation context, the style manager, the style set and the root - * frame.

    - * - * When this object is Release'd, it will release the document, the - * presentation context, the style manager, the style set and the root - * frame. - */ -class nsIPresShell : public nsISupports { -public: - NS_IMETHOD Init(nsIDocument* aDocument, - nsIPresContext* aPresContext, - nsIViewManager* aViewManager, - nsIStyleSet* aStyleSet) = 0; - - virtual nsIDocument* GetDocument() = 0; - - virtual nsIPresContext* GetPresContext() = 0; - - virtual nsIViewManager * GetViewManager() = 0; - - virtual nsIStyleSet* GetStyleSet() = 0; - - NS_IMETHOD EnterReflowLock() = 0; - - NS_IMETHOD ExitReflowLock() = 0; - - // Make shell be a document observer - virtual void BeginObservingDocument() = 0; - - // Make shell stop being a document observer - virtual void EndObservingDocument() = 0; - - /** - * Reflow the frame model into a new width and height. The - * coordinates for aWidth and aHeight must be in standard nscoord's. - */ - virtual void ResizeReflow(nscoord aWidth, nscoord aHeight) = 0; - - virtual nsIFrame* GetRootFrame() = 0; - - virtual nsIFrame* FindFrameWithContent(nsIContent* aContent) = 0; - - virtual void AppendReflowCommand(nsIReflowCommand* aReflowCommand) = 0; - - virtual void ProcessReflowCommands() = 0; - - // XXX events - // XXX selection -}; - -/** - * Create a new empty presentation shell. Upon success, call Init - * before attempting to use the shell. - */ -extern NS_LAYOUT nsresult - NS_NewPresShell(nsIPresShell** aInstancePtrResult); - -#endif /* nsIPresShell_h___ */ diff --git a/mozilla/layout/base/public/nsIReflowCommand.h b/mozilla/layout/base/public/nsIReflowCommand.h deleted file mode 100644 index 23df544105a..00000000000 --- a/mozilla/layout/base/public/nsIReflowCommand.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIReflowCommand_h___ -#define nsIReflowCommand_h___ - -#include "nsISupports.h" - -class nsIFrame; -class nsIPresContext; -struct nsReflowMetrics; -struct nsSize; - -// IID for the nsIReflowCommand interface {C3658E40-FF20-11d1-85BC-00A02468FAB6} -#define NS_IREFLOWCOMMAND_IID \ -{ 0xc3658e40, 0xff20, 0x11d1, \ - {0x85, 0xbc, 0x0, 0xa0, 0x24, 0x68, 0xfa, 0xb6}} - -/** - * A reflow command is an object that is generated in response to a content - * model change notification. The reflow command is given to a presentation - * shell where it is queued and then dispatched by invoking the reflow - * commands's Dispatch() member function. - * - * Reflow command processing follows a path from the root frame down to the - * target frame (the frame for which the reflow command is destined). Reflow - * commands are processed by invoking the frame's Reflow() member function. - * - * @see nsIFrame#ContentAppended() - * @see nsIFrame#ContentChanged() - * @see nsIFrame#ContentDeleted() - * @see nsIFrame#ContentInserted() - * @see nsIFrame#ContentReplaced() - * @see nsIPresShell#AppendReflowCommand() - * @see nsIPresShell#ProcessReflowCommands() - */ -class nsIReflowCommand : public nsISupports { -public: - enum ReflowType { - // Reflow commands generated in response to a content insert/delete/append - // notification. The target of the reflow command is the container frame - // itself - FrameAppended, - FrameInserted, - FrameDeleted, - - // This reflow command is used when a leaf node's content changes (e.g. some - // text in a text run, an image's source, etc.). The target of the reflow - // command is the frame that changed (see nsIFrame#ContentChanged() for how - // the target frame is determined). - ContentChanged, - - // When an incremental reflow operation affects a next-in-flow, - // these commands are used to get the next-in-flow to update - // itself. - PullupReflow, - PushReflow, - - // This command is used to see if a prev-in-flow wants to pullup - // some children from a next-in-flow that has changed because of - // an incremental reflow. - CheckPullupReflow, - - // Trap door for extensions - UserDefined - }; - - /** - * Dispatch the reflow command. - * - * Builds a path from the target frame back to the root frame, and then - * invokes the root frame's Reflow() member function. - * - * @see nsIFrame#Reflow() - */ - NS_IMETHOD Dispatch(nsIPresContext& aPresContext, - nsReflowMetrics& aDesiredSize, - const nsSize& aMaxSize) = 0; - - /** - * Get the next frame in the command processing path. Note that this removes - * the frame from the path so you must only call it once. - */ - NS_IMETHOD GetNext(nsIFrame*& aNextFrame) = 0; - - /** - * Get the target of the reflow command. - */ - NS_IMETHOD GetTarget(nsIFrame*& aTargetFrame) const = 0; - - /** - * Get the type of reflow command. - */ - NS_IMETHOD GetType(ReflowType& aReflowType) const = 0; - - /** - * Get the child frame associated with the reflow command. - */ - NS_IMETHOD GetChildFrame(nsIFrame*& aChildFrame) const = 0; -}; - -#endif /* nsIReflowCommand_h___ */ diff --git a/mozilla/layout/base/public/nsIRunaround.h b/mozilla/layout/base/public/nsIRunaround.h deleted file mode 100644 index ba4317bb6b2..00000000000 --- a/mozilla/layout/base/public/nsIRunaround.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIRunaround_h___ -#define nsIRunaround_h___ - -#include "nsIFrame.h" - -// IID for the nsIRunaround interface {3C6ABCF0-C028-11d1-853F-00A02468FAB6} -#define NS_IRUNAROUND_IID \ -{ 0x3c6abcf0, 0xc028, 0x11d1, \ - {0x85, 0x3f, 0x0, 0xa0, 0x24, 0x68, 0xfa, 0xb6}} - -/** - * An interface for handling reflow that allows direct access to the space - * manager. Note that this interface is not an nsISupports interface, and - * therefore you cannot QueryInterface() back - */ -class nsIRunaround -{ -public: - /** - * Reflow. The frame is given a maximum size and asked for its desired - * rect. The space manager should be used to do runaround of anchored - * items. - * - * @param aSpaceManager the space manager to use. The caller has translated - * the coordinate system so the frame has its own local coordinate - * space with an origin of (0, 0). If you translate the coordinate - * space you must restore it before returning. - * @param aMaxSize the available space in which to lay out. Each dimension - * can either be constrained or unconstrained (a value of - * NS_UNCONSTRAINEDSIZE). If constrained you should choose a value - * that's less than or equal to the constrained size. If unconstrained - * you can choose as large a value as you like. - * - * It's okay to return a desired size that exceeds the max size if - * that's the smallest you can be, i.e. it's your minimum size. - * - * @param aDesiredRect out parameter where you should return the desired - * origin and size. You should include any space you want for border - * and padding in the desired size. - * - * The origin of the desired rect is relative to the upper-left of the - * local coordinate space. - * - * @param aMaxElementSize an optional parameter for returning your maximum - * element size. If may be null in which case you don't have to compute - * a maximum element size - * - * @see nsISpaceManager#Translate() - */ - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsISpaceManager* aSpaceManager, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsRect& aDesiredRect, // XXX FIX ME - nsReflowStatus& aStatus) = 0; -}; - -#endif /* nsIRunaround_h___ */ diff --git a/mozilla/layout/base/public/nsISelection.h b/mozilla/layout/base/public/nsISelection.h deleted file mode 100644 index 552c4326d95..00000000000 --- a/mozilla/layout/base/public/nsISelection.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsISelection_h___ -#define nsISelection_h___ - -#include "nsSelectionRange.h" -#include "nslayout.h" -#include "nsISupports.h" - -// IID for the nsISelection interface -#define NS_ISELECTION_IID \ -{ 0xf46e4171, 0xdeaa, 0x11d1, \ - { 0x97, 0xfc, 0x0, 0x60, 0x97, 0x3, 0xc1, 0x4e } } - -//---------------------------------------------------------------------- - -// Selection interface -class nsISelection : public nsISupports { -public: - - /** - * Returns whether there is a valid selection - */ - virtual PRBool IsValidSelection() = 0; - - /** - * Clears the current selection (invalidates the selection) - */ - virtual void ClearSelection() = 0; - - /** - * Copies the data from the param into the internal Range - */ - virtual void SetRange(nsSelectionRange * aRange) = 0; - - /** - * Copies the param's (aRange) contents with the Range's data - */ - virtual void GetRange(nsSelectionRange * aRange) = 0; - - /** - * Copies the param's (aRange) contents with the Range's data - */ - virtual nsSelectionRange * GetRange() = 0; - - virtual char * ToString() = 0; - -}; - -// XXX Belongs somewhere else -extern NS_LAYOUT nsresult - NS_NewSelection(nsISelection** aInstancePtrResult); - -#endif /* nsISelection_h___ */ diff --git a/mozilla/layout/base/public/nsISpaceManager.h b/mozilla/layout/base/public/nsISpaceManager.h deleted file mode 100644 index ce9650e6536..00000000000 --- a/mozilla/layout/base/public/nsISpaceManager.h +++ /dev/null @@ -1,202 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsISpaceManager_h___ -#define nsISpaceManager_h___ - -#include "nsISupports.h" -#include "nsCoord.h" -#include "nsRect.h" - -class nsIFrame; -class nsVoidArray; -struct nsSize; - -// IID for the nsISpaceManager interface {17C8FB50-BE96-11d1-80B5-00805F8A274D} -#define NS_ISPACEMANAGER_IID \ -{ 0x17c8fb50, 0xbe96, 0x11d1, \ - {0x80, 0xb5, 0x0, 0x80, 0x5f, 0x8a, 0x27, 0x4d}} - -/** - * Information about a particular trapezoid within a band. The space described - * by the trapezoid is in one of three states: - *

      - *
    • available - *
    • occupied by one frame - *
    • occupied by more than one frame - *
    - */ -struct nsBandTrapezoid { - enum State {Available, Occupied, OccupiedMultiple}; - - nscoord yTop, yBottom; // top and bottom y-coordinates - nscoord xTopLeft, xBottomLeft; // left edge x-coordinates - nscoord xTopRight, xBottomRight; // right edge x-coordinates - State state; // state of the space - union { - nsIFrame* frame; // single frame occupying the space - const nsVoidArray* frames; // list of frames occupying the space - }; - - // Get the height of the trapezoid - nscoord GetHeight() {return yBottom - yTop;} - - // Get the bouding rect of the trapezoid - void GetRect(nsRect& aRect); - - // Set the trapezoid from a rectangle - void operator=(const nsRect& aRect); -}; - -/** - * Structure used for describing the space within a band. - * @see #GetBandData() - */ -struct nsBandData { - PRInt32 count; // 'out' parameter. Actual number of trapezoids in the band data - PRInt32 size; // 'in' parameter. The size of the array - nsBandTrapezoid* trapezoids; // 'out' parameter. Array of length 'size' -}; - -/** - * Interface for dealing with bands of available space. The space manager defines a coordinate - * space with an origin at (0, 0) that grows down and to the right. - * - * @see nsIRunaround - */ -class nsISpaceManager : public nsISupports { -public: - /** - * Get the frame that's associated with the space manager. This frame created - * the space manager, and the world coordinate space is relative to this frame. - * - * You can use QueryInterface() on this frame to get additional interfaces such - * as nsIAnchoredItems - */ - virtual nsIFrame* GetFrame() const = 0; - - /** - * Translate the current origin by the specified (dx, dy). This creates a new - * local coordinate space relative to the current coordinate space. - */ - virtual void Translate(nscoord aDx, nscoord aDy) = 0; - - /** - * Returns the current translation from local coordinate space to world - * coordinate space. This represents the accumulated calls to Translate(). - */ - virtual void GetTranslation(nscoord& aX, nscoord& aY) const = 0; - - /** - * Returns the y-most of the bottommost band, or 0 if there are no bands. - */ - virtual nscoord YMost() const = 0; - - /** - * Returns a band starting at the specified y-offset. The band data indicates - * which parts of the band are available, and which parts are unavailable - * - * The band data that is returned is in the coordinate space of the local - * coordinate system. - * - * The local coordinate space origin together with the max size describe a - * rectangle that's used to clip the underlying band of available space. - * - * @param aYOffset the y-offset of where the band begins. The coordinate is - * relative to the upper-left corner of the local coordinate space - * @param aMaxSize the size to use to constrain the band data - * @param aBandData out parameter used to return the list of - * trapezoids that describe the available space and the unavailable - * space. - * @returns the number of trapezoids in the band data. If the band data is - * not large enough, returns the negative of the number of - * trapezoids needed - */ - virtual PRInt32 GetBandData(nscoord aYOffset, - const nsSize& aMaxSize, - nsBandData& aBandData) const = 0; - - /** - * Add a rectangular region of unavailable space. The space is relative to - * the local coordinate system. - * - * The region is tagged with a frame, which is used to identify the region. - * The frame must not be NULL - * - * Returns PR_TRUE if successful and PR_FALSE otherwise, e.g. there is already - * a region tagged with aFrame - * - * When translated to world coordinates the origin MUST be within the defined - * coordinate space, i.e. the x-offset and y-offset must be >= 0 - */ - virtual PRBool AddRectRegion(nsIFrame* aFrame, const nsRect& aUnavailableSpace) = 0; - - /** - * Resize the rectangular region associated with aFrame by the specified deltas. - * The height change always applies to the bottom edge or the existing rect. - * You specify whether the width change applies to the left or right edge - * - * Returns PR_TRUE if successful and PR_FALSE otherwise, e.g. there is no region - * tagged with aFrame, or the new offset when translated to world coordinates is - * outside the defined coordinate space - */ - enum AffectedEdge {LeftEdge, RightEdge}; - virtual PRBool ResizeRectRegion(nsIFrame* aFrame, - nscoord aDeltaWidth, - nscoord aDeltaHeight, - AffectedEdge aEdge = RightEdge) = 0; - - /** - * Offset the region associated with aFrame by the specified amount. - * - * Returns PR_TRUE if successful and PR_FALSE otherwise, e.g. there is no region - * tagged with aFrame, or the new offset when translated to world coordinates - * is outside the defined coordinate space - */ - virtual PRBool OffsetRegion(nsIFrame* aFrame, nscoord dx, nscoord dy) = 0; - - /** - * Remove the region associated with aFrane. - * - * Returns PR_TRUE if successful and PR_FALSE otherwise, e.g. there is no region - * tagged with aFrame - */ - virtual PRBool RemoveRegion(nsIFrame* aFrame) = 0; - - /** - * Clears the list of regions representing the unavailable space. - */ - virtual void ClearRegions() = 0; -}; - -void inline nsBandTrapezoid::GetRect(nsRect& aRect) -{ - aRect.x = PR_MIN(xTopLeft, xBottomLeft); - aRect.y = yTop; - aRect.width = PR_MAX(xTopRight, xBottomRight) - aRect.x; - aRect.height = yBottom - yTop; -} - -void inline nsBandTrapezoid::operator=(const nsRect& aRect) -{ - xTopLeft = xBottomLeft = aRect.x; - xTopRight = xBottomRight = aRect.XMost(); - yTop = aRect.y; - yBottom = aRect.YMost(); -} - -#endif /* nsISpaceManager_h___ */ diff --git a/mozilla/layout/base/public/nsIStyleContext.h b/mozilla/layout/base/public/nsIStyleContext.h deleted file mode 100644 index 46f09658b33..00000000000 --- a/mozilla/layout/base/public/nsIStyleContext.h +++ /dev/null @@ -1,207 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIStyleContext_h___ -#define nsIStyleContext_h___ - -#include "nslayout.h" -#include "nsISupports.h" -#include "nsColor.h" -#include "nsCoord.h" -#include "nsMargin.h" -#include "nsFont.h" -#include "nsStyleCoord.h" -#include "nsStyleStruct.h" - -class nsIFrame; -class nsIPresContext; -class nsIContent; -class nsISupportsArray; - - -// Indicies into border/padding/margin arrays -#define NS_SIDE_TOP 0 -#define NS_SIDE_RIGHT 1 -#define NS_SIDE_BOTTOM 2 -#define NS_SIDE_LEFT 3 - -// The lifetime of these objects is managed by the nsIStyleContext. - -struct nsStyleFont : public nsStyleStruct { - nsFont mFont; // [inherited] - PRUint8 mThreeD; // [inherited] XXX fold this into nsFont or nuke it - -protected: - nsStyleFont(const nsFont& aFont); - ~nsStyleFont(void); -}; - -struct nsStyleColor : public nsStyleStruct { - nscolor mColor; // [inherited] - - PRUint8 mBackgroundAttachment; // [reset] See nsStyleConsts.h - PRUint8 mBackgroundFlags; // [reset] See nsStyleConsts.h - PRUint8 mBackgroundRepeat; // [reset] See nsStyleConsts.h - - nscolor mBackgroundColor; // [reset] - nscoord mBackgroundXPosition; // [reset] - nscoord mBackgroundYPosition; // [reset] - nsString mBackgroundImage; // [reset] absolute url string - - PRUint8 mCursor; // [reset] See nsStyleConsts.h NS_STYLE_CURSOR_* - nsString mCursorImage; // [reset] url string - float mOpacity; // [inherited] percentage - -protected: - nsStyleColor(void); - ~nsStyleColor(void); -}; - -struct nsStyleSpacing: public nsStyleStruct { - nsStyleSides mMargin; // [reset] length, percent, auto, inherit - nsStyleSides mPadding; // [reset] length, percent, inherit - nsStyleSides mBorder; // [reset] length, percent, See nsStyleConsts.h for enum - PRUint8 mBorderStyle[4]; // [reset] See nsStyleConsts.h - nscolor mBorderColor[4]; // [reset] - - void CalcMarginFor(const nsIFrame* aFrame, nsMargin& aMargin) const; - void CalcPaddingFor(const nsIFrame* aFrame, nsMargin& aPadding) const; - void CalcBorderFor(const nsIFrame* aFrame, nsMargin& aBorder) const; - void CalcBorderPaddingFor(const nsIFrame* aFrame, nsMargin& aBorderPadding) const; - -protected: - nsStyleSpacing(void); - - PRBool mHasCachedMargin; - PRBool mHasCachedPadding; - PRBool mHasCachedBorder; - nsMargin mCachedMargin; - nsMargin mCachedPadding; - nsMargin mCachedBorder; - nsMargin mCachedBorderPadding; -}; - -struct nsStyleList : public nsStyleStruct { - PRUint8 mListStyleType; // [inherited] See nsStyleConsts.h - PRUint8 mListStylePosition; // [inherited] - nsString mListStyleImage; // [inherited] absolute url string - -protected: - nsStyleList(void); - ~nsStyleList(void); -}; - -struct nsStylePosition : public nsStyleStruct { - PRUint8 mPosition; // [reset] see nsStyleConsts.h - - nsStyleCoord mLeftOffset; // [reset] - nsStyleCoord mTopOffset; // [reset] - nsStyleCoord mWidth; // [reset] - nsStyleCoord mHeight; // [reset] - - nsStyleCoord mZIndex; // [reset] - -protected: - nsStylePosition(void); -}; - -struct nsStyleText : public nsStyleStruct { - PRUint8 mTextAlign; // [inherited] see nsStyleConsts.h - PRUint8 mTextDecoration; // [reset] see nsStyleConsts.h - PRUint8 mTextTransform; // [inherited] see nsStyleConsts.h - PRUint8 mWhiteSpace; // [inherited] see nsStyleConsts.h - - nsStyleCoord mLetterSpacing; // [inherited] - nsStyleCoord mLineHeight; // [inherited] - nsStyleCoord mTextIndent; // [inherited] - nsStyleCoord mWordSpacing; // [inherited] - nsStyleCoord mVerticalAlign; // [reset] see nsStyleConsts.h for enums - -protected: - nsStyleText(void); -}; - -struct nsStyleDisplay : public nsStyleStruct { - PRUint8 mDirection; // [inherited] see nsStyleConsts.h NS_STYLE_DIRECTION_* - PRUint8 mDisplay; // [reset] see nsStyleConsts.h NS_STYLE_DISPLAY_* - PRUint8 mFloats; // [reset] see nsStyleConsts.h NS_STYLE_FLOAT_* - PRUint8 mBreakType; // [reset] see nsStyleConsts.h NS_STYLE_CLEAR_* - PRPackedBool mBreakBefore; // [reset] - PRPackedBool mBreakAfter; // [reset] - PRPackedBool mVisible; // [inherited] - PRUint8 mOverflow; // [reset] see nsStyleConsts.h - - PRUint8 mClipFlags; // [reset] see nsStyleConsts.h - nsMargin mClip; // [reset] offsets from respective edge - -protected: - nsStyleDisplay(void); -}; - -struct nsStyleTable: public nsStyleStruct { - PRUint8 mFrame; // [reset] see nsStyleConsts.h NS_STYLE_TABLE_FRAME_* - PRUint8 mRules; // [reset] see nsStyleConsts.h NS_STYLE_TABLE_RULES_* - nsStyleCoord mCellPadding; // [reset] - nsStyleCoord mCellSpacing; // [reset] - PRInt32 mCols; // an integer if set, or see nsStyleConsts.h NS_STYLE_TABLE_COLS_* - PRInt32 mSpan; // the number of columns spanned by a colgroup - -protected: - nsStyleTable(void); -}; - -//---------------------------------------------------------------------- - -#define NS_ISTYLECONTEXT_IID \ - { 0x26a4d970, 0xa342, 0x11d1, \ - {0x89, 0x74, 0x00, 0x60, 0x08, 0x91, 0x1b, 0x81} } - -class nsIStyleContext : public nsISupports { -public: - virtual PRBool Equals(const nsIStyleContext* aOther) const = 0; - virtual PRUint32 HashValue(void) const = 0; - - virtual nsIStyleContext* GetParent(void) const = 0; - virtual nsISupportsArray* GetStyleRules(void) const = 0; - virtual PRInt32 GetStyleRuleCount(void) const = 0; - - virtual nsIStyleContext* FindChildWithRules(nsISupportsArray* aRules) = 0; - - // get a style data struct by ID, may return null - virtual const nsStyleStruct* GetStyleData(nsStyleStructID aSID) = 0; - - // get a style data struct by ID, may return null - virtual nsStyleStruct* GetMutableStyleData(nsStyleStructID aSID) = 0; - - // call this to prevent context from getting shared - virtual void ForceUnique(void) = 0; - - // call if you change style data after creation - virtual void RecalcAutomaticData(nsIPresContext* aPresContext) = 0; - - // debugging - virtual void List(FILE* out, PRInt32 aIndent) = 0; -}; - -// this is private to nsStyleSet, don't call it -extern NS_LAYOUT nsresult - NS_NewStyleContext(nsIStyleContext** aInstancePtrResult, - nsIStyleContext* aParentContext, - nsISupportsArray* aRules, - nsIPresContext* aPresContext); - -#endif /* nsIStyleContext_h___ */ diff --git a/mozilla/layout/base/public/nsIStyleRule.h b/mozilla/layout/base/public/nsIStyleRule.h deleted file mode 100644 index e79eff7dae8..00000000000 --- a/mozilla/layout/base/public/nsIStyleRule.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIStyleRule_h___ -#define nsIStyleRule_h___ - -#include - -#include "nslayout.h" -#include "nsISupports.h" - -class nsIStyleContext; -class nsIPresContext; - -// IID for the nsIStyleRule interface {40ae5c90-ad6a-11d1-8031-006008159b5a} -#define NS_ISTYLE_RULE_IID \ -{0x40ae5c90, 0xad6a, 0x11d1, {0x80, 0x31, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x5a}} - -class nsIStyleRule : public nsISupports { -public: - virtual PRBool Equals(const nsIStyleRule* aRule) const = 0; - virtual PRUint32 HashValue(void) const = 0; - - virtual void MapStyleInto(nsIStyleContext* aContext, nsIPresContext* aPresContext) = 0; - - virtual void List(FILE* out = stdout, PRInt32 aIndent = 0) const = 0; -}; - -#endif /* nsIStyleRule_h___ */ diff --git a/mozilla/layout/base/public/nsIStyleSet.h b/mozilla/layout/base/public/nsIStyleSet.h deleted file mode 100644 index cfede671b42..00000000000 --- a/mozilla/layout/base/public/nsIStyleSet.h +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsStyleSet_h___ -#define nsStyleSet_h___ - -#include -#include "nsISupports.h" -#include "nslayout.h" - -class nsIAtom; -class nsIStyleMolecule; -class nsIStyleRule; -class nsIStyleSheet; -class nsIStyleContext; -class nsIPresContext; -class nsIContent; -class nsIFrame; - - -// IID for the nsIStyleSet interface {e59396b0-b244-11d1-8031-006008159b5a} -#define NS_ISTYLE_SET_IID \ -{0xe59396b0, 0xb244, 0x11d1, {0x80, 0x31, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x5a}} - -class nsIStyleSet : public nsISupports { -public: - virtual void AppendOverrideStyleSheet(nsIStyleSheet* aSheet) = 0; - virtual void InsertOverrideStyleSheetAfter(nsIStyleSheet* aSheet, - nsIStyleSheet* aAfterSheet) = 0; - virtual void InsertOverrideStyleSheetBefore(nsIStyleSheet* aSheet, - nsIStyleSheet* aBeforeSheet) = 0; - virtual void RemoveOverrideStyleSheet(nsIStyleSheet* aSheet) = 0; - virtual PRInt32 GetNumberOfOverrideStyleSheets() = 0; - virtual nsIStyleSheet* GetOverrideStyleSheetAt(PRInt32 aIndex) = 0; - - virtual void AppendDocStyleSheet(nsIStyleSheet* aSheet) = 0; - virtual void InsertDocStyleSheetAfter(nsIStyleSheet* aSheet, - nsIStyleSheet* aAfterSheet) = 0; - virtual void InsertDocStyleSheetBefore(nsIStyleSheet* aSheet, - nsIStyleSheet* aBeforeSheet) = 0; - virtual void RemoveDocStyleSheet(nsIStyleSheet* aSheet) = 0; - virtual PRInt32 GetNumberOfDocStyleSheets() = 0; - virtual nsIStyleSheet* GetDocStyleSheetAt(PRInt32 aIndex) = 0; - - virtual void AppendBackstopStyleSheet(nsIStyleSheet* aSheet) = 0; - virtual void InsertBackstopStyleSheetAfter(nsIStyleSheet* aSheet, - nsIStyleSheet* aAfterSheet) = 0; - virtual void InsertBackstopStyleSheetBefore(nsIStyleSheet* aSheet, - nsIStyleSheet* aBeforeSheet) = 0; - virtual void RemoveBackstopStyleSheet(nsIStyleSheet* aSheet) = 0; - virtual PRInt32 GetNumberOfBackstopStyleSheets() = 0; - virtual nsIStyleSheet* GetBackstopStyleSheetAt(PRInt32 aIndex) = 0; - - // get a style context for a non-pseudo frame - virtual nsIStyleContext* ResolveStyleFor(nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - - // get a style context for a pseudo-frame (ie: tag = NS_NewAtom(":FIRST-LINE"); - virtual nsIStyleContext* ResolvePseudoStyleFor(nsIPresContext* aPresContext, - nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - - // This funtions just like ResolvePseudoStyleFor except that it will - // return nsnull if there are no explicit style rules for that - // pseudo element - virtual nsIStyleContext* ProbePseudoStyleFor(nsIPresContext* aPresContext, - nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - - // xxx style rules enumeration - - virtual void List(FILE* out = stdout, PRInt32 aIndent = 0) = 0; - virtual void ListContexts(nsIStyleContext* aRootContext, FILE* out = stdout, PRInt32 aIndent = 0) = 0; -}; - -extern NS_LAYOUT nsresult - NS_NewStyleSet(nsIStyleSet** aInstancePtrResult); - -#endif /* nsIStyleSet_h___ */ diff --git a/mozilla/layout/base/public/nsIStyleSheet.h b/mozilla/layout/base/public/nsIStyleSheet.h deleted file mode 100644 index 9d1bd6b46f0..00000000000 --- a/mozilla/layout/base/public/nsIStyleSheet.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIStyleSheet_h___ -#define nsIStyleSheet_h___ - -#include -#include "nsISupports.h" -class nsIAtom; -class nsIURL; -class nsIStyleRule; -class nsISupportsArray; -class nsIPresContext; -class nsIContent; -class nsIFrame; - -// IID for the nsIStyleSheet interface {8c4a80a0-ad6a-11d1-8031-006008159b5a} -#define NS_ISTYLE_SHEET_IID \ -{0x8c4a80a0, 0xad6a, 0x11d1, {0x80, 0x31, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x5a}} - -class nsIStyleSheet : public nsISupports { -public: - virtual nsIURL* GetURL(void) = 0; - - // populate void array with nsIStyleRule* - virtual PRInt32 RulesMatching(nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aParentFrame, - nsISupportsArray* aResults) = 0; - - virtual PRInt32 RulesMatching(nsIPresContext* aPresContext, - nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - nsISupportsArray* aResults) = 0; - - // XXX style rule enumerations - - virtual void List(FILE* out = stdout, PRInt32 aIndent = 0) const = 0; -}; - -#endif /* nsIStyleSheet_h___ */ diff --git a/mozilla/layout/base/public/nsITextContent.h b/mozilla/layout/base/public/nsITextContent.h deleted file mode 100644 index fca6973fa58..00000000000 --- a/mozilla/layout/base/public/nsITextContent.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsITextContent_h___ -#define nsITextContent_h___ - -#include "nslayout.h" -class nsString; - -// IID for the nsITextContent interface -#define NS_ITEXTCONTENT_IID \ -{ 0xdd0755d0, 0x944d, 0x11d1, \ - {0x93, 0x23, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } - -// Abstract interface for textual content. Note that this interface -// does not implement nsISupports (which means it's not transitive or -// reflexive). This is done for efficiency reasons. -class nsITextContent { -public: - /* - * Get the total length of the text content. - */ - virtual PRInt32 GetLength() = 0; - - /* - * Copy a subrange of the text content into aBuf starting at aOffset - * for aCount characters. aBuf's length will be reset before the - * copy occurs and it's length upon return will reflect the amount - * of data copied. - */ - virtual void GetText(nsString& aBuf, PRInt32 aOffset, PRInt32 aCount) = 0; -}; - -#endif /* nsITextContent_h___ */ diff --git a/mozilla/layout/base/public/nsPresContext.h b/mozilla/layout/base/public/nsPresContext.h deleted file mode 100644 index ec58c5125f9..00000000000 --- a/mozilla/layout/base/public/nsPresContext.h +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIPresContext_h___ -#define nsIPresContext_h___ - -#include "nslayout.h" -#include "nsISupports.h" -#include "nsRect.h" - -struct nsFont; - -class nsIContent; -class nsIDeviceContext; -class nsIFontMetrics; -class nsIFrame; -class nsIFrameImageLoader; -class nsIImageGroup; -class nsILinkHandler; -class nsIPresShell; -class nsIStyleContext; -class nsIAtom; -class nsString; -class nsIEventStateManager; - -#define NS_IPRESCONTEXT_IID \ -{ 0x0a5d12e0, 0x944e, 0x11d1, \ - {0x93, 0x23, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } - - -// An interface for presentation contexts. Presentation contexts are -// objects that provide an outer context for a presentation shell. -class nsIPresContext : public nsISupports { -public: - /** - * Initialize the presentation context from a particular device. - */ - virtual nsresult Init(nsIDeviceContext* aDeviceContext) = 0; - - /** - * Set the presentation shell that this context is bound to. - * A presentation context may only be bound to a single shell. - */ - virtual void SetShell(nsIPresShell* aShell) = 0; - - /** - * Get the PresentationShell that this context is bound to. - */ - virtual nsIPresShell* GetShell() = 0; - - /** - * Resolve style for the given piece of content that will be a child - * of the aParentFrame frame. Don't use this for pseudo frames. - */ - virtual nsIStyleContext* ResolveStyleContextFor(nsIContent* aContent, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - - /** - * Resolve style for a pseudo frame within the given aParentFrame frame. - * The tag should be uppercase and inclue the colon. - * ie: NS_NewAtom(":FIRST-LINE"); - */ - virtual nsIStyleContext* ResolvePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - - /** - * Probe style for a pseudo frame within the given aParentFrame frame. - * This will return nsnull id there are no explicit rules for the pseudo element. - * The tag should be uppercase and inclue the colon. - * ie: NS_NewAtom(":FIRST-LINE"); - */ - virtual nsIStyleContext* ProbePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE) = 0; - /** - * Get the font metrics for a given font. - */ - virtual nsIFontMetrics* GetMetricsFor(const nsFont& aFont) = 0; - - /** - * Get the default font - */ - virtual const nsFont& GetDefaultFont(void) = 0; - - NS_IMETHOD GetImageGroup(nsIImageGroup*& aGroupResult) = 0; - - /** - * Load an image for the target frame. This call can be made - * repeated with only a single image every being loaded. If - * aNeedSizeUpdate is PR_TRUE then when the image's size is - * determined the target frame will be reflowed (via a - * ContentChanged notification on the presentation shell). When the - * image's data is ready for rendering the target frames Paint - * method will be invoked (via the ViewManager so that the - * appropriate damage repair is done). - */ - NS_IMETHOD LoadImage(const nsString& aURL, - nsIFrame* aTargetFrame, - PRBool aNeedSizeUpdate, - nsIFrameImageLoader*& aLoader) = 0; - - /** - * Stop any image loading being done on behalf of the argument frame. - */ - NS_IMETHOD StopLoadImage(nsIFrame* aForFrame) = 0; - - NS_IMETHOD SetContainer(nsISupports* aContainer) = 0; - - NS_IMETHOD GetContainer(nsISupports** aResult) = 0; - - NS_IMETHOD SetLinkHandler(nsILinkHandler* aHandler) = 0; - - NS_IMETHOD GetLinkHandler(nsILinkHandler** aResult) = 0; - - /** - * Get the currently visible portion of the RootContent ILayoutable. - * The units returned are in pixels. An acceptable answer is "null" - * which means "I don't know". - *

    Speculative

    - */ - virtual void GetVisibleArea(nsRect& aResult) = 0; - - /** - * Set the currently visible area. This is the size and location - * of the visible portion of the RootContent ILayoutable. - */ - virtual void SetVisibleArea(const nsRect& r) = 0; - - /** - * Return true if this presentation context is a paginated - * context. - */ - virtual PRBool IsPaginated() = 0; - - /** - * Return the page width if this is a paginated context. - */ - virtual nscoord GetPageWidth() = 0; - - /** - * Return the page height if this is a paginated context - */ - virtual nscoord GetPageHeight() = 0; - - virtual float GetPixelsToTwips() const = 0; - virtual float GetTwipsToPixels() const = 0; - - //be sure to Relase() after you are done with the Get() - virtual nsIDeviceContext * GetDeviceContext() const = 0; - - NS_IMETHOD GetEventStateManager(nsIEventStateManager** aManager) = 0; -}; - -// Bit values for LoadImage's aImageStatus -#define NS_LOAD_IMAGE_STATUS_ERROR 0x1 -#define NS_LOAD_IMAGE_STATUS_SIZE 0x2 -#define NS_LOAD_IMAGE_STATUS_BITS 0x4 - -// Factory method to create a "galley" presentation context (galley is -// a kind of view that has no limit to the size of a page) -extern NS_LAYOUT nsresult - NS_NewGalleyContext(nsIPresContext** aInstancePtrResult); - -// Factory method to create a "paginated" presentation context for -// the screen. -extern NS_LAYOUT nsresult - NS_NewPrintPreviewContext(nsIPresContext** aInstancePtrResult); - -#endif /* nsIPresContext_h___ */ diff --git a/mozilla/layout/base/public/nsStyleCoord.h b/mozilla/layout/base/public/nsStyleCoord.h deleted file mode 100644 index 3d3b1b70e11..00000000000 --- a/mozilla/layout/base/public/nsStyleCoord.h +++ /dev/null @@ -1,237 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsStyleCoord_h___ -#define nsStyleCoord_h___ - -#include "nscore.h" -#include "nsCoord.h" -#include "nsCRT.h" -class nsString; - -enum nsStyleUnit { - eStyleUnit_Null = 0, // (no value) value is not specified - eStyleUnit_Normal = 1, // (no value) - eStyleUnit_Auto = 2, // (no value) - eStyleUnit_Inherit = 3, // (no value) value should be inherited - eStyleUnit_Percent = 10, // (float) 1.0 == 100% - eStyleUnit_Factor = 11, // (float) a multiplier - eStyleUnit_Coord = 20, // (nscoord) value is twips - eStyleUnit_Integer = 30, // (int) value is simple integer - eStyleUnit_Proportional = 31, // (int) value has proportional meaning - eStyleUnit_Enumerated = 32 // (int) value has enumerated meaning -}; - -typedef union { - PRInt32 mInt; // nscoord is a PRInt32 for now - float mFloat; -} nsStyleUnion; - -class nsStyleCoord { -public: - nsStyleCoord(nsStyleUnit aUnit = eStyleUnit_Null); - nsStyleCoord(nscoord aValue); - nsStyleCoord(PRInt32 aValue, nsStyleUnit aUnit); - nsStyleCoord(float aValue, nsStyleUnit aUnit); - nsStyleCoord(const nsStyleCoord& aCopy); - - nsStyleCoord& operator=(const nsStyleCoord& aCopy); - PRBool operator==(const nsStyleCoord& aOther) const; - - nsStyleUnit GetUnit(void) const { return mUnit; } - nscoord GetCoordValue(void) const; - PRInt32 GetIntValue(void) const; - float GetPercentValue(void) const; - float GetFactorValue(void) const; - void GetUnionValue(nsStyleUnion& aValue) const; - - void Reset(void); // sets to null - void SetCoordValue(nscoord aValue); - void SetIntValue(PRInt32 aValue, nsStyleUnit aUnit); - void SetPercentValue(float aValue); - void SetFactorValue(float aValue); - void SetNormalValue(void); - void SetAutoValue(void); - void SetInheritValue(void); - void SetUnionValue(const nsStyleUnion& aValue, nsStyleUnit aUnit); - - void AppendToString(nsString& aBuffer) const; - void ToString(nsString& aBuffer) const; - -protected: - nsStyleUnit mUnit; - nsStyleUnion mValue; -}; - - -class nsStyleSides { -public: - nsStyleSides(void); - -// nsStyleSides& operator=(const nsStyleSides& aCopy); // use compiler's version -// PRBool operator==(const nsStyleSides& aOther) const; - - nsStyleUnit GetLeftUnit(void) const; - nsStyleUnit GetTopUnit(void) const; - nsStyleUnit GetRightUnit(void) const; - nsStyleUnit GetBottomUnit(void) const; - - nsStyleCoord& GetLeft(nsStyleCoord& aCoord) const; - nsStyleCoord& GetTop(nsStyleCoord& aCoord) const; - nsStyleCoord& GetRight(nsStyleCoord& aCoord) const; - nsStyleCoord& GetBottom(nsStyleCoord& aCoord) const; - - void Reset(void); - void SetLeft(const nsStyleCoord& aCoord); - void SetTop(const nsStyleCoord& aCoord); - void SetRight(const nsStyleCoord& aCoord); - void SetBottom(const nsStyleCoord& aCoord); - - void AppendToString(nsString& aBuffer) const; - void ToString(nsString& aBuffer) const; - -protected: - PRUint8 mLeftUnit; - PRUint8 mTopUnit; - PRUint8 mRightUnit; - PRUint8 mBottomUnit; - nsStyleUnion mLeftValue; - nsStyleUnion mTopValue; - nsStyleUnion mRightValue; - nsStyleUnion mBottomValue; -}; - -// ------------------------- -// nsStyleCoord inlines -// -inline PRInt32 nsStyleCoord::GetCoordValue(void) const -{ - NS_ASSERTION((mUnit == eStyleUnit_Coord), "not a coord value"); - if (mUnit == eStyleUnit_Coord) { - return mValue.mInt; - } - return 0; -} - -inline PRInt32 nsStyleCoord::GetIntValue(void) const -{ - NS_ASSERTION((mUnit == eStyleUnit_Proportional) || - (mUnit == eStyleUnit_Enumerated) || - (mUnit == eStyleUnit_Integer), "not an int value"); - if ((mUnit == eStyleUnit_Proportional) || - (mUnit == eStyleUnit_Enumerated) || - (mUnit == eStyleUnit_Integer)) { - return mValue.mInt; - } - return 0; -} - -inline float nsStyleCoord::GetPercentValue(void) const -{ - NS_ASSERTION(mUnit == eStyleUnit_Percent, "not a percent value"); - if (mUnit == eStyleUnit_Percent) { - return mValue.mFloat; - } - return 0.0f; -} - -inline float nsStyleCoord::GetFactorValue(void) const -{ - NS_ASSERTION(mUnit == eStyleUnit_Factor, "not a factor value"); - if (mUnit == eStyleUnit_Factor) { - return mValue.mFloat; - } - return 0.0f; -} - -inline void nsStyleCoord::GetUnionValue(nsStyleUnion& aValue) const -{ - nsCRT::memcpy(&aValue, &mValue, sizeof(nsStyleUnion)); -} - -// ------------------------- -// nsStyleSides inlines -// -inline nsStyleUnit nsStyleSides::GetLeftUnit(void) const -{ - return (nsStyleUnit)mLeftUnit; -} - -inline nsStyleUnit nsStyleSides::GetTopUnit(void) const -{ - return (nsStyleUnit)mTopUnit; -} - -inline nsStyleUnit nsStyleSides::GetRightUnit(void) const -{ - return (nsStyleUnit)mRightUnit; -} - -inline nsStyleUnit nsStyleSides::GetBottomUnit(void) const -{ - return (nsStyleUnit)mBottomUnit; -} - -inline nsStyleCoord& nsStyleSides::GetLeft(nsStyleCoord& aCoord) const -{ - aCoord.SetUnionValue(mLeftValue, (nsStyleUnit)mLeftUnit); - return aCoord; -} - -inline nsStyleCoord& nsStyleSides::GetTop(nsStyleCoord& aCoord) const -{ - aCoord.SetUnionValue(mTopValue, (nsStyleUnit)mTopUnit); - return aCoord; -} - -inline nsStyleCoord& nsStyleSides::GetRight(nsStyleCoord& aCoord) const -{ - aCoord.SetUnionValue(mRightValue, (nsStyleUnit)mRightUnit); - return aCoord; -} - -inline nsStyleCoord& nsStyleSides::GetBottom(nsStyleCoord& aCoord) const -{ - aCoord.SetUnionValue(mBottomValue, (nsStyleUnit)mBottomUnit); - return aCoord; -} - -inline void nsStyleSides::SetLeft(const nsStyleCoord& aCoord) -{ - mLeftUnit = aCoord.GetUnit(); - aCoord.GetUnionValue(mLeftValue); -} - -inline void nsStyleSides::SetTop(const nsStyleCoord& aCoord) -{ - mTopUnit = aCoord.GetUnit(); - aCoord.GetUnionValue(mTopValue); -} - -inline void nsStyleSides::SetRight(const nsStyleCoord& aCoord) -{ - mRightUnit = aCoord.GetUnit(); - aCoord.GetUnionValue(mRightValue); -} - -inline void nsStyleSides::SetBottom(const nsStyleCoord& aCoord) -{ - mBottomUnit = aCoord.GetUnit(); - aCoord.GetUnionValue(mBottomValue); -} - -#endif /* nsStyleCoord_h___ */ diff --git a/mozilla/layout/base/public/nsStyleStruct.h b/mozilla/layout/base/public/nsStyleStruct.h deleted file mode 100644 index 4a070f23e25..00000000000 --- a/mozilla/layout/base/public/nsStyleStruct.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsStyleStruct_h___ -#define nsStyleStruct_h___ - -enum nsStyleStructID { - eStyleStruct_Font = 1, - eStyleStruct_Color = 2, - eStyleStruct_Spacing = 3, - eStyleStruct_List = 4, - eStyleStruct_Position = 5, - eStyleStruct_Text = 6, - eStyleStruct_Display = 7, - eStyleStruct_Table = 8 -}; - - -struct nsStyleStruct { -}; - - -#endif /* nsStyleStruct_h___ */ - diff --git a/mozilla/layout/base/public/nslayout.h b/mozilla/layout/base/public/nslayout.h deleted file mode 100644 index 585c564e22b..00000000000 --- a/mozilla/layout/base/public/nslayout.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nslayout_h___ -#define nslayout_h___ - -#include "nscore.h" - -// Note: For now, NS_LAYOUT and NS_HTML are joined at the hip -#if defined(_IMPL_NS_LAYOUT) || defined(_IMPL_NS_HTML) -#define NS_LAYOUT NS_EXPORT -#define NS_HTML NS_EXPORT -#else -#define NS_LAYOUT NS_IMPORT -#define NS_HTML NS_IMPORT -#endif - -#endif /* nslayout_h___ */ diff --git a/mozilla/layout/base/src/Makefile b/mozilla/layout/base/src/Makefile deleted file mode 100644 index 48077f19b67..00000000000 --- a/mozilla/layout/base/src/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../../.. - -LIBRARY_NAME = raptorlayout_s - -DEFINES = -D_IMPL_NS_LAYOUT - -CPPSRCS = \ - nsContainerFrame.cpp \ - nsDocument.cpp \ - nsFrame.cpp \ - nsFrameImageLoader.cpp \ - nsGalleyContext.cpp \ - nsPresContext.cpp \ - nsPresShell.cpp \ - nsPrintPreviewContext.cpp \ - nsSelection.cpp \ - nsSelectionPoint.cpp \ - nsSelectionRange.cpp \ - nsSpaceManager.cpp \ - nsSplittableFrame.cpp \ - nsStyleCoord.cpp \ - nsStyleContext.cpp \ - nsStyleSet.cpp \ - $(NULL) - -MODULE = raptor - -EXPORTS = \ - nsSelectionRange.h \ - nsSelectionPoint.h \ - $(NULL) - -REQUIRES = xpcom raptor dom netlib js - -TARGETS = $(LIBRARY) - -include $(DEPTH)/config/config.mk - -MKSHLIB := - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/base/src/makefile.win b/mozilla/layout/base/src/makefile.win deleted file mode 100644 index 145f61cf5ff..00000000000 --- a/mozilla/layout/base/src/makefile.win +++ /dev/null @@ -1,80 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. - -LIBRARY_NAME=raptorlayout_s -DEFINES=-D_IMPL_NS_LAYOUT -DWIN32_LEAN_AND_MEAN - -CPPSRCS = \ - nsContainerFrame.cpp \ - nsDocument.cpp \ - nsFrame.cpp \ - nsFrameImageLoader.cpp \ - nsGalleyContext.cpp \ - nsPresContext.cpp \ - nsPresShell.cpp \ - nsPrintPreviewContext.cpp \ - nsSelection.cpp \ - nsSelectionPoint.cpp \ - nsSelectionRange.cpp \ - nsSpaceManager.cpp \ - nsSplittableFrame.cpp \ - nsStyleContext.cpp \ - nsStyleCoord.cpp \ - nsStyleSet.cpp \ - $(NULL) - -MODULE=raptor -REQUIRES=xpcom raptor dom -EXPORTS=nsSelectionRange.h - -CPP_OBJS= \ - .\$(OBJDIR)\nsContainerFrame.obj \ - .\$(OBJDIR)\nsDocument.obj \ - .\$(OBJDIR)\nsFrame.obj \ - .\$(OBJDIR)\nsFrameImageLoader.obj \ - .\$(OBJDIR)\nsGalleyContext.obj \ - .\$(OBJDIR)\nsPresContext.obj \ - .\$(OBJDIR)\nsPresShell.obj \ - .\$(OBJDIR)\nsPrintPreviewContext.obj \ - .\$(OBJDIR)\nsSelection.obj \ - .\$(OBJDIR)\nsSelectionPoint.obj \ - .\$(OBJDIR)\nsSelectionRange.obj \ - .\$(OBJDIR)\nsSpaceManager.obj \ - .\$(OBJDIR)\nsSplittableFrame.obj \ - .\$(OBJDIR)\nsStyleContext.obj \ - .\$(OBJDIR)\nsStyleCoord.obj \ - .\$(OBJDIR)\nsStyleSet.obj \ - $(NULL) - -LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor \ - -I$(PUBLIC)\dom -I$(PUBLIC)\js -I$(PUBLIC)\netlib - -LCFLAGS = \ - $(LCFLAGS) \ - $(DEFINES) \ - $(NULL) - -include <$(DEPTH)\layout\config\rules.mak> - -libs:: $(LIBRARY) - $(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib - -clobber:: - rm -f $(DIST)\lib\$(LIBRARY_NAME).lib - rm -f $(PDBFILE).pdb diff --git a/mozilla/layout/base/src/nsContainerFrame.cpp b/mozilla/layout/base/src/nsContainerFrame.cpp deleted file mode 100644 index 75cf8de3926..00000000000 --- a/mozilla/layout/base/src/nsContainerFrame.cpp +++ /dev/null @@ -1,1343 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsContainerFrame.h" -#include "nsIContent.h" -#include "nsIPresContext.h" -#include "nsIRenderingContext.h" -#include "nsIRunaround.h" -#include "nsISpaceManager.h" -#include "nsIStyleContext.h" -#include "nsIContentDelegate.h" -#include "nsRect.h" -#include "nsPoint.h" -#include "nsGUIEvent.h" -#include "nsStyleConsts.h" -#include "nsIView.h" -#include "nsVoidArray.h" -#include "nsISizeOfHandler.h" - -#ifdef NS_DEBUG -#undef NOISY -#else -#undef NOISY -#endif - -static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID); - -nsContainerFrame::nsContainerFrame(nsIContent* aContent, nsIFrame* aParent) - : nsSplittableFrame(aContent, aParent), - mLastContentIsComplete(PR_TRUE) -{ -} - -nsContainerFrame::~nsContainerFrame() -{ - // Delete our child frames before doing anything else. In particular - // we do all of this before our base class releases it's hold on the - // view. - for (nsIFrame* child = mFirstChild; child; ) { - nsIFrame* nextChild; - - child->GetNextSibling(nextChild); - child->DeleteFrame(); - child = nextChild; - } -} - -NS_IMETHODIMP -nsContainerFrame::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - nsContainerFrame::SizeOfWithoutThis(aHandler); - return NS_OK; -} - -void -nsContainerFrame::SizeOfWithoutThis(nsISizeOfHandler* aHandler) const -{ - nsSplittableFrame::SizeOfWithoutThis(aHandler); - for (nsIFrame* child = mFirstChild; child; ) { - child->SizeOf(aHandler); - child->GetNextSibling(child); - } -} - -void -nsContainerFrame::PrepareContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsContainerFrame* aContFrame) -{ - // Append the continuing frame to the flow - aContFrame->AppendToFlow(this); - - // Initialize it's content offsets. Note that we assume for now that - // the continuingFrame will map the remainder of the content and - // that therefore mLastContentIsComplete will be true. - PRInt32 nextOffset = NextChildOffset(); - aContFrame->mFirstContentOffset = nextOffset; - aContFrame->mLastContentOffset = nextOffset; - aContFrame->mLastContentIsComplete = PR_TRUE; - - aContFrame->SetStyleContext(aPresContext, aStyleContext); -} - -NS_METHOD -nsContainerFrame::CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame) -{ - nsIContentDelegate* contentDelegate = mContent->GetDelegate(aPresContext); - nsresult rv = contentDelegate->CreateFrame(aPresContext, mContent, aParent, - aStyleContext, aContinuingFrame); - NS_RELEASE(contentDelegate); - if (NS_OK == rv) { - PrepareContinuingFrame(aPresContext, aParent, aStyleContext, - (nsContainerFrame*)aContinuingFrame); - } - return rv; -} - -NS_METHOD -nsContainerFrame::DidReflow(nsIPresContext& aPresContext, - nsDidReflowStatus aStatus) -{ - NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, - ("enter nsContainerFrame::DidReflow: status=%d", - aStatus)); - if (NS_FRAME_REFLOW_FINISHED == aStatus) { - nsFrameState state; - nsIFrame* kid = mFirstChild; - while (nsnull != kid) { - kid->GetFrameState(state); - if (0 != (state & NS_FRAME_IN_REFLOW)) { - kid->DidReflow(aPresContext, aStatus); - } - kid->GetNextSibling(kid); - } - } - - NS_FRAME_TRACE_OUT("nsContainerFrame::DidReflow"); - - // Let nsFrame position and size our view (if we have one), and clear - // the NS_FRAME_IN_REFLOW bit - return nsFrame::DidReflow(aPresContext, aStatus); -} - -///////////////////////////////////////////////////////////////////////////// -// Child frame enumeration - -NS_METHOD nsContainerFrame::ChildCount(PRInt32& aChildCount) const -{ - aChildCount = mChildCount; - return NS_OK; -} - -NS_METHOD nsContainerFrame::ChildAt(PRInt32 aIndex, nsIFrame*& aFrame) const -{ - // Check that the index is in range - if ((aIndex < 0) || (aIndex >= mChildCount)) { - aFrame = nsnull; - return NS_OK; - } - - aFrame = mFirstChild; - while ((aIndex-- > 0) && (aFrame != nsnull)) { - aFrame->GetNextSibling(aFrame); - } - return NS_OK; -} - -NS_METHOD nsContainerFrame::IndexOf(const nsIFrame* aChild, PRInt32& aIndex) const -{ - aIndex = -1; // initialize out parameter - - for (nsIFrame* f = mFirstChild; f != nsnull; f->GetNextSibling(f)) { - aIndex++; - - if (f == aChild) - break; - } - - return NS_OK; -} - -NS_METHOD nsContainerFrame::FirstChild(nsIFrame*& aFirstChild) const -{ - aFirstChild = mFirstChild; - return NS_OK; -} - -NS_METHOD nsContainerFrame::NextChild(const nsIFrame* aChild, nsIFrame*& aNextChild) const -{ - NS_PRECONDITION(aChild != nsnull, "null pointer"); - aChild->GetNextSibling(aNextChild); - return NS_OK; -} - -NS_METHOD nsContainerFrame::PrevChild(const nsIFrame* aChild, nsIFrame*& aPrevChild) const -{ - NS_PRECONDITION(aChild != nsnull, "null pointer"); - - if (mFirstChild == aChild) { - aPrevChild = nsnull; - } else { - aPrevChild = mFirstChild; - - while ((aPrevChild != nsnull)) { - nsIFrame* nextChild; - - aPrevChild->GetNextSibling(nextChild); - if (nextChild == aChild) { - break; - } - - aPrevChild = nextChild; - } - } - - return NS_OK; -} - -NS_METHOD nsContainerFrame::LastChild(nsIFrame*& aLastChild) const -{ - aLastChild = mFirstChild; - - if (nsnull != aLastChild) { - nsIFrame* nextChild; - - aLastChild->GetNextSibling(nextChild); - while (nextChild != nsnull) { - aLastChild = nextChild; - aLastChild->GetNextSibling(nextChild); - } - } - - return NS_OK; -} - -///////////////////////////////////////////////////////////////////////////// -// Painting - -NS_METHOD nsContainerFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - PaintChildren(aPresContext, aRenderingContext, aDirtyRect); - return NS_OK; -} - -// aDirtyRect is in our coordinate system -// child rect's are also in our coordinate system -void nsContainerFrame::PaintChildren(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - // Set clip rect so that children don't leak out of us - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - PRBool hidden = PR_FALSE; - if (NS_STYLE_OVERFLOW_HIDDEN == disp->mOverflow) { - aRenderingContext.PushState(); - aRenderingContext.SetClipRect(nsRect(0, 0, mRect.width, mRect.height), - nsClipCombine_kIntersect); - hidden = PR_TRUE; - } - - // XXX reminder: use the coordinates in the dirty rect to figure out - // which set of children are impacted and only do the intersection - // work for them. In addition, stop when we no longer overlap. - - nsIFrame* kid = mFirstChild; - while (nsnull != kid) { - nsIView *pView; - - kid->GetView(pView); - if (nsnull == pView) { - nsRect kidRect; - kid->GetRect(kidRect); - nsRect damageArea; - PRBool overlap = damageArea.IntersectRect(aDirtyRect, kidRect); - if (overlap) { - // Translate damage area into kid's coordinate system - nsRect kidDamageArea(damageArea.x - kidRect.x, - damageArea.y - kidRect.y, - damageArea.width, damageArea.height); - aRenderingContext.PushState(); - aRenderingContext.Translate(kidRect.x, kidRect.y); - kid->Paint(aPresContext, aRenderingContext, kidDamageArea); - if (nsIFrame::GetShowFrameBorders()) { - nsIView* view; - GetView(view); - if (nsnull != view) { - aRenderingContext.SetColor(NS_RGB(0,0,255)); - NS_RELEASE(view); - } - else { - aRenderingContext.SetColor(NS_RGB(255,0,0)); - } - aRenderingContext.DrawRect(0, 0, kidRect.width, kidRect.height); - } - aRenderingContext.PopState(); - } - } - else { - NS_RELEASE(pView); - } - kid->GetNextSibling(kid); - } - - if (hidden) { - aRenderingContext.PopState(); - } -} - -///////////////////////////////////////////////////////////////////////////// -// Events - -NS_METHOD nsContainerFrame::HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus) -{ - aEventStatus = nsEventStatus_eIgnore; - - nsIFrame* kid = mFirstChild; - while (nsnull != kid) { - nsRect kidRect; - kid->GetRect(kidRect); - if (kidRect.Contains(aEvent->point)) { - aEvent->point.MoveBy(-kidRect.x, -kidRect.y); - kid->HandleEvent(aPresContext, aEvent, aEventStatus); - aEvent->point.MoveBy(kidRect.x, kidRect.y); - break; - } - kid->GetNextSibling(kid); - } - - return NS_OK; -} - -NS_METHOD nsContainerFrame::GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor) -{ - aCursor = NS_STYLE_CURSOR_INHERIT; - - nsIFrame* kid = mFirstChild; - nsPoint tmp; - while (nsnull != kid) { - nsRect kidRect; - kid->GetRect(kidRect); - if (kidRect.Contains(aPoint)) { - tmp.MoveTo(aPoint.x - kidRect.x, aPoint.y - kidRect.y); - kid->GetCursorAt(aPresContext, tmp, aFrame, aCursor); - break; - } - kid->GetNextSibling(kid); - } - return NS_OK; -} - -///////////////////////////////////////////////////////////////////////////// -// Managing content mapping - -// Get the offset for the next child content, i.e. the child after the -// last child that fit in us -PRInt32 nsContainerFrame::NextChildOffset() const -{ - PRInt32 result; - if (mChildCount > 0) { - result = mLastContentOffset; - if (mLastContentIsComplete) { - result++; - } - } - else { - result = mFirstContentOffset; - } - return result; -} - -/** - * Sets the first content offset based on the first child frame. - */ -void nsContainerFrame::SetFirstContentOffset(const nsIFrame* aFirstChild) -{ - NS_PRECONDITION(nsnull != aFirstChild, "bad argument"); - NS_PRECONDITION(IsChild(aFirstChild), "bad geometric parent"); - - if (ChildIsPseudoFrame(aFirstChild)) { - nsContainerFrame* pseudoFrame = (nsContainerFrame*)aFirstChild; - mFirstContentOffset = pseudoFrame->mFirstContentOffset; - } else { - // XXX TROY Change API to pass in content index if possible... - aFirstChild->GetContentIndex(mFirstContentOffset); - } -} - -/** - * Sets the last content offset based on the last child frame. If the last - * child is a pseudo frame then it sets mLastContentIsComplete to be the same - * as the last child's mLastContentIsComplete - */ -void nsContainerFrame::SetLastContentOffset(const nsIFrame* aLastChild) -{ - NS_PRECONDITION(nsnull != aLastChild, "bad argument"); - NS_PRECONDITION(IsChild(aLastChild), "bad geometric parent"); - - if (ChildIsPseudoFrame(aLastChild)) { - nsContainerFrame* pseudoFrame = (nsContainerFrame*)aLastChild; - mLastContentOffset = pseudoFrame->mLastContentOffset; -#ifdef NS_DEBUG - pseudoFrame->VerifyLastIsComplete(); -#endif - mLastContentIsComplete = pseudoFrame->mLastContentIsComplete; - } else { - // XXX TROY Change API to pass in content index if possible... - aLastChild->GetContentIndex(mLastContentOffset); - } -#ifdef NS_DEBUG - if (mLastContentOffset < mFirstContentOffset) { - DumpTree(); - } -#endif - NS_ASSERTION(mLastContentOffset >= mFirstContentOffset, "unexpected content mapping"); -} - -///////////////////////////////////////////////////////////////////////////// -// Pseudo frame related - -// Returns true if this frame is being used a pseudo frame -PRBool nsContainerFrame::IsPseudoFrame() const -{ - PRBool result = PR_FALSE; - - if (nsnull != mGeometricParent) { - nsIContent* parentContent; - - mGeometricParent->GetContent(parentContent); - if (parentContent == mContent) { - result = PR_TRUE; - } - NS_RELEASE(parentContent); - } - - return result; -} - -// Returns true if aChild is being used as a pseudo frame -PRBool nsContainerFrame::ChildIsPseudoFrame(const nsIFrame* aChild) const -{ - nsIContent* childContent; - PRBool result; - - aChild->GetContent(childContent); - result = childContent == mContent; - NS_RELEASE(childContent); - return result; -} - -///////////////////////////////////////////////////////////////////////////// -// Helper member functions - -/** - * Reflow a child frame and return the status of the reflow. If the - * child is complete and it has next-in-flows (it was a splittable child) - * then delete the next-in-flows. - */ -nsReflowStatus nsContainerFrame::ReflowChild(nsIFrame* aKidFrame, - nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState) -{ - nsReflowStatus status; - - NS_PRECONDITION(aReflowState.frame == aKidFrame, "bad reflow state"); -#ifdef NS_DEBUG - nsFrameState kidFrameState; - - aKidFrame->GetFrameState(kidFrameState); - NS_ASSERTION(kidFrameState & NS_FRAME_IN_REFLOW, "kid frame is not in reflow"); -#endif - aKidFrame->Reflow(aPresContext, aDesiredSize, aReflowState, status); - - if (NS_FRAME_IS_COMPLETE(status)) { - nsIFrame* kidNextInFlow; - - aKidFrame->GetNextInFlow(kidNextInFlow); - if (nsnull != kidNextInFlow) { - // Remove all of the childs next-in-flows. Make sure that we ask - // the right parent to do the removal (it's possible that the - // parent is not this because we are executing pullup code) - nsIFrame* parent; - aKidFrame->GetGeometricParent(parent); - ((nsContainerFrame*)parent)->DeleteChildsNextInFlow(aKidFrame); - } - } - return status; -} - -/** - * Remove and delete aChild's next-in-flow(s). Updates the sibling and flow - * pointers - * - * Updates the child count and content offsets of all containers that are - * affected - * - * @param aChild child this child's next-in-flow - * @return PR_TRUE if successful and PR_FALSE otherwise - */ -PRBool -nsContainerFrame::DeleteChildsNextInFlow(nsIFrame* aChild) -{ - NS_PRECONDITION(IsChild(aChild), "bad geometric parent"); - - nsIFrame* nextInFlow; - nsContainerFrame* parent; - - aChild->GetNextInFlow(nextInFlow); - NS_PRECONDITION(nsnull != nextInFlow, "null next-in-flow"); - nextInFlow->GetGeometricParent((nsIFrame*&)parent); - - // If the next-in-flow has a next-in-flow then delete it, too (and - // delete it first). - nsIFrame* nextNextInFlow; - - nextInFlow->GetNextInFlow(nextNextInFlow); - if (nsnull != nextNextInFlow) { - parent->DeleteChildsNextInFlow(nextInFlow); - } - -#ifdef NS_DEBUG - PRInt32 childCount; - nsIFrame* firstChild; - - nextInFlow->ChildCount(childCount); - nextInFlow->FirstChild(firstChild); - - if ((0 != childCount) || (nsnull != firstChild)) { - nsIFrame* top = nextInFlow; - for (;;) { - nsIFrame* parent; - top->GetGeometricParent(parent); - if (nsnull == parent) { - break; - } - top = parent; - } - top->List(); - } - NS_ASSERTION((0 == childCount) && (nsnull == firstChild), - "deleting !empty next-in-flow"); -#endif - - // Disconnect the next-in-flow from the flow list - nextInFlow->BreakFromPrevFlow(); - - // Take the next-in-flow out of the parent's child list - if (parent->mFirstChild == nextInFlow) { - nextInFlow->GetNextSibling(parent->mFirstChild); - if (nsnull != parent->mFirstChild) { - parent->SetFirstContentOffset(parent->mFirstChild); - if (parent->IsPseudoFrame()) { - // Tell the parent's parent to update its content offsets - nsContainerFrame* pp = (nsContainerFrame*) parent->mGeometricParent; - pp->PropagateContentOffsets(parent, parent->mFirstContentOffset, - parent->mLastContentOffset, - parent->mLastContentIsComplete); - } - } - - // When a parent loses it's last child and that last child is a - // pseudo-frame then the parent's content offsets are now wrong. - // However, we know that the parent will eventually be reflowed - // in one of two ways: it will either get a chance to pullup - // children or it will be deleted because it's prev-in-flow - // (e.g. this) is complete. In either case, the content offsets - // will be repaired. - - } else { - nsIFrame* nextSibling; - - // Because the next-in-flow is not the first child of the parent - // we know that it shares a parent with aChild. Therefore, we need - // to capture the next-in-flow's next sibling (in case the - // next-in-flow is the last next-in-flow for aChild AND the - // next-in-flow is not the last child in parent) - NS_ASSERTION(((nsContainerFrame*)parent)->IsChild(aChild), "screwy flow"); - aChild->GetNextSibling(nextSibling); - NS_ASSERTION(nextSibling == nextInFlow, "unexpected sibling"); - - nextInFlow->GetNextSibling(nextSibling); - aChild->SetNextSibling(nextSibling); - } - - // Delete the next-in-flow frame and adjust its parents child count - WillDeleteNextInFlowFrame(nextInFlow); - nextInFlow->DeleteFrame(); - parent->mChildCount--; - -#ifdef NS_DEBUG - aChild->GetNextInFlow(nextInFlow); - NS_POSTCONDITION(nsnull == nextInFlow, "non null next-in-flow"); -#endif - return PR_TRUE; -} - -void nsContainerFrame::WillDeleteNextInFlowFrame(nsIFrame* aNextInFlow) -{ -} - -void -nsContainerFrame::PropagateContentOffsets(nsIFrame* aChild, - PRInt32 aFirstContentOffset, - PRInt32 aLastContentOffset, - PRBool aLastContentIsComplete) -{ - NS_PRECONDITION(ChildIsPseudoFrame(aChild), "not a pseudo frame"); - - // First update our offsets - if (mFirstChild == aChild) { - mFirstContentOffset = aFirstContentOffset; - } - nsIFrame* lastChild; - LastChild(lastChild); - if (lastChild == aChild) { - mLastContentOffset = aLastContentOffset; - mLastContentIsComplete = aLastContentIsComplete; - } - - // If we are a pseudo-frame then we need to update our parent - if (IsPseudoFrame()) { - nsContainerFrame* parent = (nsContainerFrame*) mGeometricParent; - parent->PropagateContentOffsets(this, mFirstContentOffset, - mLastContentOffset, - mLastContentIsComplete); - } -} - -/** - * Push aFromChild and its next siblings to the next-in-flow. Change the - * geometric parent of each frame that's pushed. If there is no next-in-flow - * the frames are placed on the overflow list (and the geometric parent is - * left unchanged). - * - * Updates the next-in-flow's child count and content offsets. Does - * not update the pusher's child count or last content offset. - * - * @param aFromChild the first child frame to push. It is disconnected from - * aPrevSibling - * @param aPrevSibling aFromChild's previous sibling. Must not be null. It's - * an error to push a parent's first child frame - * @param aNextInFlowsLastChildIsComplete the next-in-flow's - * mLastContentIsComplete flag. This is used when refilling an - * empty next-in-flow that was drained by the caller. - * - */ -// Note: we cannot VerifyLastIsComplete here because the caller is -// responsible for setting it. -void nsContainerFrame::PushChildren(nsIFrame* aFromChild, - nsIFrame* aPrevSibling, - PRBool aNextInFlowsLastContentIsComplete) -{ - NS_PRECONDITION(nsnull != aFromChild, "null pointer"); - NS_PRECONDITION(nsnull != aPrevSibling, "pushing first child"); -#ifdef NS_DEBUG - nsIFrame* prevNextSibling; - - aPrevSibling->GetNextSibling(prevNextSibling); - NS_PRECONDITION(prevNextSibling == aFromChild, "bad prev sibling"); -#endif - - // Disconnect aFromChild from its previous sibling - aPrevSibling->SetNextSibling(nsnull); - - // Do we have a next-in-flow? - nsContainerFrame* nextInFlow = (nsContainerFrame*)mNextInFlow; - if (nsnull != nextInFlow) { - PRInt32 numChildren = 0; - nsIFrame* lastChild = nsnull; - -#ifdef NOISY - ListTag(stdout); - printf(": pushing kids (childCount=%d)\n", mChildCount); - { - nsContainerFrame* flow = (nsContainerFrame*) mNextInFlow; - while (flow != 0) { - printf(" %p: [%d,%d,%c]\n", - flow, flow->mFirstContentOffset, flow->mLastContentOffset, - (flow->mLastContentIsComplete ? 'T' : 'F')); - flow = (nsContainerFrame*) flow->mNextInFlow; - } - } -#endif - // Compute the number of children being pushed, and for each child change - // its geometric parent. Remember the last child - for (nsIFrame* f = aFromChild; nsnull != f; f->GetNextSibling(f)) { - numChildren++; -#ifdef NOISY - printf(" "); - ((nsFrame*)f)->ListTag(stdout); - printf("\n"); -#endif - lastChild = f; - f->SetGeometricParent(nextInFlow); - - nsIFrame* contentParent; - - f->GetContentParent(contentParent); - if (this == contentParent) { - f->SetContentParent(nextInFlow); - } - } - NS_ASSERTION(numChildren > 0, "no children to push"); - - // Prepend the frames to our next-in-flow's child list - lastChild->SetNextSibling(nextInFlow->mFirstChild); - nextInFlow->mFirstChild = aFromChild; - - // Update our next-in-flow's first content offset and child count - nextInFlow->SetFirstContentOffset(aFromChild); - if (0 == nextInFlow->mChildCount) { - nextInFlow->SetLastContentOffset(lastChild); - // If the child is pseudo-frame then SetLastContentOffset will - // have updated the next-in-flow's mLastContentIsComplete flag, - // otherwise we have to do it. - if (!nextInFlow->ChildIsPseudoFrame(lastChild)) { - nsIFrame* lastChildNextInFlow; - - lastChild->GetNextInFlow(lastChildNextInFlow); - nextInFlow->mLastContentIsComplete = (nsnull == lastChildNextInFlow); - } - } - nextInFlow->mChildCount += numChildren; - - // If the next-in-flow is being used as a pseudo frame then we need - // to propagate the content offsets upwards to its parent frame - if (nextInFlow->IsPseudoFrame()) { - nsContainerFrame* parent = (nsContainerFrame*) - nextInFlow->mGeometricParent; - parent->PropagateContentOffsets(nextInFlow, - nextInFlow->mFirstContentOffset, - nextInFlow->mLastContentOffset, - nextInFlow->mLastContentIsComplete); - } - -#ifdef NOISY - ListTag(stdout); - printf(": push kids done (childCount=%d)\n", mChildCount); - { - nsContainerFrame* flow = (nsContainerFrame*) mNextInFlow; - while (flow != 0) { - printf(" %p: [%d,%d,%c]\n", - flow, flow->mFirstContentOffset, flow->mLastContentOffset, - (flow->mLastContentIsComplete ? 'T' : 'F')); - flow = (nsContainerFrame*) flow->mNextInFlow; - } - } -#endif - } else { - // Add the frames to our overflow list - NS_ASSERTION(nsnull == mOverflowList, "bad overflow list"); -#ifdef NOISY - ListTag(stdout); - printf(": pushing kids to my overflow list\n"); -#endif - mOverflowList = aFromChild; - } -} - -/** - * Moves any frames on the overflwo lists (the prev-in-flow's overflow list and - * the receiver's overflow list) to the child list. - * - * Updates this frame's child count and content mapping. - * - * @return PR_TRUE if any frames were moved and PR_FALSE otherwise - */ -PRBool nsContainerFrame::MoveOverflowToChildList() -{ - PRBool result = PR_FALSE; - - // Check for an overflow list with our prev-in-flow - nsContainerFrame* prevInFlow = (nsContainerFrame*)mPrevInFlow; - if (nsnull != prevInFlow) { - if (nsnull != prevInFlow->mOverflowList) { - NS_ASSERTION(nsnull == mFirstChild, "bad overflow list"); - AppendChildren(prevInFlow->mOverflowList); - prevInFlow->mOverflowList = nsnull; - result = PR_TRUE; - } - } - - // It's also possible that we have an overflow list for ourselves - if (nsnull != mOverflowList) { - NS_ASSERTION(nsnull != mFirstChild, "overflow list but no mapped children"); - AppendChildren(mOverflowList, PR_FALSE); - mOverflowList = nsnull; - result = PR_TRUE; - } - - return result; -} - -/** - * Append child list starting at aChild to this frame's child list. Used for - * processing of the overflow list. - * - * Updates this frame's child count and content mapping. - * - * @param aChild the beginning of the child list - * @param aSetParent if true each child's geometric (and content parent if - * they're the same) parent is set to this frame. - */ -void nsContainerFrame::AppendChildren(nsIFrame* aChild, PRBool aSetParent) -{ - // Link the frames into our child frame list - if (nsnull == mFirstChild) { - // We have no children so aChild becomes the first child - mFirstChild = aChild; - } else { - nsIFrame* lastChild; - - LastChild(lastChild); - lastChild->SetNextSibling(aChild); - } - - // Update our child count and last content offset - nsIFrame* lastChild; - for (nsIFrame* f = aChild; nsnull != f; f->GetNextSibling(f)) { - lastChild = f; - mChildCount++; - - // Reset the geometric parent if requested - if (aSetParent) { - nsIFrame* geometricParent; - nsIFrame* contentParent; - - f->GetGeometricParent(geometricParent); - f->GetContentParent(contentParent); - if (contentParent == geometricParent) { - f->SetContentParent(this); - } - f->SetGeometricParent(this); - } - } - - // Update our content mapping - if (mFirstChild == aChild) { - SetFirstContentOffset(mFirstChild); - } - SetLastContentOffset(lastChild); - if (!ChildIsPseudoFrame(lastChild)) { - nsIFrame* nextInFlow; - - lastChild->GetNextInFlow(nextInFlow); - mLastContentIsComplete = (nsnull == nextInFlow); - } - -#ifdef NS_DEBUG - VerifyLastIsComplete(); -#endif -} - -/** - * Called after pulling-up children from the next-in-flow. Adjusts the first - * content offset of all the empty next-in-flows - * - * It's an error to call this function if all of the next-in-flow frames - * are empty. - * - * @return PR_TRUE if successful and PR_FALSE if all the next-in-flows are - * empty - */ -void nsContainerFrame::AdjustOffsetOfEmptyNextInFlows() -{ - // If the first next-in-flow is not empty then the caller drained - // more than one next-in-flow and then pushed back into it's - // immediate next-in-flow. - nsContainerFrame* nextInFlow = (nsContainerFrame*)mNextInFlow; - PRInt32 nextOffset; - if ((nsnull != nextInFlow) && (nsnull != nextInFlow->mFirstChild)) { - // Use the offset from this frame's first next-in-flow (because - // it's not empty) to propagate into the next next-in-flow (and - // onward if necessary) - nextOffset = nextInFlow->NextChildOffset(); - - // Use next next-in-flow - nextInFlow = (nsContainerFrame*) nextInFlow->mNextInFlow; - - // When this happens, there *must* be a next next-in-flow and the - // next next-in-flow must be empty. - NS_ASSERTION(nsnull != nextInFlow, "bad adjust offsets"); - NS_ASSERTION(nsnull == nextInFlow->mFirstChild, "bad adjust offsets"); - } else { - // Use our offset (since our next-in-flow is empty) to propagate - // into our empty next-in-flows - nextOffset = NextChildOffset(); - } - - while (nsnull != nextInFlow) { - if (nsnull == nextInFlow->mFirstChild) { - NS_ASSERTION(nextInFlow->IsEmpty(), "bad state"); - nextInFlow->mFirstContentOffset = nextOffset; - // If the next-in-flow is a pseudo-frame then we need to have it - // update it's parents offsets too. - if (nextInFlow->IsPseudoFrame()) { - nsContainerFrame* parent = (nsContainerFrame*) - nextInFlow->mGeometricParent; - parent->PropagateContentOffsets(nextInFlow, - nextInFlow->mFirstContentOffset, - nextInFlow->mLastContentOffset, - nextInFlow->mLastContentIsComplete); - } - } else { - // We found a non-empty frame. Verify that its first content offset - // is correct - NS_ASSERTION(nextInFlow->mFirstContentOffset == nextOffset, "bad first content offset"); - return; - } - - nextInFlow = (nsContainerFrame*)nextInFlow->mNextInFlow; - } - - // Make sure that all the next-in-flows weren't empty - NS_ASSERTION(nsnull != ((nsContainerFrame*)mNextInFlow)->mFirstChild, - "Every next-in-flow is empty!"); -} - -///////////////////////////////////////////////////////////////////////////// -// Debugging - -NS_METHOD nsContainerFrame::List(FILE* out, PRInt32 aIndent) const -{ - // Indent - for (PRInt32 i = aIndent; --i >= 0; ) fputs(" ", out); - - // Output the tag - ListTag(out); - nsIView* view; - GetView(view); - if (nsnull != view) { - fprintf(out, " [view=%p]", view); - NS_RELEASE(view); - } - - // Output the first/last content offset - fprintf(out, "[%d,%d,%c] ", mFirstContentOffset, mLastContentOffset, - (mLastContentIsComplete ? 'T' : 'F')); - if (nsnull != mPrevInFlow) { - fprintf(out, "prev-in-flow=%p ", mPrevInFlow); - } - if (nsnull != mNextInFlow) { - fprintf(out, "next-in-flow=%p ", mNextInFlow); - } - - // Output the rect - out << mRect; - - // Output the children - if (mChildCount > 0) { - if (0 != mState) { - fprintf(out, " [state=%08x]", mState); - } - fputs("<\n", out); - for (nsIFrame* child = mFirstChild; child; NextChild(child, child)) { - child->List(out, aIndent + 1); - } - for (PRInt32 i = aIndent; --i >= 0; ) fputs(" ", out); - fputs(">\n", out); - } else { - if (0 != mState) { - fprintf(out, " [state=%08x]", mState); - } - fputs("<>\n", out); - } - - return NS_OK; -} - -NS_METHOD nsContainerFrame::ListTag(FILE* out) const -{ - if ((nsnull != mGeometricParent) && IsPseudoFrame()) { - fputs("*", out); - } - nsFrame::ListTag(out); - return NS_OK; -} - -#define VERIFY_ASSERT(_expr, _msg) \ - if (!(_expr)) { \ - DumpTree(); \ - } \ - NS_ASSERTION(_expr, _msg) - -NS_METHOD nsContainerFrame::VerifyTree() const -{ -#ifdef NS_DEBUG - NS_ASSERTION(0 == (mState & NS_FRAME_IN_REFLOW), "frame is in reflow"); - - // Check our child count - PRInt32 len = LengthOf(mFirstChild); - VERIFY_ASSERT(len == mChildCount, "bad child count"); - - nsIFrame* lastChild; - - LastChild(lastChild); - if (len != 0) { - VERIFY_ASSERT(nsnull != lastChild, "bad last child"); - } - VERIFY_ASSERT(nsnull == mOverflowList, "bad overflow list"); - - // Make sure our content offsets are sane - VERIFY_ASSERT(mFirstContentOffset <= mLastContentOffset, "bad offsets"); - - // Verify child content offsets and index-in-parents - PRInt32 offset = mFirstContentOffset; - nsIFrame* child = mFirstChild; - while (nsnull != child) { - // Make sure that the child's tree is valid - child->VerifyTree(); - - // Make sure child's index-in-parent is correct - if (ChildIsPseudoFrame(child)) { - nsContainerFrame* pseudo = (nsContainerFrame*) child; - if (pseudo == mFirstChild) { - VERIFY_ASSERT(pseudo->mFirstContentOffset == offset, - "bad pseudo first content offset"); - } - if (pseudo == lastChild) { - VERIFY_ASSERT(pseudo->mFirstContentOffset == offset, - "bad pseudo first content offset"); - VERIFY_ASSERT(pseudo->mLastContentOffset == mLastContentOffset, - "bad pseudo last content offset"); - VERIFY_ASSERT(pseudo->mLastContentIsComplete == mLastContentIsComplete, - "bad pseudo last content is complete"); - } - - offset = pseudo->mLastContentOffset; - if (pseudo->mLastContentIsComplete) { - offset++; - } - } else { - PRInt32 indexInParent; - - child->GetContentIndex(indexInParent); - VERIFY_ASSERT(offset == indexInParent, "bad child offset"); - - nsIFrame* nextInFlow; - child->GetNextInFlow(nextInFlow); - if (nsnull == nextInFlow) { - offset++; - } - } - - child->GetNextSibling(child); - } - - // Verify that our last content offset is correct - if (0 != mChildCount) { - if (mLastContentIsComplete) { - VERIFY_ASSERT(offset == mLastContentOffset + 1, "bad last offset"); - } else { - VERIFY_ASSERT(offset == mLastContentOffset, "bad last offset"); - } - } - - // Make sure that our flow blocks offsets are all correct - if (nsnull == mPrevInFlow) { - PRInt32 nextOffset = NextChildOffset(); - nsContainerFrame* nextInFlow = (nsContainerFrame*) mNextInFlow; - while (nsnull != nextInFlow) { - VERIFY_ASSERT(0 != nextInFlow->mChildCount, "empty next-in-flow"); - VERIFY_ASSERT(nextInFlow->GetFirstContentOffset() == nextOffset, - "bad next-in-flow first offset"); - nextOffset = nextInFlow->NextChildOffset(); - nextInFlow = (nsContainerFrame*) nextInFlow->mNextInFlow; - } - } -#endif - return NS_OK; -} - -///////////////////////////////////////////////////////////////////////////// - -#ifdef NS_DEBUG -PRInt32 nsContainerFrame::LengthOf(nsIFrame* aFrame) -{ - PRInt32 result = 0; - - while (nsnull != aFrame) { - result++; - aFrame->GetNextSibling(aFrame); - } - - return result; -} - -PRBool nsContainerFrame::IsChild(const nsIFrame* aChild) const -{ - // Check the geometric parent - nsIFrame* parent; - - aChild->GetGeometricParent(parent); - if (parent != (nsIFrame*)this) { - return PR_FALSE; - } - -// XXX Turn back on once all frame code has been changed to always add -// a child frame to the sibling list before reflowing the child. Right now -// that's not true for inline and column when reflowing unmapped children... -#if 0 - // Check that aChild is in our sibling list - PRInt32 index; - - IndexOf(aChild, index); - if (-1 == index) { - return PR_FALSE; - } -#endif - - return PR_TRUE; -} - -PRBool nsContainerFrame::IsLastChild(const nsIFrame* aChild) const -{ - // Check the geometric parent - nsIFrame* parent; - - aChild->GetGeometricParent(parent); - if (parent != (nsIFrame*)this) { - return PR_FALSE; - } - - // Check that aChild is in our sibling list - nsIFrame* lastChild; - - LastChild(lastChild); - if (lastChild != aChild) { - return PR_FALSE; - } - - return PR_TRUE; -} - -void nsContainerFrame::DumpTree() const -{ - nsIFrame* root = (nsIFrame*)this; - nsIFrame* parent = mGeometricParent; - - while (nsnull != parent) { - root = parent; - parent->GetGeometricParent(parent); - } - - root->List(); -} - -void nsContainerFrame::CheckContentOffsets() -{ - NS_PRECONDITION(nsnull != mFirstChild, "null first child"); - - // Verify that our first content offset is correct - if (ChildIsPseudoFrame(mFirstChild)) { - nsContainerFrame* pseudoFrame = (nsContainerFrame*)mFirstChild; - - if (pseudoFrame->GetFirstContentOffset() != mFirstContentOffset) { - DumpTree(); - } - NS_ASSERTION(pseudoFrame->GetFirstContentOffset() == mFirstContentOffset, - "bad first content offset"); - } else { - PRInt32 indexInParent; - - mFirstChild->GetContentIndex(indexInParent); - if (indexInParent != mFirstContentOffset) { - DumpTree(); - } - - NS_ASSERTION(indexInParent == mFirstContentOffset, "bad first content offset"); - } - - // Verify that our last content offset is correct - nsIFrame* lastChild; - - LastChild(lastChild); - if (ChildIsPseudoFrame(lastChild)) { - nsContainerFrame* pseudoFrame = (nsContainerFrame*)lastChild; - - NS_ASSERTION(pseudoFrame->GetLastContentOffset() == mLastContentOffset, - "bad last content offset"); - - } else { - PRInt32 indexInParent; - - lastChild->GetContentIndex(indexInParent); - NS_ASSERTION(indexInParent == mLastContentOffset, "bad last content offset"); - } -} - -void nsContainerFrame::PreReflowCheck() -{ - PRInt32 len = LengthOf(mFirstChild); - NS_ASSERTION(len == mChildCount, "bad child count"); - - if (0 == mChildCount) { - NS_ASSERTION(nsnull == mFirstChild, "bad child-count/first-child"); - } else { - NS_ASSERTION(nsnull != mFirstChild, "bad child-count/first-child"); - CheckContentOffsets(); - } - VerifyLastIsComplete(); -} - -void nsContainerFrame::PostReflowCheck(nsReflowStatus aStatus) -{ - PRInt32 len = LengthOf(mFirstChild) ; - NS_ASSERTION(len == mChildCount, "bad child count"); - - if (0 == mChildCount) { - NS_ASSERTION(nsnull == mFirstChild, "bad child-count/first-child"); - } else { - NS_ASSERTION(nsnull != mFirstChild, "bad child-count/first-child"); - CheckContentOffsets(); - } - VerifyLastIsComplete(); -} - -/** - * A container is empty if it has no children, or it has exactly one - * child and that child is a pseudo-frame and it's empty (recursively - * applied if that child contains one child which is a - * pseudo-frame...) - */ -PRBool nsContainerFrame::IsEmpty() -{ - if (0 == mChildCount) { - return PR_TRUE; - } - if (mChildCount > 1) { - return PR_FALSE; - } - if (ChildIsPseudoFrame(mFirstChild)) { - return ((nsContainerFrame*)mFirstChild)->IsEmpty(); - } - return PR_FALSE; -} - -void nsContainerFrame::CheckNextInFlowOffsets() -{ - // We have to be in a safe state before we can even consider - // checking our next-in-flows state. - if (!SafeToCheckLastContentOffset(this)) { - return; - } - - PRInt32 nextOffset = NextChildOffset(); - nsContainerFrame* nextInFlow = (nsContainerFrame*)mNextInFlow; - while (nsnull != nextInFlow) { - if (!SafeToCheckLastContentOffset(nextInFlow)) { - return; - } -#ifdef NS_DEBUG - if (nextInFlow->GetFirstContentOffset() != nextOffset) { - DumpTree(); - } -#endif - NS_ASSERTION(nextInFlow->GetFirstContentOffset() == nextOffset, - "bad next-in-flow first offset"); - // Verify the content offsets are in sync with the first/last child - nextInFlow->CheckContentOffsets(); - nextOffset = nextInFlow->NextChildOffset(); - - // Move to the next-in-flow - nextInFlow = (nsContainerFrame*)nextInFlow->mNextInFlow; - } -} - -PRBool -nsContainerFrame::SafeToCheckLastContentOffset(nsContainerFrame* aContainer) -{ - if (0 == aContainer->mChildCount) { - // We can't use the last content offset on an empty frame - return PR_FALSE; - } - - if (nsnull != aContainer->mOverflowList) { - // If a frame has an overflow list then it's last content offset - // cannot be used for assertion checks (because it's not done - // being reflowed). - return PR_FALSE; - } - - nsIFrame* lastChild; - - aContainer->LastChild(lastChild); - if (aContainer->ChildIsPseudoFrame(lastChild)) { - // If the containers last child is a pseudo-frame then the - // containers last content offset is determined by the child. Ask - // the child if it's safe to use the last content offset. - return SafeToCheckLastContentOffset((nsContainerFrame*)lastChild); - } - - return PR_TRUE; -} - -void nsContainerFrame::VerifyLastIsComplete() const -{ - if (nsnull == mFirstChild) { - // If we have no children, our mLastContentIsComplete doesn't mean - // anything - return; - } - if (nsnull != mOverflowList) { - // If we can an overflow list then our mLastContentIsComplete and - // mLastContentOffset are un-verifyable because a reflow is in - // process. - return; - } - - nsIFrame* lastKid; - - LastChild(lastKid); - if (ChildIsPseudoFrame(lastKid)) { - // When my last child is a pseudo-frame it means that our - // mLastContentIsComplete is a copy of it's. - nsContainerFrame* pseudoFrame = (nsContainerFrame*) lastKid; - NS_ASSERTION(mLastContentIsComplete == pseudoFrame->mLastContentIsComplete, - "bad mLastContentIsComplete"); - } else { - // If my last child has a next-in-flow then our - // mLastContentIsComplete must be false (because our last child is - // obviously not complete) - nsIFrame* lastKidNextInFlow; - - lastKid->GetNextInFlow(lastKidNextInFlow); - if (nsnull != lastKidNextInFlow) { - if (mLastContentIsComplete) { - DumpTree(); - } - NS_ASSERTION(mLastContentIsComplete == PR_FALSE, "bad mLastContentIsComplete"); - } else { - // We don't know what state our mLastContentIsComplete should be in. - } - } -} -#endif diff --git a/mozilla/layout/base/src/nsContainerFrame.h b/mozilla/layout/base/src/nsContainerFrame.h deleted file mode 100644 index 4611eac39a8..00000000000 --- a/mozilla/layout/base/src/nsContainerFrame.h +++ /dev/null @@ -1,372 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsContainerFrame_h___ -#define nsContainerFrame_h___ - -#include "nsSplittableFrame.h" - -/** - * Implementation of a container frame. Supports being used a pseudo- - * frame (a frame that maps the same content as its parent). - * - * Container frame iterates its child content and for each content object creates - * one or more child frames. There are three member variables (class invariants) - * used to manage this mapping: - *
    - *
    mFirstContentOffset - *
    the content offset of the first piece of content mapped by this container. - *
    mLastContentOffset - *
    the content offset of the last piece of content mapped by this container - *
    mLastContentIsComplete - *
    a boolean indicating whether the last piece of content mapped by this - * container is complete, or whether its frame needs to be continued. - *
    - * - * Here are the rules governing the state of the class invariants. The debug member - * functions PreReflowCheck() and PostReflowCheck() validate these rules. For the - * purposes of this discussion an empty frame is defined as a container - * frame with a null child-list, i.e. its mFirstChild is nsnull. - * - *

    Non-Empty Frames

    - * For a container frame that is not an empty frame the following must be true: - *
      - *
    • if the first child frame is a pseudo-frame then mFirstContentOffset must be - * equal to the first child's mFirstContentOffset; otherwise, mFirstContentOffset - * must be equal to the first child frame's index in parent - *
    • if the last child frame is a pseudo-frame then mLastContentOffset must be - * equal to the last child's mLastContentOffset; otherwise, mLastContentOffset - * must be equal to the last child frame's index in parent - *
    • if the last child is a pseudo-frame then mLastContentIsComplete should be - * equal to that last child's mLastContentIsComplete; otherwise, if the last - * child frame has a next-in-flow then mLastContentIsComplete must be PR_TRUE - *
    - * - *

    Empty Frames

    - * For an empty container frame the following must be true: - *
      - *
    • mFirstContentOffset must be equal to the NextContentOffset() of the first - * non-empty prev-in-flow - *
    • mChildCount must be 0 - *
    - * - * The value of mLastContentOffset and mLastContentIsComplete are undefined - * for an empty frame. - * - *

    Next-In-Flow List

    - * The rule is that if a container frame is not complete then the mFirstContentOffset, - * mLastContentOffset, and mLastContentIsComplete of its next-in-flow frames must - * always correct. This means that whenever you push/pull child frames from a - * next-in-flow you must update that next-in-flow's state so that it is - * consistent with the aforementioned rules for empty and non-empty frames. - * - *

    Pulling-Up Frames

    - * In the processing of pulling-up child frames from a next-in-flow it's possible - * to pull-up all the child frames from a next-in-flow thereby leaving the next-in-flow - * empty. There are two cases to consider: - *
      - *
    1. All of the child frames from all of the next-in-flow have been pulled-up. - * This means that all the next-in-flow frames are empty, the container being - * reflowed is complete, and the next-in-flows will be deleted. - * - * In this case the next-in-flows' mFirstContentOffset is also undefined. - *
    2. Not all the child frames from all the next-in-flows have been pulled-up. - * This means the next-in-flow consists of one or more empty frames followed - * by one or more non-empty frames. Note that all the empty frames must be - * consecutive. This means it is illegal to have an empty frame followed by - * a non-empty frame, followed by an empty frame, followed by a non-empty frame. - *
    - * - *

    Pseudo-Frames

    - * As stated above, when pulling/pushing child frames from/to a next-in-flow the - * state of the next-in-flow must be updated. - * - * If the next-in-flow is a pseudo-frame then not only does the next-in-flow's state - * need to be updated, but the state of its geometric parent must be updated as well. - * See member function PropagateContentOffsets() for details. - * - * This rule is applied recursively, so if the next-in-flow's geometric parent is - * also a pseudo-frame then its geometric parent must be updated. - */ -class nsContainerFrame : public nsSplittableFrame -{ -public: - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - - /** - * Default implementation is to use the content delegate to create a new - * frame. After the frame is created it uses PrepareContinuingFrame() to - * set the content offsets, mLastContentOffset, and append the continuing - * frame to the flow. - */ - NS_IMETHOD CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame); - NS_IMETHOD DidReflow(nsIPresContext& aPresContext, - nsDidReflowStatus aStatus); - - // Painting - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - - /** - * Pass through the event to the correct child frame. - * Return PR_TRUE if the event is consumed. - */ - NS_IMETHOD HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus); - - NS_IMETHOD GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor); - - // Child frame enumeration. - // ChildAt() retruns null if the index is not in the range 0 .. ChildCount() - 1. - // IndexOf() returns -1 if the frame is not in the child list. - NS_IMETHOD ChildCount(PRInt32& aChildCount) const; - NS_IMETHOD ChildAt(PRInt32 aIndex, nsIFrame*& aFrame) const; - NS_IMETHOD IndexOf(const nsIFrame* aChild, PRInt32& aIndex) const; - NS_IMETHOD FirstChild(nsIFrame*& aFirstChild) const; - NS_IMETHOD NextChild(const nsIFrame* aChild, nsIFrame*& aNextChild) const; - NS_IMETHOD PrevChild(const nsIFrame* aChild, nsIFrame*& aPrevChild) const; - NS_IMETHOD LastChild(nsIFrame*& aLastChild) const; - - // Access functions for starting and end content offsets. These reflect the - // range of content mapped by the frame. - // - // If the container is empty (has no children) the last content offset is - // undefined - PRInt32 GetFirstContentOffset() const {return mFirstContentOffset;} - void SetFirstContentOffset(PRInt32 aOffset) {mFirstContentOffset = aOffset;} - PRInt32 GetLastContentOffset() const {return mLastContentOffset;} - void SetLastContentOffset(PRInt32 aOffset) {mLastContentOffset = aOffset;} - - /** return PR_TRUE if the last mapped child is complete */ - PRBool GetLastContentIsComplete() const {return mLastContentIsComplete;} - /** set the state indicating whether the last mapped child is complete */ - void SetLastContentIsComplete(PRBool aLIC) {mLastContentIsComplete = aLIC;} - - // Get the offset for the next child content, i.e. the child after the - // last child that fit in us - PRInt32 NextChildOffset() const; - - // Returns true if this frame is being used a pseudo frame - PRBool IsPseudoFrame() const; - - // Debugging - NS_IMETHOD List(FILE* out = stdout, PRInt32 aIndent = 0) const; - NS_IMETHOD ListTag(FILE* out = stdout) const; - NS_IMETHOD VerifyTree() const; - - /** - * When aChild's content mapping offsets change and the child is a - * pseudo-frame (meaning that it is mapping content on the behalf of its - * geometric parent) then the geometric needs to have its content - * mapping offsets updated. This method is used to do just that. The - * object is responsible for updating its content mapping offsets and - * then if it is a pseudo-frame propogating the update upwards to its - * parent. - */ - virtual void PropagateContentOffsets(nsIFrame* aChild, - PRInt32 aFirstContentOffset, - PRInt32 aLastContentOffset, - PRBool aLastContentIsComplete); - -protected: - // Constructor. Takes as arguments the content object, the index in parent, - // and the Frame for the content parent - nsContainerFrame(nsIContent* aContent, nsIFrame* aParent); - - virtual ~nsContainerFrame(); - - void SizeOfWithoutThis(nsISizeOfHandler* aHandler) const; - - /** - * Prepare a continuation frame of this frame for reflow. Appends - * it to the flow, sets its content offsets, mLastContentIsComplete, - * and style context. Subclasses should invoke this method after - * construction of a continuing frame. - */ - void PrepareContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsContainerFrame* aContFrame); - - - virtual void PaintChildren(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - - /** - * Reflow a child frame and return the status of the reflow. If the child - * is complete and it has next-in-flows, then delete the next-in-flows. - */ - nsReflowStatus ReflowChild(nsIFrame* aKidFrame, - nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState); - - /** - * Moves any frames on both the prev-in-flow's overflow list and the receiver's - * overflow to the receiver's child list. - * - * Resets the overlist pointers to nsnull, and updates the receiver's child - * count and content mapping. - * - * @return PR_TRUE if any frames were moved and PR_FALSE otherwise - */ - PRBool MoveOverflowToChildList(); - - /** - * Remove and delete aChild's next-in-flow(s). Updates the sibling and flow - * pointers. - * - * Updates the child count and content offsets of all containers that are - * affected. - * - * @param aChild child this child's next-in-flow - */ - PRBool DeleteChildsNextInFlow(nsIFrame* aChild); - - /** - * Push aFromChild and its next siblings to the next-in-flow. Change the - * geometric parent of each frame that's pushed. If there is no next-in-flow - * the frames are placed on the overflow list (and the geometric parent is - * left unchanged). - * - * Updates the next-in-flow's child count and content offsets. Does - * not update the pusher's child count or last content offset. - * - * @param aFromChild the first child frame to push. It is disconnected from - * aPrevSibling - * @param aPrevSibling aFromChild's previous sibling. Must not be null. It's - * an error to push a parent's first child frame - * @param aNextInFlowsLastChildIsComplete the next-in-flow's - * mLastContentIsComplete flag. This is used when refilling an - * empty next-in-flow that was drained by the caller. - */ - void PushChildren(nsIFrame* aFromChild, nsIFrame* aPrevSibling, - PRBool aNextInFlowsLastChildIsComplete); - - /** - * Called after pulling-up children from the next-in-flow. Adjusts the first - * content offset of all the empty next-in-flows - * - * It's an error to call this function if all of the next-in-flow frames - * are empty. - */ - void AdjustOffsetOfEmptyNextInFlows(); - - /** - * Append child list starting at aChild to this frame's child list. Used for - * processing of the overflow list. - * - * Updates this frame's child count and content mapping. - * - * @param aChild the beginning of the child list - * @param aSetParent if true each child's geometric (and content parent if - * they're the same) parent is set to this frame. - */ - void AppendChildren(nsIFrame* aChild, PRBool aSetParent = PR_TRUE); - - // Returns true if aChild is being used as a pseudo frame - PRBool ChildIsPseudoFrame(const nsIFrame* aChild) const; - - /** - * Sets the first content offset based on the first child frame. - */ - void SetFirstContentOffset(const nsIFrame* aFirstChild); - - /** - * Sets the last content offset based on the last child frame. If the last - * child is a pseudo frame then it sets mLastContentIsComplete to be the same - * as the last child's mLastContentIsComplete - */ - void SetLastContentOffset(const nsIFrame* aLastChild); - - virtual void WillDeleteNextInFlowFrame(nsIFrame* aNextInFlow); - -#ifdef NS_DEBUG - /** - * Return the number of children in the sibling list, starting at aChild. - * Returns zero if aChild is nsnull. - */ - static PRInt32 LengthOf(nsIFrame* aChild); - - /** - * Returns PR_TRUE if aChild is a child of this frame. - */ - PRBool IsChild(const nsIFrame* aChild) const; - - /** - * Returns PR_TRUE if aChild is the last child of this frame. - */ - PRBool IsLastChild(const nsIFrame* aChild) const; - - void DumpTree() const; - - /** - * Before reflow for this container has started we check that all - * is well. - */ - void PreReflowCheck(); - - /** - * After reflow for this container has finished we check that all - * is well. - * - * @param aStatus status to be returned from the resize reflow. If the status - * is frNotComplete then the next-in-flow content offsets are - * validated as well - */ - void PostReflowCheck(nsReflowStatus aStatus); - - void CheckNextInFlowOffsets(); - - PRBool IsEmpty(); - - PRBool SafeToCheckLastContentOffset(nsContainerFrame* nextInFlow); - - /** - * Verify that our mLastContentIsComplete flag is set correctly. - */ - void VerifyLastIsComplete() const; -#endif - - nsIFrame* mFirstChild; - PRInt32 mChildCount; - PRInt32 mFirstContentOffset; // index of first child we map - PRInt32 mLastContentOffset; // index of last child we map - PRBool mLastContentIsComplete; - nsIFrame* mOverflowList; - -private: -#ifdef NS_DEBUG - /** - * Helper function to verify that the first/last content offsets - * are correct. Note: this call will blow up if you have no - * children. - */ - void CheckContentOffsets(); -#endif -}; - -#endif /* nsContainerFrame_h___ */ diff --git a/mozilla/layout/base/src/nsDocument.cpp b/mozilla/layout/base/src/nsDocument.cpp deleted file mode 100644 index 43d825dfb10..00000000000 --- a/mozilla/layout/base/src/nsDocument.cpp +++ /dev/null @@ -1,944 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "plstr.h" - -#include "nsDocument.h" -#include "nsIArena.h" -#include "nsIURL.h" -#include "nsString.h" -#include "nsIContent.h" -#include "nsIStyleSet.h" -#include "nsIStyleSheet.h" -#include "nsIPresShell.h" -#include "nsIDocumentObserver.h" -#include "nsEventListenerManager.h" -#include "nsIScriptGlobalObject.h" -#include "nsIScriptContextOwner.h" - -#include "nsSelection.h" -#include "nsIDOMText.h" -static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID); - -static NS_DEFINE_IID(kIDocumentIID, NS_IDOCUMENT_IID); - -#include "nsIDOMElement.h" - -static NS_DEFINE_IID(kIDOMDocumentIID, NS_IDOMDOCUMENT_IID); -static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID); -static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID); -static NS_DEFINE_IID(kIDOMElementIID, NS_IDOMELEMENT_IID); -static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID); -static NS_DEFINE_IID(kIDOMEventCapturerIID, NS_IDOMEVENTCAPTURER_IID); -static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID); -static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID); - -static NS_DEFINE_IID(kIPostDataIID, NS_IPOSTDATA_IID); - -NS_LAYOUT nsresult -NS_NewPostData(PRBool aIsFile, char* aData, - nsIPostData** aInstancePtrResult) -{ - nsresult rv = NS_OK; - - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - - *aInstancePtrResult = new nsPostData(aIsFile, aData); - if (nsnull != *aInstancePtrResult) { - NS_ADDREF(*aInstancePtrResult); - } else { - rv = NS_ERROR_OUT_OF_MEMORY; - } - - return rv; -} - - -nsPostData::nsPostData(PRBool aIsFile, char* aData) -{ - NS_INIT_REFCNT(); - - mData = nsnull; - mDataLen = 0; - mIsFile = aIsFile; - - if (aData) { - mDataLen = PL_strlen(aData); - mData = aData; - } -} - -nsPostData::~nsPostData() -{ - if (nsnull != mData) { - delete [] mData; - mData = nsnull; - } -} - - -/* - * Implementation of ISupports methods... - */ -NS_IMPL_ISUPPORTS(nsPostData,kIPostDataIID); - -PRBool nsPostData::IsFile() -{ - return mIsFile; -} - -const char* nsPostData::GetData() -{ - return mData; -} - -PRInt32 nsPostData::GetDataLength() -{ - return mDataLen; -} - - - - -nsDocument::nsDocument() -{ - NS_INIT_REFCNT(); - - mArena = nsnull; - mDocumentTitle = nsnull; - mDocumentURL = nsnull; - mCharacterSet = eCharSetID_IsoLatin1; - mParentDocument = nsnull; - mRootContent = nsnull; - mScriptObject = nsnull; - mScriptContextOwner = nsnull; - mListenerManager = nsnull; - - if (NS_OK != NS_NewSelection(&mSelection)) { - printf("*************** Error: nsDocument::nsDocument - Creation of Selection failed!\n"); - } - - Init();/* XXX */ -} - -nsDocument::~nsDocument() -{ - if (nsnull != mDocumentTitle) { - delete mDocumentTitle; - mDocumentTitle = nsnull; - } - NS_IF_RELEASE(mDocumentURL); - - mParentDocument = nsnull; - - // Delete references to sub-documents - PRInt32 index = mSubDocuments.Count(); - while (--index >= 0) { - nsIDocument* subdoc = (nsIDocument*) mSubDocuments.ElementAt(index); - NS_RELEASE(subdoc); - } - - NS_IF_RELEASE(mRootContent); - // Delete references to style sheets - index = mStyleSheets.Count(); - while (--index >= 0) { - nsIStyleSheet* sheet = (nsIStyleSheet*) mStyleSheets.ElementAt(index); - NS_RELEASE(sheet); - } - - NS_IF_RELEASE(mArena); - NS_IF_RELEASE(mSelection); - NS_IF_RELEASE(mScriptContextOwner); -} - -nsresult nsDocument::QueryInterface(REFNSIID aIID, void** aInstancePtr) -{ - if (nsnull == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIDocumentIID)) { - *aInstancePtr = (void*)(nsIDocument*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIDOMDocumentIID)) { - *aInstancePtr = (void*)(nsIDOMDocument*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIScriptObjectOwnerIID)) { - *aInstancePtr = (void*)(nsIScriptObjectOwner*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIDOMEventCapturerIID)) { - *aInstancePtr = (void*)(nsIDOMEventCapturer*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIDOMEventReceiverIID)) { - *aInstancePtr = (void*)(nsIDOMEventReceiver*)this; - AddRef(); - return NS_OK; - } - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - if (aIID.Equals(kISupportsIID)) { - *aInstancePtr = (void*)(nsISupports*)(nsIDocument*)this; - AddRef(); - return NS_OK; - } - return NS_NOINTERFACE; -} - -NS_IMPL_ADDREF(nsDocument) -NS_IMPL_RELEASE(nsDocument) - -nsresult nsDocument::Init() -{ - nsresult rv = NS_NewHeapArena(&mArena, nsnull); - if (NS_OK != rv) { - return rv; - } - return NS_OK; -} - -nsIArena* nsDocument::GetArena() -{ - if (nsnull != mArena) { - NS_ADDREF(mArena); - } - return mArena; -} - -const nsString* nsDocument::GetDocumentTitle() const -{ - return mDocumentTitle; -} - -nsIURL* nsDocument::GetDocumentURL() const -{ - NS_IF_ADDREF(mDocumentURL); - return mDocumentURL; -} - -nsCharSetID nsDocument::GetDocumentCharacterSet() const -{ - return mCharacterSet; -} - -void nsDocument::SetDocumentCharacterSet(nsCharSetID aCharSetID) -{ - mCharacterSet = aCharSetID; -} - -nsresult nsDocument::CreateShell(nsIPresContext* aContext, - nsIViewManager* aViewManager, - nsIStyleSet* aStyleSet, - nsIPresShell** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - - nsIPresShell* shell; - nsresult rv = NS_NewPresShell(&shell); - if (NS_OK != rv) { - return rv; - } - - if (NS_OK != shell->Init(this, aContext, aViewManager, aStyleSet)) { - NS_RELEASE(shell); - return rv; - } - - // Note: we don't hold a ref to the shell (it holds a ref to us) - mPresShells.AppendElement(shell); - *aInstancePtrResult = shell; - return NS_OK; -} - -PRBool nsDocument::DeleteShell(nsIPresShell* aShell) -{ - return mPresShells.RemoveElement(aShell); -} - -PRInt32 nsDocument::GetNumberOfShells() -{ - return mPresShells.Count(); -} - -nsIPresShell* nsDocument::GetShellAt(PRInt32 aIndex) -{ - nsIPresShell* shell = (nsIPresShell*) mPresShells.ElementAt(aIndex); - if (nsnull != shell) { - NS_ADDREF(shell); - } - return shell; -} - -nsIDocument* nsDocument::GetParentDocument() -{ - if (nsnull != mParentDocument) { - NS_ADDREF(mParentDocument); - } - return mParentDocument; -} - -/** - * Note that we do *not* AddRef our parent because that would - * create a circular reference. - */ -void nsDocument::SetParentDocument(nsIDocument* aParent) -{ - mParentDocument = aParent; -} - -void nsDocument::AddSubDocument(nsIDocument* aSubDoc) -{ - NS_ADDREF(aSubDoc); - mSubDocuments.AppendElement(aSubDoc); -} - -PRInt32 nsDocument::GetNumberOfSubDocuments() -{ - return mSubDocuments.Count(); -} - -nsIDocument* nsDocument::GetSubDocumentAt(PRInt32 aIndex) -{ - nsIDocument* doc = (nsIDocument*) mSubDocuments.ElementAt(aIndex); - if (nsnull != doc) { - NS_ADDREF(doc); - } - return doc; -} - -nsIContent* nsDocument::GetRootContent() -{ - if (nsnull != mRootContent) { - NS_ADDREF(mRootContent); - } - return mRootContent; -} - -void nsDocument::SetRootContent(nsIContent* aRoot) -{ - NS_IF_RELEASE(mRootContent); - if (nsnull != aRoot) { - mRootContent = aRoot; - NS_ADDREF(aRoot); - } -} - -PRInt32 nsDocument::GetNumberOfStyleSheets() -{ - return mStyleSheets.Count(); -} - -nsIStyleSheet* nsDocument::GetStyleSheetAt(PRInt32 aIndex) -{ - nsIStyleSheet* sheet = (nsIStyleSheet*)mStyleSheets.ElementAt(aIndex); - NS_IF_ADDREF(sheet); - return sheet; -} - -void nsDocument::AddStyleSheetToSet(nsIStyleSheet* aSheet, nsIStyleSet* aSet) -{ - aSet->AppendDocStyleSheet(aSheet); -} - -void nsDocument::AddStyleSheet(nsIStyleSheet* aSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - mStyleSheets.AppendElement(aSheet); - NS_ADDREF(aSheet); - - PRInt32 count = mPresShells.Count(); - PRInt32 index; - for (index = 0; index < count; index++) { - nsIPresShell* shell = (nsIPresShell*)mPresShells.ElementAt(index); - nsIStyleSet* set = shell->GetStyleSet(); - if (nsnull != set) { - AddStyleSheetToSet(aSheet, set); - NS_RELEASE(set); - } - } - - count = mObservers.Count(); - for (index = 0; index < count; index++) { - nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers.ElementAt(index); - observer->StyleSheetAdded(aSheet); - } -} - -nsIScriptContextOwner *nsDocument::GetScriptContextOwner() -{ - if (nsnull != mScriptContextOwner) { - NS_ADDREF(mScriptContextOwner); - } - - return mScriptContextOwner; -} - -void nsDocument::SetScriptContextOwner(nsIScriptContextOwner *aScriptContextOwner) -{ - if (nsnull != mScriptContextOwner) { - NS_RELEASE(mScriptContextOwner); - } - - mScriptContextOwner = aScriptContextOwner; - - if (nsnull != mScriptContextOwner) { - NS_ADDREF(mScriptContextOwner); - } -} - -// Note: We don't hold a reference to the document observer; we assume -// that it has a live reference to the document. -void nsDocument::AddObserver(nsIDocumentObserver* aObserver) -{ - // XXX Make sure the observer isn't already in the list - if (mObservers.IndexOf(aObserver) == -1) { - mObservers.AppendElement(aObserver); - } -} - -PRBool nsDocument::RemoveObserver(nsIDocumentObserver* aObserver) -{ - return mObservers.RemoveElement(aObserver); -} - -NS_IMETHODIMP -nsDocument::BeginLoad() -{ - PRInt32 i, count = mObservers.Count(); - for (i = 0; i < count; i++) { - nsIDocumentObserver* observer = (nsIDocumentObserver*) mObservers[i]; - observer->BeginLoad(); - } - return NS_OK; -} - -NS_IMETHODIMP -nsDocument::EndLoad() -{ - PRInt32 i, count = mObservers.Count(); - for (i = 0; i < count; i++) { - nsIDocumentObserver* observer = (nsIDocumentObserver*) mObservers[i]; - observer->EndLoad(); - } - return NS_OK; -} - -void nsDocument::ContentChanged(nsIContent* aContent, - nsISupports* aSubContent) -{ - PRInt32 count = mObservers.Count(); - for (PRInt32 i = 0; i < count; i++) { - nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers[i]; - observer->ContentChanged(aContent, aSubContent); - } -} - -void nsDocument::ContentAppended(nsIContent* aContainer) -{ - PRInt32 count = mObservers.Count(); - for (PRInt32 i = 0; i < count; i++) { - nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers[i]; - observer->ContentAppended(aContainer); - } -} - -void nsDocument::ContentInserted(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) -{ - PRInt32 count = mObservers.Count(); - for (PRInt32 i = 0; i < count; i++) { - nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers[i]; - observer->ContentInserted(aContainer, aChild, aIndexInContainer); - } -} - -void nsDocument::ContentReplaced(nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInContainer) -{ - PRInt32 count = mObservers.Count(); - for (PRInt32 i = 0; i < count; i++) { - nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers[i]; - observer->ContentReplaced(aContainer, aOldChild, aNewChild, - aIndexInContainer); - } -} - -void nsDocument::ContentWillBeRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) -{ - PRInt32 count = mObservers.Count(); - for (PRInt32 i = 0; i < count; i++) { - nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers[i]; - observer->ContentWillBeRemoved(aContainer, aChild, aIndexInContainer); - } -} - -void nsDocument::ContentHasBeenRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) -{ - PRInt32 count = mObservers.Count(); - for (PRInt32 i = 0; i < count; i++) { - nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers[i]; - observer->ContentHasBeenRemoved(aContainer, aChild, aIndexInContainer); - } -} - -nsresult nsDocument::GetScriptObject(nsIScriptContext *aContext, void** aScriptObject) -{ - nsresult res = NS_OK; - nsIScriptGlobalObject *global = aContext->GetGlobalObject(); - - if (nsnull == mScriptObject) { - res = NS_NewScriptDocument(aContext, this, global, (void**)&mScriptObject); - } - *aScriptObject = mScriptObject; - - NS_RELEASE(global); - return res; -} - -nsresult nsDocument::ResetScriptObject() -{ - mScriptObject = nsnull; - return NS_OK; -} - - -// -// nsIDOMDocument interface -// -nsresult nsDocument::GetNodeType(PRInt32 *aType) -{ - *aType = nsIDOMNode::DOCUMENT; - return NS_OK; -} - -nsresult nsDocument::GetParentNode(nsIDOMNode **aNode) -{ - return NS_ERROR_FAILURE; -} - -nsresult nsDocument::GetChildNodes(nsIDOMNodeIterator **aIterator) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::HasChildNodes(PRBool *aReturn) -{ - if (nsnull != mRootContent) { - *aReturn = PR_TRUE; - } - else { - *aReturn = PR_FALSE; - } - return NS_OK; -} - -nsresult nsDocument::GetFirstChild(nsIDOMNode **aNode) -{ - if (nsnull != mRootContent) { - nsresult res = mRootContent->QueryInterface(kIDOMNodeIID, (void**)aNode); - NS_ASSERTION(NS_OK == res, "Must be a DOM Node"); - return res; - } - - return NS_ERROR_FAILURE; -} - -nsresult nsDocument::GetPreviousSibling(nsIDOMNode **aNode) -{ - // no siblings - return NS_ERROR_FAILURE; -} - -nsresult nsDocument::GetNextSibling(nsIDOMNode **aNode) -{ - // no siblings - return NS_ERROR_FAILURE; -} - -nsresult nsDocument::InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild) -{ - // a document has only one child - return NS_ERROR_FAILURE; -} - -nsresult nsDocument::ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild) -{ - NS_PRECONDITION(nsnull != newChild && nsnull != oldChild, "null arg"); - nsIContent* content; - - nsresult res = oldChild->QueryInterface(kIContentIID, (void**)&content); - if (NS_OK == res) { - // check that we are replacing the root content - if (content == mRootContent) { - nsIContent* newContent; - res = newChild->QueryInterface(kIContentIID, (void**)&newContent); - if (NS_OK == res) { - SetRootContent(newContent); - NS_RELEASE(newContent); - } - else NS_ASSERTION(0, "Must be an nsIContent"); // nsIContent not supported. Who are you? - } - - NS_RELEASE(content); - } - else NS_ASSERTION(0, "Must be an nsIContent"); // nsIContent not supported. Who are you? - - return res; -} - -nsresult nsDocument::RemoveChild(nsIDOMNode *oldChild) -{ - NS_PRECONDITION(nsnull != oldChild, "null arg"); - nsIContent* content; - - nsresult res = oldChild->QueryInterface(kIContentIID, (void**)&content); - if (NS_OK == res) { - if (content == mRootContent) { - NS_RELEASE(mRootContent); - mRootContent = nsnull; - } - } - - return res; -} - -nsresult nsDocument::GetMasterDoc(nsIDOMDocument **aDocument) -{ - AddRef(); - *aDocument = (nsIDOMDocument*)this; - return NS_OK; -} - -nsresult nsDocument::SetMasterDoc(nsIDOMDocument *aDocument) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::GetDocumentType(nsIDOMNode **aDocType) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::SetDocumentType(nsIDOMNode *aNode) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::GetDocumentElement(nsIDOMElement **aElement) -{ - nsresult res = NS_ERROR_FAILURE; - - if (nsnull != mRootContent) { - res = mRootContent->QueryInterface(kIDOMElementIID, (void**)aElement); - NS_ASSERTION(NS_OK == res, "Must be a DOM Element"); - } - - return res; -} - -nsresult nsDocument::SetDocumentElement(nsIDOMElement *aElement) -{ - NS_PRECONDITION(nsnull != aElement, "null arg"); - nsIContent* content; - - nsresult res = aElement->QueryInterface(kIContentIID, (void**)&content); - if (NS_OK == res) { - SetRootContent(content); - NS_RELEASE(content); - } - else NS_ASSERTION(0, "Must be an nsIContent"); // nsIContent not supported. Who are you? - - return res; -} - -nsresult nsDocument::GetDocumentContext(nsIDOMDocumentContext **aDocContext) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::SetDocumentContext(nsIDOMDocumentContext *aContext) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::CreateDocumentContext(nsIDOMDocumentContext **aDocContext) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::CreateElement(nsString &aTagName, - nsIDOMAttributeList *aAttributes, - nsIDOMElement **aElement) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::CreateTextNode(nsString &aData, nsIDOMText** aTextNode) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::CreateComment(nsString &aData, nsIDOMComment **aComment) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::CreatePI(nsString &aName, nsString &aData, nsIDOMPI **aPI) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::CreateAttribute(nsString &aName, - nsIDOMNode *value, - nsIDOMAttribute **aAttribute) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::CreateAttributeList(nsIDOMAttributeList **aAttributesList) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::CreateTreeIterator(nsIDOMNode *aNode, nsIDOMTreeIterator **aTreeIterator) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::GetElementsByTagName(nsString &aTagname, nsIDOMNodeIterator **aIterator) -{ - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDocument::GetListenerManager(nsIEventListenerManager **aInstancePtrResult) -{ - if (nsnull != mListenerManager) { - return mListenerManager->QueryInterface(kIEventListenerManagerIID, (void**) aInstancePtrResult);; - } - else { - nsIEventListenerManager* l = new nsEventListenerManager(); - - if (nsnull == l) { - return NS_ERROR_OUT_OF_MEMORY; - } - - - if (NS_OK == l->QueryInterface(kIEventListenerManagerIID, (void**) aInstancePtrResult)) { - mListenerManager = l; - return NS_OK; - } - - return NS_ERROR_FAILURE; - } -} - -nsresult nsDocument::HandleDOMEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus) -{ - //Capturing stage - - //Local handling stage - if (nsnull != mListenerManager) { - mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aEventStatus); - } - - //Bubbling stage - /*Need to go to window here*/ - - return NS_OK; -} - -nsresult nsDocument::AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID) -{ - nsIEventListenerManager *manager; - - if (NS_OK == GetListenerManager(&manager)) { - manager->AddEventListener(aListener, aIID); - return NS_OK; - } - return NS_ERROR_FAILURE; -} - -nsresult nsDocument::RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID) -{ - nsIEventListenerManager *manager; - - if (NS_OK == GetListenerManager(&manager)) { - manager->RemoveEventListener(aListener, aIID); - return NS_OK; - } - return NS_ERROR_FAILURE; -} - -nsresult nsDocument::CaptureEvent(nsIDOMEventListener *aListener) -{ - nsIEventListenerManager *manager; - - if (NS_OK == GetListenerManager(&manager)) { - manager->CaptureEvent(aListener); - return NS_OK; - } - return NS_ERROR_FAILURE; -} - -nsresult nsDocument::ReleaseEvent(nsIDOMEventListener *aListener) -{ - nsIEventListenerManager *manager; - - if (NS_OK == GetListenerManager(&manager)) { - manager->ReleaseEvent(aListener); - return NS_OK; - } - return NS_ERROR_FAILURE; -} - - - -/** - * Returns the Selection Object - */ -nsISelection * nsDocument::GetSelection() { - if (mSelection != nsnull) { - NS_ADDREF(mSelection); - } - return mSelection; -} - -/** - * Selects all the Content - */ -void nsDocument::SelectAll() { - nsIContent * start = mRootContent; - nsIContent * end = mRootContent; - - // Find Very first Piece of Content - while (start->ChildCount() > 0) { - start = start->ChildAt(0); - } - - // Last piece of Content - PRInt32 count = end->ChildCount(); - while (count > 0) { - end = end->ChildAt(count-1); - count = end->ChildCount(); - } - nsSelectionRange * range = mSelection->GetRange(); - nsSelectionPoint * startPnt = range->GetStartPoint(); - nsSelectionPoint * endPnt = range->GetEndPoint(); - startPnt->SetPoint(start, -1, PR_TRUE); - endPnt->SetPoint(end, -1, PR_FALSE); - -} - -void nsDocument::TraverseTree(nsString & aText, - nsIContent * aContent, - nsIContent * aStart, - nsIContent * aEnd, - PRBool & aInRange) { - - if (aContent == aStart) { - aInRange = PR_TRUE; - } - - PRBool addReturn = PR_FALSE; - if (aInRange) { - nsIDOMText * textContent; - nsresult status = aContent->QueryInterface(kIDOMTextIID, (void**) &textContent); - if (NS_OK == status) { - nsString text; - textContent->GetData(text); - aText.Append(text); - //NS_IF_RELEASE(textContent); - } else { - nsIAtom * atom = aContent->GetTag(); - if (atom != nsnull) { - nsString str; - atom->ToString(str); - //char * s = str.ToNewCString(); - if (str.Equals("P") || - str.Equals("OL") || - str.Equals("LI") || - str.Equals("TD") || - str.Equals("H1") || - str.Equals("H2") || - str.Equals("H3") || - str.Equals("H4") || - str.Equals("H5") || - str.Equals("H6") || - str.Equals("TABLE")) { - addReturn = PR_TRUE; - } - //printf("[%s]\n", s); - //delete s; - } - } - } - - for (PRInt32 i=0;iChildCount();i++) { - TraverseTree(aText, aContent->ChildAt(i), aStart, aEnd, aInRange); - } - if (addReturn) { - aText.Append("\n"); - } - if (aContent == aEnd) { - aInRange = PR_FALSE; - } - -} - -void nsDocument::GetSelectionText(nsString & aText) { - nsSelectionRange * range = mSelection->GetRange(); - nsSelectionPoint * startPnt = range->GetStartPoint(); - nsSelectionPoint * endPnt = range->GetEndPoint(); - - PRBool inRange = PR_FALSE; - TraverseTree(aText, mRootContent, startPnt->GetContent(), endPnt->GetContent(), inRange); -} diff --git a/mozilla/layout/base/src/nsDocument.h b/mozilla/layout/base/src/nsDocument.h deleted file mode 100644 index 5f46a459fc2..00000000000 --- a/mozilla/layout/base/src/nsDocument.h +++ /dev/null @@ -1,254 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsDocument_h___ -#define nsDocument_h___ - -#include "nsIDocument.h" -#include "nsVoidArray.h" -#include "nsIDOMDocument.h" -#include "nsIScriptObjectOwner.h" -#include "nsIScriptContextOwner.h" -#include "nsIDOMEventCapturer.h" - -class nsISelection; -class nsIEventListenerManager; - -class nsPostData : public nsIPostData { -public: - nsPostData(PRBool aIsFile, char* aData); - - NS_DECL_ISUPPORTS - - virtual PRBool IsFile(); - virtual const char* GetData(); - virtual PRInt32 GetDataLength(); - -protected: - virtual ~nsPostData(); - - PRBool mIsFile; - char* mData; - PRInt32 mDataLen; -}; - - -// Base class for our document implementations -class nsDocument : public nsIDocument, public nsIDOMDocument, public nsIScriptObjectOwner, public nsIDOMEventCapturer { -public: - NS_DECL_ISUPPORTS - - virtual nsIArena* GetArena(); - - /** - * Return the title of the document. May return null. - */ - virtual const nsString* GetDocumentTitle() const; - - /** - * Return the URL for the document. May return null. - */ - virtual nsIURL* GetDocumentURL() const; - - /** - * Return a standard name for the document's character set. This will - * trigger a startDocumentLoad if necessary to answer the question. - */ - virtual nsCharSetID GetDocumentCharacterSet() const; - virtual void SetDocumentCharacterSet(nsCharSetID aCharSetID); - - /** - * Create a new presentation shell that will use aContext for - * it's presentation context (presentation context's must not be - * shared among multiple presentation shell's). - */ - virtual nsresult CreateShell(nsIPresContext* aContext, - nsIViewManager* aViewManager, - nsIStyleSet* aStyleSet, - nsIPresShell** aInstancePtrResult); - virtual PRBool DeleteShell(nsIPresShell* aShell); - virtual PRInt32 GetNumberOfShells(); - virtual nsIPresShell* GetShellAt(PRInt32 aIndex); - - /** - * Return the parent document of this document. Will return null - * unless this document is within a compound document and has a parent. - */ - virtual nsIDocument* GetParentDocument(); - virtual void SetParentDocument(nsIDocument* aParent); - virtual void AddSubDocument(nsIDocument* aSubDoc); - virtual PRInt32 GetNumberOfSubDocuments(); - virtual nsIDocument* GetSubDocumentAt(PRInt32 aIndex); - - /** - * Return the root content object for this document. - */ - virtual nsIContent* GetRootContent(); - virtual void SetRootContent(nsIContent* aRoot); - - /** - * Get the style sheets owned by this document. - */ - virtual PRInt32 GetNumberOfStyleSheets(); - virtual nsIStyleSheet* GetStyleSheetAt(PRInt32 aIndex); - virtual void AddStyleSheet(nsIStyleSheet* aSheet); - - /** - * Set the object from which a document can get a script context. - * This is the context within which all scripts (during document - * creation and during event handling) will run. - */ - virtual nsIScriptContextOwner *GetScriptContextOwner(); - virtual void SetScriptContextOwner(nsIScriptContextOwner *aScriptContextOwner); - - /** - * Add a new observer of document change notifications. Whenever - * content is changed, appended, inserted or removed the observers are - * informed. - */ - virtual void AddObserver(nsIDocumentObserver* aObserver); - - /** - * Remove an observer of document change notifications. This will - * return false if the observer cannot be found. - */ - virtual PRBool RemoveObserver(nsIDocumentObserver* aObserver); - - // Observation hooks used by content nodes to propagate - // notifications to document observers. - NS_IMETHOD BeginLoad(); - NS_IMETHOD EndLoad(); - virtual void ContentChanged(nsIContent* aContent, - nsISupports* aSubContent); - - virtual void ContentAppended(nsIContent* aContainer); - - virtual void ContentInserted(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer); - - virtual void ContentReplaced(nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInContainer); - - virtual void ContentWillBeRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer); - - virtual void ContentHasBeenRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer); - - /** - * Returns the Selection Object - */ - virtual nsISelection * GetSelection(); - - /** - * Selects all the Content - */ - virtual void SelectAll(); - - /** - * Copies all text from the selection - */ - virtual void GetSelectionText(nsString & aText); - - void TraverseTree(nsString & aText, - nsIContent * aContent, - nsIContent * aStart, - nsIContent * aEnd, - PRBool & aInRange); - - -public: - - NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject); - NS_IMETHOD ResetScriptObject(); - - // nsIDOMDocument interface - NS_IMETHOD GetNodeType(PRInt32 *aType); - NS_IMETHOD GetParentNode(nsIDOMNode **aNode); - NS_IMETHOD GetChildNodes(nsIDOMNodeIterator **aIterator); - NS_IMETHOD HasChildNodes(PRBool *aReturn); - NS_IMETHOD GetFirstChild(nsIDOMNode **aNode); - NS_IMETHOD GetPreviousSibling(nsIDOMNode **aNode); - NS_IMETHOD GetNextSibling(nsIDOMNode **aNode); - NS_IMETHOD InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild); - NS_IMETHOD ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild); - NS_IMETHOD RemoveChild(nsIDOMNode *oldChild); - NS_IMETHOD GetMasterDoc(nsIDOMDocument **aDocument); - NS_IMETHOD SetMasterDoc(nsIDOMDocument *aDocument); - NS_IMETHOD GetDocumentType(nsIDOMNode **aDocType); - NS_IMETHOD SetDocumentType(nsIDOMNode *aNode); - NS_IMETHOD GetDocumentElement(nsIDOMElement **aElement); - NS_IMETHOD SetDocumentElement(nsIDOMElement *aElement); - NS_IMETHOD GetDocumentContext(nsIDOMDocumentContext **aDocContext); - NS_IMETHOD SetDocumentContext(nsIDOMDocumentContext *aContext); - NS_IMETHOD CreateDocumentContext(nsIDOMDocumentContext **aDocContext); - NS_IMETHOD CreateElement(nsString &aTagName, - nsIDOMAttributeList *aAttributes, - nsIDOMElement **aElement); - NS_IMETHOD CreateTextNode(nsString &aData, nsIDOMText** aTextNode); - NS_IMETHOD CreateComment(nsString &aData, nsIDOMComment **aComment); - NS_IMETHOD CreatePI(nsString &aName, nsString &aData, nsIDOMPI **aPI); - NS_IMETHOD CreateAttribute(nsString &aName, - nsIDOMNode *value, - nsIDOMAttribute **aAttribute); - NS_IMETHOD CreateAttributeList(nsIDOMAttributeList **aAttributesList); - NS_IMETHOD CreateTreeIterator(nsIDOMNode *aNode, nsIDOMTreeIterator **aTreeIterator); - NS_IMETHOD GetElementsByTagName(nsString &aTagname, nsIDOMNodeIterator **aIterator); - - // nsIDOMEventCapturer interface - NS_IMETHOD CaptureEvent(nsIDOMEventListener *aListener); - NS_IMETHOD ReleaseEvent(nsIDOMEventListener *aListener); - NS_IMETHOD AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); - NS_IMETHOD RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); - - NS_IMETHOD GetListenerManager(nsIEventListenerManager** aInstancePtrResult); - - NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus); - -protected: - virtual void AddStyleSheetToSet(nsIStyleSheet* aSheet, nsIStyleSet* aSet); // subclass hook - - nsDocument(); - virtual ~nsDocument(); - nsresult Init(); - - nsISelection * mSelection; - - nsIArena* mArena; - nsString* mDocumentTitle; - nsIURL* mDocumentURL; - nsCharSetID mCharacterSet; - nsIDocument* mParentDocument; - nsVoidArray mSubDocuments; - nsVoidArray mPresShells; - nsIContent* mRootContent; - nsVoidArray mStyleSheets; - nsVoidArray mObservers; - void* mScriptObject; - nsIScriptContextOwner *mScriptContextOwner; - nsIEventListenerManager* mListenerManager; -}; - -#endif /* nsDocument_h___ */ diff --git a/mozilla/layout/base/src/nsFrame.cpp b/mozilla/layout/base/src/nsFrame.cpp deleted file mode 100644 index dd71d169d57..00000000000 --- a/mozilla/layout/base/src/nsFrame.cpp +++ /dev/null @@ -1,1991 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsFrame.h" -#include "nsIContent.h" -#include "nsIAtom.h" -#include "nsString.h" -#include "nsIStyleContext.h" -#include "nsIView.h" -#include "nsIViewManager.h" -#include "nsIPresContext.h" -#include "nsCRT.h" -#include "nsGUIEvent.h" -#include "nsStyleConsts.h" -#include "nsIPresShell.h" -#include "prlog.h" -#include "prprf.h" -#include -#include "nsIPtr.h" -#include "nsISizeOfHandler.h" -#include "nsIEventStateManager.h" - -#define DO_SELECTION 0 - -#include "nsIDOMText.h" -#include "nsSelectionRange.h" -#include "nsDocument.h" -#include "nsIDeviceContext.h" -#include "nsIPresShell.h" - -NS_DEF_PTR(nsIView); -NS_DEF_PTR(nsIViewManager); - -// Kludged Content stuff -nsIFrame * fFrameArray[1024]; -nsIContent * fContentArray[1024]; -PRInt32 fMax = -1; - -// Tracker Data -#define kInsertInRemoveList 0 -#define kInsertInAddList 1 - -nsIContent * fTrackerContentArrayRemoveList[1024]; -PRInt32 fTrackerRemoveListMax = 0; -nsIContent * fTrackerContentArrayAddList[1024]; -PRInt32 fTrackerAddListMax = 0; - -// Some Misc #defines -#define gSelectionDebug 0 -#define FORCE_SELECTION_UPDATE 1 -PRBool gTrackerDebug = PR_FALSE; -PRBool gCalcDebug = PR_FALSE; - -// [HACK] Foward Declarations -void BuildContentList(nsIContent*aContent); -PRBool IsInRange(nsIContent * aStartContent, nsIContent * aEndContent, nsIContent * aContent); -PRBool IsBefore(nsIContent * aNewContent, nsIContent * aCurrentContent); -nsIContent * GetPrevContent(nsIContent * aContent); -nsIContent * GetNextContent(nsIContent * aContent); -void RefreshContentFrames(nsIPresContext& aPresContext, nsIContent * aStartContent, nsIContent * aEndContent); -void ForceDrawFrame(nsFrame * aFrame); -void resetContentTrackers(); -void RefreshFromContentTrackers(nsIPresContext& aPresContext); -void addRangeToSelectionTrackers(nsIContent * aStartContent, nsIContent * aEndContent, PRUint32 aType); -void PrintIndex(char * aStr, nsIContent * aContent); - - - - -// Initialize Global Selection Data -nsIFrame * nsFrame::mCurrentFrame = nsnull; -PRBool nsFrame::mDoingSelection = PR_FALSE; -PRBool nsFrame::mDidDrag = PR_FALSE; -PRInt32 nsFrame::mStartPos = 0; - -// Selection data is valid only from the Mouse Press to the Mouse Release -nsSelectionRange * nsFrame::mSelectionRange = nsnull; -nsISelection * nsFrame::mSelection = nsnull; - -nsSelectionPoint * nsFrame::mStartSelectionPoint = nsnull; -nsSelectionPoint * nsFrame::mEndSelectionPoint = nsnull; - -//---------------------------------------------------------------------- - -static PRBool gShowFrameBorders = PR_FALSE; - -NS_LAYOUT void nsIFrame::ShowFrameBorders(PRBool aEnable) -{ - gShowFrameBorders = aEnable; -} - -NS_LAYOUT PRBool nsIFrame::GetShowFrameBorders() -{ - return gShowFrameBorders; -} - -/** - * Note: the log module is created during library initialization which - * means that you cannot perform logging before then. - */ -PRLogModuleInfo* nsIFrame::gLogModule = PR_NewLogModule("frame"); - -static PRLogModuleInfo* gFrameVerifyTreeLogModuleInfo; - -static PRBool gFrameVerifyTreeEnable = PRBool(0x55); - -NS_LAYOUT PRBool -nsIFrame::GetVerifyTreeEnable() -{ -#ifdef NS_DEBUG - if (gFrameVerifyTreeEnable == PRBool(0x55)) { - if (nsnull == gFrameVerifyTreeLogModuleInfo) { - gFrameVerifyTreeLogModuleInfo = PR_NewLogModule("frameverifytree"); - gFrameVerifyTreeEnable = 0 != gFrameVerifyTreeLogModuleInfo->level; - printf("Note: frameverifytree is %sabled\n", - gFrameVerifyTreeEnable ? "en" : "dis"); - } - } -#endif - return gFrameVerifyTreeEnable; -} - -NS_LAYOUT void -nsIFrame::SetVerifyTreeEnable(PRBool aEnabled) -{ - gFrameVerifyTreeEnable = aEnabled; -} - -NS_LAYOUT PRLogModuleInfo* -nsIFrame::GetLogModuleInfo() -{ - return gLogModule; -} - -//---------------------------------------------------------------------- - -static NS_DEFINE_IID(kIFrameIID, NS_IFRAME_IID); - -nsresult -nsFrame::NewFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIFrame* it = new nsFrame(aContent, aParent); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - *aInstancePtrResult = it; - return NS_OK; -} - -void* nsFrame::operator new(size_t size) -{ - void* result = new char[size]; - - nsCRT::zero(result, size); - return result; -} - -nsFrame::nsFrame(nsIContent* aContent, nsIFrame* aParent) - : mContent(aContent), mContentParent(aParent), mGeometricParent(aParent) -{ - NS_ADDREF(mContent); - mState = NS_FRAME_FIRST_REFLOW; -} - -nsFrame::~nsFrame() -{ - NS_RELEASE(mContent); - NS_IF_RELEASE(mStyleContext); - if (nsnull != mView) { - // Break association between view and frame - mView->SetFrame(nsnull); - NS_RELEASE(mView); - } -} - -///////////////////////////////////////////////////////////////////////////// -// nsISupports - -nsresult nsFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - static NS_DEFINE_IID(kClassIID, kIFrameIID); - if (aIID.Equals(kClassIID) || (aIID.Equals(kISupportsIID))) { - *aInstancePtr = (void*)this; - return NS_OK; - } - return NS_NOINTERFACE; -} - -nsrefcnt nsFrame::AddRef(void) -{ - NS_ERROR("not supported"); - return 0; -} - -nsrefcnt nsFrame::Release(void) -{ - NS_ERROR("not supported"); - return 0; -} - -///////////////////////////////////////////////////////////////////////////// -// nsIFrame - -NS_METHOD nsFrame::DeleteFrame() -{ - nsIView* view = mView; - if (nsnull == view) { - nsIFrame* parent; - - GetParentWithView(parent); - if (nsnull != parent) { - parent->GetView(view); - } - } - if (nsnull != view) { - nsIViewManager* vm = view->GetViewManager(); - nsIPresContext* cx = vm->GetPresContext(); - // XXX Is this a really good ordering for the releases? MMP - NS_RELEASE(vm); - if (view != mView) //if this is the view that we own, let's not release it... - NS_RELEASE(view); - cx->StopLoadImage(this); - NS_RELEASE(cx); - } - - delete this; - return NS_OK; -} - -NS_IMETHODIMP -nsFrame::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - SizeOfWithoutThis(aHandler); - return NS_OK; -} - -void -nsFrame::SizeOfWithoutThis(nsISizeOfHandler* aHandler) const -{ - // Note: style context's are accounted for via the style system's - // sizeof support - - // Note: content is accounted for via the content system's sizeof - // support -} - -NS_METHOD nsFrame::GetContent(nsIContent*& aContent) const -{ - if (nsnull != mContent) { - NS_ADDREF(mContent); - } - aContent = mContent; - return NS_OK; -} - -NS_METHOD nsFrame::GetContentIndex(PRInt32& aIndexInParent) const -{ - nsIContent* parent = mContent->GetParent(); - if (nsnull != parent) { - aIndexInParent = parent->IndexOf(mContent); - NS_RELEASE(parent); - } - else { - aIndexInParent = 0; - } - return NS_OK; -} - -NS_METHOD nsFrame::GetStyleContext(nsIPresContext* aPresContext, - nsIStyleContext*& aStyleContext) -{ - if ((nsnull == mStyleContext) && (nsnull != aPresContext)) { - mStyleContext = aPresContext->ResolveStyleContextFor(mContent, mGeometricParent); // XXX should be content parent??? - if (nsnull != mStyleContext) { - DidSetStyleContext(aPresContext); - } - } - NS_IF_ADDREF(mStyleContext); - aStyleContext = mStyleContext; - return NS_OK; -} - -NS_METHOD nsFrame::SetStyleContext(nsIPresContext* aPresContext,nsIStyleContext* aContext) -{ - NS_PRECONDITION(nsnull != aContext, "null ptr"); - if (aContext != mStyleContext) { - NS_IF_RELEASE(mStyleContext); - if (nsnull != aContext) { - mStyleContext = aContext; - NS_ADDREF(aContext); - DidSetStyleContext(aPresContext); - } - } - - return NS_OK; -} - -// Subclass hook for style post processing -NS_METHOD nsFrame::DidSetStyleContext(nsIPresContext* aPresContext) -{ - return NS_OK; -} - -NS_METHOD nsFrame::GetStyleData(nsStyleStructID aSID, const nsStyleStruct*& aStyleStruct) const -{ - NS_ASSERTION(mStyleContext!=nsnull,"null style context"); - if (mStyleContext) { - aStyleStruct = mStyleContext->GetStyleData(aSID); - } else { - aStyleStruct = nsnull; - } - return NS_OK; -} - -// Geometric and content parent member functions - -NS_METHOD nsFrame::GetContentParent(nsIFrame*& aParent) const -{ - aParent = mContentParent; - return NS_OK; -} - -NS_METHOD nsFrame::SetContentParent(const nsIFrame* aParent) -{ - mContentParent = (nsIFrame*)aParent; - return NS_OK; -} - -NS_METHOD nsFrame::GetGeometricParent(nsIFrame*& aParent) const -{ - aParent = mGeometricParent; - return NS_OK; -} - -NS_METHOD nsFrame::SetGeometricParent(const nsIFrame* aParent) -{ - mGeometricParent = (nsIFrame*)aParent; - return NS_OK; -} - -// Bounding rect member functions - -NS_METHOD nsFrame::GetRect(nsRect& aRect) const -{ - aRect = mRect; - return NS_OK; -} - -NS_METHOD nsFrame::GetOrigin(nsPoint& aPoint) const -{ - aPoint.x = mRect.x; - aPoint.y = mRect.y; - return NS_OK; -} - -NS_METHOD nsFrame::GetSize(nsSize& aSize) const -{ - aSize.width = mRect.width; - aSize.height = mRect.height; - return NS_OK; -} - -NS_METHOD nsFrame::SetRect(const nsRect& aRect) -{ - MoveTo(aRect.x, aRect.y); - SizeTo(aRect.width, aRect.height); - return NS_OK; -} - -NS_METHOD nsFrame::MoveTo(nscoord aX, nscoord aY) -{ - mRect.x = aX; - mRect.y = aY; - - // Let the view know - if ((nsnull != mView) && (0 == (mState & NS_FRAME_IN_REFLOW))) { - // Position view relative to its parent, not relative to our - // parent frame (our parent frame may not have a view). - nsIView* parentWithView; - nsPoint origin; - GetOffsetFromView(origin, parentWithView); - nsIViewManager *vm = mView->GetViewManager(); - vm->MoveViewTo(mView, origin.x, origin.y); - NS_RELEASE(vm); - NS_IF_RELEASE(parentWithView); - } - - return NS_OK; -} - -NS_METHOD nsFrame::SizeTo(nscoord aWidth, nscoord aHeight) -{ - mRect.width = aWidth; - mRect.height = aHeight; - - // Let the view know - if ((nsnull != mView) && (0 == (mState & NS_FRAME_IN_REFLOW))) { - nsIViewManager *vm = mView->GetViewManager(); - vm->ResizeView(mView, aWidth, aHeight); - NS_RELEASE(vm); - } - return NS_OK; -} - -// Child frame enumeration - -NS_METHOD nsFrame::ChildCount(PRInt32& aChildCount) const -{ - aChildCount = 0; - return NS_OK; -} - -NS_METHOD nsFrame::ChildAt(PRInt32 aIndex, nsIFrame*& aFrame) const -{ - NS_ERROR("not a container"); - aFrame = nsnull; - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::IndexOf(const nsIFrame* aChild, PRInt32& aIndex) const -{ - NS_ERROR("not a container"); - aIndex = -1; - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::FirstChild(nsIFrame*& aFirstChild) const -{ - aFirstChild = nsnull; - return NS_OK; -} - -NS_METHOD nsFrame::NextChild(const nsIFrame* aChild, nsIFrame*& aNextChild) const -{ - NS_ERROR("not a container"); - aNextChild = nsnull; - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::PrevChild(const nsIFrame* aChild, nsIFrame*& aPrevChild) const -{ - NS_ERROR("not a container"); - aPrevChild = nsnull; - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::LastChild(nsIFrame*& aLastChild) const -{ - aLastChild = nsnull; - return NS_OK; -} - -NS_METHOD nsFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ -#if DO_SELECTION - - PRBool clearAfterPaint = PR_FALSE; - - // Get Content - nsIContent * content; - GetContent(content); - if (content->ChildCount() > 0) { - NS_RELEASE(content); - return NS_OK; - } - - if (mSelectionRange == nsnull) { // Get Selection Object - nsIPresShell * shell = aPresContext.GetShell(); - nsIDocument * doc = shell->GetDocument(); - nsISelection * selection = doc->GetSelection(); - - mSelectionRange = selection->GetRange(); - - clearAfterPaint = PR_TRUE; - NS_RELEASE(shell); - NS_RELEASE(selection); - } - - if (IsInRange(mSelectionRange->GetStartContent(), mSelectionRange->GetEndContent(), content)) { - nsRect rect; - GetRect(rect); - rect.width--; - rect.height--; - aRenderingContext.SetColor(NS_RGB(0,0,255)); - aRenderingContext.DrawRect(rect); - aRenderingContext.DrawLine(rect.x, rect.y, rect.x+rect.width, rect.y+rect.height); - aRenderingContext.DrawLine(rect.x, rect.y+rect.height, rect.x+rect.width, rect.y); - } - - if (clearAfterPaint) { - mSelectionRange = nsnull; - } - NS_RELEASE(content); - -#endif - return NS_OK; -} - -/** - * - */ -NS_METHOD nsFrame::HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus) -{ - aEventStatus = nsEventStatus_eIgnore; - - nsIEventStateManager *mManager; - if (NS_OK == aPresContext.GetEventStateManager(&mManager)) { - mManager->SetEventTarget((nsISupports*)mContent); - NS_RELEASE(mManager); - } - mContent->HandleDOMEvent(aPresContext, aEvent, nsnull, aEventStatus); - -#if DO_SELECTION - - if(nsEventStatus_eIgnore == aEventStatus) { - if (aEvent->message == NS_MOUSE_MOVE && mDoingSelection || - aEvent->message == NS_MOUSE_LEFT_BUTTON_UP || - aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) { - } else { - aEventStatus = nsEventStatus_eIgnore; - return NS_OK; - } - if (gSelectionDebug) printf("Message: %d-------------------------------------------------------------\n",aEvent->message); - - - if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) { - if (mDoingSelection) { - //mEndSelect = 0; - HandleRelease(aPresContext, aEvent, aEventStatus, this); - } - } else if (aEvent->message == NS_MOUSE_MOVE) { - mDidDrag = PR_TRUE; - - //if (gSelectionDebug) printf("HandleEvent(Drag)::mSelectionRange %s\n", mSelectionRange->ToString()); - HandleDrag(aPresContext, aEvent, aEventStatus, this); - if (gSelectionDebug) printf("HandleEvent(Drag)::mSelectionRange %s\n", mSelectionRange->ToString()); - - } else if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) { - nsIContent * content; - GetContent(content); - BuildContentList(content); - - NS_RELEASE(content); - - HandlePress(aPresContext, aEvent, aEventStatus, this); - } - } -#endif - - return NS_OK; -} - -/** - * Handles the Mouse Press Event for the frame - */ -NS_METHOD nsFrame::HandlePress(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus, - nsFrame * aFrame) -{ -#if DO_SELECTION - nsFrame * currentFrame = aFrame; - nsIPresShell * shell = aPresContext.GetShell(); - nsIDocument * doc = shell->GetDocument(); - nsISelection * selection = doc->GetSelection(); - nsMouseEvent * mouseEvent = (nsMouseEvent *)aEvent; - - mSelectionRange = selection->GetRange(); - - NS_RELEASE(shell); - NS_RELEASE(doc); - NS_RELEASE(selection); - - - PRInt32 offset = 0; - PRInt32 width = 0; - - mDoingSelection = PR_TRUE; - mDidDrag = PR_FALSE; - mCurrentFrame = currentFrame; - - mStartPos = GetPosition(aPresContext, aEvent, currentFrame); - - // Click count is 1 - nsIContent * newContent; - currentFrame->GetContent(newContent); - - mCurrentFrame = currentFrame; - - if (mStartSelectionPoint == nsnull) { - mStartSelectionPoint = new nsSelectionPoint(nsnull, -1, PR_TRUE); - } - if (mEndSelectionPoint == nsnull) { - mEndSelectionPoint = new nsSelectionPoint(nsnull, -1, PR_TRUE); - } - - mSelectionRange->GetStartPoint(mStartSelectionPoint); - mSelectionRange->GetEndPoint(mEndSelectionPoint); - - resetContentTrackers(); - - // keep old start and end - nsIContent * startContent = mSelectionRange->GetStartContent(); - nsIContent * endContent = mSelectionRange->GetEndContent(); - - if (gSelectionDebug) printf("****** Shift[%s]\n", (mouseEvent->isShift?"Down":"Up")); - - if (IsInRange(mSelectionRange->GetStartContent(), mSelectionRange->GetEndContent(), newContent)) { - //resetContentTrackers(); - if (gTrackerDebug) printf("Adding split range to removed selection. Shift[%s]\n", (mouseEvent->isShift?"Down":"Up")); - - if (mouseEvent->isShift) { - nsIContent * prevContent = GetPrevContent(newContent); - nsIContent * nextContent = GetNextContent(newContent); - - addRangeToSelectionTrackers(mSelectionRange->GetStartContent(), prevContent, kInsertInRemoveList); - addRangeToSelectionTrackers(nextContent, mSelectionRange->GetEndContent(), kInsertInRemoveList); - - mEndSelectionPoint->SetPoint(newContent, mStartPos, PR_FALSE); - } else { - addRangeToSelectionTrackers(mSelectionRange->GetStartContent(), mSelectionRange->GetEndContent(), kInsertInRemoveList); // removed from selection - - mEndSelectionPoint->SetPoint(newContent, mStartPos, PR_TRUE); - mStartSelectionPoint->SetPoint(newContent, mStartPos, PR_TRUE); - - addRangeToSelectionTrackers(newContent, newContent, kInsertInAddList); // add to selection - } - - } else if (IsBefore(newContent, startContent)) { - if (mouseEvent->isShift) { - if (mStartSelectionPoint->IsAnchor()) { - if (gSelectionDebug) printf("New Content is before, Start will now be end\n"); - - addRangeToSelectionTrackers(mSelectionRange->GetStartContent(), mSelectionRange->GetEndContent(), kInsertInRemoveList); // removed from selection - - nsIContent * prevContent = GetPrevContent(newContent); - nsIContent * nextContent = GetNextContent(newContent); - - mEndSelectionPoint->SetPoint(mStartSelectionPoint->GetContent(), mStartSelectionPoint->GetOffset(), PR_TRUE); - mStartSelectionPoint->SetPoint(newContent, mStartPos, PR_FALSE); - - addRangeToSelectionTrackers(newContent, mEndSelectionPoint->GetContent(), kInsertInAddList); // add to selection - } else { - if (gSelectionDebug) printf("New Content is before, Appending to Beginning\n"); - addRangeToSelectionTrackers(newContent, mEndSelectionPoint->GetContent(), kInsertInAddList); // add to selection - mStartSelectionPoint->SetPoint(newContent, mStartPos, PR_FALSE); - } - } else { - if (gSelectionDebug) printf("Adding full range to removed selection. (insert selection)\n"); - addRangeToSelectionTrackers(mSelectionRange->GetStartContent(), mSelectionRange->GetEndContent(), kInsertInRemoveList); // removed from selection - - mEndSelectionPoint->SetPoint(newContent, mStartPos, PR_TRUE); - mStartSelectionPoint->SetPoint(newContent, mStartPos, PR_TRUE); - - addRangeToSelectionTrackers(newContent, newContent, kInsertInAddList); // add to selection - } - } else { // Content is After End - - if (mouseEvent->isShift) { - if (mStartSelectionPoint->IsAnchor()) { - if (gSelectionDebug) printf("New Content is after, Append new content\n"); - addRangeToSelectionTrackers(mEndSelectionPoint->GetContent(), newContent, kInsertInAddList); // add to selection - mEndSelectionPoint->SetPoint(newContent, mStartPos, PR_FALSE); - } else { - if (gSelectionDebug) printf("New Content is after, End will now be Start\n"); - - addRangeToSelectionTrackers(mSelectionRange->GetStartContent(), mSelectionRange->GetEndContent(), kInsertInRemoveList); // removed from selection - - nsIContent * prevContent = GetPrevContent(newContent); - nsIContent * nextContent = GetNextContent(newContent); - - mStartSelectionPoint->SetPoint(mEndSelectionPoint->GetContent(), mEndSelectionPoint->GetOffset(), PR_TRUE); - mEndSelectionPoint->SetPoint(newContent, mStartPos, PR_FALSE); - - addRangeToSelectionTrackers(mEndSelectionPoint->GetContent(), newContent, kInsertInAddList); // add to selection - } - - } else { - if (gTrackerDebug) printf("Adding full range to removed selection.\n"); - addRangeToSelectionTrackers(mSelectionRange->GetStartContent(), mSelectionRange->GetEndContent(), kInsertInRemoveList); // removed from selection - - mEndSelectionPoint->SetPoint(newContent, mStartPos, PR_TRUE); - mStartSelectionPoint->SetPoint(newContent, mStartPos, PR_TRUE); - - addRangeToSelectionTrackers(newContent, newContent, kInsertInAddList); // add to selection - } - } - - /*if (mStartSelectionPoint == nsnull) { - mStartSelectionPoint = new nsSelectionPoint(newContent, mStartPos, PR_TRUE); - } else { - mStartSelectionPoint->SetPoint(newContent, mStartPos, PR_TRUE); - } - if (mEndSelectionPoint == nsnull) { - mEndSelectionPoint = new nsSelectionPoint(newContent, mStartPos, PR_TRUE); - } else { - mEndSelectionPoint->SetPoint(newContent, mStartPos, PR_TRUE); - }*/ - - mSelectionRange->SetStartPoint(mStartSelectionPoint); - mSelectionRange->SetEndPoint(mEndSelectionPoint); - - - // [TODO] Recycle sub-selections here? - ////fSubSelection = new SubSelection(mSelectionRange); - ////selection.setSelection(fSubSelection); - //aPart.setSelection(mSelectionRange); - //updateSelection(); - //resetContentTrackers(); - - //addRangeToSelectionTrackers(newContent, newContent, kInsertInAddList); - - //RefreshContentFrames(aPresContext, startContent, endContent); - RefreshFromContentTrackers(aPresContext); - - //// [TODO] Set position of caret at start point, - //// [TODO] Turn on caret and have it rendered - ////printf("Selection Start Point set."); - - - //buildContentTree(currentFrame); - - //fCurrentParentContentList = eventStrategy.getParentList(); - if (gSelectionDebug) printf("HandleEvent::mSelectionRange %s\n", mSelectionRange->ToString()); - - // Force Update - ForceDrawFrame(this); - - NS_RELEASE(newContent); - -#endif - aEventStatus = nsEventStatus_eIgnore; - return NS_OK; - -} - -NS_METHOD nsFrame::HandleDrag(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus, - nsFrame * aFrame) -{ -#if DO_SELECTION - // keep old start and end - nsIContent * startContent = mSelectionRange->GetStartContent(); - nsIContent * endContent = mSelectionRange->GetEndContent(); - - PRBool isNewFrame = PR_FALSE; // for testing (rcs) - - mDidDrag = PR_TRUE; - - if (aFrame != nsnull) { - //printf("nsFrame::HandleDrag\n"); - - // Check to see if we have changed frame - if (aFrame != mCurrentFrame) { - isNewFrame = PR_TRUE; - // We are in a new Frame! - if (gSelectionDebug) printf("HandleDrag::Different Frame in selection!\n"); - - // Get Content for current Frame - nsIContent * currentContent; - mCurrentFrame->GetContent(currentContent); - - // Get Content for New Frame - nsIContent * newContent; - aFrame->GetContent(newContent); - - // Check to see if we are still in the same Content - if (currentContent == newContent) { - if (gSelectionDebug) printf("HandleDrag::New Frame, same content.\n"); - - AdjustPointsInNewContent(aPresContext, aEvent, aFrame); - - } else if (IsBefore(newContent, currentContent)) { - if (gSelectionDebug) printf("HandleDrag::New Frame, is Before.\n"); - - resetContentTrackers(); - NewContentIsBefore(aPresContext, aEvent, newContent, currentContent, aFrame); - - } else { // Content is AFTER - if (gSelectionDebug) printf("HandleDrag::New Frame, is After.\n"); - - resetContentTrackers(); - NewContentIsAfter(aPresContext, aEvent, newContent, currentContent, aFrame); - } - mCurrentFrame = aFrame; - - NS_RELEASE(currentContent); - NS_RELEASE(newContent); - } else { - //if (gSelectionDebug) printf("HandleDrag::Same Frame.\n"); - - // Same Frame as before - //if (gSelectionDebug) printf("\nSame Start: %s\n", mStartSelectionPoint->ToString()); - //if (gSelectionDebug) printf("Same End: %s\n", mEndSelectionPoint->ToString()); - // [TODO] Uncomment these soon - - if (mStartSelectionPoint->GetContent() == mEndSelectionPoint->GetContent()) { - //if (gSelectionDebug) printf("Start & End Frame are the same: \n"); - if (gSelectionDebug) printf("******** Code is need here!\n********\n"); - //AdjustPointsInSameContent(aPresContext, aEvent); - } else { - //if (gSelectionDebug) printf("Start & End Frame are different: \n"); - - // Get Content for New Frame - nsIContent * newContent; - aFrame->GetContent(newContent); - PRInt32 newPos = -1; - - newPos = GetPosition(aPresContext, aEvent, aFrame); - - if (newContent == mStartSelectionPoint->GetContent()) { - //if (gSelectionDebug) printf("New Content equals Start Content\n"); - mStartSelectionPoint->SetOffset(newPos); - mSelectionRange->SetStartPoint(mStartSelectionPoint); - } else if (newContent == mEndSelectionPoint->GetContent()) { - //if (gSelectionDebug) printf("New Content equals End Content\n"); - mEndSelectionPoint->SetOffset(newPos); - mSelectionRange->SetEndPoint(mEndSelectionPoint); - } else { - if (gSelectionDebug) printf("=====\n=====\n=====\n=====\n=====\n=====\n Should NOT be here.\n"); - } - - //if (gSelectionDebug) printf("*Same Start: "+mStartSelectionPoint->GetOffset()+ - // " "+mStartSelectionPoint->IsAnchor()+ - // " End: "+mEndSelectionPoint->GetOffset() + - // " "+mEndSelectionPoint->IsAnchor()); - NS_RELEASE(newContent); - } - //??doDragRepaint(mCurrentFrame); - } - } - // Force Update - ForceDrawFrame(this); - //RefreshContentFrames(aPresContext, startContent, endContent); - RefreshFromContentTrackers(aPresContext); - -#endif - aEventStatus = nsEventStatus_eIgnore; - return NS_OK; -} - -NS_METHOD nsFrame::HandleRelease(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus, - nsFrame * aFrame) -{ -#if DO_SELECTION - mDoingSelection = PR_FALSE; -#endif - aEventStatus = nsEventStatus_eIgnore; - return NS_OK; -} - -//-------------------------------------------------------------------------- -//-- GetPosition -//-------------------------------------------------------------------------- -PRInt32 nsFrame::GetPosition(nsIPresContext& aPresContext, - nsGUIEvent * aEvent, - nsIFrame * aNewFrame) { - - //PRInt32 offset; - //PRInt32 width; - //CalcCursorPosition(aPresContext, aEvent, aNewFrame, offset, width); - //offset += aNewFrame->GetContentOffset(); - - //return offset; - return -1; -} - -/******************************************************** -* Adjusts the Starting and Ending TextPoint for a Range -*********************************************************/ -void nsFrame::AdjustPointsInNewContent(nsIPresContext& aPresContext, - nsGUIEvent * aEvent, - nsIFrame * aNewFrame) { - // Get new Cursor Poition in the new content - PRInt32 newPos = GetPosition(aPresContext, aEvent, aNewFrame);//, fText); - - if (mStartSelectionPoint->IsAnchor()) { - if (newPos == mStartSelectionPoint->GetOffset()) { - mEndSelectionPoint->SetOffset(newPos); - mEndSelectionPoint->SetAnchor(PR_TRUE); - mSelectionRange->SetEndPoint(mEndSelectionPoint); - } else if (newPos < mStartSelectionPoint->GetOffset()) { - mEndSelectionPoint->SetOffset(mStartSelectionPoint->GetOffset()); - mEndSelectionPoint->SetAnchor(PR_TRUE); - mStartSelectionPoint->SetOffset(newPos); - mStartSelectionPoint->SetAnchor(PR_FALSE); - mSelectionRange->SetRange(mStartSelectionPoint, mEndSelectionPoint); - } else { - mEndSelectionPoint->SetOffset(newPos); - mSelectionRange->SetEndPoint(mEndSelectionPoint); - } - } else if (mEndSelectionPoint->IsAnchor()) { - int endPos = mEndSelectionPoint->GetOffset(); - if (newPos == mEndSelectionPoint->GetOffset()) { - mStartSelectionPoint->SetOffset(newPos); - mStartSelectionPoint->SetAnchor(PR_TRUE); - mSelectionRange->SetStartPoint(mStartSelectionPoint); - } else if (newPos > mEndSelectionPoint->GetOffset()) { - mEndSelectionPoint->SetOffset(newPos); - mEndSelectionPoint->SetAnchor(PR_FALSE); - mStartSelectionPoint->SetOffset(endPos); - mStartSelectionPoint->SetAnchor(PR_TRUE); - mSelectionRange->SetRange(mStartSelectionPoint, mEndSelectionPoint); - } else { - mStartSelectionPoint->SetOffset(newPos); - mSelectionRange->SetStartPoint(mStartSelectionPoint); - } - } else { - // [TODO] Should get here - // throw exception - if (gSelectionDebug) printf("--\n--\n--\n--\n--\n--\n--\n Should be here. #102\n"); - //return; - } -} - -/******************************************************** -* Adjusts the Starting and Ending TextPoint for a Range -*********************************************************/ -void nsFrame::AdjustPointsInSameContent(nsIPresContext& aPresContext, - nsGUIEvent * aEvent) { - // Get new Cursor Poition in the same content - PRInt32 newPos = GetPosition(aPresContext, aEvent, mCurrentFrame); - if (gSelectionDebug) printf("AdjustTextPointsInSameContent newPos: %d\n", newPos); - - if (mStartSelectionPoint->IsAnchor()) { - if (newPos == mStartSelectionPoint->GetOffset()) { - mEndSelectionPoint->SetOffset(newPos); - mEndSelectionPoint->SetAnchor(PR_TRUE); - mSelectionRange->SetEndPoint(mEndSelectionPoint); - } else if (newPos < mStartSelectionPoint->GetOffset()) { - mStartSelectionPoint->SetOffset(newPos); - mStartSelectionPoint->SetAnchor(PR_FALSE); - mEndSelectionPoint->SetAnchor(PR_TRUE); - mSelectionRange->SetRange(mStartSelectionPoint, mEndSelectionPoint); - } else { - mEndSelectionPoint->SetAnchor(PR_FALSE); - mEndSelectionPoint->SetOffset(newPos); - mSelectionRange->SetEndPoint(mEndSelectionPoint); - } - } else if (mEndSelectionPoint->IsAnchor()) { - if (newPos == mEndSelectionPoint->GetOffset()) { - mStartSelectionPoint->SetOffset(newPos); - mStartSelectionPoint->SetAnchor(PR_TRUE); - mSelectionRange->SetStartPoint(mStartSelectionPoint); - } else if (newPos > mEndSelectionPoint->GetOffset()) { - mEndSelectionPoint->SetOffset(newPos); - mEndSelectionPoint->SetAnchor(PR_FALSE); - mStartSelectionPoint->SetAnchor(PR_TRUE); - mSelectionRange->SetRange(mStartSelectionPoint, mEndSelectionPoint); - } else { - mStartSelectionPoint->SetAnchor(PR_FALSE); - mStartSelectionPoint->SetOffset(newPos); - mSelectionRange->SetStartPoint(mStartSelectionPoint); - } - } else { - // [TODO] Should get here - // throw exception - if (gSelectionDebug) printf("--\n--\n--\n--\n--\n--\n--\n Should be here. #101\n"); - //return; - } - - if (gSelectionDebug) printf("Start %s End %s\n", mStartSelectionPoint->ToString(), mEndSelectionPoint->ToString()); - //} -} - -NS_METHOD nsFrame::GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor) -{ - aCursor = NS_STYLE_CURSOR_INHERIT; - return NS_OK; -} - -// Resize and incremental reflow -NS_METHOD -nsFrame::GetFrameState(nsFrameState& aResult) -{ - aResult = mState; - return NS_OK; -} - -NS_METHOD -nsFrame::SetFrameState(nsFrameState aNewState) -{ - mState = aNewState; - return NS_OK; -} - -// Resize reflow methods - -NS_METHOD -nsFrame::WillReflow(nsIPresContext& aPresContext) -{ - NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, - ("WillReflow: oldState=%x", mState)); - mState |= NS_FRAME_IN_REFLOW; - return NS_OK; -} - -NS_METHOD -nsFrame::DidReflow(nsIPresContext& aPresContext, - nsDidReflowStatus aStatus) -{ - NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, - ("nsFrame::DidReflow: aStatus=%d", aStatus)); - if (NS_FRAME_REFLOW_FINISHED == aStatus) { - mState &= ~(NS_FRAME_IN_REFLOW | NS_FRAME_FIRST_REFLOW); - - if (nsnull != mView) { - // Position and size view relative to its parent, not relative to our - // parent frame (our parent frame may not have a view). - nsIView* parentWithView; - nsPoint origin; - GetOffsetFromView(origin, parentWithView); - nsIViewManager *vm = mView->GetViewManager(); - vm->ResizeView(mView, mRect.width, mRect.height); - vm->MoveViewTo(mView, origin.x, origin.y); - NS_RELEASE(vm); - NS_IF_RELEASE(parentWithView); - } - } - return NS_OK; -} - -NS_METHOD nsFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - aDesiredSize.width = 0; - aDesiredSize.height = 0; - aDesiredSize.ascent = 0; - aDesiredSize.descent = 0; - if (nsnull != aDesiredSize.maxElementSize) { - aDesiredSize.maxElementSize->width = 0; - aDesiredSize.maxElementSize->height = 0; - } - aStatus = NS_FRAME_COMPLETE; - - if (eReflowReason_Incremental == aReflowState.reason) { - return NS_ERROR_NOT_IMPLEMENTED; - } - - return NS_OK; -} - -NS_METHOD nsFrame::ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) -{ - return NS_OK; -} - -NS_METHOD nsFrame::ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - return NS_OK; -} - -NS_METHOD nsFrame::ContentReplaced(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInParent) -{ - return NS_OK; -} - -NS_METHOD nsFrame::ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - return NS_OK; -} - -NS_METHOD nsFrame::ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent) -{ - return NS_OK; -} - -NS_METHOD nsFrame::GetReflowMetrics(nsIPresContext* aPresContext, - nsReflowMetrics& aMetrics) -{ - aMetrics.width = mRect.width; - aMetrics.height = mRect.height; - aMetrics.ascent = mRect.height; - aMetrics.descent = 0; - return NS_OK; -} - -// Flow member functions - -NS_METHOD nsFrame::IsSplittable(nsSplittableType& aIsSplittable) const -{ - aIsSplittable = NS_FRAME_NOT_SPLITTABLE; - return NS_OK; -} - -NS_METHOD nsFrame::CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame) -{ - NS_ERROR("not splittable"); - aContinuingFrame = nsnull; - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::GetPrevInFlow(nsIFrame*& aPrevInFlow) const -{ - aPrevInFlow = nsnull; - return NS_OK; -} - -NS_METHOD nsFrame::SetPrevInFlow(nsIFrame*) -{ - NS_ERROR("not splittable"); - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::GetNextInFlow(nsIFrame*& aNextInFlow) const -{ - aNextInFlow = nsnull; - return NS_OK; -} - -NS_METHOD nsFrame::SetNextInFlow(nsIFrame*) -{ - NS_ERROR("not splittable"); - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::AppendToFlow(nsIFrame* aAfterFrame) -{ - NS_ERROR("not splittable"); - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::PrependToFlow(nsIFrame* aBeforeFrame) -{ - NS_ERROR("not splittable"); - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::RemoveFromFlow() -{ - NS_ERROR("not splittable"); - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::BreakFromPrevFlow() -{ - NS_ERROR("not splittable"); - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsFrame::BreakFromNextFlow() -{ - NS_ERROR("not splittable"); - return NS_ERROR_NOT_IMPLEMENTED; -} - -// Associated view object -NS_METHOD nsFrame::GetView(nsIView*& aView) const -{ - aView = mView; - NS_IF_ADDREF(aView); - return NS_OK; -} - -NS_METHOD nsFrame::SetView(nsIView* aView) -{ - NS_IF_RELEASE(mView); - if (nsnull != aView) { - mView = aView; - aView->SetFrame(this); - NS_ADDREF(aView); - } - return NS_OK; -} - -// Find the first geometric parent that has a view -NS_METHOD nsFrame::GetParentWithView(nsIFrame*& aParent) const -{ - aParent = mGeometricParent; - - while (nsnull != aParent) { - nsIView* parView; - - aParent->GetView(parView); - if (nsnull != parView) { - NS_RELEASE(parView); - break; - } - aParent->GetGeometricParent(aParent); - } - - return NS_OK; -} - -// Returns the offset from this frame to the closest geometric parent that -// has a view. Also returns the containing view or null in case of error -NS_METHOD nsFrame::GetOffsetFromView(nsPoint& aOffset, nsIView*& aView) const -{ - nsIFrame* frame = (nsIFrame*)this; - - aView = nsnull; - aOffset.MoveTo(0, 0); - do { - nsPoint origin; - - frame->GetOrigin(origin); - aOffset += origin; - frame->GetGeometricParent(frame); - if (nsnull != frame) { - frame->GetView(aView); - } - } while ((nsnull != frame) && (nsnull == aView)); - return NS_OK; -} - -NS_METHOD nsFrame::GetWindow(nsIWidget*& aWindow) const -{ - nsIFrame* frame = (nsIFrame*)this; - - aWindow = nsnull; - while (nsnull != frame) { - nsIView* view; - - frame->GetView(view); - if (nsnull != view) { - aWindow = view->GetWidget(); - NS_RELEASE(view); - if (nsnull != aWindow) { - break; - } - } - frame->GetParentWithView(frame); - } - NS_POSTCONDITION(nsnull != aWindow, "no window in frame tree"); - return NS_OK; -} - -void nsFrame::Invalidate(const nsRect& aDamageRect) const -{ - nsIViewManagerPtr viewManager; - - if (nsnull != mView) { - viewManager = mView->GetViewManager(); - viewManager->UpdateView(mView, aDamageRect, 0); - - } else { - nsRect rect(aDamageRect); - nsPoint offset; - nsIViewPtr view; - - GetOffsetFromView(offset, view.AssignRef()); - NS_ASSERTION(view.IsNotNull(), "no view"); - rect += offset; - viewManager = view->GetViewManager(); - viewManager->UpdateView(view, rect, 0); - } -} - -// Style sizing methods -NS_METHOD nsFrame::IsPercentageBase(PRBool& aBase) const -{ - const nsStylePosition* position; - GetStyleData(eStyleStruct_Position, (const nsStyleStruct*&)position); - if (position->mPosition != NS_STYLE_POSITION_NORMAL) { - aBase = PR_TRUE; - } - else { - const nsStyleDisplay* display; - GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&)display); - if ((display->mDisplay == NS_STYLE_DISPLAY_BLOCK) || - (display->mDisplay == NS_STYLE_DISPLAY_LIST_ITEM)) { - aBase = PR_TRUE; - } - else { - aBase = PR_FALSE; - } - } - return NS_OK; -} - -NS_METHOD nsFrame::GetAutoMarginSize(PRUint8 aSide, nscoord& aSize) const -{ - aSize = 0; // XXX probably not right, subclass override? - return NS_OK; -} - - -// Sibling pointer used to link together frames - -NS_METHOD nsFrame::GetNextSibling(nsIFrame*& aNextSibling) const -{ - aNextSibling = mNextSibling; - return NS_OK; -} - -NS_METHOD nsFrame::SetNextSibling(nsIFrame* aNextSibling) -{ - mNextSibling = aNextSibling; - return NS_OK; -} - -// Transparency query -NS_METHOD nsFrame::IsTransparent(PRBool& aTransparent) const -{ - //XXX this needs to be overridden in just about every leaf class? MMP - aTransparent = PR_TRUE; - return NS_OK; -} - -// Debugging -NS_METHOD nsFrame::List(FILE* out, PRInt32 aIndent) const -{ - // Indent - for (PRInt32 i = aIndent; --i >= 0; ) fputs(" ", out); - - // Output the tag and rect - ListTag(out); - if (nsnull != mView) { - fprintf(out, " [view=%p]", mView); - } - fputs(" ", out); - out << mRect; - if (0 != mState) { - fprintf(out, " [state=%08x]", mState); - } - fputs("<>\n", out); - return NS_OK; -} - -// Output the frame's tag -NS_METHOD nsFrame::ListTag(FILE* out) const -{ - nsIAtom* tag = mContent->GetTag(); - if (tag != nsnull) { - nsAutoString buf; - tag->ToString(buf); - fputs(buf, out); - NS_RELEASE(tag); - } - PRInt32 contentIndex; - - GetContentIndex(contentIndex); - fprintf(out, "(%d)@%p", contentIndex, this); - return NS_OK; -} - -NS_METHOD nsFrame::VerifyTree() const -{ - NS_ASSERTION(0 == (mState & NS_FRAME_IN_REFLOW), "frame is in reflow"); - return NS_OK; -} - -//----------------------------------------------------------------------------------- - - -//------------------------------ -void WalkTree(nsIContent * aParent) { - - /*if (aParent->ChildCount() == 0) { - nsIDOMText * textContent; - nsresult status = aParent->QueryInterface(kIDOMTextIID, (void**) &textContent); - if (NS_OK == status) { - nsString text; - textContent->GetData(text); - if (text.Length() == 1) { - char * str = text.ToNewCString(); - if (str[0] >= 32 && str[0] != '\n') { - fContentArray[fMax++] = aParent; - } - delete str; - } else { - fContentArray[fMax++] = aParent; - } - - } - return; - }*/ - fContentArray[fMax++] = aParent; - - for (PRInt32 i=0;iChildCount();i++) { - nsIContent * node = aParent->ChildAt(i); - WalkTree(node); - } -} - -//------------------------------ -void PrintContent() { - //static NS_DEFINE_IID(kITextContentIID, NS_ITEXTCONTENT_IID); - static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID); - - nsIDOMText * textContent; - - for (int i=0;iQueryInterface(kIDOMTextIID, (void**) &textContent); - if (NS_OK == status) { - nsString text; - //textContent->GetText(text, 0, textContent->GetLength()); - textContent->GetData(text); - char * str = text.ToNewCString(); - if (text.Length() > 1) { - printf("%i [%s]\n", i, str); - } else { - printf("%i [%s] %d\n", i, str, str[0]); - } - delete str; - } - } - printf("Total pieces of Content: %d\n", fMax); -} - - -//------------------------------ -void BuildContentList(nsIContent * Start) { - - if (fMax > -1) { - return; - } - - fMax = 0; - nsIContent * node = Start; - nsIContent * parent = node->GetParent(); - // root content - while (parent != nsnull) { - parent = node->GetParent(); - if (parent != nsnull) { - node = parent; - } - } // while - //fContentArray = new nsIContent[1024]; - WalkTree(node); - if (gSelectionDebug) PrintContent(); -} - - -//-------------------------------------------------------------------------- -// Determines whether a piece of content in question is inbetween the two -// piece of content -//-------------------------------------------------------------------------- -PRBool IsInRange(nsIContent * aStartContent, - nsIContent * aEndContent, - nsIContent * aContent) { - // Start and End Content is the same, so check against the start - if (aStartContent == aEndContent) { - return aContent == aStartContent; - } - - // Check to see if it is equal to the start or the end - if (aContent == aStartContent || aContent == aEndContent) { - return PR_TRUE; - } - - if (fMax == -1) { - BuildContentList(aContent); - } - - PRBool foundStart = PR_FALSE; - for (PRInt32 i=0;iGetContent(), mEndSelectionPoint->GetContent(), aNewContent)) { - - // Case #1 - Remove Current Content from Selection (at End) - if (gSelectionDebug) printf("Case #1 - (Before) New Content is in selected Range.\n"); - - - if (aNewContent == mStartSelectionPoint->GetContent()) { - // [TODO] This is where we might have to delete from end to new content - - // Returns the new End Point, if Start and End are on the - // same content then End Point's Cursor is set to Start's - mEndSelectionPoint->SetContent(mStartSelectionPoint->GetContent()); - AdjustPointsInNewContent(aPresContext, aEvent, aNewFrame); - - } else { - PRInt32 newPos = GetPosition(aPresContext, aEvent, aNewFrame); - mEndSelectionPoint->SetPoint(aNewContent, newPos, PR_FALSE); - mSelectionRange->SetEndPoint(mEndSelectionPoint); - } - - // The current content is being removed from Selection - addRangeToSelectionTrackers(aNewContent, aCurrentContent, kInsertInRemoveList); - } else { - // Case #2 - Add new content to selection (At Start) - if (gSelectionDebug) printf("Case #2 - (Before) New Content is NOT in selected Range. Moving Start Backward.\n"); - - PRInt32 newPos = GetPosition(aPresContext, aEvent, aNewFrame); - - // Create new TextPoint and move Start Point backward - mStartSelectionPoint->SetPoint(aNewContent, newPos, PR_FALSE); // position is set correctly in adjustTextPoints - mSelectionRange->SetStartPoint(mStartSelectionPoint); - - // The New Content is added to Tracker - addRangeToSelectionTrackers(aNewContent, aCurrentContent, kInsertInAddList); - } - //??doDragRepaint(fCurrentFrame); - //??doDragRepaint(aNewFrame); - //??if (gSelectionDebug) mSelectionRange.printContent(); -} - -/******************************************************** -* Refreshes each content's frame -*********************************************************/ -void RefreshContentFrames(nsIPresContext& aPresContext, - nsIContent * aStartContent, - nsIContent * aEndContent) -{ - //------------------------------------- - // Undraw all the current selected frames - // XXX Kludge for now - nsIPresShell * shell = aPresContext.GetShell(); - PRBool foundStart = PR_FALSE; - for (PRInt32 i=0;iFindFrameWithContent(node)); - if (aStartContent == aEndContent) { - break; - } - } else if (foundStart) { - ForceDrawFrame((nsFrame *)shell->FindFrameWithContent(node)); - } else if (aEndContent == node) { - ForceDrawFrame((nsFrame *)shell->FindFrameWithContent(node)); - break; - } - } - //------------------------------------- -} - -/******************************************************** -* Handles a when the cursor enters new content that is After -* the content that the cursor is currently in -*********************************************************/ -void nsFrame::NewContentIsAfter(nsIPresContext& aPresContext, - nsGUIEvent * aEvent, - nsIContent * aNewContent, - nsIContent * aCurrentContent, - nsIFrame * aNewFrame) -{ - if (gSelectionDebug) printf("New Frame, New content is after.\n"); - - - // Dragging Mouse to the Right - // - // 3) The cursor is being dragged foward in the content - // and the mouse is "before" the anchor in the content - // and the current piece of content is being removed from the selection - // - // This section cover two cases: - // 4) The cursor is being dragged foward in the content - // and the mouse is "after" the anchor in the content - // and each new piece of content is being added to the selection - // - - // Check to see if the new content is in the selection - if (IsInRange(mStartSelectionPoint->GetContent(), mEndSelectionPoint->GetContent(), aNewContent)) { - - // Case #3 - Remove Content (from Start) - if (gSelectionDebug) printf("Case #3 - (After) New Content is in selected Range.\n"); - - PrintIndex("Start: ", mStartSelectionPoint->GetContent()); - PrintIndex("Current: ", aNewContent); - // Remove Current Content in Tracker, but leave New Content in Selection - addRangeToSelectionTrackers(mStartSelectionPoint->GetContent(), aNewContent, kInsertInRemoveList); - - // [TODO] Always get nearest Text content - PRInt32 newPos = GetPosition(aPresContext, aEvent, aNewFrame); - - // Check to see if the new Content is the same as the End Point's - if (aNewContent == mEndSelectionPoint->GetContent()) { - if (gSelectionDebug) printf("New Content matches End Point\n"); - - mStartSelectionPoint->SetContent(aNewContent); - AdjustPointsInNewContent(aPresContext, aEvent, aNewFrame); - - } else { - if (gSelectionDebug) printf("New Content does NOT matches End Point\n"); - mStartSelectionPoint->SetPoint(aNewContent, newPos, PR_FALSE); - mSelectionRange->SetStartPoint(mStartSelectionPoint); - } - - } else { - if (gSelectionDebug) - printf("Case #4 - (After) Adding New Content\n"); - - // Case #2 - Adding Content (at End) - // The new content is not in the selection - PRInt32 newPos = GetPosition(aPresContext, aEvent, aNewFrame); - - // Check to see if we need to create a new SelectionPoint and add it - // or do we simply move the existing start or end point - if (mStartSelectionPoint->GetContent() == mEndSelectionPoint->GetContent()) { - if (gSelectionDebug) printf("Case #4 - Start & End Content the Same\n"); - // Move start or end point - // Get new Cursor Poition in the new content - - if (mStartSelectionPoint->IsAnchor()) { - if (gSelectionDebug) printf("Case #4 - Start is Anchor\n"); - // Since the Start is the Anchor just adjust the end - // What is up Here???????? - //if (gSelectionDebug) printf("Start: %s\n", mStartSelectionPoint->ToString()); - //if (gSelectionDebug) printf("End: %s\n", mEndSelectionPoint->ToString()); - //if (gSelectionDebug) printf("---->"); - - // XXX Note this includes the current End point (it should be end->nextContent) - addRangeToSelectionTrackers(mEndSelectionPoint->GetContent(), aNewContent, kInsertInAddList); - - mEndSelectionPoint->SetPoint(aNewContent, newPos, PR_FALSE); - mSelectionRange->SetEndPoint(mEndSelectionPoint); - - - //if (gSelectionDebug) printf("Start: %s\n", mStartSelectionPoint->ToString()); - //if (gSelectionDebug) printf("End: %s\n", mEndSelectionPoint->ToString()); - - } else { - if (gSelectionDebug) printf("Case #4 - Start is NOT Anchor\n"); - // Because End was the anchor, we need to set the Start Point to - // the End's Offset and set it to be the new anchor - addRangeToSelectionTrackers(mStartSelectionPoint->GetContent(), - mEndSelectionPoint->GetContent(), kInsertInRemoveList); - - int endPos = mEndSelectionPoint->GetOffset(); - mStartSelectionPoint->SetOffset(endPos); - mStartSelectionPoint->SetAnchor(PR_TRUE); - - // The Start point was being moved so when it jumped to the new frame - // we needed to make it the new End Point - mEndSelectionPoint->SetPoint(aNewContent, newPos, PR_FALSE); - mSelectionRange->SetRange(mStartSelectionPoint, mEndSelectionPoint); - - addRangeToSelectionTrackers(mStartSelectionPoint->GetContent(), - mEndSelectionPoint->GetContent(), kInsertInRemoveList); - } - } else { - if (gSelectionDebug) printf("Case #4 - Start & End Content NOT the Same\n"); - nsIContent * oldEnd = mEndSelectionPoint->GetContent(); - // Adjust the end point - mEndSelectionPoint->SetPoint(aNewContent, newPos, PR_FALSE); - mSelectionRange->SetRange(mStartSelectionPoint, mEndSelectionPoint); - - // Add New Content to Selection Tracker - addRangeToSelectionTrackers(oldEnd, mEndSelectionPoint->GetContent(), kInsertInAddList); - } - } - //??if (gSelectionDebug) mSelectionRange.printContent(); - -} - -/** - * - */ -void ForceDrawFrame(nsFrame * aFrame)//, PRBool) -{ - if (aFrame == nsnull) { - return; - } - nsRect rect; - nsIView * view; - nsPoint pnt; - aFrame->GetOffsetFromView(pnt, view); - aFrame->GetRect(rect); - rect.x = pnt.x; - rect.y = pnt.y; - if (view != nsnull) { - nsIViewManager * viewMgr = view->GetViewManager(); - if (viewMgr != nsnull) { - viewMgr->UpdateView(view, rect, 0); - } - } - //viewMgr->UpdateView(view, rect, NS_VMREFRESH_DOUBLE_BUFFER | NS_VMREFRESH_IMMEDIATE); - - //NS_RELEASE(view); -} - - -///////////////////////////////////////////////// -// Selection Tracker Methods -///////////////////////////////////////////////// - -//---------------------------- -// -//---------------------------- -void resetContentTrackers() { - //nsIContent * fTrackerContentArrayRemoveList[1024]; - //nsIContent * fTrackerContentArrayAddList[1024]; - fTrackerRemoveListMax = 0; - fTrackerAddListMax = 0; -} - -//---------------------------- -// -//---------------------------- -void RefreshFromContentTrackers(nsIPresContext& aPresContext) { - /*FILE * fd = fopen("data.txt", "w"); - PRBool foundStart = PR_FALSE; - for (PRInt32 j=0;jGetStartContent()) { - foundStart = PR_TRUE; - printf("%d -> 0x%X\n", j, node); - } else if (mSelectionRange->GetEndContent() == node) { - printf("%d -> 0x%X\n", j, node); - break; - } else if (foundStart) { - printf("%d -> 0x%X\n", j, node); - } - } - fflush(fd); - fclose(fd);*/ - - - PRInt32 i; - nsIPresShell * shell = aPresContext.GetShell(); - for (i=0;iFindFrameWithContent(fTrackerContentArrayRemoveList[i])); - if (gSelectionDebug) printf("ForceDrawFrame (remove) content 0x%X\n", fTrackerContentArrayRemoveList[i]); - } - for (i=0;iFindFrameWithContent(fTrackerContentArrayAddList[i])); - if (gSelectionDebug) printf("ForceDrawFrame (add) content 0x%X\n", fTrackerContentArrayAddList[i]); - } - resetContentTrackers(); -} - -//---------------------------- -// -//---------------------------- -void addRangeToSelectionTrackers(nsIContent * aStartContent, nsIContent * aEndContent, PRUint32 aType) -{ - if (aStartContent == nsnull || aEndContent == nsnull) { - return; - } - nsIContent ** content = (aType == kInsertInRemoveList?fTrackerContentArrayRemoveList:fTrackerContentArrayAddList); - int inx = (aType == kInsertInRemoveList?fTrackerRemoveListMax:fTrackerAddListMax); - - //FILE * fd = fopen("data.txt", "w"); - //fprintf(fd, "Inx before %d\n", inx); - - PRBool foundStart = PR_FALSE; - for (PRInt32 i=0;i 10) { - int x = 0; - } - } - //fprintf(fd, "Inx after %d\n", inx); - //printf("Inx after %d\n", inx); - //fflush(fd); - //fclose(fd); - if (inx > 100) { - int x = 0; - } - if (gSelectionDebug) printf("Adding to %s %d\n", (aType == kInsertInRemoveList?"Remove Array":"Add Array"), inx); - if (aType == kInsertInRemoveList) { - fTrackerRemoveListMax = inx; - } else { // kInsertInAddList - fTrackerAddListMax = inx; - } -} - -void PrintIndex(char * aStr, nsIContent * aContent) { - for (PRInt32 j=0;jGetTag(); - if (nsnull != tag) { - nsAutoString tmp; - tag->ToString(tmp); - tmp.ToCString(namebuf, sizeof(namebuf)); - NS_RELEASE(tag); - } - } - PR_snprintf(aResult, aResultSize, "%s@%p", namebuf, aFrame); -} - -void -nsFrame::Trace(const char* aMethod, PRBool aEnter) -{ - if (NS_FRAME_LOG_TEST(gLogModule, NS_FRAME_TRACE_CALLS)) { - char tagbuf[40]; - GetTagName(this, mContent, sizeof(tagbuf), tagbuf); - PR_LogPrint("%s: %s %s", tagbuf, aEnter ? "enter" : "exit", aMethod); - } -} - -void -nsFrame::Trace(const char* aMethod, PRBool aEnter, nsReflowStatus aStatus) -{ - if (NS_FRAME_LOG_TEST(gLogModule, NS_FRAME_TRACE_CALLS)) { - char tagbuf[40]; - GetTagName(this, mContent, sizeof(tagbuf), tagbuf); - PR_LogPrint("%s: %s %s, status=%scomplete%s", - tagbuf, aEnter ? "enter" : "exit", aMethod, - NS_FRAME_IS_NOT_COMPLETE(aStatus) ? "not" : "", - (NS_FRAME_REFLOW_NEXTINFLOW & aStatus) ? "+reflow" : ""); - } -} - -void -nsFrame::TraceMsg(const char* aFormatString, ...) -{ - if (NS_FRAME_LOG_TEST(gLogModule, NS_FRAME_TRACE_CALLS)) { - // Format arguments into a buffer - char argbuf[200]; - va_list ap; - va_start(ap, aFormatString); - PR_vsnprintf(argbuf, sizeof(argbuf), aFormatString, ap); - va_end(ap); - - char tagbuf[40]; - GetTagName(this, mContent, sizeof(tagbuf), tagbuf); - PR_LogPrint("%s: %s", tagbuf, argbuf); - } -} -#endif diff --git a/mozilla/layout/base/src/nsFrame.h b/mozilla/layout/base/src/nsFrame.h deleted file mode 100644 index 47b67deeebb..00000000000 --- a/mozilla/layout/base/src/nsFrame.h +++ /dev/null @@ -1,312 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsFrame_h___ -#define nsFrame_h___ - -#include "nsIFrame.h" -#include "nsRect.h" -#include "nsISelection.h" -#include "nsSelectionRange.h" -#include "nsSelectionPoint.h" -#include "prlog.h" - -/** - * nsFrame logging constants. We redefine the nspr - * PRLogModuleInfo.level field to be a bitfield. Each bit controls a - * specific type of logging. Each logging operation has associated - * inline methods defined below. - */ -#define NS_FRAME_TRACE_CALLS 0x1 -#define NS_FRAME_TRACE_PUSH_PULL 0x2 -#define NS_FRAME_TRACE_CHILD_REFLOW 0x4 -#define NS_FRAME_TRACE_NEW_FRAMES 0x8 - -#define NS_FRAME_LOG_TEST(_lm,_bit) (PRIntn((_lm)->level) & (_bit)) - -#ifdef NS_DEBUG -#define NS_FRAME_LOG(_bit,_args) \ - PR_BEGIN_MACRO \ - if (NS_FRAME_LOG_TEST(nsIFrame::GetLogModuleInfo(),_bit)) { \ - PR_LogPrint _args; \ - } \ - PR_END_MACRO -#else -#define NS_FRAME_LOG(_bit,_args) -#endif - -// XXX Need to rework this so that logging is free when it's off -#ifdef NS_DEBUG -#define NS_FRAME_TRACE_IN(_method) Trace(_method, PR_TRUE) - -#define NS_FRAME_TRACE_OUT(_method) Trace(_method, PR_FALSE) - -// XXX remove me -#define NS_FRAME_TRACE_MSG(_bit,_args) \ - PR_BEGIN_MACRO \ - if (NS_FRAME_LOG_TEST(nsIFrame::GetLogModuleInfo(),_bit)) { \ - TraceMsg _args; \ - } \ - PR_END_MACRO - -#define NS_FRAME_TRACE(_bit,_args) \ - PR_BEGIN_MACRO \ - if (NS_FRAME_LOG_TEST(nsIFrame::GetLogModuleInfo(),_bit)) { \ - TraceMsg _args; \ - } \ - PR_END_MACRO - -#define NS_FRAME_TRACE_REFLOW_IN(_method) Trace(_method, PR_TRUE) - -#define NS_FRAME_TRACE_REFLOW_OUT(_method, _status) \ - Trace(_method, PR_FALSE, _status) - -#else -#define NS_FRAME_TRACE(_bits,_args) -#define NS_FRAME_TRACE_IN(_method) -#define NS_FRAME_TRACE_OUT(_method) -#define NS_FRAME_TRACE_MSG(_bits,_args) -#define NS_FRAME_TRACE_REFLOW_IN(_method) -#define NS_FRAME_TRACE_REFLOW_OUT(_method, _status) -#endif - -//---------------------------------------------------------------------- - -// Implementation of a simple frame with no children and that isn't splittable -class nsFrame : public nsIFrame -{ -public: - /** - * Create a new "empty" frame that maps a given piece of content into a - * 0,0 area. - */ - static nsresult NewFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent); - - // Overloaded new operator. Initializes the memory to 0 - void* operator new(size_t size); - - // nsISupports - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr); - - // nsIFrame - NS_IMETHOD DeleteFrame(); - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - NS_IMETHOD GetContent(nsIContent*& aContent) const; - NS_IMETHOD GetContentIndex(PRInt32& aIndexInParent) const; - NS_IMETHOD GetStyleContext(nsIPresContext* aContext, - nsIStyleContext*& aStyleContext); - NS_IMETHOD SetStyleContext(nsIPresContext* aPresContext, - nsIStyleContext* aContext); - NS_IMETHOD GetStyleData(nsStyleStructID aSID, - const nsStyleStruct*& aStyleStruct) const; - NS_IMETHOD GetContentParent(nsIFrame*& aParent) const; - NS_IMETHOD SetContentParent(const nsIFrame* aParent); - NS_IMETHOD GetGeometricParent(nsIFrame*& aParent) const; - NS_IMETHOD SetGeometricParent(const nsIFrame* aParent); - NS_IMETHOD GetRect(nsRect& aRect) const; - NS_IMETHOD GetOrigin(nsPoint& aPoint) const; - NS_IMETHOD GetSize(nsSize& aSize) const; - NS_IMETHOD SetRect(const nsRect& aRect); - NS_IMETHOD MoveTo(nscoord aX, nscoord aY); - NS_IMETHOD SizeTo(nscoord aWidth, nscoord aHeight); - NS_IMETHOD ChildCount(PRInt32& aChildCount) const; - NS_IMETHOD ChildAt(PRInt32 aIndex, nsIFrame*& aFrame) const; - NS_IMETHOD IndexOf(const nsIFrame* aChild, PRInt32& aIndex) const; - NS_IMETHOD FirstChild(nsIFrame*& aFirstChild) const; - NS_IMETHOD NextChild(const nsIFrame* aChild, nsIFrame*& aNextChild) const; - NS_IMETHOD PrevChild(const nsIFrame* aChild, nsIFrame*& aPrevChild) const; - NS_IMETHOD LastChild(nsIFrame*& aLastChild) const; - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - NS_IMETHOD HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus); - NS_IMETHOD GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor); - NS_IMETHOD GetFrameState(nsFrameState& aResult); - NS_IMETHOD SetFrameState(nsFrameState aNewState); - NS_IMETHOD WillReflow(nsIPresContext& aPresContext); - NS_IMETHOD DidReflow(nsIPresContext& aPresContext, - nsDidReflowStatus aStatus); - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - NS_IMETHOD ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer); - NS_IMETHOD ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentReplaced(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent); - NS_IMETHOD GetReflowMetrics(nsIPresContext* aPresContext, - nsReflowMetrics& aMetrics); - NS_IMETHOD IsSplittable(nsSplittableType& aIsSplittable) const; - NS_IMETHOD CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame); - NS_IMETHOD GetPrevInFlow(nsIFrame*& aPrevInFlow) const; - NS_IMETHOD SetPrevInFlow(nsIFrame*); - NS_IMETHOD GetNextInFlow(nsIFrame*& aNextInFlow) const; - NS_IMETHOD SetNextInFlow(nsIFrame*); - NS_IMETHOD AppendToFlow(nsIFrame* aAfterFrame); - NS_IMETHOD PrependToFlow(nsIFrame* aAfterFrame); - NS_IMETHOD RemoveFromFlow(); - NS_IMETHOD BreakFromPrevFlow(); - NS_IMETHOD BreakFromNextFlow(); - NS_IMETHOD GetView(nsIView*& aView) const; - NS_IMETHOD SetView(nsIView* aView); - NS_IMETHOD GetParentWithView(nsIFrame*& aParent) const; - NS_IMETHOD GetOffsetFromView(nsPoint& aOffset, nsIView*& aView) const; - NS_IMETHOD GetWindow(nsIWidget*&) const; - NS_IMETHOD IsPercentageBase(PRBool& aBase) const; - NS_IMETHOD GetAutoMarginSize(PRUint8 aSide, nscoord& aSize) const; - NS_IMETHOD GetNextSibling(nsIFrame*& aNextSibling) const; - NS_IMETHOD SetNextSibling(nsIFrame* aNextSibling); - NS_IMETHOD IsTransparent(PRBool& aTransparent) const; - NS_IMETHOD List(FILE* out = stdout, PRInt32 aIndent = 0) const; - NS_IMETHOD ListTag(FILE* out = stdout) const; - NS_IMETHOD VerifyTree() const; - - //-------------------------------------------------- - // Additional methods - - // Invalidate part of the frame by asking the view manager to repaint. - // aDamageRect is in the frame's local coordinate space - void Invalidate(const nsRect& aDamageRect) const; - -#ifdef NS_DEBUG - /** - * Tracing method that writes a method enter/exit routine to the - * nspr log using the nsIFrame log module. The tracing is only - * done when the NS_FRAME_TRACE_CALLS bit is set in the log module's - * level field. - */ - void Trace(const char* aMethod, PRBool aEnter); - void Trace(const char* aMethod, PRBool aEnter, nsReflowStatus aStatus); - void TraceMsg(const char* fmt, ...); -#endif - -protected: - // Selection Methods - NS_METHOD HandlePress(nsIPresContext& aPresContext, - nsGUIEvent * aEvent, - nsEventStatus& aEventStatus, - nsFrame * aFrame); - - NS_METHOD HandleDrag(nsIPresContext& aPresContext, - nsGUIEvent * aEvent, - nsEventStatus& aEventStatus, - nsFrame * aFrame); - - NS_METHOD HandleRelease(nsIPresContext& aPresContext, - nsGUIEvent * aEvent, - nsEventStatus& aEventStatus, - nsFrame * aFrame); - - virtual void NewContentIsBefore(nsIPresContext& aPresContext, - nsGUIEvent * aEvent, - nsIContent * aNewContent, - nsIContent * aCurrentContent, - nsIFrame * aNewFrame); - - virtual void NewContentIsAfter(nsIPresContext& aPresContext, - nsGUIEvent * aEvent, - nsIContent * aNewContent, - nsIContent * aCurrentContent, - nsIFrame * aNewFrame); - - virtual PRInt32 GetPosition(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIFrame * aNewFrame); - - virtual void AdjustPointsInNewContent(nsIPresContext& aPresContext, - nsGUIEvent * aEvent, - nsIFrame * aNewFrame); - - virtual void AdjustPointsInSameContent(nsIPresContext& aPresContext, - nsGUIEvent * aEvent); - - - // Style post processing hook - NS_IMETHOD DidSetStyleContext(nsIPresContext* aPresContext); - - - - // Constructor. Takes as arguments the content object, the index in parent, - // and the Frame for the content parent - nsFrame(nsIContent* aContent, nsIFrame* aParent); - - virtual ~nsFrame(); - - void SizeOfWithoutThis(nsISizeOfHandler* aHandler) const; - - nsRect mRect; - nsIContent* mContent; - nsIStyleContext* mStyleContext; - nsIFrame* mContentParent; - nsIFrame* mGeometricParent; - nsIFrame* mNextSibling; // singly linked list of frames - nsFrameState mState; - - /////////////////////////////////// - // Important Selection Variables - /////////////////////////////////// - static nsIFrame * mCurrentFrame; - static PRBool mDoingSelection; - static PRBool mDidDrag; - static PRInt32 mStartPos; - - // Selection data is valid only from the Mouse Press to the Mouse Release - static nsSelectionRange * mSelectionRange; - static nsISelection * mSelection; - - static nsSelectionPoint * mStartSelectionPoint; - static nsSelectionPoint * mEndSelectionPoint; - /////////////////////////////////// - - -private: - nsIView* mView; // must use accessor member functions - - NS_IMETHOD_(nsrefcnt) AddRef(void); - NS_IMETHOD_(nsrefcnt) Release(void); -}; - -#endif /* nsFrame_h___ */ diff --git a/mozilla/layout/base/src/nsFrameImageLoader.cpp b/mozilla/layout/base/src/nsFrameImageLoader.cpp deleted file mode 100644 index 9d1e5ee3f97..00000000000 --- a/mozilla/layout/base/src/nsFrameImageLoader.cpp +++ /dev/null @@ -1,319 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsFrameImageLoader.h" -#include "nsIPresContext.h" -#include "nsIViewManager.h" -#include "nsIView.h" -#include "nsIFrame.h" -#include "nsIURL.h" -#include "nsIDocument.h" -#include "nsIContent.h" -#include "nsIImageGroup.h" -#include "nsIImageRequest.h" -#include "nsString.h" -#include "prlog.h" -#include "nsISizeOfHandler.h" - -static NS_DEFINE_IID(kIFrameImageLoaderIID, NS_IFRAME_IMAGE_LOADER_IID); -static NS_DEFINE_IID(kIImageRequestObserverIID, NS_IIMAGEREQUESTOBSERVER_IID); -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - -static PRLogModuleInfo* gFrameImageLoaderLMI; - -NS_LAYOUT nsresult -NS_NewFrameImageLoader(nsIFrameImageLoader** aInstancePtrResult) -{ - nsFrameImageLoader* it = new nsFrameImageLoader(); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIFrameImageLoaderIID, - (void**) aInstancePtrResult); -} - -nsFrameImageLoader::nsFrameImageLoader() -{ - NS_INIT_REFCNT(); - mImage = nsnull; - mSize.width = 0; - mSize.height = 0; - mError = (nsImageError) -1; - mTargetFrame = nsnull; - mPresContext = nsnull; - mImageRequest = nsnull; - mImageLoadStatus = NS_IMAGE_LOAD_STATUS_NONE; -#ifdef NS_DEBUG - if (nsnull == gFrameImageLoaderLMI) { - gFrameImageLoaderLMI = PR_NewLogModule("frameimageloader"); - } -#endif -} - -nsFrameImageLoader::~nsFrameImageLoader() -{ - NS_IF_RELEASE(mImageRequest); - NS_IF_RELEASE(mPresContext); -} - -NS_IMPL_ADDREF(nsFrameImageLoader) - -NS_IMPL_RELEASE(nsFrameImageLoader) - -NS_METHOD -nsFrameImageLoader::QueryInterface(REFNSIID aIID, - void** aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIImageRequestObserverIID)) { - *aInstancePtr = (void*) ((nsIImageRequestObserver*) this); - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIFrameImageLoaderIID)) { - *aInstancePtr = (void*) ((nsIFrameImageLoader*) this); - AddRef(); - return NS_OK; - } - if (aIID.Equals(kISupportsIID)) { - *aInstancePtr = (void*) ((nsISupports*) this); - AddRef(); - return NS_OK; - } - return NS_NOINTERFACE; -} - -nsresult -nsFrameImageLoader::Init(nsIPresContext* aPresContext, - nsIImageGroup* aGroup, - const nsString& aURL, - nsIFrame* aTargetFrame, - PRBool aNeedSizeUpdate) -{ - NS_PRECONDITION(nsnull != aPresContext, "null ptr"); - NS_PRECONDITION(nsnull == mPresContext, "double init"); - - if (nsnull == aPresContext) { - return NS_ERROR_NULL_POINTER; - } - if (nsnull != mPresContext) { - return NS_ERROR_ALREADY_INITIALIZED; - } - mTargetFrame = aTargetFrame; - mPresContext = aPresContext; - NS_IF_ADDREF(mPresContext); - if (aNeedSizeUpdate) { - mImageLoadStatus = NS_IMAGE_LOAD_STATUS_SIZE_REQUESTED; - } - - // Translate url to a C string - mURL = aURL; - char* cp = aURL.ToNewCString(); - - PR_LOG(gFrameImageLoaderLMI, PR_LOG_DEBUG, - ("nsFrameImageLoader::Init start loading for '%s', frame=%p loadStatus=%x", - cp ? cp : "(null)", mTargetFrame, mImageLoadStatus)); - - // Start image load request - mImageRequest = aGroup->GetImage(cp, this, NS_RGB(255,255,255), 0, 0, 0); - delete cp; - - return NS_OK; -} - -nsresult -nsFrameImageLoader::StopImageLoad() -{ - PR_LOG(gFrameImageLoaderLMI, PR_LOG_DEBUG, - ("nsFrameImageLoader::StopImageLoad frame=%p loadStatus=%x", - mTargetFrame, mImageLoadStatus)); - - if (nsnull != mImageRequest) { - mImageRequest->RemoveObserver(this); - NS_RELEASE(mImageRequest); - } - return NS_OK; -} - -nsresult -nsFrameImageLoader::AbortImageLoad() -{ - PR_LOG(gFrameImageLoaderLMI, PR_LOG_DEBUG, - ("nsFrameImageLoader::AbortImageLoad frame=%p loadStatus=%x", - mTargetFrame, mImageLoadStatus)); - - if (nsnull != mImageRequest) { - mImageRequest->Interrupt(); - } - return NS_OK; -} - -void -nsFrameImageLoader::Notify(nsIImageRequest *aImageRequest, - nsIImage *aImage, - nsImageNotification aNotificationType, - PRInt32 aParam1, PRInt32 aParam2, - void *aParam3) -{ - PR_LOG(gFrameImageLoaderLMI, PR_LOG_DEBUG, - ("nsFrameImageLoader::Notify frame=%p type=%x p1=%x p2=%x p3=%x", - mTargetFrame, aNotificationType, aParam1, aParam2, aParam3)); - - switch (aNotificationType) { - case nsImageNotification_kDimensions: - mSize.width = aParam1; - mSize.height = aParam2; - mImageLoadStatus |= NS_IMAGE_LOAD_STATUS_SIZE_AVAILABLE; - if (0 != (mImageLoadStatus & NS_IMAGE_LOAD_STATUS_SIZE_REQUESTED)) { - ReflowFrame(); - } - break; - - case nsImageNotification_kPixmapUpdate: - case nsImageNotification_kImageComplete: - case nsImageNotification_kFrameComplete: - if ((mImage == nsnull) && (nsnull != aImage)) { - mImage = aImage; - NS_ADDREF(aImage); - } - mImageLoadStatus |= NS_IMAGE_LOAD_STATUS_IMAGE_READY; - DamageRepairFrame(); - break; - } -} - -void -nsFrameImageLoader::NotifyError(nsIImageRequest *aImageRequest, - nsImageError aErrorType) -{ - PR_LOG(gFrameImageLoaderLMI, PR_LOG_DEBUG, - ("nsFrameImageLoader::NotifyError frame=%p error=%x", - mTargetFrame, aErrorType)); - - mError = aErrorType; - mImageLoadStatus |= NS_IMAGE_LOAD_STATUS_ERROR; - if (0 != (mImageLoadStatus & NS_IMAGE_LOAD_STATUS_SIZE_REQUESTED)) { - ReflowFrame(); - } - else { - DamageRepairFrame(); - } -} - -static PRBool gXXXInstalledColorMap; - -void -nsFrameImageLoader::DamageRepairFrame() -{ - PR_LOG(gFrameImageLoaderLMI, PR_LOG_DEBUG, - ("nsFrameImageLoader::DamageRepairFrame frame=%p status=%x", - mTargetFrame, mImageLoadStatus)); - - // XXX this should be done somewhere else, like when the window - // is created or something??? - // XXX maybe there should be a seperate notification service for - // colormap events? - nsIWidget* window; - mTargetFrame->GetWindow(window); - if (!gXXXInstalledColorMap && mImage) { - nsColorMap* cmap = mImage->GetColorMap(); - if ((nsnull != cmap) && (cmap->NumColors > 0)) { - window->SetColorMap(cmap); - } - gXXXInstalledColorMap = PR_TRUE; - } - NS_RELEASE(window); - - // Determine damaged area and tell view manager to redraw it - nsPoint offset; - nsRect bounds; - nsIView* view; - mTargetFrame->GetRect(bounds); - mTargetFrame->GetOffsetFromView(offset, view); - nsIViewManager* vm = view->GetViewManager(); - bounds.x = offset.x; - bounds.y = offset.y; - vm->UpdateView(view, bounds, 0); - NS_RELEASE(vm); - NS_RELEASE(view); -} - -void -nsFrameImageLoader::ReflowFrame() -{ - PR_LOG(gFrameImageLoaderLMI, PR_LOG_DEBUG, - ("nsFrameImageLoader::ReflowFrame frame=%p status=%x", - mTargetFrame, mImageLoadStatus)); - - nsIContent* content = nsnull; - mTargetFrame->GetContent(content); - if (nsnull != content) { - nsIDocument* document = nsnull; - content->GetDocument(document); - if (nsnull != document) { - document->ContentChanged(content, nsnull); - NS_RELEASE(document); - } - NS_RELEASE(content); - } -} - -NS_METHOD -nsFrameImageLoader::GetTargetFrame(nsIFrame*& aFrameResult) const -{ - aFrameResult = mTargetFrame; - return NS_OK; -} - -NS_METHOD -nsFrameImageLoader::GetURL(nsString& aResult) const -{ - aResult = mURL; - return NS_OK; -} - -NS_METHOD -nsFrameImageLoader::GetImage(nsIImage*& aResult) const -{ - aResult = mImage; - return NS_OK; -} - -NS_METHOD -nsFrameImageLoader::GetSize(nsSize& aResult) const -{ - aResult = mSize; - return NS_OK; -} - -NS_METHOD -nsFrameImageLoader::GetImageLoadStatus(PRIntn& aLoadStatus) const -{ - aLoadStatus = mImageLoadStatus; - return NS_OK; -} - -NS_IMETHODIMP -nsFrameImageLoader::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - // XXX mImage - // XXX mImageRequest - return NS_OK; -} diff --git a/mozilla/layout/base/src/nsFrameImageLoader.h b/mozilla/layout/base/src/nsFrameImageLoader.h deleted file mode 100644 index 088767a595d..00000000000 --- a/mozilla/layout/base/src/nsFrameImageLoader.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsFrameImageLoader_h___ -#define nsFrameImageLoader_h___ - -#include "nsIFrameImageLoader.h" -#include "nsSize.h" -#include "nsString.h" - -/** - * An image loader for frame's. - */ -class nsFrameImageLoader : public nsIFrameImageLoader { -public: - - // nsISupports - NS_DECL_ISUPPORTS - - // nsIImageRequestObserver - virtual void Notify(nsIImageRequest *aImageRequest, - nsIImage *aImage, - nsImageNotification aNotificationType, - PRInt32 aParam1, PRInt32 aParam2, - void *aParam3); - virtual void NotifyError(nsIImageRequest *aImageRequest, - nsImageError aErrorType); - - // nsIFrameImageLoader - NS_IMETHOD Init(nsIPresContext* aPresContext, - nsIImageGroup* aGroup, - const nsString& aURL, - nsIFrame* aTargetFrame, - PRBool aNeedSizeUpdate); - NS_IMETHOD StopImageLoad(); - NS_IMETHOD AbortImageLoad(); - NS_IMETHOD GetTargetFrame(nsIFrame*& aFrameResult) const; - NS_IMETHOD GetURL(nsString& aResult) const; - NS_IMETHOD GetImage(nsIImage*& aResult) const; - NS_IMETHOD GetSize(nsSize& aResult) const; - NS_IMETHOD GetImageLoadStatus(PRIntn& aLoadStatus) const; - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - -protected: - nsFrameImageLoader(); - ~nsFrameImageLoader(); - - void ReflowFrame(); - - void DamageRepairFrame(); - - nsString mURL; - nsIImage* mImage; - nsSize mSize; - nsImageError mError; - nsIFrame* mTargetFrame; - nsIPresContext* mPresContext; - nsIImageRequest* mImageRequest; - PRUint8 mImageLoadStatus; - - friend NS_LAYOUT nsresult NS_NewFrameImageLoader(nsIFrameImageLoader**); -}; - -extern NS_LAYOUT nsresult - NS_NewFrameImageLoader(nsIFrameImageLoader** aInstancePtrResult); - -#endif /* nsFrameImageLoader_h___ */ diff --git a/mozilla/layout/base/src/nsGalleyContext.cpp b/mozilla/layout/base/src/nsGalleyContext.cpp deleted file mode 100644 index 64c439dd275..00000000000 --- a/mozilla/layout/base/src/nsGalleyContext.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsPresContext.h" -#include "nsGfxCIID.h" - -static NS_DEFINE_IID(kIPresContextIID, NS_IPRESCONTEXT_IID); - -class GalleyContext : public nsPresContext { -public: - GalleyContext(); - ~GalleyContext(); - - virtual PRBool IsPaginated(); - virtual nscoord GetPageWidth(); - virtual nscoord GetPageHeight(); -}; - -GalleyContext::GalleyContext() -{ -} - -GalleyContext::~GalleyContext() -{ - mDeviceContext->FlushFontCache(); -} - -PRBool GalleyContext::IsPaginated() -{ - return PR_FALSE; -} - -nscoord GalleyContext::GetPageWidth() -{ - return 0; -} - -nscoord GalleyContext::GetPageHeight() -{ - return 0; -} - -NS_LAYOUT nsresult -NS_NewGalleyContext(nsIPresContext** aInstancePtrResult) -{ - if (aInstancePtrResult == nsnull) { - return NS_ERROR_NULL_POINTER; - } - - GalleyContext *it = new GalleyContext(); - - if (it == nsnull) { - return NS_ERROR_OUT_OF_MEMORY; - } - - return it->QueryInterface(kIPresContextIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/base/src/nsPresContext.cpp b/mozilla/layout/base/src/nsPresContext.cpp deleted file mode 100644 index 15b4add6b32..00000000000 --- a/mozilla/layout/base/src/nsPresContext.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsPresContext.h" -#include "nsIPresShell.h" -#include "nsILinkHandler.h" -#include "nsIStyleSet.h" -#include "nsFrameImageLoader.h" -#include "nsIImageGroup.h" -#include "nsIFrame.h" -#include "nsIRenderingContext.h" -#include "nsEventStateManager.h" - -#define NOISY_IMAGES - -static NS_DEFINE_IID(kIPresContextIID, NS_IPRESCONTEXT_IID); - -nsPresContext::nsPresContext() - : mVisibleArea(0, 0, 0, 0), - mDefaultFont("Times", NS_FONT_STYLE_NORMAL, - NS_FONT_VARIANT_NORMAL, - NS_FONT_WEIGHT_NORMAL, - 0, - NS_POINTS_TO_TWIPS_INT(12)) -{ - NS_INIT_REFCNT(); - mShell = nsnull; - mDeviceContext = nsnull; - mImageGroup = nsnull; - mLinkHandler = nsnull; - mContainer = nsnull; - mEventManager = nsnull; - -#ifdef DEBUG - mInitialized = PR_FALSE; -#endif -} - -nsPresContext::~nsPresContext() -{ - mShell = nsnull; - - // XXX there is a race between an async notify and this code because - // the presentation shell code deletes the frame tree first and then - // deletes us. We need an "Deactivation" hook for this code too - - // Release all the image loaders - PRInt32 n = mImageLoaders.Count(); - for (PRInt32 i = 0; i < n; i++) { - nsIFrameImageLoader* loader; - loader = (nsIFrameImageLoader*) mImageLoaders.ElementAt(i); - NS_RELEASE(loader); - } - - // XXX Tell the image library we are done with the cached images? - - if (nsnull != mImageGroup) { - /*XXX mImageGroup->Interrupt(); required? */ - NS_RELEASE(mImageGroup); - } - - NS_IF_RELEASE(mLinkHandler); - NS_IF_RELEASE(mContainer); - NS_IF_RELEASE(mEventManager); - NS_IF_RELEASE(mDeviceContext); -} - -nsrefcnt -nsPresContext::AddRef(void) -{ - return ++mRefCnt; -} - -nsrefcnt -nsPresContext::Release(void) -{ - NS_PRECONDITION(0 != mRefCnt, "bad refcnt"); - if (--mRefCnt == 0) { - delete this; - return 0; - } - return mRefCnt; -} - -NS_IMPL_QUERY_INTERFACE(nsPresContext, kIPresContextIID); - -nsresult -nsPresContext::Init(nsIDeviceContext* aDeviceContext) -{ - NS_ASSERTION(!(mInitialized == PR_TRUE), "attempt to reinit pres context"); - - mDeviceContext = aDeviceContext; - NS_IF_ADDREF(mDeviceContext); - -#ifdef DEBUG - mInitialized = PR_TRUE; -#endif - - return NS_OK; -} - -// Note: We don't hold a reference on the shell; it has a reference to -// us -void -nsPresContext::SetShell(nsIPresShell* aShell) -{ - mShell = aShell; -} - -nsIPresShell* -nsPresContext::GetShell() -{ - NS_IF_ADDREF(mShell); - return mShell; -} - -nsIStyleContext* -nsPresContext::ResolveStyleContextFor(nsIContent* aContent, - nsIFrame* aParentFrame, - PRBool aForceUnique) -{ - nsIStyleContext* result = nsnull; - - nsIStyleSet* set = mShell->GetStyleSet(); - if (nsnull != set) { - result = set->ResolveStyleFor(this, aContent, aParentFrame, aForceUnique); - NS_RELEASE(set); - } - - return result; -} - -nsIStyleContext* -nsPresContext::ResolvePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique) -{ - nsIStyleContext* result = nsnull; - - nsIStyleSet* set = mShell->GetStyleSet(); - if (nsnull != set) { - result = set->ResolvePseudoStyleFor(this, aPseudoTag, aParentFrame, aForceUnique); - NS_RELEASE(set); - } - - return result; -} - -nsIStyleContext* -nsPresContext::ProbePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique) -{ - nsIStyleContext* result = nsnull; - - nsIStyleSet* set = mShell->GetStyleSet(); - if (nsnull != set) { - result = set->ProbePseudoStyleFor(this, aPseudoTag, aParentFrame, aForceUnique); - NS_RELEASE(set); - } - - return result; -} - -nsIFontMetrics* -nsPresContext::GetMetricsFor(const nsFont& aFont) -{ - if (nsnull != mDeviceContext) - return mDeviceContext->GetMetricsFor(aFont); - return nsnull; -} - -const nsFont& -nsPresContext::GetDefaultFont(void) -{ - return mDefaultFont; -} - -void -nsPresContext::GetVisibleArea(nsRect& aResult) -{ - aResult = mVisibleArea; -} - -void -nsPresContext::SetVisibleArea(const nsRect& r) -{ - mVisibleArea = r; -} - -float -nsPresContext::GetPixelsToTwips() const -{ - if (nsnull != mDeviceContext) { - return mDeviceContext->GetDevUnitsToAppUnits(); - } - return 1.0f; -} - -float -nsPresContext::GetTwipsToPixels() const -{ - if (nsnull != mDeviceContext) { - return mDeviceContext->GetAppUnitsToDevUnits(); - } - return 1.0f; -} - -nsIDeviceContext* -nsPresContext::GetDeviceContext() const -{ - NS_IF_ADDREF(mDeviceContext); - return mDeviceContext; -} - -NS_METHOD -nsPresContext::GetImageGroup(nsIImageGroup*& aGroupResult) -{ - if (nsnull == mImageGroup) { - // Create image group - nsresult rv = NS_NewImageGroup(&mImageGroup); - if (NS_OK != rv) { - return rv; - } - - // Initialize the image group - nsIWidget* window; - nsIFrame* rootFrame; - rootFrame = mShell->GetRootFrame(); - rootFrame->GetWindow(window); - nsIRenderingContext* drawCtx = window->GetRenderingContext(); - drawCtx->Scale(mDeviceContext->GetAppUnitsToDevUnits(), - mDeviceContext->GetAppUnitsToDevUnits()); - rv = mImageGroup->Init(drawCtx); - NS_RELEASE(drawCtx); - NS_RELEASE(window); - if (NS_OK != rv) { - return rv; - } - } - aGroupResult = mImageGroup; - NS_IF_ADDREF(mImageGroup); - return NS_OK; -} - -NS_METHOD -nsPresContext::LoadImage(const nsString& aURL, - nsIFrame* aTargetFrame, - PRBool aNeedSizeUpdate, - nsIFrameImageLoader*& aLoaderResult) -{ - aLoaderResult = nsnull; - - // Lookup image request in our loaders array. Note that we need - // to get a loader that is observing the same image and that has - // the same value for aNeedSizeUpdate. - PRInt32 i, n = mImageLoaders.Count(); - nsIFrameImageLoader* loader; - nsAutoString loaderURL; - for (i = 0; i < n; i++) { - loader = (nsIFrameImageLoader*) mImageLoaders.ElementAt(i); - nsIFrame* targetFrame; - loader->GetTargetFrame(targetFrame); - if (targetFrame == aTargetFrame) { - loader->GetURL(loaderURL); - // XXX case doesn't matter for all of the url so using Equals - // isn't quite right - if (aURL.Equals(loaderURL)) { - // Make sure the size update flags are the same, if not keep looking - PRIntn status; - loader->GetImageLoadStatus(status); - PRBool wantSize = 0 != (status & NS_IMAGE_LOAD_STATUS_SIZE_REQUESTED); - if (aNeedSizeUpdate == wantSize) { - NS_ADDREF(loader); - aLoaderResult = loader; - return NS_OK; - } - } - } - } - - // Create image group if needed - nsresult rv; - if (nsnull == mImageGroup) { - nsIImageGroup* group; - rv = GetImageGroup(group); - if (NS_OK != rv) { - return rv; - } - NS_RELEASE(group); - } - - // We haven't seen that image before. Create a new loader and - // start it going. - rv = NS_NewFrameImageLoader(&loader); - if (NS_OK != rv) { - return rv; - } - mImageLoaders.AppendElement(loader); - - // Return new loader - NS_ADDREF(loader); - - rv = loader->Init(this, mImageGroup, aURL, aTargetFrame, aNeedSizeUpdate); - if (NS_OK != rv) { - return rv; - } - aLoaderResult = loader; - return NS_OK; -} - -NS_METHOD -nsPresContext::StopLoadImage(nsIFrame* aForFrame) -{ - nsIFrameImageLoader* loader; - PRInt32 i, n = mImageLoaders.Count(); - for (i = 0; i < n;) { - loader = (nsIFrameImageLoader*) mImageLoaders.ElementAt(i); - nsIFrame* loaderFrame; - loader->GetTargetFrame(loaderFrame); - if (loaderFrame == aForFrame) { - loader->StopImageLoad(); - NS_RELEASE(loader); - mImageLoaders.RemoveElementAt(i); - n--; - continue; - } - i++; - } - return NS_OK; -} - -NS_IMETHODIMP -nsPresContext::SetLinkHandler(nsILinkHandler* aHandler) -{ // XXX should probably be a WEAK reference - NS_IF_RELEASE(mLinkHandler); - mLinkHandler = aHandler; - NS_IF_ADDREF(aHandler); - return NS_OK; -} - -NS_IMETHODIMP -nsPresContext::GetLinkHandler(nsILinkHandler** aResult) -{ - NS_PRECONDITION(nsnull != aResult, "null ptr"); - if (nsnull == aResult) { - return NS_ERROR_NULL_POINTER; - } - *aResult = mLinkHandler; - NS_IF_ADDREF(mLinkHandler); - return NS_OK; -} - -NS_IMETHODIMP -nsPresContext::SetContainer(nsISupports* aHandler) -{ // XXX should most likely be a WEAK reference - NS_IF_RELEASE(mContainer); - mContainer = aHandler; - NS_IF_ADDREF(aHandler); - return NS_OK; -} - -NS_IMETHODIMP -nsPresContext::GetContainer(nsISupports** aResult) -{ - NS_PRECONDITION(nsnull != aResult, "null ptr"); - if (nsnull == aResult) { - return NS_ERROR_NULL_POINTER; - } - *aResult = mContainer; - NS_IF_ADDREF(mContainer); - return NS_OK; -} - -NS_METHOD -nsPresContext::GetEventStateManager(nsIEventStateManager** aManager) -{ - NS_PRECONDITION(nsnull != aManager, "null ptr"); - if (nsnull == aManager) { - return NS_ERROR_NULL_POINTER; - } - - if (nsnull == mEventManager) { - nsresult rv = NS_NewEventStateManager(&mEventManager); - if (NS_OK != rv) { - return rv; - } - } - - *aManager = mEventManager; - NS_IF_ADDREF(mEventManager); - return NS_OK; -} - diff --git a/mozilla/layout/base/src/nsPresContext.h b/mozilla/layout/base/src/nsPresContext.h deleted file mode 100644 index bfd30c27c03..00000000000 --- a/mozilla/layout/base/src/nsPresContext.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsPresContext_h___ -#define nsPresContext_h___ - -#include "nsIPresContext.h" -#include "nsIDeviceContext.h" -#include "nsVoidArray.h" -#include "nsFont.h" -class nsIImageGroup; - -// Base class for concrete presentation context classes -class nsPresContext : public nsIPresContext { -public: - // nsISupports methods - NS_DECL_ISUPPORTS - - // nsIPresContext methods - virtual nsresult Init(nsIDeviceContext* aDeviceContext); - virtual void SetShell(nsIPresShell* aShell); - virtual nsIPresShell* GetShell(); - virtual nsIStyleContext* ResolveStyleContextFor(nsIContent* aContent, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE); - virtual nsIStyleContext* ResolvePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE); - virtual nsIStyleContext* ProbePseudoStyleContextFor(nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE); - virtual nsIFontMetrics* GetMetricsFor(const nsFont& aFont); - virtual const nsFont& GetDefaultFont(void); - NS_IMETHOD GetImageGroup(nsIImageGroup*& aGroupResult); - NS_IMETHOD LoadImage(const nsString& aURL, - nsIFrame* aTargetFrame, - PRBool aNeedSizeUpdate, - nsIFrameImageLoader*& aLoader); - NS_IMETHOD StopLoadImage(nsIFrame* aForFrame); - NS_IMETHOD SetContainer(nsISupports* aContainer); - NS_IMETHOD GetContainer(nsISupports** aResult); - NS_IMETHOD SetLinkHandler(nsILinkHandler* aHander); - NS_IMETHOD GetLinkHandler(nsILinkHandler** aResult); - virtual void GetVisibleArea(nsRect& aResult); - virtual void SetVisibleArea(const nsRect& r); - virtual float GetPixelsToTwips() const; - virtual float GetTwipsToPixels() const; - virtual nsIDeviceContext* GetDeviceContext() const; - NS_IMETHOD GetEventStateManager(nsIEventStateManager** aManager); - -protected: - nsPresContext(); - virtual ~nsPresContext(); - - nsIPresShell* mShell; - nsRect mVisibleArea; - nsIDeviceContext* mDeviceContext; - nsIImageGroup* mImageGroup; - nsILinkHandler* mLinkHandler; - nsISupports* mContainer; - nsFont mDefaultFont; - nsVoidArray mImageLoaders; - nsIEventStateManager* mEventManager; - -#ifdef DEBUG - PRBool mInitialized; -#endif -}; - -#endif /* nsPresContext_h___ */ diff --git a/mozilla/layout/base/src/nsPresShell.cpp b/mozilla/layout/base/src/nsPresShell.cpp deleted file mode 100644 index 0ea0860b7c0..00000000000 --- a/mozilla/layout/base/src/nsPresShell.cpp +++ /dev/null @@ -1,751 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIPresShell.h" -#include "nsIPresContext.h" -#include "nsIContent.h" -#include "nsIContentDelegate.h" -#include "nsIDocument.h" -#include "nsIDocumentObserver.h" -#include "nsIStyleSet.h" -#include "nsIStyleContext.h" -#include "nsFrame.h" -#include "nsIReflowCommand.h" -#include "nsIViewManager.h" -#include "nsCRT.h" -#include "plhash.h" -#include "prlog.h" -#include "nsVoidArray.h" - -#undef NOISY - -#if 0 -static PLHashNumber -HashKey(nsIFrame* key) -{ - return (PLHashNumber) key; -} - -static PRIntn -CompareKeys(nsIFrame* key1, nsIFrame* key2) -{ - return key1 == key2; -} - -class FrameHashTable { -public: - FrameHashTable(); - ~FrameHashTable(); - - void* Get(nsIFrame* aKey); - void* Put(nsIFrame* aKey, void* aValue); - void* Remove(nsIFrame* aKey); - -protected: - PLHashTable* mTable; -}; - -FrameHashTable::FrameHashTable() -{ - mTable = PL_NewHashTable(8, (PLHashFunction) HashKey, - (PLHashComparator) CompareKeys, - (PLHashComparator) nsnull, - nsnull, nsnull); -} - -FrameHashTable::~FrameHashTable() -{ - // XXX if debugging then we should assert that the table is empty - PL_HashTableDestroy(mTable); -} - -/** - * Get the data associated with a frame. - */ -void* -FrameHashTable::Get(nsIFrame* aKey) -{ - PRInt32 hashCode = (PRInt32) aKey; - PLHashEntry** hep = PL_HashTableRawLookup(mTable, hashCode, aKey); - PLHashEntry* he = *hep; - if (nsnull != he) { - return he->value; - } - return nsnull; -} - -/** - * Create an association between a frame and some data. This call - * returns an old association if there was one (or nsnull if there - * wasn't). - */ -void* -FrameHashTable::Put(nsIFrame* aKey, void* aData) -{ - PRInt32 hashCode = (PRInt32) aKey; - PLHashEntry** hep = PL_HashTableRawLookup(mTable, hashCode, aKey); - PLHashEntry* he = *hep; - if (nsnull != he) { - void* oldValue = he->value; - he->value = aData; - return oldValue; - } - PL_HashTableRawAdd(mTable, hep, hashCode, aKey, aData); - return nsnull; -} - -/** - * Remove an association between a frame and it's data. This returns - * the old associated data. - */ -void* -FrameHashTable::Remove(nsIFrame* aKey) -{ - PRInt32 hashCode = (PRInt32) aKey; - PLHashEntry** hep = PL_HashTableRawLookup(mTable, hashCode, aKey); - PLHashEntry* he = *hep; - void* oldValue = nsnull; - if (nsnull != he) { - oldValue = he->value; - PL_HashTableRawRemove(mTable, hep, he); - } - return oldValue; -} -#endif - -//---------------------------------------------------------------------- - -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_IID(kIPresShellIID, NS_IPRESSHELL_IID); -static NS_DEFINE_IID(kIDocumentObserverIID, NS_IDOCUMENT_OBSERVER_IID); - -class PresShell : public nsIPresShell, private nsIDocumentObserver { -public: - PresShell(); - - void* operator new(size_t sz) { - void* rv = new char[sz]; - nsCRT::zero(rv, sz); - return rv; - } - - // nsISupports - NS_DECL_ISUPPORTS - - // nsIDocumentObserver - NS_IMETHOD SetTitle(const nsString& aTitle); - NS_IMETHOD BeginUpdate(); - NS_IMETHOD EndUpdate(); - NS_IMETHOD BeginLoad(); - NS_IMETHOD EndLoad(); - NS_IMETHOD BeginReflow(nsIPresShell* aShell); - NS_IMETHOD EndReflow(nsIPresShell* aShell); - NS_IMETHOD ContentChanged(nsIContent* aContent, - nsISupports* aSubContent); - NS_IMETHOD ContentAppended(nsIContent* aContainer); - NS_IMETHOD ContentInserted(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer); - NS_IMETHOD ContentReplaced(nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInContainer); - NS_IMETHOD ContentWillBeRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer); - NS_IMETHOD ContentHasBeenRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer); - NS_IMETHOD StyleSheetAdded(nsIStyleSheet* aStyleSheet); - - // nsIPresShell - NS_IMETHOD Init(nsIDocument* aDocument, - nsIPresContext* aPresContext, - nsIViewManager* aViewManager, - nsIStyleSet* aStyleSet); - virtual nsIDocument* GetDocument(); - virtual nsIPresContext* GetPresContext(); - virtual nsIViewManager* GetViewManager(); - virtual nsIStyleSet* GetStyleSet(); - NS_IMETHOD EnterReflowLock(); - NS_IMETHOD ExitReflowLock(); - virtual void BeginObservingDocument(); - virtual void EndObservingDocument(); - virtual void ResizeReflow(nscoord aWidth, nscoord aHeight); - virtual nsIFrame* GetRootFrame(); - virtual nsIFrame* FindFrameWithContent(nsIContent* aContent); - virtual void AppendReflowCommand(nsIReflowCommand* aReflowCommand); - virtual void ProcessReflowCommands(); - -protected: - ~PresShell(); - - void InitFrameVerifyTreeLogModuleInfo(); - - nsIDocument* mDocument; - nsIPresContext* mPresContext; - nsIStyleSet* mStyleSet; - nsIFrame* mRootFrame; - nsIViewManager* mViewManager; - PRUint32 mUpdateCount; - nsVoidArray mReflowCommands; - PRUint32 mReflowLockCount; -}; - -//---------------------------------------------------------------------- - -PresShell::PresShell() -{ -} - -nsrefcnt -PresShell::AddRef(void) -{ - return ++mRefCnt; -} - -nsrefcnt -PresShell::Release(void) -{ - NS_PRECONDITION(0 != mRefCnt, "bad refcnt"); - if (--mRefCnt == 0) { - delete this; - return 0; - } - return mRefCnt; -} - -nsresult -PresShell::QueryInterface(const nsIID& aIID, void** aInstancePtr) -{ - if (aIID.Equals(kIPresShellIID)) { - *aInstancePtr = (void*) ((nsIPresShell*) this); - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIDocumentObserverIID)) { - *aInstancePtr = (void*) ((nsIDocumentObserver*) this); - AddRef(); - return NS_OK; - } - if (aIID.Equals(kISupportsIID)) { - *aInstancePtr = (void*) ((nsISupports*) ((nsIPresShell*)this)); - AddRef(); - return NS_OK; - } - return NS_NOINTERFACE; -} - -PresShell::~PresShell() -{ - if (nsnull != mDocument) { - mDocument->DeleteShell(this); - NS_RELEASE(mDocument); - } - if (nsnull != mRootFrame) { - mRootFrame->DeleteFrame(); - } - NS_IF_RELEASE(mPresContext); - NS_IF_RELEASE(mViewManager); - NS_IF_RELEASE(mStyleSet); -} - -/** - * Initialize the presentation shell. Create view manager and style - * manager. - */ -nsresult -PresShell::Init(nsIDocument* aDocument, - nsIPresContext* aPresContext, - nsIViewManager* aViewManager, - nsIStyleSet* aStyleSet) -{ - NS_PRECONDITION(nsnull != aDocument, "null ptr"); - NS_PRECONDITION(nsnull != aPresContext, "null ptr"); - NS_PRECONDITION(nsnull != aViewManager, "null ptr"); - if ((nsnull == aDocument) || (nsnull == aPresContext) || - (nsnull == aViewManager)) { - return NS_ERROR_NULL_POINTER; - } - if (nsnull != mDocument) { - return NS_ERROR_ALREADY_INITIALIZED; - } - - mDocument = aDocument; - NS_ADDREF(aDocument); - mViewManager = aViewManager; - NS_ADDREF(mViewManager); - - // Bind the context to the presentation shell. - mPresContext = aPresContext; - NS_ADDREF(aPresContext); - aPresContext->SetShell(this); - - mStyleSet = aStyleSet; - NS_ADDREF(aStyleSet); - - return NS_OK; -} - -NS_METHOD -PresShell::EnterReflowLock() -{ - ++mReflowLockCount; - return NS_OK; -} - -NS_METHOD -PresShell::ExitReflowLock() -{ - PRUint32 newReflowLockCount = mReflowLockCount - 1; - if (newReflowLockCount == 0) { - ProcessReflowCommands(); - } - mReflowLockCount = newReflowLockCount; - return NS_OK; -} - -nsIDocument* -PresShell::GetDocument() -{ - NS_IF_ADDREF(mDocument); - return mDocument; -} - -nsIPresContext* -PresShell::GetPresContext() -{ - NS_IF_ADDREF(mPresContext); - return mPresContext; -} - -nsIViewManager* -PresShell::GetViewManager() -{ - NS_IF_ADDREF(mViewManager); - return mViewManager; -} - -nsIStyleSet* -PresShell::GetStyleSet() -{ - NS_IF_ADDREF(mStyleSet); - return mStyleSet; -} - -// Make shell be a document observer -void -PresShell::BeginObservingDocument() -{ - if (nsnull != mDocument) { - mDocument->AddObserver(this); - } -} - -// Make shell stop being a document observer -void -PresShell::EndObservingDocument() -{ - if (nsnull != mDocument) { - mDocument->RemoveObserver(this); - } -} - -void -PresShell::ResizeReflow(nscoord aWidth, nscoord aHeight) -{ - EnterReflowLock(); - - if (nsnull != mPresContext) { - nsRect r(0, 0, aWidth, aHeight); - mPresContext->SetVisibleArea(r); - } - - nsReflowReason reflowReason = eReflowReason_Resize; - - if (nsnull == mRootFrame) { - if (nsnull != mDocument) { - nsIContent* root = mDocument->GetRootContent(); - if (nsnull != root) { - nsIContentDelegate* cd = root->GetDelegate(mPresContext); - if (nsnull != cd) { - nsIStyleContext* rootSC = - mPresContext->ResolveStyleContextFor(root, nsnull); - nsresult rv = cd->CreateFrame(mPresContext, root, nsnull, - rootSC, mRootFrame); - NS_RELEASE(rootSC); - NS_RELEASE(cd); - reflowReason = eReflowReason_Initial; - - // Bind root frame to root view (and root window) - nsIView* rootView = mViewManager->GetRootView(); - mRootFrame->SetView(rootView); - NS_RELEASE(rootView); - } - NS_RELEASE(root); - } - } - } - - if (nsnull != mRootFrame) { - // Kick off a top-down reflow - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("enter nsPresShell::ResizeReflow: %d,%d", aWidth, aHeight)); -#ifdef NS_DEBUG - if (nsIFrame::GetVerifyTreeEnable()) { - mRootFrame->VerifyTree(); - } -#endif - nsRect bounds; - mPresContext->GetVisibleArea(bounds); - nsSize maxSize(bounds.width, bounds.height); - nsReflowMetrics desiredSize(nsnull); - nsReflowStatus status; - nsReflowState reflowState(mRootFrame, reflowReason, maxSize); - - mRootFrame->Reflow(mPresContext, desiredSize, reflowState, status); - mRootFrame->SizeTo(desiredSize.width, desiredSize.height); -#ifdef NS_DEBUG - if (nsIFrame::GetVerifyTreeEnable()) { - mRootFrame->VerifyTree(); - } -#endif - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, ("exit nsPresShell::ResizeReflow")); - - // XXX if debugging then we should assert that the cache is empty - } else { -#ifdef NOISY - printf("PresShell::ResizeReflow: null root frame\n"); -#endif - } - - ExitReflowLock(); -} - -nsIFrame* -PresShell::GetRootFrame() -{ - return mRootFrame; -} - -NS_METHOD -PresShell::SetTitle(const nsString& aTitle) -{ - if (nsnull != mPresContext) { - nsISupports* container; - if (NS_OK == mPresContext->GetContainer(&container)) { - if (nsnull != container) { - nsIDocumentObserver* docob; - if (NS_OK == container->QueryInterface(kIDocumentObserverIID, - (void**) &docob)) { - docob->SetTitle(aTitle); - NS_RELEASE(docob); - } - NS_RELEASE(container); - } - } - } - return NS_OK; -} - -NS_IMETHODIMP -PresShell::BeginUpdate() -{ - mUpdateCount++; - return NS_OK; -} - -NS_IMETHODIMP -PresShell::EndUpdate() -{ - NS_PRECONDITION(0 != mUpdateCount, "too many EndUpdate's"); - if (--mUpdateCount == 0) { - // XXX do something here - } - return NS_OK; -} - -NS_IMETHODIMP -PresShell::BeginLoad() -{ - return NS_OK; -} - -NS_IMETHODIMP -PresShell::EndLoad() -{ - return NS_OK; -} - -NS_IMETHODIMP -PresShell::BeginReflow(nsIPresShell* aShell) -{ - return NS_OK; -} - -NS_IMETHODIMP -PresShell::EndReflow(nsIPresShell* aShell) -{ - return NS_OK; -} - -void -PresShell::AppendReflowCommand(nsIReflowCommand* aReflowCommand) -{ - mReflowCommands.AppendElement(aReflowCommand); - NS_ADDREF(aReflowCommand); -} - -void -PresShell::ProcessReflowCommands() -{ - if (0 != mReflowCommands.Count()) { - nsReflowMetrics desiredSize(nsnull); - - while (0 != mReflowCommands.Count()) { - nsIReflowCommand* rc = (nsIReflowCommand*) mReflowCommands.ElementAt(0); - mReflowCommands.RemoveElementAt(0); - - // Dispatch the reflow command - nsSize maxSize; - mRootFrame->GetSize(maxSize); -#ifdef NS_DEBUG - nsIReflowCommand::ReflowType type; - rc->GetType(type); - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("PresShell::ProcessReflowCommands: begin reflow command type=%d", - type)); -#endif - rc->Dispatch(*mPresContext, desiredSize, maxSize); - NS_RELEASE(rc); - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("PresShell::ProcessReflowCommands: end reflow command")); - } - - // Place and size the root frame - mRootFrame->SizeTo(desiredSize.width, desiredSize.height); -#ifdef NS_DEBUG - if (nsIFrame::GetVerifyTreeEnable()) { - mRootFrame->VerifyTree(); - } -#endif - } -} - -#ifdef NS_DEBUG -static char* -ContentTag(nsIContent* aContent, PRIntn aSlot) -{ - static char buf0[100], buf1[100], buf2[100]; - static char* bufs[] = { buf0, buf1, buf2 }; - char* buf = bufs[aSlot]; - nsIAtom* atom = aContent->GetTag(); - if (nsnull != atom) { - nsAutoString tmp; - atom->ToString(tmp); - tmp.ToCString(buf, 100); - } - else { - buf[0] = 0; - } - return buf; -} -#endif - -NS_IMETHODIMP -PresShell::ContentChanged(nsIContent* aContent, - nsISupports* aSubContent) -{ - NS_PRECONDITION(nsnull != mRootFrame, "null root frame"); - - EnterReflowLock(); - - // Notify the first frame that maps the content. It will generate a reflow - // command - nsIFrame* frame = FindFrameWithContent(aContent); - - // It's possible the frame whose content changed isn't inserted into the - // frame hierarchy yet. This sometimes happens with images inside tables - if (nsnull != frame) { - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("PresShell::ContentChanged: content=%p[%s] subcontent=%p frame=%p", - aContent, ContentTag(aContent, 0), - aSubContent, frame)); - frame->ContentChanged(this, mPresContext, aContent, aSubContent); - } - - ExitReflowLock(); - return NS_OK; -} - -NS_IMETHODIMP -PresShell::ContentAppended(nsIContent* aContainer) -{ - NS_PRECONDITION(nsnull != mRootFrame, "null root frame"); - - EnterReflowLock(); - - nsIContent* parentContainer = aContainer; - while (nsnull != parentContainer) { - nsIFrame* frame = FindFrameWithContent(parentContainer); - if (nsnull != frame) { - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("PresShell::ContentAppended: container=%p[%s] frame=%p", - aContainer, ContentTag(aContainer, 0), frame)); - frame->ContentAppended(this, mPresContext, aContainer); - break; - } - parentContainer = parentContainer->GetParent(); - } - - ExitReflowLock(); - return NS_OK; -} - -NS_IMETHODIMP -PresShell::ContentInserted(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) -{ - NS_PRECONDITION(nsnull != mRootFrame, "null root frame"); - - EnterReflowLock(); - - nsIFrame* frame = FindFrameWithContent(aContainer); - NS_PRECONDITION(nsnull != frame, "null frame"); - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("PresShell::ContentInserted: container=%p[%s] child=%p[%s][%d] frame=%p", - aContainer, ContentTag(aContainer, 0), - aChild, ContentTag(aChild, 1), aIndexInContainer, - frame)); - frame->ContentInserted(this, mPresContext, aContainer, aChild, - aIndexInContainer); - - ExitReflowLock(); - return NS_OK; -} - -NS_IMETHODIMP -PresShell::ContentReplaced(nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInContainer) -{ - NS_PRECONDITION(nsnull != mRootFrame, "null root frame"); - - EnterReflowLock(); - - nsIFrame* frame = FindFrameWithContent(aContainer); - NS_PRECONDITION(nsnull != frame, "null frame"); - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("PresShell::ContentReplaced: container=%p[%s] oldChild=%p[%s][%d] newChild=%p[%s] frame=%p", - aContainer, ContentTag(aContainer, 0), - aOldChild, ContentTag(aOldChild, 1), aIndexInContainer, - aNewChild, ContentTag(aNewChild, 2), frame)); - frame->ContentReplaced(this, mPresContext, aContainer, aOldChild, - aNewChild, aIndexInContainer); - - ExitReflowLock(); - return NS_OK; -} - -// XXX keep this? -NS_IMETHODIMP -PresShell::ContentWillBeRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) -{ - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("PresShell::ContentWillBeRemoved: container=%p[%s] child=%p[%s][%d]", - aContainer, ContentTag(aContainer, 0), - aChild, ContentTag(aChild, 1), aIndexInContainer)); - return NS_OK; -} - -NS_IMETHODIMP -PresShell::ContentHasBeenRemoved(nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInContainer) -{ - NS_PRECONDITION(nsnull != mRootFrame, "null root frame"); - - nsIFrame* frame = FindFrameWithContent(aContainer); - NS_PRECONDITION(nsnull != frame, "null frame"); - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("PresShell::ContentHasBeenRemoved: container=%p child=%p[%d] frame=%p", - aContainer, aChild, aIndexInContainer, frame)); - frame->ContentDeleted(this, mPresContext, aContainer, aChild, - aIndexInContainer); - ProcessReflowCommands(); - return NS_OK; -} - -NS_IMETHODIMP -PresShell::StyleSheetAdded(nsIStyleSheet* aStyleSheet) -{ - return NS_OK; -} - -static nsIFrame* -FindFrameWithContent(nsIFrame* aFrame, nsIContent* aContent) -{ - nsIContent* frameContent; - - aFrame->GetContent(frameContent); - if (frameContent == aContent) { - NS_RELEASE(frameContent); - return aFrame; - } - NS_RELEASE(frameContent); - - aFrame->FirstChild(aFrame); - while (aFrame) { - nsIFrame* result = FindFrameWithContent(aFrame, aContent); - - if (result) { - return result; - } - - aFrame->GetNextSibling(aFrame); - } - - return nsnull; -} - -nsIFrame* -PresShell::FindFrameWithContent(nsIContent* aContent) -{ - // For the time being do a brute force depth-first search of - // the frame tree - return ::FindFrameWithContent(mRootFrame, aContent); -} - -//---------------------------------------------------------------------- - -NS_LAYOUT nsresult -NS_NewPresShell(nsIPresShell** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - PresShell* it = new PresShell(); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIPresShellIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/base/src/nsPrintPreviewContext.cpp b/mozilla/layout/base/src/nsPrintPreviewContext.cpp deleted file mode 100644 index c50e6828314..00000000000 --- a/mozilla/layout/base/src/nsPrintPreviewContext.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsPresContext.h" -#include "nsIDeviceContext.h" -#include "nsUnitConversion.h" -#include "nsIView.h" -#include "nsIWidget.h" -#include "nsGfxCIID.h" - -static NS_DEFINE_IID(kIPresContextIID, NS_IPRESCONTEXT_IID); - -class PrintPreviewContext : public nsPresContext { -public: - PrintPreviewContext(); - ~PrintPreviewContext(); - - virtual PRBool IsPaginated(); - virtual nscoord GetPageWidth(); - virtual nscoord GetPageHeight(); -}; - -PrintPreviewContext::PrintPreviewContext() -{ -} - -PrintPreviewContext::~PrintPreviewContext() -{ -} - -PRBool PrintPreviewContext::IsPaginated() -{ - return PR_TRUE; -} - -nscoord PrintPreviewContext::GetPageWidth() -{ -#if 0 - // XXX assumes a 1/2 margin around all sides - return (nscoord) NS_INCHES_TO_TWIPS(7.5); -#else - // For testing purposes make the page width smaller than the visible - // area - nscoord sbar = NS_TO_INT_ROUND(mDeviceContext->GetScrollBarWidth()); - return mVisibleArea.width - sbar - 2*100; -#endif -} - -nscoord PrintPreviewContext::GetPageHeight() -{ -#if 0 - // XXX assumes a 1/2 margin around all sides - return (nscoord) NS_INCHES_TO_TWIPS(10); -#else - // For testing purposes make the page height 60% of the visible area - return mVisibleArea.height * 60 / 100; -#endif -} - -NS_LAYOUT nsresult -NS_NewPrintPreviewContext(nsIPresContext** aInstancePtrResult) -{ - if (aInstancePtrResult == nsnull) { - return NS_ERROR_NULL_POINTER; - } - - PrintPreviewContext *it = new PrintPreviewContext(); - - if (it == nsnull) { - return NS_ERROR_OUT_OF_MEMORY; - } - - return it->QueryInterface(kIPresContextIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/base/src/nsSelection.cpp b/mozilla/layout/base/src/nsSelection.cpp deleted file mode 100644 index 4f36d8b703e..00000000000 --- a/mozilla/layout/base/src/nsSelection.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsSelection.h" -#include "nsISelection.h" - -NS_LAYOUT nsresult -NS_NewSelection(nsISelection** aInstancePtrResult) -{ - static NS_DEFINE_IID(kISelectionIID, NS_ISELECTION_IID); - nsSelection * sel = new nsSelection(); - return sel->QueryInterface(kISelectionIID, (void**) aInstancePtrResult); -} - -nsresult nsSelection::QueryInterface(const nsIID& aIID, - void** aInstancePtrResult) -{ - static NS_DEFINE_IID(kISelectionIID, NS_ISELECTION_IID); - NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kISelectionIID)) { - *aInstancePtrResult = (void*) ((nsISelection*)this); - AddRef(); - return NS_OK; - } - return !NS_OK; -} - -nsSelection::nsSelection() { - NS_INIT_REFCNT(); - mRange = new nsSelectionRange(); -} - -nsSelection::~nsSelection() { - delete mRange; -} - -NS_IMPL_ADDREF(nsSelection) -NS_IMPL_RELEASE(nsSelection) - -/** - * Returns whether there is a valid selection - */ -PRBool nsSelection::IsValidSelection() { - return (PRBool)(mRange->GetStartContent() == nsnull || - mRange->GetEndContent() == nsnull); - -} - - -/** - * Clears the current selection (invalidates the selection) - */ -void nsSelection::ClearSelection() { - mRange->GetStartPoint()->SetPoint(nsnull, -1, PR_TRUE); - mRange->GetEndPoint()->SetPoint(nsnull, -1, PR_TRUE); -} - - - -/** - * Copies the data from one nsSelectionPoint in the range to another, - * it does NOT just assign the pointers - */ -void nsSelection::SetRange(nsSelectionRange * aSelectionRange) { - mRange->SetRange(aSelectionRange->GetStartPoint(), - aSelectionRange->GetEndPoint()); -} - -/** - * Copies the data from one nsSelectionPoint in the range to another, - * it does NOT just assign the pointers - */ -void nsSelection::GetRange(nsSelectionRange * aSelectionRange) { - mRange->SetRange(aSelectionRange->GetStartPoint(), - aSelectionRange->GetEndPoint()); -} - - -/** - * For debug only, it potentially leaks memory - */ -char * nsSelection::ToString() { - return mRange->ToString();; -} - diff --git a/mozilla/layout/base/src/nsSelection.h b/mozilla/layout/base/src/nsSelection.h deleted file mode 100644 index 036509331e3..00000000000 --- a/mozilla/layout/base/src/nsSelection.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsSelection_h___ -#define nsSelection_h___ - -#include "nsSelectionRange.h" -#include "nsISelection.h" - -class nsSelection : public nsISelection { - - nsSelectionRange * mRange; - - public: - NS_DECL_ISUPPORTS - - nsSelection(); - virtual ~nsSelection(); - - /** - * Returns whether there is a valid selection - */ - PRBool IsValidSelection(); - - /** - * Clears the current selection (invalidates the selection) - */ - void ClearSelection(); - - /** - * Copies the data from the param into the internal Range - */ - void SetRange(nsSelectionRange * aRange); - - /** - * Copies the param's (aRange) contents with the Range's data - */ - void GetRange(nsSelectionRange * aRange); - - /** - * Copies the param's (aRange) contents with the Range's data - */ - nsSelectionRange * GetRange() { return mRange; } - - char * ToString(); -}; - -extern NS_LAYOUT nsresult - NS_NewSelection(nsISelection** aInstancePtrResult); - -#endif /* nsSelection_h___ */ diff --git a/mozilla/layout/base/src/nsSelectionPoint.cpp b/mozilla/layout/base/src/nsSelectionPoint.cpp deleted file mode 100644 index 85a786f75d1..00000000000 --- a/mozilla/layout/base/src/nsSelectionPoint.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsSelectionPoint.h" - -nsSelectionPoint::nsSelectionPoint(nsIContent * aContent, - PRInt32 aOffset, - PRBool aIsAnchor) -{ - fContent = aContent; - fOffset = aOffset; - fIsAnchor = aIsAnchor; - fEntireContent = PR_FALSE; -} - -nsSelectionPoint::~nsSelectionPoint() -{ -} - -void nsSelectionPoint::SetPoint(nsIContent * aContent, - PRInt32 aOffset, - PRBool aIsAnchor) -{ - fContent = aContent; - fOffset = aOffset; - fIsAnchor = aIsAnchor; -}; - - -/** - * For debug only, it potentially leaks memory - */ -char * nsSelectionPoint::ToString() { - char * str = new char[256]; - sprintf(str, "TextPoint[0x%X, offset=%d, isAnchor=%s]", fContent, fOffset, (fIsAnchor?"PR_TRUE":"PR_FALSE")); - return str; -} - diff --git a/mozilla/layout/base/src/nsSelectionPoint.h b/mozilla/layout/base/src/nsSelectionPoint.h deleted file mode 100644 index 8aea0499455..00000000000 --- a/mozilla/layout/base/src/nsSelectionPoint.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsSelectionPoint_h___ -#define nsSelectionPoint_h___ - -#include "nsIContent.h" - -class nsSelectionPoint { - - nsIContent * fContent; - PRInt32 fOffset; - PRBool fIsAnchor; - PRBool fEntireContent; - - public: - - nsSelectionPoint(nsIContent * aContent, - PRInt32 aOffset, - PRBool aIsAnchor); - - virtual ~nsSelectionPoint(); - - nsIContent * GetContent() { return fContent; } - PRInt32 GetOffset() { return fOffset; } - PRBool IsAnchor() { return fIsAnchor;} - - PRBool IsEntireContentSelected() { return fEntireContent; } - void setEntireContentSelected(PRBool aState) { fEntireContent = aState; } - - void SetContent(nsIContent * aValue) { fContent = aValue; } - void SetOffset(PRInt32 aValue) { fOffset = aValue; } - void SetAnchor(PRBool aValue) { fIsAnchor = aValue; } - - void SetPoint(nsIContent * aContent, - PRInt32 aOffset, - PRBool aIsAnchor); - char * ToString(); - -}; -#endif /* nsSelectionPoint_h___ */ diff --git a/mozilla/layout/base/src/nsSelectionRange.cpp b/mozilla/layout/base/src/nsSelectionRange.cpp deleted file mode 100644 index 4133faee384..00000000000 --- a/mozilla/layout/base/src/nsSelectionRange.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsSelectionRange.h" - -nsSelectionRange::nsSelectionRange() { - mStart = new nsSelectionPoint(nsnull, -1, PR_TRUE); - mEnd = new nsSelectionPoint(nsnull, -1, PR_TRUE); -} - -nsSelectionRange::nsSelectionRange(nsIContent * aStartContent, - PRInt32 aStartOffset, - PRBool aStartIsAnchor, - nsIContent * aEndContent, - PRInt32 aEndOffset, - PRBool aEndIsAnchor) { - mStart = new nsSelectionPoint(aStartContent, aStartOffset, aStartIsAnchor); - mEnd = new nsSelectionPoint(aEndContent, aEndOffset, aEndIsAnchor); -} - -nsSelectionRange::~nsSelectionRange() { - delete mStart; - delete mEnd; -} - -void nsSelectionRange::SetRange(nsIContent * aStartContent, - PRInt32 aStartOffset, - PRBool aStartIsAnchor, - nsIContent * aEndContent, - PRInt32 aEndOffset, - PRBool aEndIsAnchor) { - mStart->SetPoint(aStartContent, aStartOffset, aStartIsAnchor); - mEnd->SetPoint(aEndContent, aEndOffset, aEndIsAnchor); -} - -void nsSelectionRange::SetRange(nsSelectionPoint * aStartPoint, - nsSelectionPoint * aEndPoint) { - SetStartPoint(aStartPoint); - SetEndPoint(aEndPoint); -} - -void nsSelectionRange::SetRange(nsSelectionRange * aRange) { - SetStartPoint(aRange->GetStartPoint()); - SetEndPoint(aRange->GetEndPoint()); -} - -void nsSelectionRange::SetStartPoint(nsSelectionPoint * aPoint) { - mStart->SetPoint(aPoint->GetContent(), aPoint->GetOffset(), aPoint->IsAnchor()); -} - -void nsSelectionRange::SetEndPoint(nsSelectionPoint * aPoint) { - mEnd->SetPoint(aPoint->GetContent(), aPoint->GetOffset(), aPoint->IsAnchor()); -} - -void nsSelectionRange::GetStartPoint(nsSelectionPoint * aPoint) { - aPoint->SetPoint(mStart->GetContent(), mStart->GetOffset(), mStart->IsAnchor()); -} - -void nsSelectionRange::GetEndPoint(nsSelectionPoint * aPoint) { - aPoint->SetPoint(mEnd->GetContent(), mEnd->GetOffset(), mEnd->IsAnchor()); -} - -void nsSelectionRange::GetRange(nsSelectionRange * aRange) { - aRange->SetStartPoint(mStart); - aRange->SetEndPoint(mEnd); -} - -/** - * For debug only, it potentially leaks memory - */ -char * nsSelectionRange::ToString() { - static char str[1024]; - char * startStr = mStart->ToString(); - char * endStr = mEnd->ToString(); - sprintf(str, "nsSelectionRange[\nStart=%s,\nEnd =%s\n]", startStr, endStr); - delete startStr; - delete endStr; - return str; -} - diff --git a/mozilla/layout/base/src/nsSelectionRange.h b/mozilla/layout/base/src/nsSelectionRange.h deleted file mode 100644 index a790d5f95e1..00000000000 --- a/mozilla/layout/base/src/nsSelectionRange.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsSelectionRange_h___ -#define nsSelectionRange_h___ - -#include "nsSelectionPoint.h" - -class nsSelectionRange { - - nsSelectionPoint * mStart; - nsSelectionPoint * mEnd; - - public: - nsSelectionRange(); - - nsSelectionRange(nsIContent * aStartContent, - PRInt32 aStartOffset, - PRBool aStartIsAnchor, - nsIContent * aEndContent, - PRInt32 aEndOffset, - PRBool aEndIsAnchor); - - virtual ~nsSelectionRange(); - - void SetRange(nsIContent * aStartContent, - PRInt32 aStartOffset, - PRBool aStartIsAnchor, - nsIContent * aEndContent, - PRInt32 aEndOffset, - PRBool aEndIsAnchor); - - void SetRange(nsSelectionPoint * aStartPoint, - nsSelectionPoint * aEndPoint); - - /** - * Copies the data from the param into the internal Range - */ - void SetRange(nsSelectionRange * aRange); - - nsIContent * GetStartContent() { return mStart->GetContent();} - nsIContent * GetEndContent() { return mEnd->GetContent(); } - nsSelectionPoint * GetStartPoint() { return mStart; } - nsSelectionPoint * GetEndPoint() { return mEnd; } - - /** - * Copies the data from the param into the Start Point - */ - void SetStartPoint(nsSelectionPoint * aPoint); - - /** - * Copies the data from the param into the End Point - */ - void SetEndPoint(nsSelectionPoint * aPoint); - - - /** - * Copies the param's (aPoint) contents with the Range's Point data - */ - void GetStartPoint(nsSelectionPoint * aPoint); - - /** - * Copies the param's (aPoint) contents with the Range's Point data - */ - void GetEndPoint(nsSelectionPoint * aPoint); - - /** - * Copies the param's (aRange) contents with the Range's data - */ - void GetRange(nsSelectionRange * aRange); - - char * ToString(); -}; - -#endif /* nsSelectionRange_h___ */ diff --git a/mozilla/layout/base/src/nsSpaceManager.cpp b/mozilla/layout/base/src/nsSpaceManager.cpp deleted file mode 100644 index 0ef29a7a04f..00000000000 --- a/mozilla/layout/base/src/nsSpaceManager.cpp +++ /dev/null @@ -1,1070 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsSpaceManager.h" -#include "nsPoint.h" -#include "nsRect.h" -#include "nsSize.h" -#include -#include "nsVoidArray.h" - -static NS_DEFINE_IID(kISpaceManagerIID, NS_ISPACEMANAGER_IID); - -PR_CALLBACK PLHashNumber -NS_HashNumber(const void* key) -{ - return (PLHashNumber)key; -} - -PR_CALLBACK PRIntn -NS_RemoveFrameInfoEntries(PLHashEntry* he, PRIntn i, void* arg) -{ - nsSpaceManager::FrameInfo* frameInfo = (nsSpaceManager::FrameInfo*)he->value; - - NS_ASSERTION(nsnull != frameInfo, "null frameInfo"); - delete frameInfo; - return HT_ENUMERATE_REMOVE; -} - -///////////////////////////////////////////////////////////////////////////// -// BandList - -nsSpaceManager::BandList::BandList() - : BandRect(-1, -1, -1, -1, (nsIFrame*)nsnull) -{ - PR_INIT_CLIST(this); - numFrames = 0; -} - -void nsSpaceManager::BandList::Clear() -{ - if (!IsEmpty()) { - BandRect* bandRect = Head(); - - while (bandRect != this) { - BandRect* next = bandRect->Next(); - - delete bandRect; - bandRect = next; - } - - PR_INIT_CLIST(this); - } -} - - -///////////////////////////////////////////////////////////////////////////// -// nsSpaceManager - -nsSpaceManager::nsSpaceManager(nsIFrame* aFrame) - : mFrame(aFrame) -{ - NS_INIT_REFCNT(); - mX = mY = 0; - mFrameInfoMap = nsnull; -} - -void nsSpaceManager::ClearFrameInfo() -{ - if (nsnull != mFrameInfoMap) { - PL_HashTableEnumerateEntries(mFrameInfoMap, NS_RemoveFrameInfoEntries, 0); - PL_HashTableDestroy(mFrameInfoMap); - mFrameInfoMap = nsnull; - } -} - -nsSpaceManager::~nsSpaceManager() -{ - mBandList.Clear(); - ClearFrameInfo(); -} - -NS_IMPL_ISUPPORTS(nsSpaceManager, kISpaceManagerIID); - -nsIFrame* nsSpaceManager::GetFrame() const -{ - return mFrame; -} - -void nsSpaceManager::Translate(nscoord aDx, nscoord aDy) -{ - mX += aDx; - mY += aDy; -} - -void nsSpaceManager::GetTranslation(nscoord& aX, nscoord& aY) const -{ - aX = mX; - aY = mY; -} - -nscoord nsSpaceManager::YMost() const -{ - nscoord yMost; - - if (mBandList.IsEmpty()) { - yMost = 0; - } else { - BandRect* lastRect = mBandList.Tail(); - - yMost = lastRect->bottom; - } - - return yMost; -} - -/** - * Internal function that returns the list of available and unavailable space - * within the band - * - * @param aBand the first rect in the band - * @param aY the y-offset in world coordinates - * @param aMaxSize the size to use to constrain the band data - * @param aAvailableBand - */ -PRInt32 nsSpaceManager::GetBandAvailableSpace(const BandRect* aBand, - nscoord aY, - const nsSize& aMaxSize, - nsBandData& aBandData) const -{ - nscoord topOfBand = aBand->top; - nscoord localY = aY - mY; - nscoord height = PR_MIN(aBand->bottom - aY, aMaxSize.height); - nsBandTrapezoid* trapezoid = aBandData.trapezoids; - nscoord rightEdge = mX + aMaxSize.width; - - // Initialize the band data - aBandData.count = 0; - - // Skip any rectangles that are to the left of the local coordinate space - while (aBand->top == topOfBand) { - if (aBand->right > mX) { - break; - } - - // Get the next rect in the band - aBand = aBand->Next(); - } - - // This is used to track the current x-location within the band. This is in - // world coordinates - nscoord left = mX; - - // Process the remaining rectangles that are within the clip width - while ((aBand->top == topOfBand) && (aBand->left < rightEdge)) { - // Compare the left edge of the occupied space with the current left - // coordinate - if (aBand->left > left) { - // The rect is to the right of our current left coordinate, so we've - // found some available space - trapezoid->state = nsBandTrapezoid::Available; - trapezoid->frame = nsnull; - - // Assign the trapezoid a rectangular shape. The trapezoid must be in the - // local coordinate space, so convert the current left coordinate - *trapezoid = nsRect(left - mX, localY, aBand->left - left, height); - - // Move to the next output rect - trapezoid++; - aBandData.count++; - } - - // The rect represents unavailable space, so add another trapezoid - if (1 == aBand->numFrames) { - trapezoid->state = nsBandTrapezoid::Occupied; - trapezoid->frame = aBand->frame; - } else { - NS_ASSERTION(aBand->numFrames > 1, "unexpected frame count"); - trapezoid->state = nsBandTrapezoid::OccupiedMultiple; - trapezoid->frames = aBand->frames; - } - - nscoord x = aBand->left; - // The first band can straddle the clip rect - if (x < mX) { - // Clip the left edge - x = mX; - } - - // Assign the trapezoid a rectangular shape. The trapezoid must be in the - // local coordinate space, so convert the rects's left coordinate - *trapezoid = nsRect(x - mX, localY, aBand->right - x, height); - - // Move to the next output rect - trapezoid++; - aBandData.count++; - - // Adjust our current x-location within the band - left = aBand->right; - - // Move to the next rect within the band - aBand = aBand->Next(); - } - - // No more rects left in the band. If we haven't yet reached the right edge, - // then all the remaining space is available - if (left < rightEdge) { - trapezoid->state = nsBandTrapezoid::Available; - trapezoid->frame = nsnull; - - // Assign the trapezoid a rectangular shape. The trapezoid must be in the - // local coordinate space, so convert the current left coordinate - *trapezoid = nsRect(left - mX, localY, rightEdge - left, height); - aBandData.count++; - } - - return aBandData.count; -} - -PRInt32 nsSpaceManager::GetBandData(nscoord aYOffset, - const nsSize& aMaxSize, - nsBandData& aBandData) const -{ - // Convert the y-offset to world coordinates - nscoord y = mY + aYOffset; - - // If there are no unavailable rects or the offset is below the bottommost - // band, then all the space is available - if (y >= YMost()) { - // All the requested space is available - aBandData.count = 1; - aBandData.trapezoids[0] = nsRect(0, aYOffset, aMaxSize.width, aMaxSize.height); - aBandData.trapezoids[0].state = nsBandTrapezoid::Available; - aBandData.trapezoids[0].frame = nsnull; - } else { - // Find the first band that contains the y-offset or is below the y-offset - NS_ASSERTION(!mBandList.IsEmpty(), "no bands"); - BandRect* band = mBandList.Head(); - - aBandData.count = 0; - while (nsnull != band) { - if (band->top > y) { - // The band is below the y-offset. The area between the y-offset and - // the top of the band is available - aBandData.count = 1; - aBandData.trapezoids[0] = - nsRect(0, aYOffset, aMaxSize.width, PR_MIN(band->top - y, aMaxSize.height)); - aBandData.trapezoids[0].state = nsBandTrapezoid::Available; - aBandData.trapezoids[0].frame = nsnull; - break; - } else if (y < band->bottom) { - // The band contains the y-offset. Return a list of available and - // unavailable rects within the band - return GetBandAvailableSpace(band, y, aMaxSize, aBandData); - } else { - // Skip to the next band - band = GetNextBand(band); - } - } - } - - NS_POSTCONDITION(aBandData.count > 0, "unexpected band data count"); - return aBandData.count; -} - -/** - * Skips to the start of the next band. - * - * @param aBandRect A rect within the band - * @returns The start of the next band, or nsnull of this is the last band. - */ -nsSpaceManager::BandRect* nsSpaceManager::GetNextBand(const BandRect* aBandRect) const -{ - nscoord topOfBand = aBandRect->top; - - aBandRect = aBandRect->Next(); - while (aBandRect != &mBandList) { - // Check whether this rect is part of the same band - if (aBandRect->top != topOfBand) { - // We found the start of the next band - return (BandRect*)aBandRect; - } - - aBandRect = aBandRect->Next(); - } - - // No bands left - return nsnull; -} - -/** - * Divides the current band into two vertically - * - * @param aBandRect the first rect in the band - * @param aBottom where to split the band. This becomes the bottom of the top - * part - */ -void nsSpaceManager::DivideBand(BandRect* aBandRect, nscoord aBottom) -{ - NS_PRECONDITION(aBottom < aBandRect->bottom, "bad height"); - nscoord topOfBand = aBandRect->top; - BandRect* nextBand = GetNextBand(aBandRect); - - if (nsnull == nextBand) { - nextBand = (BandRect*)&mBandList; - } - - while (topOfBand == aBandRect->top) { - // Split the band rect into two vertically - BandRect* bottomBandRect = aBandRect->SplitVertically(aBottom); - - // Insert the new bottom part - nextBand->InsertBefore(bottomBandRect); - - // Move to the next rect in the band - aBandRect = aBandRect->Next(); - } -} - -PRBool nsSpaceManager::CanJoinBands(BandRect* aBand, BandRect* aPrevBand) -{ - PRBool result; - nscoord topOfBand = aBand->top; - nscoord topOfPrevBand = aPrevBand->top; - - // The bands can be joined if: - // - they're adjacent - // - they have the same number of rects - // - each rect has the same left and right edge as its corresponding rect, and - // the rects are occupied by the same frames - if (aPrevBand->bottom == aBand->top) { - // Compare each of the rects in the two bands - while (PR_TRUE) { - if ((aBand->left != aPrevBand->left) || (aBand->right != aPrevBand->right)) { - // The rects have different edges - result = PR_FALSE; - break; - } - - if (!aBand->HasSameFrameList(aPrevBand)) { - // The rects are occupied by different frames - result = PR_FALSE; - break; - } - - // Move to the next rects within the bands - aBand = aBand->Next(); - aPrevBand = aPrevBand->Next(); - - // Have we reached the end of either band? - PRBool endOfBand = aBand->top != topOfBand; - PRBool endOfPrevBand = aPrevBand->top != topOfPrevBand; - - if (endOfBand || endOfPrevBand) { - result = endOfBand & endOfPrevBand; - break; // all done - } - } - - } else { - // The bands aren't adjacent - result = PR_FALSE; - } - - return result; -} - -/** - * Tries to join the two adjacent bands. Returns PR_TRUE if successful and - * PR_FALSE otherwise - * - * If the two bands are joined, the previous band is the the band that's deleted - */ -PRBool nsSpaceManager::JoinBands(BandRect* aBand, BandRect* aPrevBand) -{ - if (CanJoinBands(aBand, aPrevBand)) { - BandRect* startOfNextBand = aBand; - - while (aPrevBand != startOfNextBand) { - // Adjust the top of the band we're keeping, and then move to the next - // rect within the band - aBand->top = aPrevBand->top; - aBand = aBand->Next(); - - // Delete the rect from the previous band - BandRect* next = aPrevBand->Next(); - - aPrevBand->Remove(); - delete aPrevBand; - aPrevBand = next; - } - - return PR_TRUE; - } - - return PR_FALSE; -} - -/** - * Adds a new rect to a band. - * - * @param aBand the first rect in the band - * @param aBandRect the band rect to add to the band - */ -void nsSpaceManager::AddRectToBand(BandRect* aBand, - BandRect* aBandRect) -{ - NS_PRECONDITION((aBand->top == aBandRect->top) && - (aBand->bottom == aBandRect->bottom), "bad band"); - NS_PRECONDITION(1 == aBandRect->numFrames, "shared band rect"); - nscoord topOfBand = aBand->top; - - // Figure out where in the band horizontally to insert the rect - do { - // Compare the left edge of the new rect with the left edge of the existing - // rect - if (aBandRect->left < aBand->left) { - // The new rect's left edge is to the left of the existing rect's left edge. - // Could be any of these cases (N is new rect, E is existing rect): - // - // Case 1: left-of Case 2: overlaps Case 3: N.contains(E) - // --------------- ---------------- --------------------- - // +-----+ +-----+ +-----+ +---------+ - // | N | | E | | N | | N | - // +-----+ +-----+ +-----+ +---------+ - // +-----+ +---+ - // | E | | E | - // +-----+ +---+ - // - // Do the two rectangles overlap? - if (aBandRect->right <= aBand->left) { - // No, the new rect is completely to the left of the existing rect - // (case #1). Insert a new rect - aBand->InsertBefore(aBandRect); - return; - } - - // Yes, they overlap. Compare the right edges. - if (aBandRect->right > aBand->right) { - // The new rect's right edge is to the right of the existing rect's - // right edge (case #3). Split the new rect - BandRect* r1 = aBandRect->SplitHorizontally(aBand->left); - - // Insert the part of the new rect that's to the left of the existing - // rect as a new band rect - aBand->InsertBefore(aBandRect); - - // Continue below with the part that overlaps the existing rect - aBandRect = r1; - - } else { - if (aBand->right > aBandRect->right) { - // The existing rect extends past the new rect (case #2). Split the - // existing rect - BandRect* r1 = aBand->SplitHorizontally(aBandRect->right); - - // Insert the new right half of the existing rect - aBand->InsertAfter(r1); - } - - // Insert the part of the new rect that's to the left of the existing - // rect - aBandRect->right = aBand->left; - aBand->InsertBefore(aBandRect); - - // Mark the existing rect as shared - aBand->AddFrame(aBandRect->frame); - return; - } - } - - if (aBandRect->left > aBand->left) { - // The new rect's left edge is to the right of the existing rect's left - // edge. Could be any one of these cases: - // - // Case 4: right-of Case 5: overlaps Case 6: E.Contains(N) - // --------------- ---------------- --------------------- - // +-----+ +-----+ +-----+ +------------+ - // | E | | N | | E | | E | - // +-----+ +-----+ +-----+ +------------+ - // +-----+ +-----+ - // | N | | N | - // +-----+ +-----+ - // - if (aBandRect->left >= aBand->right) { - // The new rect is to the right of the existing rect (case #4), so move - // to the next rect in the band - aBand = aBand->Next(); - continue; - } - - // The rects overlap, so divide the existing rect into two rects: the - // part to the left of the new rect, and the part that overlaps - BandRect* r1 = aBand->SplitHorizontally(aBandRect->left); - - // Insert the new right half of the existing rect, and make it the current - // rect - aBand->InsertAfter(r1); - aBand = r1; - } - - // At this point the left edge of the new rect is the same as the left edge - // of the existing rect - NS_ASSERTION(aBandRect->left == aBand->left, "unexpected rect"); - - // Compare which rect is wider, the new rect or the existing rect - if (aBand->right > aBandRect->right) { - // The existing rect is wider (case #6). Divide the existing rect into - // two rects: the part that overlaps, and the part to the right of the - // new rect - BandRect* r1 = aBand->SplitHorizontally(aBandRect->right); - - // Insert the new right half of the existing rect - aBand->InsertAfter(r1); - - // Mark the overlap as being shared - aBand->AddFrame(aBandRect->frame); - return; - - } else { - // Indicate the frames share the existing rect - aBand->AddFrame(aBandRect->frame); - - if (aBand->right == aBandRect->right) { - // The new and existing rect have the same right edge. We're all done, - // and the new band rect is no longer needed - delete aBandRect; - return; - } else { - // The new rect is wider than the existing rect (cases #5). Set the - // new rect to be the overhang, and move to the next rect within the band - aBandRect->left = aBand->right; - aBand = aBand->Next(); - continue; - } - } - } while (aBand->top == topOfBand); - - // Insert a new rect - aBand->InsertBefore(aBandRect); -} - -// When comparing a rect to a band there are seven cases to consider. -// 'R' is the rect and 'B' is the band. -// -// Case 1 Case 2 Case 3 Case 4 -// ------ ------ ------ ------ -// +-----+ +-----+ +-----+ +-----+ -// | R | | R | +-----+ +-----+ | | | | -// +-----+ +-----+ | | | R | | B | | B | -// +-----+ | B | +-----+ | | +-----+ | | -// | | | | +-----+ | R | +-----+ -// | B | +-----+ +-----+ -// | | -// +-----+ -// -// -// -// Case 5 Case 6 Case 7 -// ------ ------ ------ -// +-----+ +-----+ +-----+ +-----+ -// | | | R | | B | | | +-----+ -// | B | +-----+ +-----+ | R | | B | -// | | | | +-----+ -// +-----+ +-----+ -// +-----+ -// | R | -// +-----+ -// -void nsSpaceManager::InsertBandRect(BandRect* aBandRect) -{ - // If there are no existing bands or this rect is below the bottommost - // band, then add a new band - if (aBandRect->top >= YMost()) { - mBandList.Append(aBandRect); - return; - } - - // Examine each band looking for a band that intersects this rect - NS_ASSERTION(!mBandList.IsEmpty(), "no bands"); - BandRect* band = mBandList.Head(); - - while (nsnull != band) { - // Compare the top edge of this rect with the top edge of the band - if (aBandRect->top < band->top) { - // The top edge of the rect is above the top edge of the band. - // Is there any overlap? - if (aBandRect->bottom <= band->top) { - // Case #1. This rect is completely above the band, so insert a - // new band before the current band - band->InsertBefore(aBandRect); - break; // we're all done - } - - // Case #2 and case #7. Divide this rect, creating a new rect for - // the part that's above the band - BandRect* bandRect1 = new BandRect(aBandRect->left, aBandRect->top, - aBandRect->right, band->top, - aBandRect->frame); - - // Insert bandRect1 as a new band - band->InsertBefore(bandRect1); - - // Modify this rect to exclude the part above the band - aBandRect->top = band->top; - - } else if (aBandRect->top > band->top) { - // The top edge of the rect is below the top edge of the band. Is there - // any overlap? - if (aBandRect->top >= band->bottom) { - // Case #5. This rect is below the current band. Skip to the next band - band = GetNextBand(band); - continue; - } - - // Case #3 and case #4. Divide the current band into two bands with the - // top band being the part that's above the rect - DivideBand(band, aBandRect->top); - - // Skip to the bottom band that we just created - band = GetNextBand(band); - } - - // At this point the rect and the band should have the same y-offset - NS_ASSERTION(aBandRect->top == band->top, "unexpected band"); - - // Is the band higher than the rect? - if (band->bottom > aBandRect->bottom) { - // Divide the band into two bands with the top band the same height - // as the rect - DivideBand(band, aBandRect->bottom); - } - - if (aBandRect->bottom == band->bottom) { - // Add the rect to the band - AddRectToBand(band, aBandRect); - break; - - } else { - // Case #4 and case #7. The rect contains the band vertically. Divide - // the rect, creating a new rect for the part that overlaps the band - BandRect* bandRect1 = new BandRect(aBandRect->left, aBandRect->top, - aBandRect->right, band->bottom, - aBandRect->frame); - - // Add bandRect1 to the band - AddRectToBand(band, bandRect1); - - // Modify aBandRect to be the part below the band - aBandRect->top = band->bottom; - - // Continue with the next band - band = GetNextBand(band); - if (nsnull == band) { - // Append a new bottommost band - mBandList.Append(aBandRect); - break; - } - } - } -} - -PRBool nsSpaceManager::AddRectRegion(nsIFrame* aFrame, const nsRect& aUnavailableSpace) -{ - NS_PRECONDITION(nsnull != aFrame, "null frame"); - - // See if there is already a region associated with aFrame - FrameInfo* frameInfo = GetFrameInfoFor(aFrame); - - if (nsnull != frameInfo) { - NS_WARNING("aFrame is already associated with a region"); - return PR_FALSE; - } - - // Convert the frame to world coordinates - nsRect rect(aUnavailableSpace.x + mX, aUnavailableSpace.y + mY, - aUnavailableSpace.width, aUnavailableSpace.height); - - // Verify that the offset is within the defined coordinate space - if ((rect.x < 0) || (rect.y < 0)) { - NS_WARNING("invalid offset for rect region"); - return PR_FALSE; - } - - // Create a frame info structure - frameInfo = CreateFrameInfo(aFrame, rect); - - // Is the rect empty? - if (aUnavailableSpace.IsEmpty()) { - // The rect doesn't consume any space, so don't add any band data - return PR_TRUE; - } - - // Allocate a band rect - BandRect* bandRect = new BandRect(rect.x, rect.y, rect.XMost(), rect.YMost(), aFrame); - - // Insert the band rect - InsertBandRect(bandRect); - return PR_TRUE; -} - -PRBool nsSpaceManager::ResizeRectRegion(nsIFrame* aFrame, - nscoord aDeltaWidth, - nscoord aDeltaHeight, - AffectedEdge aEdge) -{ - // Get the frame info associated with with aFrame - FrameInfo* frameInfo = GetFrameInfoFor(aFrame); - - if (nsnull == frameInfo) { - NS_WARNING("no region associated with aFrame"); - return PR_FALSE; - } - - nsRect rect(frameInfo->rect); - rect.SizeBy(aDeltaWidth, aDeltaHeight); - if (aEdge == LeftEdge) { - rect.x += aDeltaWidth; - } - - // Verify that the offset is within the defined coordinate space - if ((rect.x < 0) || (rect.y < 0)) { - NS_WARNING("invalid offset when resizing rect region"); - return PR_FALSE; - } - - // For the time being just remove it and add it back in - RemoveRegion(aFrame); - return AddRectRegion(aFrame, rect); -} - -PRBool nsSpaceManager::OffsetRegion(nsIFrame* aFrame, nscoord aDx, nscoord aDy) -{ - // Get the frame info associated with with aFrame - FrameInfo* frameInfo = GetFrameInfoFor(aFrame); - - if (nsnull == frameInfo) { - NS_WARNING("no region associated with aFrame"); - return PR_FALSE; - } - - nsRect rect(frameInfo->rect); - rect.MoveBy(aDx, aDy); - - // Verify that the offset is within the defined coordinate space - if ((rect.x < 0) || (rect.y < 0)) { - NS_WARNING("invalid offset when offseting rect region"); - return PR_FALSE; - } - - // For the time being just remove it and add it back in - RemoveRegion(aFrame); - return AddRectRegion(aFrame, rect); -} - -PRBool nsSpaceManager::RemoveRegion(nsIFrame* aFrame) -{ - // Get the frame info associated with aFrame - FrameInfo* frameInfo = GetFrameInfoFor(aFrame); - - if (nsnull == frameInfo) { - NS_WARNING("no region associated with aFrame"); - return PR_FALSE; - } - - if (!frameInfo->rect.IsEmpty()) { - NS_ASSERTION(!mBandList.IsEmpty(), "no bands"); - BandRect* band = mBandList.Head(); - BandRect* prevBand = nsnull; - PRBool prevFoundMatchingRect = PR_FALSE; - - // Iterate each band looking for rects tagged with aFrame - while (nsnull != band) { - BandRect* rect = band; - BandRect* prevRect = nsnull; - nscoord topOfBand = band->top; - PRBool foundMatchingRect = PR_FALSE; - PRBool prevIsSharedRect = PR_FALSE; - - // Iterate each rect in the band - do { - PRBool isSharedRect = PR_FALSE; - - if (rect->IsOccupiedBy(aFrame)) { - // Remember that we found a matching rect in this band - foundMatchingRect = PR_TRUE; - - if (rect->numFrames > 1) { - // The band rect is occupied by more than one frame - rect->RemoveFrame(aFrame); - - // Remember that this rect was being shared by more than one frame - // including aFrame - isSharedRect = PR_TRUE; - } else { - // The rect isn't shared so just delete it - BandRect* next = rect->Next(); - rect->Remove(); - if (rect == band) { - // The rect we're deleting is the start of the band - if (topOfBand == next->top) { - band = next; - } else { - band = nsnull; - } - } - delete rect; - rect = next; - - // We don't need to try and coalesce adjacent rects in this case - prevRect = nsnull; - prevIsSharedRect = PR_FALSE; - continue; - } - } - - // If we found a shared rect occupied by aFrame, then we need to try - // and coalesce adjacent rects - if (prevIsSharedRect || (isSharedRect && (nsnull != prevRect))) { - NS_ASSERTION(nsnull != prevRect, "no previous rect"); - if ((prevRect->right == rect->left) && (prevRect->HasSameFrameList(rect))) { - // Modify the current rect's left edge, and delete the previous rect - rect->left = prevRect->left; - prevRect->Remove(); - if (prevRect == band) { - // the rect we're deleting is the start of the band - band = rect; - } - delete prevRect; - } - } - - // Get the next rect in the band - prevRect = rect; - prevIsSharedRect = isSharedRect; - rect = rect->Next(); - } while (rect->top == topOfBand); - - if (nsnull != band) { - // If we found a rect occupied by aFrame in this band or the previous band - // then try to join the two bands - if ((nsnull != prevBand) && (foundMatchingRect || prevFoundMatchingRect)) { - // Try and join this band with the previous band - JoinBands(band, prevBand); - } - } - - // Move to the next band - prevFoundMatchingRect = foundMatchingRect; - prevBand = band; - band = (rect == &mBandList) ? nsnull : rect; - } - } - - DestroyFrameInfo(frameInfo); - return PR_TRUE; -} - -void nsSpaceManager::ClearRegions() -{ - ClearFrameInfo(); - mBandList.Clear(); -} - -nsSpaceManager::FrameInfo* nsSpaceManager::GetFrameInfoFor(nsIFrame* aFrame) -{ - FrameInfo* result = nsnull; - - if (nsnull != mFrameInfoMap) { - result = (FrameInfo*)PL_HashTableLookup(mFrameInfoMap, (const void*)aFrame); - } - - return result; -} - -nsSpaceManager::FrameInfo* nsSpaceManager::CreateFrameInfo(nsIFrame* aFrame, - const nsRect& aRect) -{ - if (nsnull == mFrameInfoMap) { - mFrameInfoMap = PL_NewHashTable(17, NS_HashNumber, PL_CompareValues, - PL_CompareValues, nsnull, nsnull); - } - - FrameInfo* frameInfo = new FrameInfo(aFrame, aRect); - - PL_HashTableAdd(mFrameInfoMap, (const void*)aFrame, frameInfo); - return frameInfo; -} - -void nsSpaceManager::DestroyFrameInfo(FrameInfo* aFrameInfo) -{ - PL_HashTableRemove(mFrameInfoMap, (const void*)aFrameInfo->frame); - delete aFrameInfo; -} - -///////////////////////////////////////////////////////////////////////////// -// FrameInfo - -nsSpaceManager::FrameInfo::FrameInfo(nsIFrame* aFrame, const nsRect& aRect) - : frame(aFrame), rect(aRect) -{ -} - -///////////////////////////////////////////////////////////////////////////// -// BandRect - -nsSpaceManager::BandRect::BandRect(nscoord aLeft, - nscoord aTop, - nscoord aRight, - nscoord aBottom, - nsIFrame* aFrame) -{ - left = aLeft; - top = aTop; - right = aRight; - bottom = aBottom; - frame = aFrame; - numFrames = 1; -} - -nsSpaceManager::BandRect::BandRect(nscoord aLeft, - nscoord aTop, - nscoord aRight, - nscoord aBottom, - nsVoidArray* aFrames) -{ - left = aLeft; - top = aTop; - right = aRight; - bottom = aBottom; - frames = new nsVoidArray; - frames->operator=(*aFrames); - numFrames = frames->Count(); -} - -nsSpaceManager::BandRect::~BandRect() -{ - if (numFrames > 1) { - delete frames; - } -} - -nsSpaceManager::BandRect* nsSpaceManager::BandRect::SplitVertically(nscoord aBottom) -{ - NS_PRECONDITION((aBottom > top) && (aBottom < bottom), "bad argument"); - - // Create a new band rect for the bottom part - BandRect* bottomBandRect; - - if (numFrames > 1) { - bottomBandRect = new BandRect(left, aBottom, right, bottom, frames); - } else { - bottomBandRect = new BandRect(left, aBottom, right, bottom, frame); - } - - // This band rect becomes the top part, so adjust the bottom edge - bottom = aBottom; - - return bottomBandRect; -} - -nsSpaceManager::BandRect* nsSpaceManager::BandRect::SplitHorizontally(nscoord aRight) -{ - NS_PRECONDITION((aRight > left) && (aRight < right), "bad argument"); - - // Create a new band rect for the right part - BandRect* rightBandRect; - - if (numFrames > 1) { - rightBandRect = new BandRect(aRight, top, right, bottom, frames); - } else { - rightBandRect = new BandRect(aRight, top, right, bottom, frame); - } - - // This band rect becomes the left part, so adjust the right edge - right = aRight; - - return rightBandRect; -} - -PRBool nsSpaceManager::BandRect::IsOccupiedBy(const nsIFrame* aFrame) const -{ - PRBool result; - - if (1 == numFrames) { - result = (frame == aFrame); - } else { - PRInt32 count = frames->Count(); - - result = PR_FALSE; - for (PRInt32 i = 0; i < count; i++) { - nsIFrame* f = (nsIFrame*)frames->ElementAt(i); - - if (f == aFrame) { - result = PR_TRUE; - break; - } - } - } - - return result; -} - -void nsSpaceManager::BandRect::AddFrame(const nsIFrame* aFrame) -{ - if (1 == numFrames) { - nsIFrame* f = frame; - frames = new nsVoidArray; - frames->AppendElement(f); - } - - numFrames++; - frames->AppendElement((void*)aFrame); - NS_POSTCONDITION(frames->Count() == numFrames, "bad frame count"); -} - -void nsSpaceManager::BandRect::RemoveFrame(const nsIFrame* aFrame) -{ - NS_PRECONDITION(numFrames > 1, "only one frame"); - frames->RemoveElement((void*)aFrame); - numFrames--; - - if (1 == numFrames) { - nsIFrame* f = (nsIFrame*)frames->ElementAt(0); - - delete frames; - frame = f; - } -} - -PRBool nsSpaceManager::BandRect::HasSameFrameList(const BandRect* aBandRect) const -{ - PRBool result; - - // Check whether they're occupied by the same number of frames - if (numFrames != aBandRect->numFrames) { - result = PR_FALSE; - } else if (1 == numFrames) { - result = frame == aBandRect->frame; - } else { - result = PR_TRUE; - - // For each frame occupying this band rect check whether it also occupies - // aBandRect - PRInt32 count = frames->Count(); - for (PRInt32 i = 0; i < count; i++) { - nsIFrame* f = (nsIFrame*)frames->ElementAt(i); - - if (-1 == aBandRect->frames->IndexOf(f)) { - result = PR_FALSE; - break; - } - } - } - - return result; -} diff --git a/mozilla/layout/base/src/nsSpaceManager.h b/mozilla/layout/base/src/nsSpaceManager.h deleted file mode 100644 index d09eece1719..00000000000 --- a/mozilla/layout/base/src/nsSpaceManager.h +++ /dev/null @@ -1,162 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsSpaceManager_h___ -#define nsSpaceManager_h___ - -#include "nsISpaceManager.h" -#include "prclist.h" -#include "plhash.h" - -/** - * Implementation of nsISpaceManager that maintains a region data structure of - * unavailable space - */ -class nsSpaceManager : public nsISpaceManager { -public: - nsSpaceManager(nsIFrame* aFrame); - ~nsSpaceManager(); - - // nsISupports - NS_DECL_ISUPPORTS - - // nsISpaceManager - virtual nsIFrame* GetFrame() const; - - virtual void Translate(nscoord aDx, nscoord aDy); - virtual void GetTranslation(nscoord& aX, nscoord& aY) const; - virtual nscoord YMost() const; - - virtual PRInt32 GetBandData(nscoord aYOffset, - const nsSize& aMaxSize, - nsBandData& aBandData) const; - - virtual PRBool AddRectRegion(nsIFrame* aFrame, const nsRect& aUnavailableSpace); - virtual PRBool ResizeRectRegion(nsIFrame* aFrame, - nscoord aDeltaWidth, - nscoord aDeltaHeight, - AffectedEdge aEdge); - virtual PRBool OffsetRegion(nsIFrame* aFrame, nscoord aDx, nscoord aDy); - virtual PRBool RemoveRegion(nsIFrame* aFrame); - - virtual void ClearRegions(); - -protected: - // Structure that maintains information about the region associated - // with a particular frame - struct FrameInfo { - nsIFrame* const frame; - nsRect rect; // rectangular region - - FrameInfo(nsIFrame* aFrame, const nsRect& aRect); - }; - - // Doubly linked list of band rects - struct BandRect : PRCListStr { - nscoord left, top; - nscoord right, bottom; - PRIntn numFrames; // number of frames occupying this rect - union { - nsIFrame* frame; // single frame occupying the space - nsVoidArray* frames; // list of frames occupying the space - }; - - BandRect(nscoord aLeft, nscoord aTop, - nscoord aRight, nscoord aBottom, - nsIFrame*); - BandRect(nscoord aLeft, nscoord aTop, - nscoord aRight, nscoord aBottom, - nsVoidArray*); - ~BandRect(); - - // List operations - BandRect* Next() const {return (BandRect*)PR_NEXT_LINK(this);} - BandRect* Prev() const {return (BandRect*)PR_PREV_LINK(this);} - void InsertBefore(BandRect* aBandRect) {PR_INSERT_BEFORE(aBandRect, this);} - void InsertAfter(BandRect* aBandRect) {PR_INSERT_AFTER(aBandRect, this);} - void Remove() {PR_REMOVE_LINK(this);} - - // Split the band rect into two vertically, with this band rect becoming - // the top part, and a new band rect being allocated and returned for the - // bottom part - // - // Does not insert the new band rect into the linked list - BandRect* SplitVertically(nscoord aBottom); - - // Split the band rect into two horizontally, with this band rect becoming - // the left part, and a new band rect being allocated and returned for the - // right part - // - // Does not insert the new band rect into the linked list - BandRect* SplitHorizontally(nscoord aRight); - - // Accessor functions - PRBool IsOccupiedBy(const nsIFrame*) const; - void AddFrame(const nsIFrame*); - void RemoveFrame(const nsIFrame*); - PRBool HasSameFrameList(const BandRect* aBandRect) const; - }; - - // Circular linked list of band rects - struct BandList : BandRect { - BandList(); - - // Accessors - PRBool IsEmpty() const {return PR_CLIST_IS_EMPTY((PRCListStr*)this);} - BandRect* Head() const {return (BandRect*)PR_LIST_HEAD(this);} - BandRect* Tail() const {return (BandRect*)PR_LIST_TAIL(this);} - - // Operations - void Append(BandRect* aBandRect) {PR_APPEND_LINK(aBandRect, this);} - - // Remove and delete all the band rects in the list - void Clear(); - }; - - nsIFrame* const mFrame; // frame associated with the space manager - nscoord mX, mY; // translation from local to global coordinate space - BandList mBandList; // header for circular linked list of band rects - PLHashTable* mFrameInfoMap; - -protected: - FrameInfo* GetFrameInfoFor(nsIFrame* aFrame); - FrameInfo* CreateFrameInfo(nsIFrame* aFrame, const nsRect& aRect); - void DestroyFrameInfo(FrameInfo*); - - void ClearFrameInfo(); - void ClearBandRects(); - - BandRect* GetNextBand(const BandRect* aBandRect) const; - void DivideBand(BandRect* aBand, nscoord aBottom); - PRBool CanJoinBands(BandRect* aBand, BandRect* aPrevBand); - PRBool JoinBands(BandRect* aBand, BandRect* aPrevBand); - void AddRectToBand(BandRect* aBand, BandRect* aBandRect); - void InsertBandRect(BandRect* aBandRect); - - PRInt32 GetBandAvailableSpace(const BandRect* aBand, - nscoord aY, - const nsSize& aMaxSize, - nsBandData& aAvailableSpace) const; - -private: - nsSpaceManager(const nsSpaceManager&); // no implementation - void operator=(const nsSpaceManager&); // no implementation - friend PR_CALLBACK PRIntn NS_RemoveFrameInfoEntries(PLHashEntry*, PRIntn, void*); -}; - -#endif /* nsSpaceManager_h___ */ - diff --git a/mozilla/layout/base/src/nsSplittableFrame.cpp b/mozilla/layout/base/src/nsSplittableFrame.cpp deleted file mode 100644 index 22e79414a06..00000000000 --- a/mozilla/layout/base/src/nsSplittableFrame.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsSplittableFrame.h" -#include "nsIContent.h" -#include "nsIContentDelegate.h" -#include "nsIPresContext.h" -#include "nsIStyleContext.h" -#include "nsISizeOfHandler.h" - -nsSplittableFrame::nsSplittableFrame(nsIContent* aContent, - nsIFrame* aParent) - : nsFrame(aContent, aParent) -{ -} - -nsSplittableFrame::~nsSplittableFrame() -{ -} - -NS_IMETHODIMP -nsSplittableFrame::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - nsSplittableFrame::SizeOfWithoutThis(aHandler); - return NS_OK; -} - -void -nsSplittableFrame::SizeOfWithoutThis(nsISizeOfHandler* aHandler) const -{ - nsFrame::SizeOfWithoutThis(aHandler); - if (!aHandler->HaveSeen(mPrevInFlow)) { - mPrevInFlow->SizeOf(aHandler); - } - if (!aHandler->HaveSeen(mNextInFlow)) { - mNextInFlow->SizeOf(aHandler); - } -} - -// Flow member functions - -NS_IMETHODIMP -nsSplittableFrame::IsSplittable(nsSplittableType& aIsSplittable) const -{ - aIsSplittable = NS_FRAME_SPLITTABLE; - return NS_OK; -} - -/** - * Creates a continuing frame. The continuing frame is appended to the flow. - * - * @param aPresContext presentation context to use to get the content delegate - * @param aParent the geometric parent to use. Note that it maybe different than - * the receiver's geometric parent - * @return the continuing frame or null if unsuccessful - */ -NS_METHOD -nsSplittableFrame::CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame) -{ - nsIContentDelegate* contentDelegate = mContent->GetDelegate(aPresContext); - - nsresult rv = contentDelegate->CreateFrame(aPresContext, mContent, aParent, - aStyleContext, aContinuingFrame); - NS_RELEASE(contentDelegate); - if (NS_OK != rv) { - return rv; - } - - // Append the continuing frame to the flow - aContinuingFrame->AppendToFlow(this); - - // XXX remove this! - - // Resolve style for the continuing frame and set its style context. - nsIStyleContext* styleContext = - aPresContext->ResolveStyleContextFor(mContent, aParent); - aContinuingFrame->SetStyleContext(aPresContext,styleContext); - NS_RELEASE(styleContext); - - return rv; -} - -NS_METHOD nsSplittableFrame::GetPrevInFlow(nsIFrame*& aPrevInFlow) const -{ - aPrevInFlow = mPrevInFlow; - return NS_OK; -} - -NS_METHOD nsSplittableFrame::SetPrevInFlow(nsIFrame* aFrame) -{ - mPrevInFlow = aFrame; - return NS_OK; -} - -NS_METHOD nsSplittableFrame::GetNextInFlow(nsIFrame*& aNextInFlow) const -{ - aNextInFlow = mNextInFlow; - return NS_OK; -} - -NS_METHOD nsSplittableFrame::SetNextInFlow(nsIFrame* aFrame) -{ - mNextInFlow = aFrame; - return NS_OK; -} - -nsIFrame* nsSplittableFrame::GetFirstInFlow() const -{ - nsSplittableFrame* firstInFlow; - nsSplittableFrame* prevInFlow = (nsSplittableFrame*)this; - while (nsnull!=prevInFlow) { - firstInFlow = prevInFlow; - prevInFlow = (nsSplittableFrame*)firstInFlow->mPrevInFlow; - } - NS_POSTCONDITION(nsnull!=firstInFlow, "illegal state in flow chain."); - return firstInFlow; -} - -nsIFrame* nsSplittableFrame::GetLastInFlow() const -{ - nsSplittableFrame* lastInFlow; - nsSplittableFrame* nextInFlow = (nsSplittableFrame*)this; - while (nsnull!=nextInFlow) { - lastInFlow = nextInFlow; - nextInFlow = (nsSplittableFrame*)lastInFlow->mNextInFlow; - } - NS_POSTCONDITION(nsnull!=lastInFlow, "illegal state in flow chain."); - return lastInFlow; -} - -// Append this frame to flow after aAfterFrame -NS_METHOD nsSplittableFrame::AppendToFlow(nsIFrame* aAfterFrame) -{ - NS_PRECONDITION(aAfterFrame != nsnull, "null pointer"); - - mPrevInFlow = aAfterFrame; - aAfterFrame->GetNextInFlow(mNextInFlow); - mPrevInFlow->SetNextInFlow(this); - if (mNextInFlow) { - mNextInFlow->SetPrevInFlow(this); - } - return NS_OK; -} - -// Prepend this frame to flow before aBeforeFrame -NS_METHOD nsSplittableFrame::PrependToFlow(nsIFrame* aBeforeFrame) -{ - NS_PRECONDITION(aBeforeFrame != nsnull, "null pointer"); - - aBeforeFrame->GetPrevInFlow(mPrevInFlow); - mNextInFlow = aBeforeFrame; - mNextInFlow->SetPrevInFlow(this); - if (mPrevInFlow) { - mPrevInFlow->SetNextInFlow(this); - } - return NS_OK; -} - -// Remove this frame from the flow. Connects prev in flow and next in flow -NS_METHOD nsSplittableFrame::RemoveFromFlow() -{ - if (mPrevInFlow) { - mPrevInFlow->SetNextInFlow(mNextInFlow); - } - - if (mNextInFlow) { - mNextInFlow->SetPrevInFlow(mPrevInFlow); - } - - mPrevInFlow = mNextInFlow = nsnull; - return NS_OK; -} - -// Detach from previous frame in flow -NS_METHOD nsSplittableFrame::BreakFromPrevFlow() -{ - if (mPrevInFlow) { - mPrevInFlow->SetNextInFlow(nsnull); - mPrevInFlow = nsnull; - } - return NS_OK; -} - -// Detach from next frame in flow -NS_METHOD nsSplittableFrame::BreakFromNextFlow() -{ - if (mNextInFlow) { - mNextInFlow->SetPrevInFlow(nsnull); - mNextInFlow = nsnull; - } - return NS_OK; -} - -nsIFrame * nsSplittableFrame::GetPrevInFlow() -{ - return mPrevInFlow; -} - -nsIFrame * nsSplittableFrame::GetNextInFlow() -{ - return mNextInFlow; -} diff --git a/mozilla/layout/base/src/nsSplittableFrame.h b/mozilla/layout/base/src/nsSplittableFrame.h deleted file mode 100644 index 2c26a6c2b9d..00000000000 --- a/mozilla/layout/base/src/nsSplittableFrame.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsSplittableFrame_h___ -#define nsSplittableFrame_h___ - -#include "nsFrame.h" - -// Derived class that allows splitting -class nsSplittableFrame : public nsFrame -{ -public: - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - // CreateContinuingFrame() does the default behavior of using the - // content delegate to create a new frame - NS_IMETHOD IsSplittable(nsSplittableType& aIsSplittable) const; - NS_IMETHOD CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame); - - // Flow member functions. - NS_IMETHOD GetPrevInFlow(nsIFrame*& aPrevInFlow) const; - NS_IMETHOD SetPrevInFlow(nsIFrame*); - NS_IMETHOD GetNextInFlow(nsIFrame*& aNextInFlow) const; - NS_IMETHOD SetNextInFlow(nsIFrame*); - - /** - * Return the first frame in our current flow. - */ - nsIFrame* GetFirstInFlow() const; - - /** - * Return the last frame in our current flow. - */ - nsIFrame* GetLastInFlow() const; - - NS_IMETHOD AppendToFlow(nsIFrame* aAfterFrame); - NS_IMETHOD PrependToFlow(nsIFrame* aAfterFrame); - NS_IMETHOD RemoveFromFlow(); - NS_IMETHOD BreakFromPrevFlow(); - NS_IMETHOD BreakFromNextFlow(); - - nsIFrame* GetPrevInFlow(); - nsIFrame* GetNextInFlow(); - - -protected: - // Constructor. Takes as arguments the content object, the index in parent, - // and the Frame for the content parent - nsSplittableFrame(nsIContent* aContent, nsIFrame* aParent); - - virtual ~nsSplittableFrame(); - - void SizeOfWithoutThis(nsISizeOfHandler* aHandler) const; - - nsIFrame* mPrevInFlow; - nsIFrame* mNextInFlow; -}; - -#endif /* nsSplittableFrame_h___ */ diff --git a/mozilla/layout/base/src/nsStyleConsts.h b/mozilla/layout/base/src/nsStyleConsts.h deleted file mode 100644 index 30fa853cc21..00000000000 --- a/mozilla/layout/base/src/nsStyleConsts.h +++ /dev/null @@ -1,250 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsStyleConsts_h___ -#define nsStyleConsts_h___ - -#include "nsFont.h" - -// XXX fold this into nsIStyleContext and group by nsStyleXXX struct - -// Defines for various style related constants - -// See nsStyleColor -#define NS_STYLE_BG_ATTACHMENT_FIXED 0x01 -#define NS_STYLE_BG_ATTACHMENT_SCROLL 0x02 - -// See nsStyleColor -#define NS_STYLE_BG_COLOR_TRANSPARENT 0x01 -#define NS_STYLE_BG_IMAGE_NONE 0x02 -#define NS_STYLE_BG_X_POSITION_PERCENT 0x04 -#define NS_STYLE_BG_X_POSITION_LENGTH 0x08 -#define NS_STYLE_BG_Y_POSITION_PERCENT 0x10 -#define NS_STYLE_BG_Y_POSITION_LENGTH 0x20 - -// See nsStyleColor -#define NS_STYLE_BG_REPEAT_OFF 0x00 -#define NS_STYLE_BG_REPEAT_X 0x01 -#define NS_STYLE_BG_REPEAT_Y 0x02 -#define NS_STYLE_BG_REPEAT_XY 0x03 - -// See nsStyleSpacing mBorder enum values -#define NS_STYLE_BORDER_WIDTH_THIN 0 -#define NS_STYLE_BORDER_WIDTH_MEDIUM 1 -#define NS_STYLE_BORDER_WIDTH_THICK 2 -// XXX chopping block #define NS_STYLE_BORDER_WIDTH_LENGTH_VALUE 3 - -// See nsStyleSpacing mBorderStyle -#define NS_STYLE_BORDER_STYLE_NONE 0 -#define NS_STYLE_BORDER_STYLE_GROOVE 1 -#define NS_STYLE_BORDER_STYLE_RIDGE 2 -#define NS_STYLE_BORDER_STYLE_DOTTED 3 -#define NS_STYLE_BORDER_STYLE_DASHED 4 -#define NS_STYLE_BORDER_STYLE_SOLID 5 -#define NS_STYLE_BORDER_STYLE_DOUBLE 6 -#define NS_STYLE_BORDER_STYLE_BLANK 7 -#define NS_STYLE_BORDER_STYLE_INSET 8 -#define NS_STYLE_BORDER_STYLE_OUTSET 9 - -// See nsStyleDisplay -#define NS_STYLE_CLEAR_NONE 0 -#define NS_STYLE_CLEAR_LEFT 1 -#define NS_STYLE_CLEAR_RIGHT 2 -#define NS_STYLE_CLEAR_LEFT_AND_RIGHT 3 -#define NS_STYLE_CLEAR_LINE 4 -#define NS_STYLE_CLEAR_BLOCK 5 -#define NS_STYLE_CLEAR_COLUMN 6 -#define NS_STYLE_CLEAR_PAGE 7 - -// See nsStyleColor -#define NS_STYLE_CURSOR_INHERIT 0 -#define NS_STYLE_CURSOR_AUTO 1 -#define NS_STYLE_CURSOR_DEFAULT 2 -#define NS_STYLE_CURSOR_HAND 3 -#define NS_STYLE_CURSOR_IBEAM 4 - -// See nsStyleDisplay -#define NS_STYLE_DIRECTION_LTR 0 -#define NS_STYLE_DIRECTION_RTL 1 -#define NS_STYLE_DIRECTION_INHERIT 2 - -// See nsStyleDisplay -#define NS_STYLE_DISPLAY_NONE 0 -#define NS_STYLE_DISPLAY_BLOCK 1 -#define NS_STYLE_DISPLAY_INLINE 2 -#define NS_STYLE_DISPLAY_LIST_ITEM 3 -#define NS_STYLE_DISPLAY_MARKER 4 -#define NS_STYLE_DISPLAY_RUN_IN 5 -#define NS_STYLE_DISPLAY_COMPACT 6 -#define NS_STYLE_DISPLAY_TABLE 7 -#define NS_STYLE_DISPLAY_INLINE_TABLE 8 -#define NS_STYLE_DISPLAY_TABLE_ROW_GROUP 9 -#define NS_STYLE_DISPLAY_TABLE_COLUMN 10 -#define NS_STYLE_DISPLAY_TABLE_COLUMN_GROUP 11 -#define NS_STYLE_DISPLAY_TABLE_HEADER_GROUP 12 -#define NS_STYLE_DISPLAY_TABLE_FOOTER_GROUP 13 -#define NS_STYLE_DISPLAY_TABLE_ROW 14 -#define NS_STYLE_DISPLAY_TABLE_CELL 15 -#define NS_STYLE_DISPLAY_TABLE_CAPTION 16 - -// See nsStyleDisplay -#define NS_STYLE_FLOAT_NONE 0 -#define NS_STYLE_FLOAT_LEFT 1 -#define NS_STYLE_FLOAT_RIGHT 2 - -// See nsStyleFont -#define NS_STYLE_FONT_STYLE_NORMAL 0 -#define NS_STYLE_FONT_STYLE_ITALIC 1 -#define NS_STYLE_FONT_STYLE_OBLIQUE 2 - -// See nsStyleFont -#define NS_STYLE_FONT_VARIANT_NORMAL 0 -#define NS_STYLE_FONT_VARIANT_SMALL_CAPS 1 - -// See nsStyleFont -#define NS_STYLE_FONT_WEIGHT_NORMAL 400 -#define NS_STYLE_FONT_WEIGHT_BOLD 700 -#define NS_STYLE_FONT_WEIGHT_BOLDER 100 -#define NS_STYLE_FONT_WEIGHT_LIGHTER -100 - -// See nsStyleFont -#define NS_STYLE_FONT_SIZE_XXSMALL 0 -#define NS_STYLE_FONT_SIZE_XSMALL 1 -#define NS_STYLE_FONT_SIZE_SMALL 2 -#define NS_STYLE_FONT_SIZE_MEDIUM 3 -#define NS_STYLE_FONT_SIZE_LARGE 4 -#define NS_STYLE_FONT_SIZE_XLARGE 5 -#define NS_STYLE_FONT_SIZE_XXLARGE 6 -#define NS_STYLE_FONT_SIZE_LARGER 7 -#define NS_STYLE_FONT_SIZE_SMALLER 8 - -// See nsStylePosition.mPosition -#define NS_STYLE_POSITION_NORMAL 0 -#define NS_STYLE_POSITION_RELATIVE 1 -#define NS_STYLE_POSITION_ABSOLUTE 2 -#define NS_STYLE_POSITION_FIXED 3 - -// See nsStylePosition.mClip -#define NS_STYLE_CLIP_AUTO 0x00 -#define NS_STYLE_CLIP_INHERIT 0x01 -#define NS_STYLE_CLIP_RECT 0x02 -#define NS_STYLE_CLIP_TYPE_MASK 0x0F -#define NS_STYLE_CLIP_LEFT_AUTO 0x10 -#define NS_STYLE_CLIP_TOP_AUTO 0x20 -#define NS_STYLE_CLIP_RIGHT_AUTO 0x40 -#define NS_STYLE_CLIP_BOTTOM_AUTO 0x80 - -// See nsStylePosition.mOverflow -#define NS_STYLE_OVERFLOW_VISIBLE 0 -#define NS_STYLE_OVERFLOW_HIDDEN 1 -#define NS_STYLE_OVERFLOW_SCROLL 2 -#define NS_STYLE_OVERFLOW_AUTO 3 - -// See nsStyleDisplay -#define NS_STYLE_LINE_HEIGHT_NORMAL 0 - -// See nsStyleList -#define NS_STYLE_LIST_STYLE_IMAGE_NONE 0 - -// See nsStyleList -#define NS_STYLE_LIST_STYLE_NONE 0 -#define NS_STYLE_LIST_STYLE_DISC 1 -#define NS_STYLE_LIST_STYLE_CIRCLE 2 -#define NS_STYLE_LIST_STYLE_SQUARE 3 -#define NS_STYLE_LIST_STYLE_DECIMAL 4 -#define NS_STYLE_LIST_STYLE_LOWER_ROMAN 5 -#define NS_STYLE_LIST_STYLE_UPPER_ROMAN 6 -#define NS_STYLE_LIST_STYLE_LOWER_ALPHA 7 -#define NS_STYLE_LIST_STYLE_UPPER_ALPHA 8 -#define NS_STYLE_LIST_STYLE_BASIC 9 // not in css - -// See nsStyleList -#define NS_STYLE_LIST_STYLE_POSITION_INSIDE 0 -#define NS_STYLE_LIST_STYLE_POSITION_OUTSIDE 1 - -// See nsStyleSpacing -#define NS_STYLE_MARGIN_SIZE_AUTO 0 - -// See nsStyleText (word/letter) -#define NS_STYLE_SPACING_NORMAL 0 - -// See nsStyleText -#define NS_STYLE_TEXT_ALIGN_DEFAULT 0 -#define NS_STYLE_TEXT_ALIGN_LEFT 1 -#define NS_STYLE_TEXT_ALIGN_RIGHT 2 -#define NS_STYLE_TEXT_ALIGN_CENTER 3 -#define NS_STYLE_TEXT_ALIGN_JUSTIFY 4 - -// See nsStyleText, nsStyleFont -#define NS_STYLE_TEXT_DECORATION_NONE 0 -#define NS_STYLE_TEXT_DECORATION_UNDERLINE NS_FONT_DECORATION_UNDERLINE -#define NS_STYLE_TEXT_DECORATION_OVERLINE NS_FONT_DECORATION_OVERLINE -#define NS_STYLE_TEXT_DECORATION_LINE_THROUGH NS_FONT_DECORATION_LINE_THROUGH -#define NS_STYLE_TEXT_DECORATION_BLINK 0x8 - -// See nsStyleText -#define NS_STYLE_TEXT_TRANSFORM_NONE 0 -#define NS_STYLE_TEXT_TRANSFORM_CAPITALIZE 1 -#define NS_STYLE_TEXT_TRANSFORM_LOWERCASE 2 -#define NS_STYLE_TEXT_TRANSFORM_UPPERCASE 3 - -// See nsStyleText -// Note: these values pickup after the text-align values because there -// are a few html cases where an object can have both types of -// alignment applied with a single attribute -#define NS_STYLE_VERTICAL_ALIGN_BASELINE 10 -#define NS_STYLE_VERTICAL_ALIGN_SUB 11 -#define NS_STYLE_VERTICAL_ALIGN_SUPER 12 -#define NS_STYLE_VERTICAL_ALIGN_TOP 13 -#define NS_STYLE_VERTICAL_ALIGN_TEXT_TOP 14 -#define NS_STYLE_VERTICAL_ALIGN_MIDDLE 15 -#define NS_STYLE_VERTICAL_ALIGN_TEXT_BOTTOM 16 -#define NS_STYLE_VERTICAL_ALIGN_BOTTOM 17 -//#define NS_STYLE_VERTICAL_ALIGN_LENGTH 18 -//#define NS_STYLE_VERTICAL_ALIGN_PERCENT 19 - -// See nsStyleDisplay -#define NS_STYLE_VISIBILITY_HIDDEN 0 -#define NS_STYLE_VISIBILITY_VISIBLE 1 - -// See nsStyleText -#define NS_STYLE_WHITESPACE_NORMAL 0 -#define NS_STYLE_WHITESPACE_PRE 1 -#define NS_STYLE_WHITESPACE_NOWRAP 2 - -// See nsStyleTable (here for HTML 4.0 for now, should probably change to side flags) -#define NS_STYLE_TABLE_FRAME_NONE 0 -#define NS_STYLE_TABLE_FRAME_ABOVE 1 -#define NS_STYLE_TABLE_FRAME_BELOW 2 -#define NS_STYLE_TABLE_FRAME_HSIDES 3 -#define NS_STYLE_TABLE_FRAME_VSIDES 4 -#define NS_STYLE_TABLE_FRAME_LEFT 5 -#define NS_STYLE_TABLE_FRAME_RIGHT 6 -#define NS_STYLE_TABLE_FRAME_BOX 7 -#define NS_STYLE_TABLE_FRAME_BORDER 8 - -// See nsStyleTable -#define NS_STYLE_TABLE_RULES_NONE 0 -#define NS_STYLE_TABLE_RULES_GROUPS 1 -#define NS_STYLE_TABLE_RULES_ROWS 2 -#define NS_STYLE_TABLE_RULES_COLS 3 -#define NS_STYLE_TABLE_RULES_ALL 4 - -#define NS_STYLE_TABLE_COLS_NONE (-1) -#define NS_STYLE_TABLE_COLS_ALL PRInt32(1 << 30) - -#endif /* nsStyleConsts_h___ */ diff --git a/mozilla/layout/base/src/nsStyleContext.cpp b/mozilla/layout/base/src/nsStyleContext.cpp deleted file mode 100644 index 38e5400da1c..00000000000 --- a/mozilla/layout/base/src/nsStyleContext.cpp +++ /dev/null @@ -1,998 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" -#include "nsString.h" -#include "nsUnitConversion.h" -#include "nsIContent.h" -#include "nsIPresContext.h" -#include "nsIStyleRule.h" -#include "nsISupportsArray.h" -#include "nsCRT.h" - -#include "nsIFrame.h" - -//#define DEBUG_REFS - -static NS_DEFINE_IID(kIStyleContextIID, NS_ISTYLECONTEXT_IID); - - -// -------------------- -// nsStyleFont -// -nsStyleFont::nsStyleFont(const nsFont& aFont) - : mFont(aFont) -{ } - -nsStyleFont::~nsStyleFont(void) { } - -struct StyleFontImpl : public nsStyleFont { - StyleFontImpl(const nsFont& aFont) - : nsStyleFont(aFont) - {} - - void ResetFrom(const nsStyleFont* aParent, nsIPresContext* aPresContext); - -private: // These are not allowed - StyleFontImpl(const StyleFontImpl& aOther); - StyleFontImpl& operator=(const StyleFontImpl& aOther); -}; - -void StyleFontImpl::ResetFrom(const nsStyleFont* aParent, nsIPresContext* aPresContext) -{ - if (nsnull != aParent) { - mFont = aParent->mFont; - mThreeD = aParent->mThreeD; - } - else { - mFont = aPresContext->GetDefaultFont(); - mThreeD = PR_FALSE; - } -} - -// -------------------- -// nsStyleColor -// -nsStyleColor::nsStyleColor(void) { } -nsStyleColor::~nsStyleColor(void) { } - -struct StyleColorImpl: public nsStyleColor { - StyleColorImpl(void) { } - - void ResetFrom(const nsStyleColor* aParent, nsIPresContext* aPresContext); - -private: // These are not allowed - StyleColorImpl(const StyleColorImpl& aOther); - StyleColorImpl& operator=(const StyleColorImpl& aOther); -}; - -void StyleColorImpl::ResetFrom(const nsStyleColor* aParent, nsIPresContext* aPresContext) -{ - if (nsnull != aParent) { - mColor = aParent->mColor; - mOpacity = aParent->mOpacity; - } - else { - mColor = NS_RGB(0, 0, 0); - mOpacity = 1.0F; - } - - mBackgroundAttachment = NS_STYLE_BG_ATTACHMENT_SCROLL; - mBackgroundFlags = NS_STYLE_BG_COLOR_TRANSPARENT; - mBackgroundRepeat = NS_STYLE_BG_REPEAT_XY; - mBackgroundColor = NS_RGB(192,192,192); - mBackgroundXPosition = 0; - mBackgroundYPosition = 0; - - mCursor = NS_STYLE_CURSOR_INHERIT; -} - - -// -------------------- -// nsStyleSpacing -// -nsStyleSpacing::nsStyleSpacing(void) { } - -#define NS_SPACING_MARGIN 0 -#define NS_SPACING_PADDING 1 -#define NS_SPACING_BORDER 2 - -static nscoord CalcSideFor(const nsIFrame* aFrame, const nsStyleCoord& aCoord, - PRUint8 aSpacing, PRUint8 aSide, - const nscoord* aEnumTable, PRInt32 aNumEnums) -{ - nscoord result = 0; - - switch (aCoord.GetUnit()) { - case eStyleUnit_Auto: - aFrame->GetAutoMarginSize(aSide, result); - break; - - case eStyleUnit_Inherit: - nsIFrame* parentFrame; - aFrame->GetGeometricParent(parentFrame); // XXX may not be direct parent... - if (nsnull != parentFrame) { - nsIStyleContext* parentContext; - parentFrame->GetStyleContext(nsnull, parentContext); - if (nsnull != parentContext) { - const nsStyleSpacing* parentSpacing = (const nsStyleSpacing*)parentContext->GetStyleData(eStyleStruct_Spacing); - nsMargin parentMargin; - switch (aSpacing) { - case NS_SPACING_MARGIN: parentSpacing->CalcMarginFor(parentFrame, parentMargin); - break; - case NS_SPACING_PADDING: parentSpacing->CalcPaddingFor(parentFrame, parentMargin); - break; - case NS_SPACING_BORDER: parentSpacing->CalcBorderFor(parentFrame, parentMargin); - break; - } - switch (aSide) { - case NS_SIDE_LEFT: result = parentMargin.left; break; - case NS_SIDE_TOP: result = parentMargin.top; break; - case NS_SIDE_RIGHT: result = parentMargin.right; break; - case NS_SIDE_BOTTOM: result = parentMargin.bottom; break; - } - NS_RELEASE(parentContext); - } - } - - case eStyleUnit_Percent: - { - nscoord baseWidth = 0; - PRBool isBase = PR_FALSE; - nsIFrame* frame; - aFrame->GetGeometricParent(frame); - while (nsnull != frame) { - frame->IsPercentageBase(isBase); - if (isBase) { - nsSize size; - frame->GetSize(size); - baseWidth = size.width; // not really width, need to subtract out padding... - break; - } - frame->GetGeometricParent(frame); - } - result = (nscoord)((float)baseWidth * aCoord.GetPercentValue()); - } - break; - - case eStyleUnit_Coord: - result = aCoord.GetCoordValue(); - break; - - case eStyleUnit_Enumerated: - if (nsnull != aEnumTable) { - PRInt32 value = aCoord.GetIntValue(); - if ((0 <= value) && (value < aNumEnums)) { - return aEnumTable[aCoord.GetIntValue()]; - } - } - break; - - case eStyleUnit_Null: - case eStyleUnit_Normal: - case eStyleUnit_Integer: - case eStyleUnit_Proportional: - default: - result = 0; - break; - } - return result; -} - -static void CalcSidesFor(const nsIFrame* aFrame, const nsStyleSides& aSides, - PRUint8 aSpacing, - const nscoord* aEnumTable, PRInt32 aNumEnums, - nsMargin& aResult) -{ - nsStyleCoord coord; - - aResult.left = CalcSideFor(aFrame, aSides.GetLeft(coord), aSpacing, NS_SIDE_LEFT, - aEnumTable, aNumEnums); - aResult.top = CalcSideFor(aFrame, aSides.GetTop(coord), aSpacing, NS_SIDE_TOP, - aEnumTable, aNumEnums); - aResult.right = CalcSideFor(aFrame, aSides.GetRight(coord), aSpacing, NS_SIDE_RIGHT, - aEnumTable, aNumEnums); - aResult.bottom = CalcSideFor(aFrame, aSides.GetBottom(coord), aSpacing, NS_SIDE_BOTTOM, - aEnumTable, aNumEnums); -} - -void nsStyleSpacing::CalcMarginFor(const nsIFrame* aFrame, nsMargin& aMargin) const -{ - if (mHasCachedMargin) { - aMargin = mCachedMargin; - } - else { - CalcSidesFor(aFrame, mMargin, NS_SPACING_MARGIN, nsnull, 0, aMargin); - } -} - -void nsStyleSpacing::CalcPaddingFor(const nsIFrame* aFrame, nsMargin& aPadding) const -{ - if (mHasCachedPadding) { - aPadding = mCachedPadding; - } - else { - CalcSidesFor(aFrame, mPadding, NS_SPACING_PADDING, nsnull, 0, aPadding); - } -} - -static const nscoord kBorderWidths[3] = - { NS_POINTS_TO_TWIPS_INT(1), - NS_POINTS_TO_TWIPS_INT(3), - NS_POINTS_TO_TWIPS_INT(5) }; - -void nsStyleSpacing::CalcBorderFor(const nsIFrame* aFrame, nsMargin& aBorder) const -{ - if (mHasCachedBorder) { - aBorder = mCachedBorder; - } - else { - CalcSidesFor(aFrame, mBorder, NS_SPACING_BORDER, kBorderWidths, 3, aBorder); - } -} - -void nsStyleSpacing::CalcBorderPaddingFor(const nsIFrame* aFrame, nsMargin& aBorderPadding) const -{ - if (mHasCachedPadding && mHasCachedBorder) { - aBorderPadding = mCachedBorderPadding; - } - else { - nsMargin border; - CalcBorderFor(aFrame, border); - CalcPaddingFor(aFrame, aBorderPadding); - aBorderPadding += border; - } -} - - -struct StyleSpacingImpl: public nsStyleSpacing { - StyleSpacingImpl(void) - : nsStyleSpacing() - {} - - void ResetFrom(const nsStyleSpacing* aParent, nsIPresContext* aPresContext); - void RecalcData(nsIPresContext* aPresContext); -}; - -void StyleSpacingImpl::ResetFrom(const nsStyleSpacing* aParent, nsIPresContext* aPresContext) -{ - // spacing values not inherited - mMargin.Reset(); - mPadding.Reset(); - mBorder.Reset(); - mBorderStyle[0] = NS_STYLE_BORDER_STYLE_NONE; - mBorderStyle[1] = NS_STYLE_BORDER_STYLE_NONE; - mBorderStyle[2] = NS_STYLE_BORDER_STYLE_NONE; - mBorderStyle[3] = NS_STYLE_BORDER_STYLE_NONE; - mBorderColor[0] = NS_RGB(0, 0, 0); - mBorderColor[1] = NS_RGB(0, 0, 0); - mBorderColor[2] = NS_RGB(0, 0, 0); - mBorderColor[3] = NS_RGB(0, 0, 0); - - mHasCachedMargin = PR_FALSE; - mHasCachedPadding = PR_FALSE; - mHasCachedBorder = PR_FALSE; -} - -inline PRBool IsFixedUnit(nsStyleUnit aUnit, PRBool aEnumOK) -{ - return PRBool((aUnit == eStyleUnit_Null) || - (aUnit == eStyleUnit_Coord) || - (aEnumOK && (aUnit == eStyleUnit_Enumerated))); -} - -static PRBool IsFixedData(const nsStyleSides& aSides, PRBool aEnumOK) -{ - return PRBool(IsFixedUnit(aSides.GetLeftUnit(), aEnumOK) && - IsFixedUnit(aSides.GetTopUnit(), aEnumOK) && - IsFixedUnit(aSides.GetRightUnit(), aEnumOK) && - IsFixedUnit(aSides.GetBottomUnit(), aEnumOK)); -} - -static nscoord CalcCoord(const nsStyleCoord& aCoord, - const nscoord* aEnumTable, - PRInt32 aNumEnums) -{ - switch (aCoord.GetUnit()) { - case eStyleUnit_Null: - return 0; - case eStyleUnit_Coord: - return aCoord.GetCoordValue(); - case eStyleUnit_Enumerated: - if (nsnull != aEnumTable) { - PRInt32 value = aCoord.GetIntValue(); - if ((0 <= value) && (value < aNumEnums)) { - return aEnumTable[aCoord.GetIntValue()]; - } - } - break; - default: - NS_ERROR("bad unit type"); - break; - } - return 0; -} - -void StyleSpacingImpl::RecalcData(nsIPresContext* aPresContext) -{ - if (IsFixedData(mMargin, PR_FALSE)) { - nsStyleCoord coord; - mCachedMargin.left = CalcCoord(mMargin.GetLeft(coord), nsnull, 0); - mCachedMargin.top = CalcCoord(mMargin.GetTop(coord), nsnull, 0); - mCachedMargin.right = CalcCoord(mMargin.GetRight(coord), nsnull, 0); - mCachedMargin.bottom = CalcCoord(mMargin.GetBottom(coord), nsnull, 0); - - mHasCachedMargin = PR_TRUE; - } - else { - mHasCachedMargin = PR_FALSE; - } - - if (IsFixedData(mPadding, PR_FALSE)) { - nsStyleCoord coord; - mCachedPadding.left = CalcCoord(mPadding.GetLeft(coord), nsnull, 0); - mCachedPadding.top = CalcCoord(mPadding.GetTop(coord), nsnull, 0); - mCachedPadding.right = CalcCoord(mPadding.GetRight(coord), nsnull, 0); - mCachedPadding.bottom = CalcCoord(mPadding.GetBottom(coord), nsnull, 0); - - mHasCachedPadding = PR_TRUE; - } - else { - mHasCachedPadding = PR_FALSE; - } - - if (IsFixedData(mBorder, PR_TRUE)) { - nsStyleCoord coord; - mCachedBorder.left = CalcCoord(mBorder.GetLeft(coord), kBorderWidths, 3); - mCachedBorder.top = CalcCoord(mBorder.GetTop(coord), kBorderWidths, 3); - mCachedBorder.right = CalcCoord(mBorder.GetRight(coord), kBorderWidths, 3); - mCachedBorder.bottom = CalcCoord(mBorder.GetBottom(coord), kBorderWidths, 3); - - mHasCachedPadding = PR_TRUE; - } - else { - mHasCachedPadding = PR_FALSE; - } - - if (mHasCachedBorder && mHasCachedPadding) { - mCachedBorderPadding = mCachedPadding; - mCachedBorderPadding += mCachedBorder; - } - - - // XXX fixup missing border colors - -} - - -// -------------------- -// nsStyleList -// -nsStyleList::nsStyleList(void) { } -nsStyleList::~nsStyleList(void) { } - -struct StyleListImpl: public nsStyleList { - StyleListImpl(void) { } - - void ResetFrom(const nsStyleList* aParent, nsIPresContext* aPresContext); -}; - -void StyleListImpl::ResetFrom(const nsStyleList* aParent, nsIPresContext* aPresContext) -{ - if (nsnull != aParent) { - mListStyleType = aParent->mListStyleType; - mListStyleImage = aParent->mListStyleImage; - mListStylePosition = aParent->mListStylePosition; - } - else { - mListStyleType = NS_STYLE_LIST_STYLE_BASIC; - mListStylePosition = NS_STYLE_LIST_STYLE_POSITION_OUTSIDE; - mListStyleImage.Truncate(); - } -} - -// -------------------- -// nsStylePosition -// -nsStylePosition::nsStylePosition(void) { } - -struct StylePositionImpl: public nsStylePosition { - StylePositionImpl(void) { } - - void ResetFrom(const nsStylePosition* aParent, nsIPresContext* aPresContext); - -private: // These are not allowed - StylePositionImpl(const StylePositionImpl& aOther); - StylePositionImpl& operator=(const StylePositionImpl& aOther); -}; - -void StylePositionImpl::ResetFrom(const nsStylePosition* aParent, nsIPresContext* aPresContext) -{ - // positioning values not inherited - mPosition = NS_STYLE_POSITION_NORMAL; - mLeftOffset.SetAutoValue(); - mTopOffset.SetAutoValue(); - mWidth.SetAutoValue(); - mHeight.SetAutoValue(); - mZIndex.SetAutoValue(); -} - -// -------------------- -// nsStyleText -// - -nsStyleText::nsStyleText(void) { } - -struct StyleTextImpl: public nsStyleText { - StyleTextImpl(void) { } - - void ResetFrom(const nsStyleText* aParent, nsIPresContext* aPresContext); -}; - -void StyleTextImpl::ResetFrom(const nsStyleText* aParent, nsIPresContext* aPresContext) -{ - // These properties not inherited - mTextDecoration = NS_STYLE_TEXT_DECORATION_NONE; - mVerticalAlign.SetIntValue(NS_STYLE_VERTICAL_ALIGN_BASELINE, eStyleUnit_Enumerated); - - if (nsnull != aParent) { - mTextAlign = aParent->mTextAlign; - mTextTransform = aParent->mTextTransform; - mWhiteSpace = aParent->mWhiteSpace; - - mLetterSpacing = aParent->mLetterSpacing; - mLineHeight = aParent->mLineHeight; - mTextIndent = aParent->mTextIndent; - mWordSpacing = aParent->mWordSpacing; - } - else { - mTextAlign = NS_STYLE_TEXT_ALIGN_DEFAULT; - mTextTransform = NS_STYLE_TEXT_TRANSFORM_NONE; - mWhiteSpace = NS_STYLE_WHITESPACE_NORMAL; - - mLetterSpacing.SetNormalValue(); - mLineHeight.SetNormalValue(); - mTextIndent.SetCoordValue(0); - mWordSpacing.SetNormalValue(); - } - -} - -// -------------------- -// nsStyleDisplay -// - -nsStyleDisplay::nsStyleDisplay(void) { } - -struct StyleDisplayImpl: public nsStyleDisplay { - StyleDisplayImpl(void) { } - - void ResetFrom(const nsStyleDisplay* aParent, nsIPresContext* aPresContext); -}; - -void StyleDisplayImpl::ResetFrom(const nsStyleDisplay* aParent, nsIPresContext* aPresContext) -{ - if (nsnull != aParent) { - mDirection = aParent->mDirection; - mVisible = aParent->mVisible; - } - else { - mDirection = NS_STYLE_DIRECTION_LTR; - mVisible = PR_TRUE; - } - mDisplay = NS_STYLE_DISPLAY_INLINE; - mFloats = NS_STYLE_FLOAT_NONE; - mBreakType = NS_STYLE_CLEAR_NONE; - mBreakBefore = PR_FALSE; - mBreakAfter = PR_FALSE; - mOverflow = NS_STYLE_OVERFLOW_VISIBLE; - mClipFlags = NS_STYLE_CLIP_AUTO; - mClip.SizeTo(0,0,0,0); -} - -// -------------------- -// nsStyleTable -// - -nsStyleTable::nsStyleTable(void) { } - -struct StyleTableImpl: public nsStyleTable { - StyleTableImpl(void); - - void ResetFrom(const nsStyleTable* aParent, nsIPresContext* aPresContext); -}; - -StyleTableImpl::StyleTableImpl() -{ - ResetFrom(nsnull, nsnull); -} - -void StyleTableImpl::ResetFrom(const nsStyleTable* aParent, nsIPresContext* aPresContext) -{ - // values not inherited - mCols = NS_STYLE_TABLE_COLS_NONE; - mFrame = NS_STYLE_TABLE_FRAME_NONE; - mRules = NS_STYLE_TABLE_RULES_NONE; - mCellPadding.Reset(); - mCellSpacing.Reset(); - mSpan=0; -} - - -//---------------------------------------------------------------------- - -class StyleContextImpl : public nsIStyleContext { -public: - StyleContextImpl(nsIStyleContext* aParent, nsISupportsArray* aRules, nsIPresContext* aPresContext); - ~StyleContextImpl(); - - void* operator new(size_t sz) { - void* rv = new char[sz]; - nsCRT::zero(rv, sz); - return rv; - } - - NS_DECL_ISUPPORTS - - virtual nsIStyleContext* GetParent(void) const; - virtual nsISupportsArray* GetStyleRules(void) const; - virtual PRInt32 GetStyleRuleCount(void) const; - - virtual nsIStyleContext* FindChildWithRules(nsISupportsArray* aRules); - - virtual PRBool Equals(const nsIStyleContext* aOther) const; - virtual PRUint32 HashValue(void) const; - - virtual void RemapStyle(nsIPresContext* aPresContext); - - virtual const nsStyleStruct* GetStyleData(nsStyleStructID aSID); - virtual nsStyleStruct* GetMutableStyleData(nsStyleStructID aSID); - - virtual void ForceUnique(void); - virtual void RecalcAutomaticData(nsIPresContext* aPresContext); - - virtual void List(FILE* out, PRInt32 aIndent); - -protected: - void AddChild(StyleContextImpl* aChild); - - StyleContextImpl* mParent; - StyleContextImpl* mChild; - StyleContextImpl* mPrev; - StyleContextImpl* mNext; - - PRUint32 mHashValid: 1; - PRUint32 mHashValue: 31; - nsISupportsArray* mRules; - PRInt32 mDataCode; - - // the style data... - StyleFontImpl mFont; - StyleColorImpl mColor; - StyleSpacingImpl mSpacing; - StyleListImpl mList; - StylePositionImpl mPosition; - StyleTextImpl mText; - StyleDisplayImpl mDisplay; - StyleTableImpl* mTable; - -#ifdef DEBUG_REFS - PRInt32 mInstance; -#endif -}; - -static PRInt32 gLastDataCode; - -#ifdef DEBUG_REFS -static PRInt32 gInstanceCount; -static PRInt32 gInstrument = 6; -#endif - -StyleContextImpl::StyleContextImpl(nsIStyleContext* aParent, - nsISupportsArray* aRules, - nsIPresContext* aPresContext) - : mParent((StyleContextImpl*)aParent), // weak ref - mChild(nsnull), - mRules(aRules), - mDataCode(-1), - mFont(aPresContext->GetDefaultFont()), - mColor(), - mSpacing(), - mList(), - mPosition(), - mText(), - mDisplay(), - mTable(nsnull) -{ - NS_INIT_REFCNT(); - NS_IF_ADDREF(mRules); - - mNext = this; - mPrev = this; - if (nsnull != mParent) { - mParent->AddChild(this); - } - - RemapStyle(aPresContext); - -#ifdef DEBUG_REFS - mInstance = ++gInstanceCount; - fprintf(stdout, "%d of %d + StyleContext\n", mInstance, gInstanceCount); -#endif -} - -StyleContextImpl::~StyleContextImpl() -{ - mParent = nsnull; // weak ref - - if (nsnull != mChild) { - StyleContextImpl* child = mChild; - do { - StyleContextImpl* goner = child; - child = child->mNext; - NS_RELEASE(goner); - } while (child != mChild); - mChild = nsnull; - } - - NS_IF_RELEASE(mRules); - if (nsnull != mTable) { - delete mTable; - mTable = nsnull; - } - -#ifdef DEBUG_REFS - fprintf(stdout, "%d of %d - StyleContext\n", mInstance, gInstanceCount); - --gInstanceCount; -#endif -} - - - -#ifdef DEBUG_REFS -NS_IMPL_QUERY_INTERFACE(StyleContextImpl, kIStyleContextIID) - -nsrefcnt StyleContextImpl::AddRef(void) -{ - if ((gInstrument == -1) || (mInstance == gInstrument)) { - fprintf(stdout, "%d AddRef StyleContext %d\n", mRefCnt + 1, mInstance); - } - return ++mRefCnt; -} - -nsrefcnt StyleContextImpl::Release(void) -{ - if ((gInstrument == -1) || (mInstance == gInstrument)) { - fprintf(stdout, "%d Release StyleContext %d\n", mRefCnt - 1, mInstance); - } - if (--mRefCnt == 0) { - delete this; - return 0; - } - return mRefCnt; -} -#else -NS_IMPL_ISUPPORTS(StyleContextImpl, kIStyleContextIID) -#endif - - - -nsIStyleContext* StyleContextImpl::GetParent(void) const -{ - NS_IF_ADDREF(mParent); - return mParent; -} - -void StyleContextImpl::AddChild(StyleContextImpl* aChild) -{ - if (nsnull == mChild) { - mChild = aChild; - } - else { - aChild->mNext = mChild; - aChild->mPrev = mChild->mPrev; - mChild->mPrev->mNext = aChild; - mChild->mPrev = aChild; - } - NS_ADDREF(aChild); -} - -nsISupportsArray* StyleContextImpl::GetStyleRules(void) const -{ - NS_IF_ADDREF(mRules); - return mRules; -} - -PRInt32 StyleContextImpl::GetStyleRuleCount(void) const -{ - if (nsnull != mRules) { - return mRules->Count(); - } - return 0; -} - -nsIStyleContext* StyleContextImpl::FindChildWithRules(nsISupportsArray* aRules) -{ - nsIStyleContext* result = nsnull; - - if (nsnull != mChild) { - StyleContextImpl* child = mChild; - PRInt32 ruleCount = aRules->Count(); - do { - if ((0 == child->mDataCode) && // only look at children with un-twiddled data - (child->GetStyleRuleCount() == ruleCount)) { - if (child->mRules->Equals(aRules)) { - result = child; - NS_ADDREF(result); - break; - } - } - child = child->mNext; - } while (child != mChild); - } - return result; -} - - -PRBool StyleContextImpl::Equals(const nsIStyleContext* aOther) const -{ - PRBool result = PR_TRUE; - const StyleContextImpl* other = (StyleContextImpl*)aOther; - - if (other != this) { - if (mParent != other->mParent) { - result = PR_FALSE; - } - else if (mDataCode != other->mDataCode) { - result = PR_FALSE; - } - else { - if ((nsnull != mRules) && (nsnull != other->mRules)) { - result = mRules->Equals(other->mRules); - } - else { - result = PRBool((nsnull == mRules) && (nsnull == other->mRules)); - } - } - } - return result; -} - -PRUint32 StyleContextImpl::HashValue(void) const -{ - if (0 == mHashValid) { - ((StyleContextImpl*)this)->mHashValue = ((nsnull != mParent) ? mParent->HashValue() : 0); - if (nsnull != mRules) { - PRInt32 index = mRules->Count(); - while (0 <= --index) { - nsIStyleRule* rule = (nsIStyleRule*)mRules->ElementAt(index); - PRUint32 hash = rule->HashValue(); - ((StyleContextImpl*)this)->mHashValue ^= (hash & 0x7FFFFFFF); - NS_RELEASE(rule); - } - } - ((StyleContextImpl*)this)->mHashValid = 1; - } - return mHashValue; -} - - -const nsStyleStruct* StyleContextImpl::GetStyleData(nsStyleStructID aSID) -{ - nsStyleStruct* result = nsnull; - - switch (aSID) { - case eStyleStruct_Font: - result = &mFont; - break; - case eStyleStruct_Color: - result = &mColor; - break; - case eStyleStruct_Spacing: - result = &mSpacing; - break; - case eStyleStruct_List: - result = &mList; - break; - case eStyleStruct_Position: - result = &mPosition; - break; - case eStyleStruct_Text: - result = &mText; - break; - case eStyleStruct_Display: - result = &mDisplay; - break; - case eStyleStruct_Table: // this one gets created lazily - if (nsnull == mTable) { - mTable = new StyleTableImpl(); - if (nsnull != mParent) { - if (nsnull != mParent->mTable) { - mTable->ResetFrom(mParent->mTable, nsnull); - } - } - } - result = mTable; - break; - default: - NS_ERROR("Invalid style struct id"); - break; - } - return result; -} - -nsStyleStruct* StyleContextImpl::GetMutableStyleData(nsStyleStructID aSID) -{ - nsStyleStruct* result = nsnull; - - switch (aSID) { - case eStyleStruct_Font: - result = &mFont; - break; - case eStyleStruct_Color: - result = &mColor; - break; - case eStyleStruct_Spacing: - result = &mSpacing; - break; - case eStyleStruct_List: - result = &mList; - break; - case eStyleStruct_Position: - result = &mPosition; - break; - case eStyleStruct_Text: - result = &mText; - break; - case eStyleStruct_Display: - result = &mDisplay; - break; - case eStyleStruct_Table: // this one gets created lazily - if (nsnull == mTable) { - mTable = new StyleTableImpl(); - if (nsnull != mParent) { - if (nsnull != mParent->mTable) { - mTable->ResetFrom(mParent->mTable, nsnull); - } - } - } - result = mTable; - break; - default: - NS_ERROR("Invalid style struct id"); - break; - } - if (nsnull != result) { - if (0 == mDataCode) { - mDataCode = ++gLastDataCode; - } - } - return result; -} - -struct MapStyleData { - MapStyleData(nsIStyleContext* aStyleContext, nsIPresContext* aPresContext) - { - mStyleContext = aStyleContext; - mPresContext = aPresContext; - } - nsIStyleContext* mStyleContext; - nsIPresContext* mPresContext; -}; - -PRBool MapStyleRule(nsISupports* aRule, void* aData) -{ - nsIStyleRule* rule = (nsIStyleRule*)aRule; - MapStyleData* data = (MapStyleData*)aData; - rule->MapStyleInto(data->mStyleContext, data->mPresContext); - return PR_TRUE; -} - -void StyleContextImpl::RemapStyle(nsIPresContext* aPresContext) -{ - mDataCode = -1; - if (nsnull != mParent) { - mFont.ResetFrom(&(mParent->mFont), aPresContext); - mColor.ResetFrom(&(mParent->mColor), aPresContext); - mSpacing.ResetFrom(&(mParent->mSpacing), aPresContext); - mList.ResetFrom(&(mParent->mList), aPresContext); - mText.ResetFrom(&(mParent->mText), aPresContext); - mPosition.ResetFrom(&(mParent->mPosition), aPresContext); - mDisplay.ResetFrom(&(mParent->mDisplay), aPresContext); - } - else { - mFont.ResetFrom(nsnull, aPresContext); - mColor.ResetFrom(nsnull, aPresContext); - mSpacing.ResetFrom(nsnull, aPresContext); - mList.ResetFrom(nsnull, aPresContext); - mText.ResetFrom(nsnull, aPresContext); - mPosition.ResetFrom(nsnull, aPresContext); - mDisplay.ResetFrom(nsnull, aPresContext); - } - - if ((nsnull != mRules) && (0 < mRules->Count())) { - MapStyleData data(this, aPresContext); - mRules->EnumerateBackwards(MapStyleRule, &data); - } - if (-1 == mDataCode) { - mDataCode = 0; - } -} - -void StyleContextImpl::ForceUnique(void) -{ - if (mDataCode <= 0) { - mDataCode = ++gLastDataCode; - } -} - -void StyleContextImpl::RecalcAutomaticData(nsIPresContext* aPresContext) -{ - mSpacing.RecalcData(aPresContext); -} - -void StyleContextImpl::List(FILE* out, PRInt32 aIndent) -{ - // Indent - PRInt32 index; - for (index = aIndent; --index >= 0; ) fputs(" ", out); - PRInt32 count = mRules->Count(); - if (0 < count) { - fputs("{\n", out); - - for (index = 0; index < count; index++) { - nsIStyleRule* rule = (nsIStyleRule*)mRules->ElementAt(index); - rule->List(out, aIndent + 1); - NS_RELEASE(rule); - } - - for (index = aIndent; --index >= 0; ) fputs(" ", out); - fputs("}\n", out); - } - else { - fputs("{}\n", out); - } - - if (nsnull != mChild) { - StyleContextImpl* child = mChild; - do { - child->List(out, aIndent + 1); - child = child->mNext; - } while (mChild != child); - } -} - -NS_LAYOUT nsresult -NS_NewStyleContext(nsIStyleContext** aInstancePtrResult, - nsIStyleContext* aParentContext, - nsISupportsArray* aRules, - nsIPresContext* aPresContext) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - - StyleContextImpl* context = new StyleContextImpl(aParentContext, aRules, aPresContext); - if (nsnull == context) { - return NS_ERROR_OUT_OF_MEMORY; - } - context->RecalcAutomaticData(aPresContext); - - return context->QueryInterface(kIStyleContextIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/base/src/nsStyleCoord.cpp b/mozilla/layout/base/src/nsStyleCoord.cpp deleted file mode 100644 index 8b88a280084..00000000000 --- a/mozilla/layout/base/src/nsStyleCoord.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsStyleCoord.h" -#include "nsString.h" -#include "nsCRT.h" - -nsStyleCoord::nsStyleCoord(nsStyleUnit aUnit) - : mUnit(aUnit) -{ - NS_ASSERTION(aUnit < eStyleUnit_Percent, "not a valueless unit"); - if (aUnit >= eStyleUnit_Percent) { - mUnit = eStyleUnit_Null; - } - mValue.mInt = 0; -} - -nsStyleCoord::nsStyleCoord(nscoord aValue) - : mUnit(eStyleUnit_Coord) -{ - mValue.mInt = aValue; -} - -nsStyleCoord::nsStyleCoord(PRInt32 aValue, nsStyleUnit aUnit) - : mUnit(aUnit) -{ - //if you want to pass in eStyleUnit_Coord, don't. instead, use the - //constructor just above this one... MMP - NS_ASSERTION((aUnit == eStyleUnit_Proportional) || - (aUnit == eStyleUnit_Enumerated) || - (aUnit == eStyleUnit_Integer), "not an int value"); - if ((aUnit == eStyleUnit_Proportional) || - (aUnit == eStyleUnit_Enumerated) || - (aUnit == eStyleUnit_Integer)) { - mValue.mInt = aValue; - } - else { - mUnit = eStyleUnit_Null; - mValue.mInt = 0; - } -} - -nsStyleCoord::nsStyleCoord(float aValue, nsStyleUnit aUnit) - : mUnit(aUnit) -{ - NS_ASSERTION((aUnit == eStyleUnit_Percent) || - (aUnit == eStyleUnit_Factor), "not a float value"); - if ((aUnit == eStyleUnit_Percent) || - (aUnit == eStyleUnit_Factor)) { - mValue.mFloat = aValue; - } - else { - mUnit = eStyleUnit_Null; - mValue.mInt = 0; - } -} - -nsStyleCoord::nsStyleCoord(const nsStyleCoord& aCopy) - : mUnit(aCopy.mUnit) -{ - if ((eStyleUnit_Percent <= mUnit) && (mUnit < eStyleUnit_Coord)) { - mValue.mFloat = aCopy.mValue.mFloat; - } - else { - mValue.mInt = aCopy.mValue.mInt; - } -} - -nsStyleCoord& nsStyleCoord::operator=(const nsStyleCoord& aCopy) -{ - mUnit = aCopy.mUnit; - if ((eStyleUnit_Percent <= mUnit) && (mUnit < eStyleUnit_Coord)) { - mValue.mFloat = aCopy.mValue.mFloat; - } - else { - mValue.mInt = aCopy.mValue.mInt; - } - return *this; -} - -PRBool nsStyleCoord::operator==(const nsStyleCoord& aOther) const -{ - if (mUnit == aOther.mUnit) { - if ((eStyleUnit_Percent <= mUnit) && (mUnit < eStyleUnit_Coord)) { - return PRBool(mValue.mFloat == aOther.mValue.mFloat); - } - else { - return PRBool(mValue.mInt == aOther.mValue.mInt); - } - } - return PR_FALSE; -} - -void nsStyleCoord::Reset(void) -{ - mUnit = eStyleUnit_Null; - mValue.mInt = 0; -} - -void nsStyleCoord::SetCoordValue(nscoord aValue) -{ - mUnit = eStyleUnit_Coord; - mValue.mInt = aValue; -} - -void nsStyleCoord::SetIntValue(PRInt32 aValue, nsStyleUnit aUnit) -{ - NS_ASSERTION((aUnit == eStyleUnit_Proportional) || - (aUnit == eStyleUnit_Enumerated) || - (aUnit == eStyleUnit_Integer), "not an int value"); - if ((aUnit == eStyleUnit_Proportional) || - (aUnit == eStyleUnit_Enumerated) || - (aUnit == eStyleUnit_Integer)) { - mUnit = aUnit; - mValue.mInt = aValue; - } - else { - Reset(); - } -} - -void nsStyleCoord::SetPercentValue(float aValue) -{ - mUnit = eStyleUnit_Percent; - mValue.mFloat = aValue; -} - -void nsStyleCoord::SetFactorValue(float aValue) -{ - mUnit = eStyleUnit_Factor; - mValue.mFloat = aValue; -} - -void nsStyleCoord::SetNormalValue(void) -{ - mUnit = eStyleUnit_Normal; - mValue.mInt = 0; -} - -void nsStyleCoord::SetAutoValue(void) -{ - mUnit = eStyleUnit_Auto; - mValue.mInt = 0; -} - -void nsStyleCoord::SetInheritValue(void) -{ - mUnit = eStyleUnit_Inherit; - mValue.mInt = 0; -} - -void nsStyleCoord::SetUnionValue(const nsStyleUnion& aValue, nsStyleUnit aUnit) -{ - mUnit = aUnit; -#if PR_BYTES_PER_INT == PR_BYTES_PER_FLOAT - mValue.mInt = aValue.mInt; -#else - nsCRT::memcpy(&mValue, &aValue, sizeof(nsStyleUnion)); -#endif -} - -void nsStyleCoord::AppendToString(nsString& aBuffer) const -{ - if ((eStyleUnit_Percent <= mUnit) && (mUnit < eStyleUnit_Coord)) { - aBuffer.Append(mValue.mFloat); - } - else if ((eStyleUnit_Coord == mUnit) || - (eStyleUnit_Proportional == mUnit) || - (eStyleUnit_Enumerated == mUnit) || - (eStyleUnit_Integer == mUnit)) { - aBuffer.Append(mValue.mInt, 10); - aBuffer.Append("[0x"); - aBuffer.Append(mValue.mInt, 16); - aBuffer.Append(']'); - } - - switch (mUnit) { - case eStyleUnit_Null: aBuffer.Append("Null"); break; - case eStyleUnit_Coord: aBuffer.Append("tw"); break; - case eStyleUnit_Percent: aBuffer.Append("%"); break; - case eStyleUnit_Factor: aBuffer.Append("f"); break; - case eStyleUnit_Normal: aBuffer.Append("Normal"); break; - case eStyleUnit_Auto: aBuffer.Append("Auto"); break; - case eStyleUnit_Inherit: aBuffer.Append("Inherit"); break; - case eStyleUnit_Proportional: aBuffer.Append("*"); break; - case eStyleUnit_Enumerated: aBuffer.Append("enum"); break; - case eStyleUnit_Integer: aBuffer.Append("int"); break; - } - aBuffer.Append(' '); -} - -void nsStyleCoord::ToString(nsString& aBuffer) const -{ - aBuffer.Truncate(); - AppendToString(aBuffer); -} - - - - -nsStyleSides::nsStyleSides(void) -{ - nsCRT::memset(this, 0x00, sizeof(nsStyleSides)); -} - -void nsStyleSides::Reset(void) -{ - nsCRT::memset(this, 0x00, sizeof(nsStyleSides)); -} - -void nsStyleSides::AppendToString(nsString& aBuffer) const -{ - nsStyleCoord temp; - - GetLeft(temp); - aBuffer.Append("left: "); - temp.AppendToString(aBuffer); - - GetTop(temp); - aBuffer.Append("top: "); - temp.AppendToString(aBuffer); - - GetRight(temp); - aBuffer.Append("right: "); - temp.AppendToString(aBuffer); - - GetBottom(temp); - aBuffer.Append("bottom: "); - temp.AppendToString(aBuffer); -} - -void nsStyleSides::ToString(nsString& aBuffer) const -{ - aBuffer.Truncate(); - AppendToString(aBuffer); -} - diff --git a/mozilla/layout/base/src/nsStyleSet.cpp b/mozilla/layout/base/src/nsStyleSet.cpp deleted file mode 100644 index 90c5be7199e..00000000000 --- a/mozilla/layout/base/src/nsStyleSet.cpp +++ /dev/null @@ -1,819 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIStyleSet.h" -#include "nsIStyleSheet.h" -#include "nsIStyleRule.h" -#include "nsIStyleContext.h" -#include "nsISupportsArray.h" -#include "nsIFrame.h" -#include "nsHashtable.h" - -static NS_DEFINE_IID(kIStyleSetIID, NS_ISTYLE_SET_IID); - -class ContextKey : public nsHashKey { -public: - ContextKey(nsIStyleContext* aContext); - ContextKey(nsIStyleContext* aParent, nsISupportsArray* aRules); - virtual ~ContextKey(void); - - void SetContext(nsIStyleContext* aContext); - - PRBool Equals(const nsHashKey* aOther) const; - PRUint32 HashValue(void) const; - nsHashKey* Clone(void) const; - -private: - ContextKey(void); - ContextKey(const ContextKey& aCopy); - ContextKey& operator=(const ContextKey& aCopy) const; - -protected: - nsIStyleContext* mContext; - nsIStyleContext* mParent; - nsISupportsArray* mRules; -}; - -ContextKey::ContextKey(nsIStyleContext* aContext) - : mContext(aContext), - mParent(nsnull), - mRules(nsnull) -{ - NS_IF_ADDREF(mContext); -} - -ContextKey::ContextKey(nsIStyleContext* aParent, nsISupportsArray* aRules) - : mContext(nsnull), - mParent(aParent), - mRules(aRules) -{ - NS_IF_ADDREF(mParent); - NS_IF_ADDREF(mRules); -} - -ContextKey::ContextKey(const ContextKey& aCopy) - : mContext(aCopy.mContext), - mParent(aCopy.mParent), - mRules(aCopy.mRules) -{ - NS_IF_ADDREF(mContext); - NS_IF_ADDREF(mParent); - NS_IF_ADDREF(mRules); -} - -ContextKey::~ContextKey(void) -{ - NS_IF_RELEASE(mContext); - NS_IF_RELEASE(mParent); - NS_IF_RELEASE(mRules); -} - -void ContextKey::SetContext(nsIStyleContext* aContext) -{ - if (aContext != mContext) { - NS_IF_RELEASE(mContext); - mContext = aContext; - NS_IF_ADDREF(mContext); - } - NS_IF_RELEASE(mParent); - NS_IF_RELEASE(mRules); -} - -PRBool ContextKey::Equals(const nsHashKey* aOther) const -{ - PRBool result = PR_TRUE; - const ContextKey* other = (const ContextKey*)aOther; - - if (other != this) { - if ((nsnull == mContext) || (nsnull == other->mContext) || (mContext != other->mContext)) { - nsIStyleContext* otherParent = other->mParent; - if ((nsnull == otherParent) && (nsnull != other->mContext)) { - otherParent = other->mContext->GetParent(); - } - else { - NS_IF_ADDREF(otherParent); // simulate the above addref - } - - if (mParent == otherParent) { - nsISupportsArray* otherRules = other->mRules; - if ((nsnull == otherRules) && (nsnull != other->mContext)) { - otherRules = other->mContext->GetStyleRules(); - } - else { - NS_IF_ADDREF(otherRules); // simulate the above addref - } - if ((nsnull != mRules) && (nsnull != otherRules)) { - result = mRules->Equals(otherRules); - } - else { - result = PRBool((nsnull == mRules) && (nsnull == otherRules)); - } - NS_IF_RELEASE(otherRules); - } - else { - result = PR_FALSE; - } - NS_IF_RELEASE(otherParent); - } - } - return result; -} - -PRUint32 ContextKey::HashValue(void) const -{ - if (nsnull != mContext) { - return mContext->HashValue(); - } - // we don't have a context yet, compute it like it would - PRUint32 hashValue = ((nsnull != mParent) ? mParent->HashValue() : 0); - if (nsnull != mRules) { - PRInt32 index = mRules->Count(); - while (0 <= --index) { - nsIStyleRule* rule = (nsIStyleRule*)mRules->ElementAt(index); - PRUint32 hash = rule->HashValue(); - hashValue ^= (hash & 0x7FFFFFFF); - NS_RELEASE(rule); - } - } - return hashValue; -} - -nsHashKey* ContextKey::Clone(void) const -{ - return new ContextKey(*this); -} - - -class StyleSetImpl : public nsIStyleSet { -public: - StyleSetImpl(); - - NS_DECL_ISUPPORTS - - virtual void AppendOverrideStyleSheet(nsIStyleSheet* aSheet); - virtual void InsertOverrideStyleSheetAfter(nsIStyleSheet* aSheet, - nsIStyleSheet* aAfterSheet); - virtual void InsertOverrideStyleSheetBefore(nsIStyleSheet* aSheet, - nsIStyleSheet* aBeforeSheet); - virtual void RemoveOverrideStyleSheet(nsIStyleSheet* aSheet); - virtual PRInt32 GetNumberOfOverrideStyleSheets(); - virtual nsIStyleSheet* GetOverrideStyleSheetAt(PRInt32 aIndex); - - virtual void AppendDocStyleSheet(nsIStyleSheet* aSheet); - virtual void InsertDocStyleSheetAfter(nsIStyleSheet* aSheet, - nsIStyleSheet* aAfterSheet); - virtual void InsertDocStyleSheetBefore(nsIStyleSheet* aSheet, - nsIStyleSheet* aBeforeSheet); - virtual void RemoveDocStyleSheet(nsIStyleSheet* aSheet); - virtual PRInt32 GetNumberOfDocStyleSheets(); - virtual nsIStyleSheet* GetDocStyleSheetAt(PRInt32 aIndex); - - virtual void AppendBackstopStyleSheet(nsIStyleSheet* aSheet); - virtual void InsertBackstopStyleSheetAfter(nsIStyleSheet* aSheet, - nsIStyleSheet* aAfterSheet); - virtual void InsertBackstopStyleSheetBefore(nsIStyleSheet* aSheet, - nsIStyleSheet* aBeforeSheet); - virtual void RemoveBackstopStyleSheet(nsIStyleSheet* aSheet); - virtual PRInt32 GetNumberOfBackstopStyleSheets(); - virtual nsIStyleSheet* GetBackstopStyleSheetAt(PRInt32 aIndex); - - virtual nsIStyleContext* ResolveStyleFor(nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE); - - virtual nsIStyleContext* ResolvePseudoStyleFor(nsIPresContext* aPresContext, - nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE); - - virtual nsIStyleContext* ProbePseudoStyleFor(nsIPresContext* aPresContext, - nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique = PR_FALSE); - - // xxx style rules enumeration - - virtual void List(FILE* out = stdout, PRInt32 aIndent = 0); - -private: - // These are not supported and are not implemented! - StyleSetImpl(const StyleSetImpl& aCopy); - StyleSetImpl& operator=(const StyleSetImpl& aCopy); - -protected: - virtual ~StyleSetImpl(); - PRBool EnsureArray(nsISupportsArray** aArray); - nsIStyleContext* GetContext(nsIPresContext* aPresContext, nsIFrame* aParentFrame, - nsIStyleContext* aParentContext, nsISupportsArray* aRules, - PRBool aForceUnique); - PRInt32 RulesMatching(nsISupportsArray* aSheets, - nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aParentFrame, - nsISupportsArray* aResults); - PRInt32 RulesMatching(nsISupportsArray* aSheets, - nsIPresContext* aPresContext, - nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - nsISupportsArray* aResults); - void List(FILE* out, PRInt32 aIndent, nsISupportsArray* aSheets); - void ListContexts(nsIStyleContext* aRootContext, FILE* out, PRInt32 aIndent); - - nsISupportsArray* mOverrideSheets; - nsISupportsArray* mDocSheets; - nsISupportsArray* mBackstopSheets; - nsHashtable mStyleContexts; -}; - - -StyleSetImpl::StyleSetImpl() - : mOverrideSheets(nsnull), - mDocSheets(nsnull), - mBackstopSheets(nsnull) -{ - NS_INIT_REFCNT(); -} - -PRBool ReleaseContext(nsHashKey *aKey, void *aData) -{ - ((nsIStyleContext*)aData)->Release(); - return PR_TRUE; -} - -StyleSetImpl::~StyleSetImpl() -{ - NS_IF_RELEASE(mOverrideSheets); - NS_IF_RELEASE(mDocSheets); - NS_IF_RELEASE(mBackstopSheets); - mStyleContexts.Enumerate(ReleaseContext); -} - -NS_IMPL_ISUPPORTS(StyleSetImpl, kIStyleSetIID) - -PRBool StyleSetImpl::EnsureArray(nsISupportsArray** aArray) -{ - if (nsnull == *aArray) { - if (NS_OK != NS_NewISupportsArray(aArray)) { - return PR_FALSE; - } - } - return PR_TRUE; -} - -// ----- Override sheets - -void StyleSetImpl::AppendOverrideStyleSheet(nsIStyleSheet* aSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - if (EnsureArray(&mOverrideSheets)) { - mOverrideSheets->AppendElement(aSheet); - } -} - -void StyleSetImpl::InsertOverrideStyleSheetAfter(nsIStyleSheet* aSheet, - nsIStyleSheet* aAfterSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - if (EnsureArray(&mOverrideSheets)) { - PRInt32 index = mOverrideSheets->IndexOf(aAfterSheet); - mOverrideSheets->InsertElementAt(aSheet, ++index); - } -} - -void StyleSetImpl::InsertOverrideStyleSheetBefore(nsIStyleSheet* aSheet, - nsIStyleSheet* aBeforeSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - if (EnsureArray(&mOverrideSheets)) { - PRInt32 index = mOverrideSheets->IndexOf(aBeforeSheet); - mOverrideSheets->InsertElementAt(aSheet, ((-1 < index) ? index : 0)); - } -} - -void StyleSetImpl::RemoveOverrideStyleSheet(nsIStyleSheet* aSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - - if (nsnull != mOverrideSheets) { - mOverrideSheets->RemoveElement(aSheet); - } -} - -PRInt32 StyleSetImpl::GetNumberOfOverrideStyleSheets() -{ - if (nsnull != mOverrideSheets) { - return mOverrideSheets->Count(); - } - return 0; -} - -nsIStyleSheet* StyleSetImpl::GetOverrideStyleSheetAt(PRInt32 aIndex) -{ - nsIStyleSheet* sheet = nsnull; - if (nsnull == mOverrideSheets) { - sheet = (nsIStyleSheet*)mOverrideSheets->ElementAt(aIndex); - } - return sheet; -} - -// -------- Doc Sheets - -void StyleSetImpl::AppendDocStyleSheet(nsIStyleSheet* aSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - if (EnsureArray(&mDocSheets)) { - mDocSheets->AppendElement(aSheet); - } -} - -void StyleSetImpl::InsertDocStyleSheetAfter(nsIStyleSheet* aSheet, - nsIStyleSheet* aAfterSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - if (EnsureArray(&mDocSheets)) { - PRInt32 index = mDocSheets->IndexOf(aAfterSheet); - mDocSheets->InsertElementAt(aSheet, ++index); - } -} - -void StyleSetImpl::InsertDocStyleSheetBefore(nsIStyleSheet* aSheet, - nsIStyleSheet* aBeforeSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - if (EnsureArray(&mDocSheets)) { - PRInt32 index = mDocSheets->IndexOf(aBeforeSheet); - mDocSheets->InsertElementAt(aSheet, ((-1 < index) ? index : 0)); - } -} - -void StyleSetImpl::RemoveDocStyleSheet(nsIStyleSheet* aSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - - if (nsnull != mDocSheets) { - mDocSheets->RemoveElement(aSheet); - } -} - -PRInt32 StyleSetImpl::GetNumberOfDocStyleSheets() -{ - if (nsnull != mDocSheets) { - return mDocSheets->Count(); - } - return 0; -} - -nsIStyleSheet* StyleSetImpl::GetDocStyleSheetAt(PRInt32 aIndex) -{ - nsIStyleSheet* sheet = nsnull; - if (nsnull == mDocSheets) { - sheet = (nsIStyleSheet*)mDocSheets->ElementAt(aIndex); - } - return sheet; -} - -// ------ backstop sheets - -void StyleSetImpl::AppendBackstopStyleSheet(nsIStyleSheet* aSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - if (EnsureArray(&mBackstopSheets)) { - mBackstopSheets->AppendElement(aSheet); - } -} - -void StyleSetImpl::InsertBackstopStyleSheetAfter(nsIStyleSheet* aSheet, - nsIStyleSheet* aAfterSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - if (EnsureArray(&mBackstopSheets)) { - PRInt32 index = mBackstopSheets->IndexOf(aAfterSheet); - mBackstopSheets->InsertElementAt(aSheet, ++index); - } -} - -void StyleSetImpl::InsertBackstopStyleSheetBefore(nsIStyleSheet* aSheet, - nsIStyleSheet* aBeforeSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - if (EnsureArray(&mBackstopSheets)) { - PRInt32 index = mBackstopSheets->IndexOf(aBeforeSheet); - mBackstopSheets->InsertElementAt(aSheet, ((-1 < index) ? index : 0)); - } -} - -void StyleSetImpl::RemoveBackstopStyleSheet(nsIStyleSheet* aSheet) -{ - NS_PRECONDITION(nsnull != aSheet, "null arg"); - - if (nsnull != mBackstopSheets) { - mBackstopSheets->RemoveElement(aSheet); - } -} - -PRInt32 StyleSetImpl::GetNumberOfBackstopStyleSheets() -{ - if (nsnull != mBackstopSheets) { - return mBackstopSheets->Count(); - } - return 0; -} - -nsIStyleSheet* StyleSetImpl::GetBackstopStyleSheetAt(PRInt32 aIndex) -{ - nsIStyleSheet* sheet = nsnull; - if (nsnull == mBackstopSheets) { - sheet = (nsIStyleSheet*)mBackstopSheets->ElementAt(aIndex); - } - return sheet; -} - -PRInt32 StyleSetImpl::RulesMatching(nsISupportsArray* aSheets, - nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aParentFrame, - nsISupportsArray* aResults) -{ - PRInt32 ruleCount = 0; - - if (nsnull != aSheets) { - PRInt32 sheetCount = aSheets->Count(); - PRInt32 index; - for (index = 0; index < sheetCount; index++) { - nsIStyleSheet* sheet = (nsIStyleSheet*)aSheets->ElementAt(index); - ruleCount += sheet->RulesMatching(aPresContext, aContent, aParentFrame, - aResults); - NS_RELEASE(sheet); - } - } - return ruleCount; -} - -nsIStyleContext* StyleSetImpl::GetContext(nsIPresContext* aPresContext, nsIFrame* aParentFrame, - nsIStyleContext* aParentContext, nsISupportsArray* aRules, - PRBool aForceUnique) -{ - nsIStyleContext* result; - - if ((PR_FALSE == aForceUnique) && - (nsnull != aParentContext) && (0 == aRules->Count()) && - (0 == aParentContext->GetStyleRuleCount())) { - // this and parent are empty - result = aParentContext; - NS_ADDREF(result); // add ref for the caller -//fprintf(stdout, "."); - } - else { -#if USE_CONTEXT_HASH - // check for cached ruleSet to context or create - ContextKey tempKey(aParentContext, aRules); - if (PR_FALSE == aForceUnique) { - result = (nsIStyleContext*)mStyleContexts.Get(&tempKey); - } else { - result = nsnull; - } - if (nsnull == result) { - if (NS_OK == NS_NewStyleContext(&result, aParentContext, aRules, aPresContext)) { - if (PR_TRUE == aForceUnique) { - result->ForceUnique(); - } - tempKey.SetContext(result); - mStyleContexts.Put(&tempKey, result); // hashtable clones key, so this is OK (table gets first ref) -//fprintf(stdout, "+"); - } - } - else { -//fprintf(stdout, "-"); - } - NS_ADDREF(result); // add ref for the caller -#else - if ((PR_FALSE == aForceUnique) && (nsnull != aParentContext)) { - result = aParentContext->FindChildWithRules(aRules); - } - else { - result = nsnull; - } - if (nsnull == result) { - if (NS_OK == NS_NewStyleContext(&result, aParentContext, aRules, aPresContext)) { - if (PR_TRUE == aForceUnique) { - result->ForceUnique(); - } - } -//fprintf(stdout, "+"); - } - else { -//fprintf(stdout, "-"); - } -#endif - } - return result; -} - -nsIStyleContext* StyleSetImpl::ResolveStyleFor(nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aParentFrame, - PRBool aForceUnique) -{ - nsIStyleContext* result = nsnull; - nsIStyleContext* parentContext = nsnull; - - if (nsnull != aParentFrame) { - aParentFrame->GetStyleContext(aPresContext, parentContext); - NS_ASSERTION(nsnull != parentContext, "parent must have style context"); - } - - // want to check parent frame's context for cached child context first - - // then do a brute force rule search - - nsISupportsArray* rules = nsnull; - if (NS_OK == NS_NewISupportsArray(&rules)) { - PRInt32 ruleCount = RulesMatching(mOverrideSheets, aPresContext, aContent, aParentFrame, rules); - ruleCount += RulesMatching(mDocSheets, aPresContext, aContent, aParentFrame, rules); - ruleCount += RulesMatching(mBackstopSheets, aPresContext, aContent, aParentFrame, rules); - - result = GetContext(aPresContext, aParentFrame, parentContext, rules, aForceUnique); - - NS_RELEASE(rules); - } - - NS_IF_RELEASE(parentContext); - - return result; -} - - -PRInt32 StyleSetImpl::RulesMatching(nsISupportsArray* aSheets, - nsIPresContext* aPresContext, - nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - nsISupportsArray* aResults) -{ - PRInt32 ruleCount = 0; - - if (nsnull != aSheets) { - PRInt32 sheetCount = aSheets->Count(); - PRInt32 index; - for (index = 0; index < sheetCount; index++) { - nsIStyleSheet* sheet = (nsIStyleSheet*)aSheets->ElementAt(index); - ruleCount += sheet->RulesMatching(aPresContext, aPseudoTag, aParentFrame, - aResults); - NS_RELEASE(sheet); - } - } - return ruleCount; -} - -nsIStyleContext* StyleSetImpl::ResolvePseudoStyleFor(nsIPresContext* aPresContext, - nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique) -{ - nsIStyleContext* result = nsnull; - nsIStyleContext* parentContext = nsnull; - - if (nsnull != aParentFrame) { - aParentFrame->GetStyleContext(aPresContext, parentContext); - NS_ASSERTION(nsnull != parentContext, "parent must have style context"); - } - - // want to check parent frame's context for cached child context first - - // then do a brute force rule search - - nsISupportsArray* rules = nsnull; - if (NS_OK == NS_NewISupportsArray(&rules)) { - PRInt32 ruleCount = RulesMatching(mOverrideSheets, aPresContext, aPseudoTag, aParentFrame, rules); - ruleCount += RulesMatching(mDocSheets, aPresContext, aPseudoTag, aParentFrame, rules); - ruleCount += RulesMatching(mBackstopSheets, aPresContext, aPseudoTag, aParentFrame, rules); - - result = GetContext(aPresContext, aParentFrame, parentContext, rules, aForceUnique); - - NS_RELEASE(rules); - } - - NS_IF_RELEASE(parentContext); - - return result; -} - -nsIStyleContext* StyleSetImpl::ProbePseudoStyleFor(nsIPresContext* aPresContext, - nsIAtom* aPseudoTag, - nsIFrame* aParentFrame, - PRBool aForceUnique) -{ - nsIStyleContext* result = nsnull; - nsIStyleContext* parentContext = nsnull; - - if (nsnull != aParentFrame) { - aParentFrame->GetStyleContext(aPresContext, parentContext); - NS_ASSERTION(nsnull != parentContext, "parent must have style context"); - } - - // want to check parent frame's context for cached child context first - - // then do a brute force rule search - - nsISupportsArray* rules = nsnull; - if (NS_OK == NS_NewISupportsArray(&rules)) { - PRInt32 ruleCount = RulesMatching(mOverrideSheets, aPresContext, aPseudoTag, aParentFrame, rules); - ruleCount += RulesMatching(mDocSheets, aPresContext, aPseudoTag, aParentFrame, rules); - ruleCount += RulesMatching(mBackstopSheets, aPresContext, aPseudoTag, aParentFrame, rules); - - if (0 < ruleCount) { - result = GetContext(aPresContext, aParentFrame, parentContext, rules, aForceUnique); - } - - NS_RELEASE(rules); - } - - NS_IF_RELEASE(parentContext); - - return result; -} - -// xxx style rules enumeration - -void StyleSetImpl::List(FILE* out, PRInt32 aIndent, nsISupportsArray* aSheets) -{ - PRInt32 count = ((nsnull != aSheets) ? aSheets->Count() : 0); - - for (PRInt32 index = 0; index < count; index++) { - nsIStyleSheet* sheet = (nsIStyleSheet*)aSheets->ElementAt(index); - sheet->List(out, aIndent); - fputs("\n", out); - NS_RELEASE(sheet); - } -} - -void StyleSetImpl::List(FILE* out, PRInt32 aIndent) -{ - List(out, aIndent, mOverrideSheets); - List(out, aIndent, mDocSheets); - List(out, aIndent, mBackstopSheets); -} - -struct ContextNode { - nsIStyleContext* mContext; - ContextNode* mNext; - ContextNode* mChild; - ContextNode(nsIStyleContext* aContext) - { - mContext = aContext; - mNext = nsnull; - mChild = nsnull; - } - ~ContextNode(void) - { - if (nsnull != mNext) { - delete mNext; - } - if (nsnull != mChild) { - delete mChild; - } - } -}; - -static ContextNode* gRootNode; - -static ContextNode* FindNode(nsIStyleContext* aContext, ContextNode* aStart) -{ - ContextNode* node = aStart; - while (nsnull != node) { - if (node->mContext == aContext) { - return node; - } - if (nsnull != node->mChild) { - ContextNode* result = FindNode(aContext, node->mChild); - if (nsnull != result) { - return result; - } - } - node = node->mNext; - } - return nsnull; -} - -PRBool GatherContexts(nsHashKey *aKey, void *aData) -{ - PRBool result = PR_TRUE; - - nsIStyleContext* context = (nsIStyleContext*)aData; - nsIStyleContext* parent = context->GetParent(); - ContextNode* node = new ContextNode(context); - - if (nsnull == gRootNode) { - gRootNode = node; - } - else { - if (nsnull == parent) { // found real root, replace temp - node->mNext = gRootNode; // orphan the old root - gRootNode = node; - } - else { - ContextNode* parentNode = FindNode(parent, gRootNode); - if (nsnull == parentNode) { // hang orhpans off root - node->mNext = gRootNode->mNext; - gRootNode->mNext = node; - } - else { - node->mNext = parentNode->mChild; - parentNode->mChild = node; - } - } - } - // graft orphans - ContextNode* prevOrphan = nsnull; - ContextNode* orphan = gRootNode; - while (nsnull != orphan) { - nsIStyleContext* orphanParent = orphan->mContext->GetParent(); - if (orphanParent == context) { // found our child - if (orphan == gRootNode) { - gRootNode = orphan->mNext; - orphan->mNext = node->mChild; - node->mChild = orphan; - orphan = gRootNode; - } - else { - ContextNode* foundling = orphan; - orphan = orphan->mNext; - prevOrphan->mNext = orphan; - foundling->mNext = node->mChild; - node->mChild = foundling; - } - } - else { - prevOrphan = orphan; - orphan = orphan->mNext; - } - NS_IF_RELEASE(orphanParent); - } - NS_IF_RELEASE(parent); - return result; -} - -static PRInt32 ListNode(ContextNode* aNode, FILE* out, PRInt32 aIndent) -{ - PRInt32 count = 0; - ContextNode* node = aNode; - while (nsnull != node) { - node->mContext->List(out, aIndent); - count++; - if (nsnull != node->mChild) { - nsIStyleContext* childParent = node->mChild->mContext->GetParent(); - NS_ASSERTION(childParent == node->mContext, "broken graph"); - NS_RELEASE(childParent); - count += ListNode(node->mChild, out, aIndent + 1); - } - node = node->mNext; - } - return count; -} - -void StyleSetImpl::ListContexts(nsIStyleContext* aRootContext, FILE* out, PRInt32 aIndent) -{ -#if USE_CONTEXT_HASH - mStyleContexts.Enumerate(GatherContexts); - NS_ASSERTION(gRootNode->mNext == nsnull, "dangling orphan"); - - PRInt32 listCount = ListNode(gRootNode, out, aIndent); - NS_ASSERTION(listCount == mStyleContexts.Count(), "graph incomplete"); - - delete gRootNode; - gRootNode = nsnull; -#else - aRootContext->List(out, aIndent); -#endif -} - - -NS_LAYOUT nsresult -NS_NewStyleSet(nsIStyleSet** aInstancePtrResult) -{ - if (aInstancePtrResult == nsnull) { - return NS_ERROR_NULL_POINTER; - } - - StyleSetImpl *it = new StyleSetImpl(); - - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - - return it->QueryInterface(kIStyleSetIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/base/tests/Makefile b/mozilla/layout/base/tests/Makefile deleted file mode 100644 index 12358087090..00000000000 --- a/mozilla/layout/base/tests/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../../.. - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/base/tests/TestContainerFrame.cpp b/mozilla/layout/base/tests/TestContainerFrame.cpp deleted file mode 100644 index 0af4c88d086..00000000000 --- a/mozilla/layout/base/tests/TestContainerFrame.cpp +++ /dev/null @@ -1,737 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include -#include "nscore.h" -#include "nsCRT.h" -#include "nscoord.h" -#include "nsContainerFrame.h" -#include "nsIContent.h" - -static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID); - -/////////////////////////////////////////////////////////////////////////////// -// Helper functions - -// Compute the number of frames in the list -static PRInt32 -LengthOf(nsIFrame* aChildList) -{ - PRInt32 result = 0; - - while (nsnull != aChildList) { - aChildList->GetNextSibling(aChildList); - result++; - } - - return result; -} - -/////////////////////////////////////////////////////////////////////////////// -// - -class SimpleContent : public nsIContent { -public: - SimpleContent(); - - NS_IMETHOD GetDocument(nsIDocument*& adoc) const { - adoc = mDocument; - return NS_OK; - } - - void SetDocument(nsIDocument* aDocument) {mDocument = aDocument;} - - nsIContent* GetParent() const { return nsnull; } - void SetParent(nsIContent* aParent) {} - - PRBool CanContainChildren() const {return PR_FALSE;} - PRInt32 ChildCount() const {return 0;} - nsIContent* ChildAt(PRInt32 aIndex) const {return nsnull;} - PRInt32 IndexOf(nsIContent* aPossibleChild) const {return -1;} - NS_IMETHOD InsertChildAt(nsIContent* aKid, PRInt32 aIndex, - PRBool aNotify) { return NS_OK; } - NS_IMETHOD ReplaceChildAt(nsIContent* aKid, PRInt32 aIndex, - PRBool aNotify){ return NS_OK; } - NS_IMETHOD AppendChild(nsIContent* aKid, PRBool aNotify) {return NS_OK;} - NS_IMETHOD RemoveChildAt(PRInt32 aIndex, PRBool aNotify) {return NS_OK;} - - NS_IMETHOD IsSynthetic(PRBool& aResult) { - aResult = PR_FALSE; - return NS_OK; - } - - nsIAtom* GetTag() const {return nsnull;} - void SetAttribute(const nsString& aName,const nsString& aValue) {;} - nsContentAttr GetAttribute(const nsString& aName, nsString& aRet) const {return eContentAttr_NotThere;} - - nsIContentDelegate* GetDelegate(nsIPresContext* aCX) {return nsnull;} - - void List(FILE* out = stdout, PRInt32 aIndent = 0) const {;} - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const { return NS_OK; } - NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, nsGUIEvent* aEvent, nsIDOMEvent* aDOMEvent, nsEventStatus& aEventStatus) - {return NS_OK;} - - NS_DECL_ISUPPORTS - -protected: - nsIDocument* mDocument; -}; - -SimpleContent::SimpleContent() -{ -} - -NS_IMPL_ISUPPORTS(SimpleContent, kIContentIID); - -/////////////////////////////////////////////////////////////////////////////// -// - -class SimpleContainer : public nsContainerFrame -{ -public: - SimpleContainer(nsIContent* aContent); - - void SetFirstChild(nsIFrame* aChild, PRInt32 aChildCount); - nsIFrame* GetOverflowList() {return mOverflowList;} - void SetOverflowList(nsIFrame* aChildList) {mOverflowList = aChildList;} - - // Allow public access to protected member functions - void PushChildren(nsIFrame* aFromChild, nsIFrame* aPrevSibling, PRBool aLastIsComplete); - PRBool DeleteChildsNextInFlow(nsIFrame* aChild); -}; - -SimpleContainer::SimpleContainer(nsIContent* aContent) - : nsContainerFrame(aContent, nsnull) -{ -} - -// Sets mFirstChild and mChildCount, but not mContentOffset, mContentLength, -// or mLastContentIsComplete -void SimpleContainer::SetFirstChild(nsIFrame* aChild, PRInt32 aChildCount) -{ - mFirstChild = aChild; - mChildCount = aChildCount; - NS_ASSERTION(LengthOf(mFirstChild) == aChildCount, "bad child count argument"); -} - -void SimpleContainer::PushChildren(nsIFrame* aFromChild, nsIFrame* aPrevSibling, PRBool aLastIsComplete) -{ - nsContainerFrame::PushChildren(aFromChild, aPrevSibling, aLastIsComplete); -} - -PRBool SimpleContainer::DeleteChildsNextInFlow(nsIFrame* aChild) -{ - return nsContainerFrame::DeleteChildsNextInFlow(aChild); -} - -/////////////////////////////////////////////////////////////////////////////// -// - -class SimpleSplittableFrame : public nsSplittableFrame { -public: - SimpleSplittableFrame(nsIContent* aContent, nsIFrame* aParent); -}; - -SimpleSplittableFrame::SimpleSplittableFrame(nsIContent* aContent, - nsIFrame* aParent) - : nsSplittableFrame(aContent, aParent) -{ -} - -/////////////////////////////////////////////////////////////////////////////// -// - -// Basic test of the child enumeration member functions -static PRBool -TestChildEnumeration() -{ - // Create a simple test container - SimpleContent* content = new SimpleContent; - SimpleContainer* f = new SimpleContainer(content); - - // Add three child frames - SimpleContent* childContent = new SimpleContent(); - nsFrame* c1; - nsFrame* c2; - nsFrame* c3; - - nsFrame::NewFrame((nsIFrame**)&c1, childContent, f); - nsFrame::NewFrame((nsIFrame**)&c2, childContent, f); - nsFrame::NewFrame((nsIFrame**)&c3, childContent, f); - - c1->SetNextSibling(c2); - c2->SetNextSibling(c3); - f->SetFirstChild(c1, 3); - f->SetLastContentOffset(2); - - // Make sure the child count is correct - PRInt32 childCount; - f->ChildCount(childCount); - if (childCount != 3) { - printf("ChildEnumeration: wrong child count: %d\n", childCount); - return PR_FALSE; - } - - // Test indexing of child frames. nsnull should be returned for index - // values that are out of range - nsIFrame* child; - f->ChildAt(-1, child); - if (nsnull != child) { - printf("ChildEnumeration: child index failed for index < 0\n"); - return PR_FALSE; - } - f->ChildAt(0, child); - if (c1 != child) { - printf("ChildEnumeration: wrong child at index: %d\n", 0); - return PR_FALSE; - } - f->ChildAt(1, child); - if (c2 != child) { - printf("ChildEnumeration: wrong child at index: %d\n", 1); - return PR_FALSE; - } - f->ChildAt(2, child); - if (c3 != child) { - printf("ChildEnumeration: wrong child at index: %d\n", 2); - return PR_FALSE; - } - f->ChildAt(3, child); - if (nsnull != child) { - printf("ChildEnumeration: child index failed for index >= child countn"); - return PR_FALSE; - } - - // Test first and last child member functions - f->FirstChild(child); - if (child != c1) { - printf("ChildEnumeration: wrong first child\n"); - return PR_FALSE; - } - f->LastChild(child); - if (child != c3) { - printf("ChildEnumeration: wrong last child\n"); - return PR_FALSE; - } - - // Test IndexOf() - PRInt32 index; - f->IndexOf(c1, index); - if (index != 0) { - printf("ChildEnumeration: index of c1 failed\n"); - return PR_FALSE; - } - f->IndexOf(c2, index); - if (index != 1) { - printf("ChildEnumeration: index of c2 failed\n"); - return PR_FALSE; - } - f->IndexOf(c3, index); - if (index != 2) { - printf("ChildEnumeration: index of c3 failed\n"); - return PR_FALSE; - } - - return PR_TRUE; -} - -/////////////////////////////////////////////////////////////////////////////// -// - -// Test the push children method -// -// This tests the following: -// 1. pushing children to the overflow list when there's no next-in-flow -// 2. pushing to a next-in-flow that's empty -// 3. pushing to a next-in-flow that isn't empty -static PRBool -TestPushChildren() -{ - // Create a simple test container - SimpleContent* content = new SimpleContent; - SimpleContainer* f = new SimpleContainer(content); - - // Add five child frames - SimpleContent* childContent = new SimpleContent; - nsFrame* c1; - nsFrame* c2; - nsFrame* c3; - nsFrame* c4; - nsFrame* c5; - - nsFrame::NewFrame((nsIFrame**)&c1, childContent, f); - nsFrame::NewFrame((nsIFrame**)&c2, childContent, f); - nsFrame::NewFrame((nsIFrame**)&c3, childContent, f); - nsFrame::NewFrame((nsIFrame**)&c4, childContent, f); - nsFrame::NewFrame((nsIFrame**)&c5, childContent, f); - - c1->SetNextSibling(c2); - c2->SetNextSibling(c3); - c3->SetNextSibling(c4); - c4->SetNextSibling(c5); - f->SetFirstChild(c1, 5); - f->SetLastContentOffset(4); - - /////////////////////////////////////////////////////////////////////////// - // #1 - - // Push the last two children. Since there's no next-in-flow the children - // should be placed on the overflow list - f->PushChildren(c4, c3, PR_TRUE); - - // Verify that the next sibling pointer of c3 has been cleared - nsIFrame* nextSibling; - c3->GetNextSibling(nextSibling); - if (nsnull != nextSibling) { - printf("PushChildren: sibling pointer isn't null\n"); - return PR_FALSE; - } - - // Verify that there are two frames on the overflow list - nsIFrame* overflowList = f->GetOverflowList(); - if ((nsnull == overflowList) || (LengthOf(overflowList) != 2)) { - printf("PushChildren: bad overflow list\n"); - return PR_FALSE; - } - - // and that the children on the overflow still have the same geometric parent - while (nsnull != overflowList) { - nsIFrame* parent; - - overflowList->GetGeometricParent(parent); - if (f != parent) { - printf("PushChildren: bad geometric parent\n"); - return PR_FALSE; - } - - overflowList->GetNextSibling(overflowList); - } - - /////////////////////////////////////////////////////////////////////////// - // #2 - - // Link the overflow list back into the child list - c3->SetNextSibling(f->GetOverflowList()); - f->SetOverflowList(nsnull); - - // Create a continuing frame - SimpleContainer* f1 = new SimpleContainer(content); - - // Link it into the flow - f->SetNextInFlow(f1); - f1->SetPrevInFlow(f); - - // Push the last two children to the next-in-flow which is empty. - f->PushChildren(c4, c3, PR_TRUE); - - // Verify there are two children in f1 - PRInt32 childCount; - f1->ChildCount(childCount); - if (childCount != 2) { - printf("PushChildren: continuing frame bad child count: %d\n", childCount); - return PR_FALSE; - } - - // Verify the content offsets are correct - if (f1->GetFirstContentOffset() != 3) { - printf("PushChildren: continuing frame bad first content offset\n"); - return PR_FALSE; - } - if (f1->GetLastContentOffset() != 4) { - printf("PushChildren: continuing frame bad last content offset\n"); - return PR_FALSE; - } - - // Verify that the first child is correct - nsIFrame* firstChild; - f1->FirstChild(firstChild); - if (c4 != firstChild) { - printf("PushChildren: continuing frame first child is wrong\n"); - return PR_FALSE; - } - - // Verify that the next sibling pointer of c3 has been cleared - c3->GetNextSibling(nextSibling); - if (nsnull != nextSibling) { - printf("PushChildren: sibling pointer isn't null\n"); - return PR_FALSE; - } - - // Verify that the geometric parent and content parent have been changed - f1->FirstChild(firstChild); - while (nsnull != firstChild) { - nsIFrame* parent; - firstChild->GetGeometricParent(parent); - if (f1 != parent) { - printf("PushChildren: bad geometric parent\n"); - return PR_FALSE; - } - - firstChild->GetContentParent(parent); - if (f1 != parent) { - printf("PushChildren: bad content parent\n"); - return PR_FALSE; - } - - firstChild->GetNextSibling(firstChild); - } - - /////////////////////////////////////////////////////////////////////////// - // #3 - - // Test pushing two children to a next-in-flow that already has children - f->PushChildren(c2, c1, PR_TRUE); - - // Verify there are four children in f1 - f1->ChildCount(childCount); - if (childCount != 4) { - printf("PushChildren: continuing frame bad child count: %d\n", childCount); - return PR_FALSE; - } - - // Verify the content offset/length are correct - if (f1->GetFirstContentOffset() != 1) { - printf("PushChildren: continuing frame bad first content offset\n"); - return PR_FALSE; - } - if (f1->GetLastContentOffset() != 4) { - printf("PushChildren: continuing frame bad last content offset\n"); - return PR_FALSE; - } - - // Verify that the first child is correct - f1->FirstChild(firstChild); - if (c2 != firstChild) { - printf("PushChildren: continuing frame first child is wrong\n"); - return PR_FALSE; - } - - // Verify that c3 points to c4 - c3->GetNextSibling(nextSibling); - if (c4 != nextSibling) { - printf("PushChildren: bad sibling pointers\n"); - return PR_FALSE; - } - - return PR_TRUE; -} - -/////////////////////////////////////////////////////////////////////////////// -// - -// Test the delete child's next-in-flow method -// -// This tests the following: -// 1. one next-in-flow in same geometric parent -// a) next-in-flow is parent's last child -// b) next-in-flow is not the parent's last child -// 2. one next-in-flow in different geometric parents -// a) next-in-flow is parent's first and last child -// b) next-in-flow is not the parent's last child -// 3. multiple next-in-flow frames -static PRBool -TestDeleteChildsNext() -{ - // Create two simple test containers - SimpleContent* content = new SimpleContent; - SimpleContainer* f = new SimpleContainer(content); - - // Create two child frames - SimpleContent* childContent = new SimpleContent; - nsFrame* c1 = new SimpleSplittableFrame(childContent, f); - nsFrame* c11 = new SimpleSplittableFrame(childContent, f); - - /////////////////////////////////////////////////////////////////////////// - // #1a - - // Make the child frames siblings and in the same flow - c1->SetNextSibling(c11); - c11->AppendToFlow(c1); - f->SetFirstChild(c1, 2); - - // Delete the next-in-flow - f->DeleteChildsNextInFlow(c1); - - // Verify the child count - PRInt32 childCount; - f->ChildCount(childCount); - if (childCount != 1) { - printf("DeleteNextInFlow: bad child count (#1a): %d\n", childCount); - return PR_FALSE; - } - - // Verify the sibling pointer is null - nsIFrame* nextSibling; - c1->GetNextSibling(nextSibling); - if (nsnull != nextSibling) { - printf("DeleteNextInFlow: bad sibling pointer (#1a):\n"); - return PR_FALSE; - } - - // Verify the next-in-flow pointer is null - nsIFrame* nextInFlow; - c1->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - printf("DeleteNextInFlow: bad next-in-flow (#1a)\n"); - return PR_FALSE; - } - - // Verify the first/last content offsets are still 0 - if ((f->GetFirstContentOffset() != 0) || (f->GetLastContentOffset() != 0)) { - printf("DeleteNextInFlow: bad content mapping (#1a)\n"); - return PR_FALSE; - } - - /////////////////////////////////////////////////////////////////////////// - // #2a - - // Create a second container frame - SimpleContainer* f1 = new SimpleContainer(content); - - // Re-create the continuing child frame - c11 = new SimpleSplittableFrame(childContent, f1); - - // Put the first child in the first container and the continuing child frame in - // the second container - c11->AppendToFlow(c1); - f->SetFirstChild(c1, 1); - f->SetLastContentOffset(0); - f1->SetFirstChild(c11, 1); - - // Link the containers together - f1->AppendToFlow(f); - - // Delete the next-in-flow - f->DeleteChildsNextInFlow(c1); - - // Verify that the second container frame is empty - nsIFrame* firstChild; - - f1->ChildCount(childCount); - f1->FirstChild(firstChild); - if ((childCount != 0) || (firstChild != nsnull)) { - printf("DeleteNextInFlow: continuing frame not empty (#2a)\n"); - return PR_FALSE; - } - - // Verify the next-in-flow pointer is null - c1->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - printf("DeleteNextInFlow: bad next-in-flow (#1b)\n"); - return PR_FALSE; - } - - /////////////////////////////////////////////////////////////////////////// - // #1b - - // Re-create the continuing child frame - c11 = new SimpleSplittableFrame(childContent, f); - - // Create a third child frame - nsFrame* c2 = new SimpleSplittableFrame(childContent, f); - - c1->SetNextSibling(c11); - c11->AppendToFlow(c1); - c11->SetNextSibling(c2); - f->SetFirstChild(c1, 3); - f->SetLastContentOffset(1); - - // Delete the next-in-flow - f->DeleteChildsNextInFlow(c1); - - // Verify the child count - f->ChildCount(childCount); - if (childCount != 2) { - printf("DeleteNextInFlow: bad child count (#1b): %d\n", childCount); - return PR_FALSE; - } - - // Verify the sibling pointer is correct - c1->GetNextSibling(nextSibling); - if (nextSibling != c2) { - printf("DeleteNextInFlow: bad sibling pointer (#1b):\n"); - return PR_FALSE; - } - - // Verify the next-in-flow pointer is correct - c1->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - printf("DeleteNextInFlow: bad next-in-flow (#1b)\n"); - return PR_FALSE; - } - - // Verify the first/last content offsets are correct - if ((f->GetFirstContentOffset() != 0) || (f->GetLastContentOffset() != 1)) { - printf("DeleteNextInFlow: bad content mapping (#1a)\n"); - return PR_FALSE; - } - - /////////////////////////////////////////////////////////////////////////// - // #2b - - // Re-create the continuing frame and the third child frame - c11 = new SimpleSplittableFrame(childContent, f1); - c2 = new SimpleSplittableFrame(childContent, f1); - - // Put the first child in the first container, and the continuing child frame - // and the third frame in the second container - c1->SetNextSibling(nsnull); - c11->AppendToFlow(c1); - f->SetFirstChild(c1, 1); - f->SetLastContentOffset(0); - - c11->SetNextSibling(c2); - f1->SetFirstChild(c11, 2); - f1->SetFirstContentOffset(0); - f1->SetLastContentOffset(1); - - // Link the containers together - f1->AppendToFlow(f); - - // Delete the next-in-flow - f->DeleteChildsNextInFlow(c1); - - // Verify the next-in-flow pointer is null - c1->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - printf("DeleteNextInFlow: bad next-in-flow (#2b)\n"); - return PR_FALSE; - } - - // Verify that the second container frame has one child - f1->ChildCount(childCount); - if (childCount != 1) { - printf("DeleteNextInFlow: continuing frame bad child count (#2b): %d\n", childCount); - return PR_FALSE; - } - - // Verify that the second container's first child is correct - f1->FirstChild(firstChild); - if (firstChild != c2) { - printf("DeleteNextInFlow: continuing frame bad first child (#2b)\n"); - return PR_FALSE; - } - - // Verify the second container's first content offset - if (f1->GetFirstContentOffset() != 1) { - printf("DeleteNextInFlow: continuing frame bad first content offset (#2b): %d\n", - f1->GetFirstContentOffset()); - return PR_FALSE; - } - - /////////////////////////////////////////////////////////////////////////// - // #3 - - // Re-create the continuing frame and the third child frame - c11 = new SimpleSplittableFrame(childContent, f); - c2 = new SimpleSplittableFrame(childContent, f); - - // Create a second continuing frame - SimpleSplittableFrame* c12 = new SimpleSplittableFrame(childContent, f); - - // Put all the child frames in the first container - c1->SetNextSibling(c11); - c11->SetNextSibling(c12); - c12->SetNextSibling(c2); - c11->AppendToFlow(c1); - c12->AppendToFlow(c11); - f->SetFirstChild(c1, 4); - f->SetLastContentOffset(1); - - // Delete the next-in-flow - f->DeleteChildsNextInFlow(c1); - - // Verify the next-in-flow pointer is null - c1->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - printf("DeleteNextInFlow: bad next-in-flow (#3)\n"); - return PR_FALSE; - } - - // Verify the child count is correct - f->ChildCount(childCount); - if (childCount != 2) { - printf("DeleteNextInFlow: bad child count (#3): %d\n", childCount); - return PR_FALSE; - } - - // and the last content offset is still correct - if (f->GetLastContentOffset() != 1) { - printf("DeleteNextInFlow: bad last content offset (#3): %d\n", f->GetLastContentOffset()); - return PR_FALSE; - } - - // Verify the sibling list is correct - c1->GetNextSibling(nextSibling); - if (nextSibling != c2) { - printf("DeleteNextInFlow: bad sibling list (#3)\n"); - return PR_FALSE; - } - c2->GetNextSibling(nextSibling); - if (nextSibling != nsnull) { - printf("DeleteNextInFlow: bad sibling list (#3)\n"); - return PR_FALSE; - } - - // Verify the next-in-flow pointer is null - c1->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - printf("DeleteNextInFlow: bad next-in-flow (#3)\n"); - return PR_FALSE; - } - - return PR_TRUE; -} - -/////////////////////////////////////////////////////////////////////////////// -// - -// Test the container frame being used as a pseudo frame -static PRBool -TestAsPseudo() -{ - return PR_TRUE; -} - -/////////////////////////////////////////////////////////////////////////////// -// - -int main(int argc, char** argv) -{ - // Test the child frame enumeration member functions - if (!TestChildEnumeration()) { - return -1; - } - -#if 0 - // Test the push children method - if (!TestPushChildren()) { - return -1; - } - - // Test the push children method - if (!TestDeleteChildsNext()) { - return -1; - } -#endif - - // Test being used as a pseudo frame - if (!TestAsPseudo()) { - return -1; - } - - return 0; -} diff --git a/mozilla/layout/base/tests/TestSpaceManager.cpp b/mozilla/layout/base/tests/TestSpaceManager.cpp deleted file mode 100644 index 94331a0bd74..00000000000 --- a/mozilla/layout/base/tests/TestSpaceManager.cpp +++ /dev/null @@ -1,761 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include -#include "nscore.h" -#include "nsCRT.h" -#include "nscoord.h" -#include "nsSpaceManager.h" - -class MySpaceManager: public nsSpaceManager { -public: - MySpaceManager(nsIFrame* aFrame) : nsSpaceManager(aFrame) {} - - PRBool TestAddBand(); - PRBool TestAddBandOverlap(); - PRBool TestAddRectToBand(); - PRBool TestRemoveRegion(); - PRBool TestOffsetRegion(); - PRBool TestResizeRectRegion(); - -protected: - struct BandInfo { - nscoord yOffset; - nscoord height; - BandRect* firstRect; - PRIntn numRects; - }; - - struct BandsInfo { - PRIntn numBands; - BandInfo bands[25]; - }; - - void GetBandsInfo(BandsInfo&); -}; - -void MySpaceManager::GetBandsInfo(BandsInfo& aBandsInfo) -{ - aBandsInfo.numBands = 0; - - if (!mBandList.IsEmpty()) { - BandRect* band = mBandList.Head(); - while (nsnull != band) { - BandInfo& info = aBandsInfo.bands[aBandsInfo.numBands]; - - info.yOffset = band->top; - info.height = band->bottom - band->top; - info.firstRect = band; - - aBandsInfo.numBands++; - - // Get the next band, and count the number of rects in this band - info.numRects = 0; - while (info.yOffset == band->top) { - info.numRects++; - - band = band->Next(); - if (band == &mBandList) { - // No bands left - band = nsnull; - break; - } - } - } - } -} - -/////////////////////////////////////////////////////////////////////////////// -// - -// Test of adding a rect region that causes a new band to be created (no -// overlap with an existing band) -// -// This tests the following: -// 1. when there are no existing bands -// 2. adding a new band above the topmost band -// 3. inserting a new band between two existing bands -// 4. adding a new band below the bottommost band -PRBool MySpaceManager::TestAddBand() -{ - PRBool status; - BandsInfo bandsInfo; - - // Clear any existing regions - ClearRegions(); - NS_ASSERTION(mBandList.IsEmpty(), "clear regions failed"); - - ///////////////////////////////////////////////////////////////////////////// - // #1. Add a rect region. Verify the return status, and that a band rect is - // added - status = AddRectRegion((nsIFrame*)0x01, nsRect(10, 100, 100, 100)); - if (PR_FALSE == status) { - printf("TestAddBand: add returned false (#1)\n"); - return PR_FALSE; - } - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 1) { - printf("TestAddBand: wrong number of bands (#1): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if ((bandsInfo.bands[0].yOffset != 100) || (bandsInfo.bands[0].height != 100)) { - printf("TestAddBand: wrong band size (#1)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #2. Add another band rect completely above the first band rect - status = AddRectRegion((nsIFrame*)0x02, nsRect(10, 10, 100, 20)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 2) { - printf("TestAddBand: wrong number of bands (#2): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if ((bandsInfo.bands[0].yOffset != 10) || (bandsInfo.bands[0].height != 20) || - (bandsInfo.bands[1].yOffset != 100) || (bandsInfo.bands[1].height != 100)) { - printf("TestAddBand: wrong band sizes (#2)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #3. Now insert a new band between the two existing bands - status = AddRectRegion((nsIFrame*)0x03, nsRect(10, 40, 100, 30)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 3) { - printf("TestAddBand: wrong number of bands (#3): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if ((bandsInfo.bands[0].yOffset != 10) || (bandsInfo.bands[0].height != 20) || - (bandsInfo.bands[1].yOffset != 40) || (bandsInfo.bands[1].height != 30) || - (bandsInfo.bands[2].yOffset != 100) || (bandsInfo.bands[2].height != 100)) { - printf("TestAddBand: wrong band sizes (#3)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #4. Append a new bottommost band - status = AddRectRegion((nsIFrame*)0x04, nsRect(10, 210, 100, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 4) { - printf("TestAddBand: wrong number of bands (#4): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if ((bandsInfo.bands[0].yOffset != 10) || (bandsInfo.bands[0].height != 20) || - (bandsInfo.bands[1].yOffset != 40) || (bandsInfo.bands[1].height != 30) || - (bandsInfo.bands[2].yOffset != 100) || (bandsInfo.bands[2].height != 100) || - (bandsInfo.bands[3].yOffset != 210) || (bandsInfo.bands[3].height != 100)) { - printf("TestAddBand: wrong band sizes (#4)\n"); - return PR_FALSE; - } - - return PR_TRUE; -} - -// Test of adding a rect region that overlaps an existing band -// -// This tests the following: -// 1. Adding a rect that's above and pertially overlaps an existing band -// 2. Adding a rect that's completely contained by an existing band -// 3. Adding a rect that overlaps and is below an existing band -// 3. Adding a rect that contains an existing band -PRBool MySpaceManager::TestAddBandOverlap() -{ - PRBool status; - BandsInfo bandsInfo; - - // Clear any existing regions - ClearRegions(); - NS_ASSERTION(mBandList.IsEmpty(), "clear regions failed"); - - // Add a new band - status = AddRectRegion((nsIFrame*)0x01, nsRect(100, 100, 100, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - - ///////////////////////////////////////////////////////////////////////////// - // #1. Add a rect region that's above and partially overlaps an existing band - status = AddRectRegion((nsIFrame*)0x02, nsRect(10, 50, 50, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 3) { - printf("TestAddBandOverlap: wrong number of bands (#1): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if ((bandsInfo.bands[0].yOffset != 50) || (bandsInfo.bands[0].height != 50) || - (bandsInfo.bands[1].yOffset != 100) || (bandsInfo.bands[1].height != 50) || - (bandsInfo.bands[2].yOffset != 150) || (bandsInfo.bands[2].height != 50)) { - printf("TestAddBandOverlap: wrong band sizes (#1)\n"); - return PR_FALSE; - } - if ((bandsInfo.bands[0].numRects != 1) || - (bandsInfo.bands[1].numRects != 2) || - (bandsInfo.bands[2].numRects != 1)) { - printf("TestAddBandOverlap: wrong number of rects (#1)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #2. Add a rect region that's contained by the first band - status = AddRectRegion((nsIFrame*)0x03, nsRect(200, 60, 50, 10)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 5) { - printf("TestAddBandOverlap: wrong number of bands (#2): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if ((bandsInfo.bands[0].yOffset != 50) || (bandsInfo.bands[0].height != 10) || - (bandsInfo.bands[1].yOffset != 60) || (bandsInfo.bands[1].height != 10) || - (bandsInfo.bands[2].yOffset != 70) || (bandsInfo.bands[2].height != 30) || - (bandsInfo.bands[3].yOffset != 100) || (bandsInfo.bands[3].height != 50) || - (bandsInfo.bands[4].yOffset != 150) || (bandsInfo.bands[4].height != 50)) { - printf("TestAddBandOverlap: wrong band sizes (#2)\n"); - return PR_FALSE; - } - if ((bandsInfo.bands[0].numRects != 1) || - (bandsInfo.bands[1].numRects != 2) || - (bandsInfo.bands[2].numRects != 1) || - (bandsInfo.bands[3].numRects != 2) || - (bandsInfo.bands[4].numRects != 1)) { - printf("TestAddBandOverlap: wrong number of rects (#2)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #3. Add a rect that overlaps and is below an existing band - status = AddRectRegion((nsIFrame*)0x04, nsRect(200, 175, 50, 50)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 7) { - printf("TestAddBandOverlap: wrong number of bands (#3): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if ((bandsInfo.bands[0].yOffset != 50) || (bandsInfo.bands[0].height != 10) || - (bandsInfo.bands[1].yOffset != 60) || (bandsInfo.bands[1].height != 10) || - (bandsInfo.bands[2].yOffset != 70) || (bandsInfo.bands[2].height != 30) || - (bandsInfo.bands[3].yOffset != 100) || (bandsInfo.bands[3].height != 50) || - (bandsInfo.bands[4].yOffset != 150) || (bandsInfo.bands[4].height != 25) || - (bandsInfo.bands[5].yOffset != 175) || (bandsInfo.bands[5].height != 25) || - (bandsInfo.bands[6].yOffset != 200) || (bandsInfo.bands[6].height != 25)) { - printf("TestAddBandOverlap: wrong band sizes (#3)\n"); - return PR_FALSE; - } - if ((bandsInfo.bands[0].numRects != 1) || - (bandsInfo.bands[1].numRects != 2) || - (bandsInfo.bands[2].numRects != 1) || - (bandsInfo.bands[3].numRects != 2) || - (bandsInfo.bands[4].numRects != 1) || - (bandsInfo.bands[5].numRects != 2) || - (bandsInfo.bands[6].numRects != 1)) { - printf("TestAddBandOverlap: wrong number of rects (#3)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #4. Now test adding a rect that contains an existing band - ClearRegions(); - status = AddRectRegion((nsIFrame*)0x01, nsRect(100, 100, 100, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - - // Now add a rect that contains the existing band vertically - status = AddRectRegion((nsIFrame*)0x02, nsRect(200, 50, 100, 200)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 3) { - printf("TestAddBandOverlap: wrong number of bands (#4): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if ((bandsInfo.bands[0].yOffset != 50) || (bandsInfo.bands[0].height != 50) || - (bandsInfo.bands[1].yOffset != 100) || (bandsInfo.bands[1].height != 100) || - (bandsInfo.bands[2].yOffset != 200) || (bandsInfo.bands[2].height != 50)) { - printf("TestAddBandOverlap: wrong band sizes (#4)\n"); - return PR_FALSE; - } - if ((bandsInfo.bands[0].numRects != 1) || - (bandsInfo.bands[1].numRects != 2) || - (bandsInfo.bands[2].numRects != 1)) { - printf("TestAddBandOverlap: wrong number of rects (#4)\n"); - return PR_FALSE; - } - - return PR_TRUE; -} - -// Test of adding rects within an existing band -// -// This tests the following: -// 1. Add a rect to the left of an existing rect -// 2. Add a rect to the right of the rightmost rect -// 3. Add a rect that's to the left of an existing rect and that overlaps it -// 4. Add a rect that's to the right of an existing rect and that overlaps it -// 5. Add a rect over top of an existing rect (existing rect contains new rect) -// 6. Add a new rect that completely contains an existing rect -PRBool MySpaceManager::TestAddRectToBand() -{ - PRBool status; - BandsInfo bandsInfo; - BandRect* bandRect; - - // Clear any existing regions - ClearRegions(); - NS_ASSERTION(mBandList.IsEmpty(), "clear regions failed"); - - // Add a new band - status = AddRectRegion((nsIFrame*)0x01, nsRect(100, 100, 100, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - - ///////////////////////////////////////////////////////////////////////////// - // #1. Add a rect region that's to the left of the existing rect - status = AddRectRegion((nsIFrame*)0x02, nsRect(10, 100, 50, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 1) { - printf("TestAddRectToBand: wrong number of bands (#1): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if (bandsInfo.bands[0].numRects != 2) { - printf("TestAddRectToBand: wrong number of rects (#1): %i\n", bandsInfo.bands[0].numRects); - return PR_FALSE; - } - bandRect = bandsInfo.bands[0].firstRect; - if ((bandRect->left != 10) || (bandRect->right != 60)) { - printf("TestAddRectToBand: wrong first rect (#1)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 100) || (bandRect->right != 200)) { - printf("TestAddRectToBand: wrong second rect (#1)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #2. Add a rect region that's to the right of the rightmost rect - status = AddRectRegion((nsIFrame*)0x03, nsRect(250, 100, 100, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - NS_ASSERTION(bandsInfo.numBands == 1, "wrong number of bands"); - if (bandsInfo.bands[0].numRects != 3) { - printf("TestAddRectToBand: wrong number of rects (#2): %i\n", bandsInfo.bands[0].numRects); - return PR_FALSE; - } - bandRect = bandsInfo.bands[0].firstRect; - if ((bandRect->left != 10) || (bandRect->right != 60)) { - printf("TestAddRectToBand: wrong first rect (#2)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 100) || (bandRect->right != 200)) { - printf("TestAddRectToBand: wrong second rect (#2)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 250) || (bandRect->right != 350)) { - printf("TestAddRectToBand: wrong third rect (#2)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #3. Add a rect region that's to the left of an existing rect and that - // overlaps the rect - status = AddRectRegion((nsIFrame*)0x04, nsRect(80, 100, 40, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - NS_ASSERTION(bandsInfo.numBands == 1, "wrong number of bands"); - if (bandsInfo.bands[0].numRects != 5) { - printf("TestAddRectToBand: wrong number of rects (#3): %i\n", bandsInfo.bands[0].numRects); - return PR_FALSE; - } - bandRect = bandsInfo.bands[0].firstRect; - if ((bandRect->left != 10) || (bandRect->right != 60)) { - printf("TestAddRectToBand: wrong first rect (#3)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - NS_ASSERTION(1 == bandRect->numFrames, "unexpected shared rect"); - if ((bandRect->left != 80) || (bandRect->right != 100)) { - printf("TestAddRectToBand: wrong second rect (#3)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 100) || (bandRect->right != 120) || - (bandRect->numFrames != 2) || !bandRect->IsOccupiedBy((nsIFrame*)0x04)) { - printf("TestAddRectToBand: wrong third rect (#3)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - NS_ASSERTION(1 == bandRect->numFrames, "unexpected shared rect"); - if ((bandRect->left != 120) || (bandRect->right != 200)) { - printf("TestAddRectToBand: wrong fourth rect (#3)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 250) || (bandRect->right != 350)) { - printf("TestAddRectToBand: wrong fifth rect (#3)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #4. Add a rect region that's to the right of an existing rect and that - // overlaps the rect - status = AddRectRegion((nsIFrame*)0x05, nsRect(50, 100, 20, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - NS_ASSERTION(bandsInfo.numBands == 1, "wrong number of bands"); - if (bandsInfo.bands[0].numRects != 7) { - printf("TestAddRectToBand: wrong number of rects (#4): %i\n", bandsInfo.bands[0].numRects); - return PR_FALSE; - } - bandRect = bandsInfo.bands[0].firstRect; - NS_ASSERTION(1 == bandRect->numFrames, "unexpected shared rect"); - if ((bandRect->left != 10) || (bandRect->right != 50)) { - printf("TestAddRectToBand: wrong first rect (#4)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 50) || (bandRect->right != 60) || - (bandRect->numFrames != 2) || !bandRect->IsOccupiedBy((nsIFrame*)0x05)) { - printf("TestAddRectToBand: wrong second rect (#4)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - NS_ASSERTION(1 == bandRect->numFrames, "unexpected shared rect"); - if ((bandRect->left != 60) || (bandRect->right != 70)) { - printf("TestAddRectToBand: wrong third rect (#4)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - NS_ASSERTION(1 == bandRect->numFrames, "unexpected shared rect"); - if ((bandRect->left != 80) || (bandRect->right != 100)) { - printf("TestAddRectToBand: wrong fourth rect (#4)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #5. Add a new rect over top of an existing rect (existing rect contains - // the new rect) - status = AddRectRegion((nsIFrame*)0x06, nsRect(20, 100, 20, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - NS_ASSERTION(bandsInfo.numBands == 1, "wrong number of bands"); - if (bandsInfo.bands[0].numRects != 9) { - printf("TestAddRectToBand: wrong number of rects (#5): %i\n", bandsInfo.bands[0].numRects); - return PR_FALSE; - } - bandRect = bandsInfo.bands[0].firstRect; - NS_ASSERTION(1 == bandRect->numFrames, "unexpected shared rect"); - if ((bandRect->left != 10) || (bandRect->right != 20)) { - printf("TestAddRectToBand: wrong first rect (#5)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 20) || (bandRect->right != 40) || - (bandRect->numFrames != 2) || !bandRect->IsOccupiedBy((nsIFrame*)0x06)) { - printf("TestAddRectToBand: wrong second rect (#5)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - NS_ASSERTION(1 == bandRect->numFrames, "unexpected shared rect"); - if ((bandRect->left != 40) || (bandRect->right != 50)) { - printf("TestAddRectToBand: wrong third rect (#5)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 50) || (bandRect->right != 60) || (bandRect->numFrames != 2)) { - printf("TestAddRectToBand: wrong fourth rect (#5)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #6. Add a new rect that completely contains an existing rect - status = AddRectRegion((nsIFrame*)0x07, nsRect(0, 100, 30, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - NS_ASSERTION(bandsInfo.numBands == 1, "wrong number of bands"); - if (bandsInfo.bands[0].numRects != 11) { - printf("TestAddRectToBand: wrong number of rects (#6): %i\n", bandsInfo.bands[0].numRects); - return PR_FALSE; - } - bandRect = bandsInfo.bands[0].firstRect; - NS_ASSERTION(1 == bandRect->numFrames, "unexpected shared rect"); - if ((bandRect->left != 0) || (bandRect->right != 10)) { - printf("TestAddRectToBand: wrong first rect (#6)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 10) || (bandRect->right != 20) || - (bandRect->numFrames != 2) || !bandRect->IsOccupiedBy((nsIFrame*)0x07)) { - printf("TestAddRectToBand: wrong second rect (#6)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 20) || (bandRect->right != 30) || - (bandRect->numFrames != 3) || !bandRect->IsOccupiedBy((nsIFrame*)0x07)) { - printf("TestAddRectToBand: wrong third rect (#6)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - if ((bandRect->left != 30) || (bandRect->right != 40) || (bandRect->numFrames != 2)) { - printf("TestAddRectToBand: wrong fourth rect (#6)\n"); - return PR_FALSE; - } - bandRect = bandRect->Next(); - NS_ASSERTION(1 == bandRect->numFrames, "unexpected shared rect"); - if ((bandRect->left != 40) || (bandRect->right != 50)) { - printf("TestAddRectToBand: wrong fifth rect (#6)\n"); - return PR_FALSE; - } - - return PR_TRUE; -} - -// Test of removing regions. We especially need to test that we correctly -// coalesce adjacent rects and bands -// -// This tests the following: -// 1. simple test of removing the one and only band rect -// 2. removing a shared rect and verifying adjacent rects are coalesced -// 3. removing a band rect and making sure adjacent bands are combined -PRBool MySpaceManager::TestRemoveRegion() -{ - PRBool status; - BandsInfo bandsInfo; - BandRect* bandRect; - - // Clear any existing regions - ClearRegions(); - NS_ASSERTION(mBandList.IsEmpty(), "clear regions failed"); - - ///////////////////////////////////////////////////////////////////////////// - // #1. A simple test of removing the one and only band rect - status = AddRectRegion((nsIFrame*)0x01, nsRect(10, 100, 100, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - status = RemoveRegion((nsIFrame*)0x01); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 0) { - printf("TestRemoveRegion: wrong number of bands (#1): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #2. Test removing a rect that's shared. Make sure adjacent rects are - // coalesced - status = AddRectRegion((nsIFrame*)0x01, nsRect(10, 100, 100, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - status = AddRectRegion((nsIFrame*)0x02, nsRect(40, 100, 20, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - - // Verify there are three rects in the band - GetBandsInfo(bandsInfo); - if (bandsInfo.bands[0].numRects != 3) { - printf("TestRemoveRegion: wrong number of rects (#2): %i\n", bandsInfo.bands[0].numRects); - return PR_FALSE; - } - - // Remove the region associated with the second frame - status = RemoveRegion((nsIFrame*)0x02); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - if (bandsInfo.bands[0].numRects != 1) { - printf("TestRemoveRegion: failed to coalesce adjacent rects (#2)\n"); - return PR_FALSE; - } - bandRect = bandsInfo.bands[0].firstRect; - if ((bandRect->left != 10) || (bandRect->right != 110)) { - printf("TestRemoveRegion: wrong size rect (#2)\n"); - return PR_FALSE; - } - - ///////////////////////////////////////////////////////////////////////////// - // #3. Test removing a band rect and making sure adjacent bands are combined - status = AddRectRegion((nsIFrame*)0x02, nsRect(10, 140, 20, 20)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - - // Verify there are three bands and that each band has three rects - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 3) { - printf("TestRemoveRegion: wrong number of bands (#3): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if (bandsInfo.bands[0].numRects != 1) { - printf("TestRemoveRegion: band #1 wrong number of rects (#3): %i\n", bandsInfo.bands[0].numRects); - return PR_FALSE; - } - if (bandsInfo.bands[1].numRects != 2) { - printf("TestRemoveRegion: band #2 wrong number of rects (#3): %i\n", bandsInfo.bands[1].numRects); - return PR_FALSE; - } - if (bandsInfo.bands[2].numRects != 1) { - printf("TestRemoveRegion: band #3 wrong number of rects (#3): %i\n", bandsInfo.bands[2].numRects); - return PR_FALSE; - } - - // Remove the region associated with the second frame - status = RemoveRegion((nsIFrame*)0x02); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - GetBandsInfo(bandsInfo); - if (bandsInfo.bands[0].numRects != 1) { - printf("TestRemoveRegion: failed to coalesce adjacent rects (#3)\n"); - return PR_FALSE; - } - bandRect = bandsInfo.bands[0].firstRect; - if ((bandRect->left != 10) || (bandRect->right != 110)) { - printf("TestRemoveRegion: wrong size rect (#3)\n"); - return PR_FALSE; - } - - return PR_TRUE; -} - -// Test of offseting regions -// -// This tests the following: -// 1. simple test of offseting the one and only band rect -PRBool MySpaceManager::TestOffsetRegion() -{ - PRBool status; - BandsInfo bandsInfo; - BandRect* bandRect; - - // Clear any existing regions - ClearRegions(); - NS_ASSERTION(mBandList.IsEmpty(), "clear regions failed"); - - ///////////////////////////////////////////////////////////////////////////// - // #1. A simple test of offseting the one and only band rect - status = AddRectRegion((nsIFrame*)0x01, nsRect(10, 100, 100, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - status = OffsetRegion((nsIFrame*)0x01, 50, 50); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - - // Verify there is one band with one rect - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 1) { - printf("TestOffsetRegion: wrong number of bands (#1): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if (bandsInfo.bands[0].numRects != 1) { - printf("TestOffsetRegion: wrong number of rects (#1): %i\n", bandsInfo.bands[0].numRects); - return PR_FALSE; - } - - // Verify the position - bandRect = bandsInfo.bands[0].firstRect; - if ((bandRect->left != 60) || (bandRect->top != 150)) { - printf("TestOffsetRegion: wrong rect origin (#1)\n"); - return PR_FALSE; - } - - return PR_TRUE; -} - -// Test of resizing rect regions -// -// This tests the following: -// 1. simple test of resizing the one and only band rect -PRBool MySpaceManager::TestResizeRectRegion() -{ - PRBool status; - BandsInfo bandsInfo; - BandRect* bandRect; - - // Clear any existing regions - ClearRegions(); - NS_ASSERTION(mBandList.IsEmpty(), "clear regions failed"); - - ///////////////////////////////////////////////////////////////////////////// - // #1. A simple test of resizing the right edge of the one and only band rect - status = AddRectRegion((nsIFrame*)0x01, nsRect(10, 100, 100, 100)); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - status = ResizeRectRegion((nsIFrame*)0x01, 50, 50, nsISpaceManager::RightEdge); - NS_ASSERTION(PR_TRUE == status, "unexpected status"); - - // Verify there is one band with one rect - GetBandsInfo(bandsInfo); - if (bandsInfo.numBands != 1) { - printf("TestResizeRectRegion: wrong number of bands (#1): %i\n", bandsInfo.numBands); - return PR_FALSE; - } - if (bandsInfo.bands[0].numRects != 1) { - printf("TestResizeRectRegion: wrong number of rects (#1): %i\n", bandsInfo.bands[0].numRects); - return PR_FALSE; - } - - // Verify the position and size of the rect - bandRect = bandsInfo.bands[0].firstRect; - if ((bandRect->left != 10) || (bandRect->top != 100) || - (bandRect->right != 160) || (bandRect->bottom != 250)) { - printf("TestResizeRectRegion: wrong rect shape (#1)\n"); - return PR_FALSE; - } - - return PR_TRUE; -} - -/////////////////////////////////////////////////////////////////////////////// -// - -int main(int argc, char** argv) -{ - // Create a space manager - MySpaceManager* spaceMgr = new MySpaceManager(nsnull); - - NS_ADDREF(spaceMgr); - - // Test adding rect regions - if (!spaceMgr->TestAddBand()) { - NS_RELEASE(spaceMgr); - return -1; - } - - // Test adding rect regions that overlap existing bands - if (!spaceMgr->TestAddBandOverlap()) { - NS_RELEASE(spaceMgr); - return -1; - } - - // Test adding rects within an existing band - if (!spaceMgr->TestAddRectToBand()) { - NS_RELEASE(spaceMgr); - return -1; - } - - // Test removing regions - if (!spaceMgr->TestRemoveRegion()) { - return -1; - } - - // Test offseting regions - if (!spaceMgr->TestOffsetRegion()) { - return -1; - } - - // Test resizing rect regions - if (!spaceMgr->TestResizeRectRegion()) { - return -1; - } - -#if 0 - if (!spaceMgr->TestGetBandData()) { - return -1; - } -#endif - NS_RELEASE(spaceMgr); - return 0; -} diff --git a/mozilla/layout/base/tests/makefile.win b/mozilla/layout/base/tests/makefile.win deleted file mode 100644 index 012d59a6eb3..00000000000 --- a/mozilla/layout/base/tests/makefile.win +++ /dev/null @@ -1,58 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. - -MAKE_OBJ_TYPE = EXE -PROG1 = .\$(OBJDIR)\TestContainerFrame.exe -PROG2 = .\$(OBJDIR)\TestSpaceManager.exe -PROGRAMS = $(PROG1) $(PROG2) - -LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I..\src -LLIBS= \ - $(DIST)\lib\raptorlayout_s.lib \ - $(DIST)\lib\raptorgfx.lib \ - $(DIST)\lib\raptorbase.lib \ - $(DIST)\lib\xpcom32.lib \ - $(DIST)\lib\jsdom.lib \ - $(LIBNSPR) \ - $(DIST)\lib\libplc21.lib - -include <$(DEPTH)\layout\config\rules.mak> - -install:: $(PROGRAMS) - $(MAKE_INSTALL) $(PROG1) $(DIST)\bin - $(MAKE_INSTALL) $(PROG2) $(DIST)\bin - -# Move this into config/obj.inc when it's allowed -.cpp{.\$(OBJDIR)\}.exe: - -$(CC) @<<$(CFGFILE) - $(CFLAGS) - $(LCFLAGS) - $(LINCS) - $(LINCS_1) - $(INCS) - $(LLIBS) - $(OS_LIBS) - -Fd.\$(OBJDIR)\$(*B) - -Fe.\$(OBJDIR)\ - -Fo.\$(OBJDIR)\ - $(CURDIR)$(*B).cpp -< - -install:: $(DLL) - $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).dll $(DIST)\bin - $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).lib $(DIST)\lib - -clobber:: - rm -f $(DIST)\bin\$(DLLNAME).dll - rm -f $(DIST)\lib\$(DLLNAME).lib diff --git a/mozilla/layout/config/config.mak b/mozilla/layout/config/config.mak deleted file mode 100644 index ac61150cfc6..00000000000 --- a/mozilla/layout/config/config.mak +++ /dev/null @@ -1,30 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -IGNORE_MANIFEST=1 - -# First include standard config file -include <$(DEPTH)\config\config.mak> - -# Replace optimizer and pdb related flags to use our own conventions -!ifdef LIBRARY_NAME -!ifdef MOZ_DEBUG -OPTIMIZER=-Zi -DDEBUG -UNDEBUG -D_DEBUG -PDBFILE=$(LIBRARY_NAME) -OS_LFLAGS=/DEBUG /DEBUGTYPE:CV /PDB:$(PDBFILE) -!endif -!endif diff --git a/mozilla/layout/config/rules.mak b/mozilla/layout/config/rules.mak deleted file mode 100644 index 1fb54470b8d..00000000000 --- a/mozilla/layout/config/rules.mak +++ /dev/null @@ -1,19 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -include <$(DEPTH)\layout\config\config.mak> -include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/layout/css/Makefile b/mozilla/layout/css/Makefile deleted file mode 100644 index f1e5fea7715..00000000000 --- a/mozilla/layout/css/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../.. - -DIRS = layout - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/css/layout/Makefile b/mozilla/layout/css/layout/Makefile deleted file mode 100644 index c650dc9b7ab..00000000000 --- a/mozilla/layout/css/layout/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../../.. - -DIRS = public src - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/css/layout/makefile.win b/mozilla/layout/css/layout/makefile.win deleted file mode 100644 index fc8fa3cffa1..00000000000 --- a/mozilla/layout/css/layout/makefile.win +++ /dev/null @@ -1,22 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. - -DIRS=public src - -include <$(DEPTH)\layout\config\rules.mak> diff --git a/mozilla/layout/css/layout/public/Makefile b/mozilla/layout/css/layout/public/Makefile deleted file mode 100644 index d74b3ee8f66..00000000000 --- a/mozilla/layout/css/layout/public/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../../../.. - -MODULE = raptor - -EXPORTS = \ - nsIInlineReflow.h \ - $(NULL) - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/css/layout/public/makefile.win b/mozilla/layout/css/layout/public/makefile.win deleted file mode 100644 index edc19c0ec33..00000000000 --- a/mozilla/layout/css/layout/public/makefile.win +++ /dev/null @@ -1,27 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\..\.. - -EXPORTS = \ - nsIInlineReflow.h \ - $(NULL) - -MODULE=raptor - -include <$(DEPTH)\layout\config\rules.mak> - diff --git a/mozilla/layout/css/layout/public/nsIInlineReflow.h b/mozilla/layout/css/layout/public/nsIInlineReflow.h deleted file mode 100644 index fdab1f0e62f..00000000000 --- a/mozilla/layout/css/layout/public/nsIInlineReflow.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is Netscape Communications - * Corporation. Portions created by Netscape are Copyright (C) 1998 - * Netscape Communications Corporation. All Rights Reserved. - */ -#ifndef nsIInlineReflow_h___ -#define nsIInlineReflow_h___ - -#include "nsISupports.h" -#include "nsStyleConsts.h" -class nsCSSLineLayout; - -/* d76e29b0-ff56-11d1-89e7-006008911b81 */ -#define NS_IINLINE_REFLOW_IID \ - {0xd76e29b0, 0xff56, 0x11d1, {0x89, 0xe7, 0x00, 0x60, 0x08, 0x91, 0x1b, 0x81}} - -class nsIInlineReflow { -public: - /** - * Recursively find all of the text runs contained in an outer - * block container. Inline frames implement this by recursing over - * their children; note that inlines frames may need to create - * missing child frames before proceeding (e.g. when a tree - * containing inlines is appended/inserted into a block container - */ - NS_IMETHOD FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand) = 0; - - /** - * InlineReflow method. See below for how to interpret the return value. - */ - NS_IMETHOD InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState) = 0; -}; - -/** - * For InlineReflow the return value (an nsresult) indicates the - * status of the reflow operation. If the return value is negative - * then some sort of catastrophic error has occured (e.g. out of memory). - * If the return value is non-negative then the macros below can be - * used to interpret it. - * - * This is an extension of the nsReflowStatus value; it's bits are used - * in addition the bits that we add. - */ -typedef nsReflowStatus nsInlineReflowStatus; - -// This bit is set, when a break is requested. This bit is orthogonal -// to the nsIFrame::nsReflowStatus completion bits. -#define NS_INLINE_BREAK 0x0100 - -#define NS_INLINE_IS_BREAK(_status) \ - (0 != ((_status) & NS_INLINE_BREAK)) - -// When a break is requested, this bit when set indicates that the -// break should occur after the frame just reflowed; when the bit is -// clear the break should occur before the frame just reflowed. -#define NS_INLINE_BREAK_SIDE 0x0200 // 0 = before, !0 = after -#define NS_INLINE_BREAK_BEFORE 0x0000 -#define NS_INLINE_BREAK_AFTER NS_INLINE_BREAK_SIDE - -#define NS_INLINE_IS_BREAK_AFTER(_status) \ - (0 != ((_status) & NS_INLINE_BREAK_SIDE)) - -#define NS_INLINE_IS_BREAK_BEFORE(_status) \ - (NS_INLINE_BREAK == ((_status) & (NS_INLINE_BREAK|NS_INLINE_BREAK_SIDE))) - -// The type of break requested can be found in these bits. -#define NS_INLINE_BREAK_TYPE_MASK 0xF000 - -#define NS_INLINE_GET_BREAK_TYPE(_status) (((_status) >> 12) & 0xF) - -#define NS_INLINE_MAKE_BREAK_TYPE(_type) ((_type) << 12) - -// Convenience macro's: Take a completion status and add to it -// the desire to have a line-break before. -#define NS_INLINE_LINE_BREAK_BEFORE(_completionStatus) \ - ((_completionStatus) | NS_INLINE_BREAK | NS_INLINE_BREAK_BEFORE | \ - NS_INLINE_MAKE_BREAK_TYPE(NS_STYLE_CLEAR_LINE)) - -// Convenience macro's: Take a completion status and add to it -// the desire to have a line-break after. -#define NS_INLINE_LINE_BREAK_AFTER(_completionStatus) \ - ((_completionStatus) | NS_INLINE_BREAK | NS_INLINE_BREAK_AFTER | \ - NS_INLINE_MAKE_BREAK_TYPE(NS_STYLE_CLEAR_LINE)) - -#endif /* nsIInlineReflow_h___ */ diff --git a/mozilla/layout/css/layout/src/Makefile b/mozilla/layout/css/layout/src/Makefile deleted file mode 100644 index cbba09f24cd..00000000000 --- a/mozilla/layout/css/layout/src/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../../../.. - -LIBRARY_NAME = nglcsslay_s - -# Note the sophisticated alphabetical ordering :-| -CPPSRCS = \ - nsCSSBlockFrame.cpp \ - nsCSSContainerFrame.cpp \ - nsCSSInlineFrame.cpp \ - nsCSSInlineLayout.cpp \ - nsCSSLineLayout.cpp \ - $(NULL) - -MODULE = raptor - -REQUIRES = xpcom raptor dom netlib - -include $(DEPTH)/config/config.mk - -LCFLAGS += -D_IMPL_NS_HTML - -INCLUDES += -I../../../html/style/src -I../../../html/base/src \ - -I../../../base/src - -MKSHLIB := - -include $(DEPTH)/config/rules.mk - -install:: - $(INSTALL) broken-image.gif $(DIST)/bin/res/html diff --git a/mozilla/layout/css/layout/src/makefile.win b/mozilla/layout/css/layout/src/makefile.win deleted file mode 100644 index f24d0cdd99d..00000000000 --- a/mozilla/layout/css/layout/src/makefile.win +++ /dev/null @@ -1,57 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\..\.. - -LIBRARY_NAME=nglcsslay_s -MODULE=raptor -REQUIRES=xpcom raptor -DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN - -CPPSRCS= \ - nsCSSBlockFrame.cpp \ - nsCSSContainerFrame.cpp \ - nsCSSInlineFrame.cpp \ - nsCSSInlineLayout.cpp \ - nsCSSLineLayout.cpp \ - $(NULL) - -CPP_OBJS= \ - .\$(OBJDIR)\nsCSSBlockFrame.obj \ - .\$(OBJDIR)\nsCSSContainerFrame.obj \ - .\$(OBJDIR)\nsCSSInlineFrame.obj \ - .\$(OBJDIR)\nsCSSInlineLayout.obj \ - .\$(OBJDIR)\nsCSSLineLayout.obj \ - $(NULL) - -LINCS = \ - -I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I$(PUBLIC)\dom -I$(PUBLIC)\netlib \ - -I..\..\..\base\src \ - -I..\..\..\html\style\src -I..\..\..\html\base\src - -LCFLAGS = \ - $(LCFLAGS) \ - $(DEFINES) \ - $(NULL) - -include <$(DEPTH)\layout\config\rules.mak> - -libs:: $(LIBRARY) - $(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib - -clobber:: - rm -f $(DIST)\lib\$(LIBRARY_NAME).lib diff --git a/mozilla/layout/css/layout/src/nsCSSBlockFrame.cpp b/mozilla/layout/css/layout/src/nsCSSBlockFrame.cpp deleted file mode 100644 index 4a9b87486ad..00000000000 --- a/mozilla/layout/css/layout/src/nsCSSBlockFrame.cpp +++ /dev/null @@ -1,3894 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is Netscape Communications - * Corporation. Portions created by Netscape are Copyright (C) 1998 - * Netscape Communications Corporation. All Rights Reserved. - */ -#include "nsCSSBlockFrame.h" -#include "nsCSSLineLayout.h" -#include "nsCSSInlineLayout.h" -#include "nsCSSLayout.h" -#include "nsPlaceholderFrame.h" -#include "nsStyleConsts.h" -#include "nsHTMLIIDs.h" -#include "nsCSSRendering.h" - -#include "nsIAnchoredItems.h" -#include "nsIFloaterContainer.h" -#include "nsIPresContext.h" -#include "nsIPresShell.h" -#include "nsIReflowCommand.h" -#include "nsIRunaround.h" -#include "nsIStyleContext.h" -#include "nsIView.h" - -#include "nsHTMLBase.h"// XXX rename to nsCSSBase? -#include "nsHTMLParts.h"// XXX html reflow command??? -#include "nsHTMLAtoms.h"// XXX list ordinal hack -#include "nsHTMLValue.h"// XXX list ordinal hack -#include "nsIHTMLContent.h"// XXX list ordinal hack - -// XXX break-before and completion status? - -// XXX mLastContentOffset, mFirstContentOffset, mLastContentIsComplete -// XXX pagination -// XXX prev-in-flow continuations - -// XXX write verify code for FD's: -// no contiguous IFD's -// check that child-counts agree with mChildCount -// verify that mFirstChild == first FD's first child - -// XXX IsFirstChild -// XXX max-element-size -// XXX no-wrap -// XXX margin collapsing and empty InlineFrameData's -// XXX floaters in inlines -// XXX Check handling of mUnconstrainedWidth - -// XXX MULTICOL support; note that multicol will end up using the -// equivalent of pagination! Therefore we should probably make sure -// the pagination code isn't completely stupid. - -// XXX better lists (bullet numbering) - -// XXX page-breaks - -// XXX out of memory checks are missing - -// XXX push code can record the y coordinate where the push occurred -// and the width that the data was flowed against and also indicate -// which frames were reflowed and which weren't. Then drain code can just -// place the pulled up data directly when there are no floaters to -// worry about. something like that... - -// XXX Tuneup: if mNoWrap is true and we are given a ResizeReflow we -// can just return because there's nothing to do!; this is true in -// nsCSSInlineFrame too! - -//---------------------------------------------------------------------- -// XXX It's really important that blocks strip out extra whitespace; -// otherwise we will see ALOT of this, which will waste memory big time: -// -// -// -// -// -// ... -//---------------------------------------------------------------------- - -// XXX I don't want mFirstChild, mChildCount, mOverflowList, -// mLastContentIsComplete in our base class!!! - -struct LineData; - -// XXX Death to pseudo-frames!!!!! -#define DTPF 1 - -// XXX temporary until PropagateContentOffsets can be written genericly -#define nsCSSBlockFrameSuper nsCSSContainerFrame - -class nsCSSBlockFrame : public nsCSSBlockFrameSuper, - public nsIRunaround, - public nsIFloaterContainer -{ -public: - nsCSSBlockFrame(nsIContent* aContent, nsIFrame* aParent); - - // nsISupports - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr); - - // nsIFrame - NS_IMETHOD ChildCount(PRInt32& aChildCount) const; - NS_IMETHOD ChildAt(PRInt32 aIndex, nsIFrame*& aFrame) const; - NS_IMETHOD IndexOf(const nsIFrame* aChild, PRInt32& aIndex) const; - NS_IMETHOD FirstChild(nsIFrame*& aFirstChild) const; - NS_IMETHOD NextChild(const nsIFrame* aChild, nsIFrame*& aNextChild) const; - NS_IMETHOD PrevChild(const nsIFrame* aChild, nsIFrame*& aPrevChild) const; - NS_IMETHOD LastChild(nsIFrame*& aLastChild) const; - NS_IMETHOD IsSplittable(nsSplittableType& aIsSplittable) const; - NS_IMETHOD CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame); - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - NS_IMETHOD ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer); - NS_IMETHOD ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD DidReflow(nsIPresContext& aPresContext, - nsDidReflowStatus aStatus); - NS_IMETHOD HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus); - NS_IMETHOD GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor); - NS_IMETHOD List(FILE* out, PRInt32 aIndent) const; - NS_IMETHOD ListTag(FILE* out) const; - NS_IMETHOD VerifyTree() const; - // XXX implement regular reflow method too! - - // nsIRunaround - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsISpaceManager* aSpaceManager, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsRect& aDesiredRect, - nsReflowStatus& aStatus); - - // nsIFloaterContainer - virtual PRBool AddFloater(nsIPresContext* aPresContext, - const nsReflowState& aPlaceholderReflowState, - nsIFrame* aFloater, - nsPlaceholderFrame* aPlaceholder); - -protected: - ~nsCSSBlockFrame(); - -#if 0 - PRInt32 GetFirstContentOffset() const; - - PRInt32 GetLastContentOffset() const; - - PRBool GetLastContentIsComplete() const; -#endif - virtual PRBool DeleteNextInFlowsFor(nsIFrame* aNextInFlow); - - nsresult DrainOverflowLines(); - - PRBool RemoveChild(LineData* aLines, nsIFrame* aChild); - - nsresult ProcessInitialReflow(nsIPresContext* aPresContext); - - //XXX void PropagateContentOffsets(); - - PRIntn GetSkipSides() const; - - PRBool IsPseudoFrame() const; - - nsresult InitialReflow(nsCSSBlockReflowState& aState); - - nsresult FrameAppendedReflow(nsCSSBlockReflowState& aState); - - nsresult FrameInsertedReflow(nsCSSBlockReflowState& aState); - - nsresult FrameDeletedReflow(nsCSSBlockReflowState& aState); - - nsresult CreateNewFrames(nsIPresContext* aPresContext); - - nsresult FindTextRuns(nsCSSBlockReflowState& aState); - - nsresult ChildIncrementalReflow(nsCSSBlockReflowState& aState); - - nsresult ResizeReflow(nsCSSBlockReflowState& aState); - - void ComputeFinalSize(nsCSSBlockReflowState& aState, - nsReflowMetrics& aMetrics, - nsRect& aDesiredRect); - - nsresult ReflowLinesAt(nsCSSBlockReflowState& aState, LineData* aLine); - - PRBool ReflowLine(nsCSSBlockReflowState& aState, - LineData* aLine, - nsInlineReflowStatus& aReflowResult); - - PRBool PlaceLine(nsCSSBlockReflowState& aState, - LineData* aLine, - nsInlineReflowStatus aReflowStatus); - - PRBool ReflowInlineFrame(nsCSSBlockReflowState& aState, - LineData* aLine, - nsIFrame* aFrame, - nsInlineReflowStatus& aResult); - - nsresult SplitLine(nsCSSBlockReflowState& aState, - LineData* aLine, - nsIFrame* aFrame, - PRBool aLineWasComplete); - - PRBool ReflowBlockFrame(nsCSSBlockReflowState& aState, - LineData* aLine, - nsIFrame* aFrame, - nsInlineReflowStatus& aResult); - - PRBool PullFrame(nsCSSBlockReflowState& aState, - LineData* aToLine, - LineData** aFromList, - PRBool aUpdateGeometricParent, - nsInlineReflowStatus& aResult); - - void PushLines(nsCSSBlockReflowState& aState); - - void ReflowFloater(nsIPresContext* aPresContext, - nsCSSBlockReflowState& aState, - nsIFrame* aFloaterFrame); - - PRBool IsLeftMostChild(nsIFrame* aFrame); - - void PaintChildren(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - -#ifdef NS_DEBUG - PRBool IsChild(nsIFrame* aFrame); -#endif - - LineData* mLines; - - LineData* mOverflowLines; - - // placeholder frames for floaters to display at the top line - nsVoidArray* mRunInFloaters; - - // Text run information - nsCSSTextRun* mTextRuns; - - friend struct nsCSSBlockReflowState; -}; - -//---------------------------------------------------------------------- - -#define LINE_IS_DIRTY 0x1 -#define LINE_IS_BLOCK 0x2 -#define LINE_LAST_CONTENT_IS_COMPLETE 0x4 - -struct LineData { - LineData(nsIFrame* aFrame, PRInt32 aCount, PRUint16 flags) { - mFirstChild = aFrame; - mChildCount = aCount; - mState = LINE_IS_DIRTY | flags; - mFloaters = nsnull; - mNext = nsnull; - } - - ~LineData(); - - void List(FILE* out, PRInt32 aIndent) const; - - nsIFrame* LastChild() const; - - PRBool IsLastChild(nsIFrame* aFrame) const; - - void SetLastContentIsComplete() { - mState |= LINE_LAST_CONTENT_IS_COMPLETE; - } - - void ClearLastContentIsComplete() { - mState &= ~LINE_LAST_CONTENT_IS_COMPLETE; - } - - void SetLastContentIsComplete(PRBool aValue) { - if (aValue) { - SetLastContentIsComplete(); - } - else { - ClearLastContentIsComplete(); - } - } - - PRBool GetLastContentIsComplete() { - return 0 != (LINE_LAST_CONTENT_IS_COMPLETE & mState); - } - - PRBool IsBlock() const { - return 0 != (LINE_IS_BLOCK & mState); - } - - void SetIsBlock() { - mState |= LINE_IS_BLOCK; - } - - void ClearIsBlock() { - mState &= ~LINE_IS_BLOCK; - } - - void SetIsBlock(PRBool aValue) { - if (aValue) { - SetIsBlock(); - } - else { - ClearIsBlock(); - } - } - - void MarkDirty() { - mState |= LINE_IS_DIRTY; - } - - void ClearDirty() { - mState &= ~LINE_IS_DIRTY; - } - - PRBool IsDirty() const { - return 0 != (LINE_IS_DIRTY & mState); - } - - PRUint16 GetState() const { return mState; } - - PRBool Contains(nsIFrame* aFrame) const; - -#ifdef NS_DEBUG - void Verify(); -#endif - - nsIFrame* mFirstChild; - PRUint16 mChildCount; - PRUint16 mState; - nsRect mBounds; - nsVoidArray* mFloaters; - LineData* mNext; -}; - -LineData::~LineData() -{ - if (nsnull != mFloaters) { - delete mFloaters; - } -} - -static void -ListFloaters(FILE* out, nsVoidArray* aFloaters) -{ - PRInt32 i, n = aFloaters->Count(); - for (i = 0; i < n; i++) { - nsIFrame* frame = (nsIFrame*) aFloaters->ElementAt(i); - frame->ListTag(out); - } -} - -static void -ListTextRuns(FILE* out, PRInt32 aIndent, nsCSSTextRun* aRuns) -{ - while (nsnull != aRuns) { - aRuns->List(out, aIndent); - aRuns = aRuns->mNext; - } -} - -void -LineData::List(FILE* out, PRInt32 aIndent) const -{ - PRInt32 i; - for (i = aIndent; --i >= 0; ) fputs(" ", out); - fprintf(out, "line %p: count=%d state=%x {%d,%d,%d,%d} <\n", - this, mChildCount, GetState(), - mBounds.x, mBounds.y, mBounds.width, mBounds.height); - - nsIFrame* frame = mFirstChild; - PRInt32 n = mChildCount; - while (--n >= 0) { - frame->List(out, aIndent + 1); - frame->GetNextSibling(frame); - } - - for (i = aIndent; --i >= 0; ) fputs(" ", out); - - if (nsnull != mFloaters) { - fputs("> bcl-floaters=<", out); - ListFloaters(out, mFloaters); - } - fputs(">\n", out); -} - -nsIFrame* -LineData::LastChild() const -{ - nsIFrame* frame = mFirstChild; - PRInt32 n = mChildCount - 1; - while (--n >= 0) { - frame->GetNextSibling(frame); - } - return frame; -} - -PRBool -LineData::IsLastChild(nsIFrame* aFrame) const -{ - nsIFrame* lastFrame = LastChild(); - return aFrame == lastFrame; -} - -PRBool -LineData::Contains(nsIFrame* aFrame) const -{ - PRInt32 n = mChildCount; - nsIFrame* frame = mFirstChild; - while (--n >= 0) { - if (frame == aFrame) { - return PR_TRUE; - } - frame->GetNextSibling(frame); - } - return PR_FALSE; -} - -#ifdef NS_DEBUG -static PRInt32 -LengthOf(nsIFrame* aFrame) -{ - PRInt32 result = 0; - while (nsnull != aFrame) { - result++; - aFrame->GetNextSibling(aFrame); - } - return result; -} - -void -LineData::Verify() -{ - nsIFrame* lastFrame = LastChild(); - if (nsnull != lastFrame) { - nsIFrame* nextInFlow; - lastFrame->GetNextInFlow(nextInFlow); - if (GetLastContentIsComplete()) { - NS_ASSERTION(nsnull == nextInFlow, "bad mState"); - } - if (nsnull != mNext) { - nsIFrame* nextSibling; - lastFrame->GetNextSibling(nextSibling); - NS_ASSERTION(mNext->mFirstChild == nextSibling, "bad line list"); - } - } - PRInt32 len = LengthOf(mFirstChild); - NS_ASSERTION(len >= mChildCount, "bad mChildCount"); -} - -static void -VerifyLines(LineData* aLine) -{ - while (nsnull != aLine) { - aLine->Verify(); - aLine = aLine->mNext; - } -} - -static void -VerifyChildCount(LineData* aLines, PRBool aEmptyOK = PR_FALSE) -{ - if (nsnull != aLines) { - PRInt32 childCount = LengthOf(aLines->mFirstChild); - PRInt32 sum = 0; - LineData* line = aLines; - while (nsnull != line) { - if (!aEmptyOK) { - NS_ASSERTION(0 != line->mChildCount, "empty line left in line list"); - } - sum += line->mChildCount; - line = line->mNext; - } - if (sum != childCount) { - printf("Bad sibling list/line mChildCount's\n"); - LineData* line = aLines; - while (nsnull != line) { - line->List(stdout, 1); - if (nsnull != line->mNext) { - nsIFrame* lastFrame = line->LastChild(); - if (nsnull != lastFrame) { - nsIFrame* nextSibling; - lastFrame->GetNextSibling(nextSibling); - if (line->mNext->mFirstChild != nextSibling) { - printf(" [list broken: nextSibling=%p mNext->mFirstChild=%p]\n", - nextSibling, line->mNext->mFirstChild); - } - } - } - line = line->mNext; - } - NS_ASSERTION(sum == childCount, "bad sibling list/line mChildCount's"); - } - } -} -#endif - -static void -DeleteLineList(LineData* aLine) -{ - if (nsnull != aLine) { - // Delete our child frames before doing anything else. In particular - // we do all of this before our base class releases it's hold on the - // view. - for (nsIFrame* child = aLine->mFirstChild; child; ) { - nsIFrame* nextChild; - child->GetNextSibling(nextChild); - child->DeleteFrame(); - child = nextChild; - } - - while (nsnull != aLine) { - LineData* next = aLine->mNext; - delete aLine; - aLine = next; - } - } -} - -static LineData* -LastLine(LineData* aLine) -{ - if (nsnull != aLine) { - while (nsnull != aLine->mNext) { - aLine = aLine->mNext; - } - } - return aLine; -} - -static LineData* -FindLineContaining(LineData* aLine, nsIFrame* aFrame) -{ - while (nsnull != aLine) { - if (aLine->Contains(aFrame)) { - return aLine; - } - aLine = aLine->mNext; - } - return nsnull; -} - -//---------------------------------------------------------------------- - -void nsCSSBlockReflowState::BlockBandData::ComputeAvailSpaceRect() -{ - nsBandTrapezoid* trapezoid = data; - - if (count > 1) { - // If there's more than one trapezoid that means there are floaters - PRInt32 i; - - // Stop when we get to space occupied by a right floater, or when we've - // looked at every trapezoid and none are right floaters - for (i = 0; i < count; i++) { - nsBandTrapezoid* trapezoid = &data[i]; - if (trapezoid->state != nsBandTrapezoid::Available) { - const nsStyleDisplay* display; - if (nsBandTrapezoid::OccupiedMultiple == trapezoid->state) { - PRInt32 j, numFrames = trapezoid->frames->Count(); - NS_ASSERTION(numFrames > 0, "bad trapezoid frame list"); - for (j = 0; j < numFrames; j++) { - nsIFrame* f = (nsIFrame*)trapezoid->frames->ElementAt(j); - f->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&)display); - if (NS_STYLE_FLOAT_RIGHT == display->mFloats) { - goto foundRightFloater; - } - } - } else { - trapezoid->frame->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&)display); - if (NS_STYLE_FLOAT_RIGHT == display->mFloats) { - break; - } - } - } - } - foundRightFloater: - - if (i > 0) { - trapezoid = &data[i - 1]; - } - } - - if (nsBandTrapezoid::Available == trapezoid->state) { - // The trapezoid is available - trapezoid->GetRect(availSpace); - } else { - const nsStyleDisplay* display; - - // The trapezoid is occupied. That means there's no available space - trapezoid->GetRect(availSpace); - - // XXX Handle the case of multiple frames - trapezoid->frame->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&)display); - if (NS_STYLE_FLOAT_LEFT == display->mFloats) { - availSpace.x = availSpace.XMost(); - } - availSpace.width = 0; - } -} - -//---------------------------------------------------------------------- - -nsCSSBlockReflowState::nsCSSBlockReflowState(nsIPresContext* aPresContext, - nsISpaceManager* aSpaceManager, - nsCSSBlockFrame* aBlock, - nsIStyleContext* aBlockSC, - const nsReflowState& aReflowState, - PRBool aComputeMaxElementSize) - : nsReflowState(aReflowState), - mLineLayout(aPresContext, aSpaceManager), - mInlineLayout(mLineLayout, aBlock, aBlockSC) -{ - mInlineLayout.Init(this); - - mPresContext = aPresContext; - mSpaceManager = aSpaceManager; - mBlock = aBlock; - mBlockIsPseudo = aBlock->IsPseudoFrame(); - aBlock->GetNextInFlow((nsIFrame*&)mNextInFlow); - mPrevPosBottomMargin = 0; - mPrevNegBottomMargin = 0; - mKidXMost = 0; - - mX = 0; - mY = 0; - mUnconstrainedWidth = aReflowState.maxSize.width == NS_UNCONSTRAINEDSIZE; - mUnconstrainedHeight = aReflowState.maxSize.height == NS_UNCONSTRAINEDSIZE; -#ifdef NS_DEBUG - if (!mUnconstrainedWidth) { - NS_ASSERTION(aReflowState.maxSize.width < 1000000, "bad parent"); - } -#if XXX_not_yet - if (!mUnconstrainedHeight) { - NS_ASSERTION(aReflowState.maxSize.height < 1000000, "bad parent"); - } -#endif -#endif - mComputeMaxElementSize = aComputeMaxElementSize; - if (mComputeMaxElementSize) { - mMaxElementSize.width = 0; - mMaxElementSize.height = 0; - } - mHaveBlockMaxWidth = PR_FALSE; - - // Set mNoWrap flag - const nsStyleText* blockText = (const nsStyleText*) - aBlockSC->GetStyleData(eStyleStruct_Text); - switch (blockText->mWhiteSpace) { - case NS_STYLE_WHITESPACE_PRE: - case NS_STYLE_WHITESPACE_NOWRAP: - mNoWrap = PR_TRUE; - break; - default: - mNoWrap = PR_FALSE; - break; - } - mTextAlign = blockText->mTextAlign; - const nsStyleDisplay* styleDisplay = (const nsStyleDisplay*) - aBlockSC->GetStyleData(eStyleStruct_Display); - mDirection = styleDisplay->mDirection; - - if (NS_STYLE_DISPLAY_LIST_ITEM == styleDisplay->mDisplay) { - const nsStyleList* sl = (const nsStyleList*) - aBlockSC->GetStyleData(eStyleStruct_List); - if (NS_STYLE_LIST_STYLE_POSITION_OUTSIDE == sl->mListStylePosition) { - mLineLayout.mListPositionOutside = PR_TRUE; - } - } - - // Apply border and padding adjustments for regular frames only - nsRect blockRect; - mBlock->GetRect(blockRect); - mStyleSizeFlags = 0; - if (!mBlockIsPseudo) { - const nsStyleSpacing* blockSpacing = (const nsStyleSpacing*) - aBlockSC->GetStyleData(eStyleStruct_Spacing); - - blockSpacing->CalcBorderPaddingFor(mBlock, mBorderPadding); - mY = mBorderPadding.top; - mX = mBorderPadding.left; - - if (mUnconstrainedWidth) { - // If our width is unconstrained don't bother futzing with the - // available width/height because they don't matter - we are - // going to get reflowed again. - mDeltaWidth = NS_UNCONSTRAINEDSIZE; - mInnerSize.width = NS_UNCONSTRAINEDSIZE; - } - else { - // When we are constrained we need to apply the width/height - // style properties. When we have a width/height it applies to - // the content width/height of our box. The content width/height - // doesn't include the border+padding so we have to add that in - // instead of subtracting it out of our maxsize. - nscoord lr = mBorderPadding.left + mBorderPadding.right; - - // Get and apply the stylistic size. Note: do not limit the - // height until we are done reflowing. - PRIntn ss = nsCSSLayout::GetStyleSize(aPresContext, aReflowState, - mStyleSize); - mStyleSizeFlags = ss; - if (0 != (ss & NS_SIZE_HAS_WIDTH)) { - // CSS2 spec says that the width attribute defines the width - // of the "content area" which does not include the border - // padding. So we add those back in. - mInnerSize.width = mStyleSize.width + lr; - } - else { - mInnerSize.width = maxSize.width - lr; - } - mDeltaWidth = maxSize.width - blockRect.width; - } - if (mUnconstrainedHeight) { - mInnerSize.height = maxSize.height; - mBottomEdge = maxSize.height; - } - else { - nscoord tb = mBorderPadding.top + mBorderPadding.bottom; - mInnerSize.height = maxSize.height - tb; - mBottomEdge = maxSize.height - mBorderPadding.bottom; - } - } - else { - mBorderPadding.SizeTo(0, 0, 0, 0); - mDeltaWidth = maxSize.width - blockRect.width; - mInnerSize = maxSize; - mBottomEdge = maxSize.height; - } - - mPrevChild = nsnull; - mFreeList = nsnull; - mPrevLine = nsnull; - - // Setup initial list ordinal value - - // XXX translate the starting value to a css style type and stop - // doing this! - mNextListOrdinal = -1; - nsIContent* blockContent; - mBlock->GetContent(blockContent); - nsIAtom* tag = blockContent->GetTag(); - if ((tag == nsHTMLAtoms::ul) || (tag == nsHTMLAtoms::ol) || - (tag == nsHTMLAtoms::menu) || (tag == nsHTMLAtoms::dir)) { - nsHTMLValue value; - if (eContentAttr_HasValue == - ((nsIHTMLContent*)blockContent)->GetAttribute(nsHTMLAtoms::start, - value)) { - if (eHTMLUnit_Integer == value.GetUnit()) { - mNextListOrdinal = value.GetIntValue(); - } - } - } - NS_RELEASE(blockContent); -} - -nsCSSBlockReflowState::~nsCSSBlockReflowState() -{ - LineData* line = mFreeList; - while (nsnull != line) { - NS_ASSERTION((0 == line->mChildCount) && (nsnull == line->mFirstChild), - "bad free line"); - LineData* next = line->mNext; - delete line; - line = next; - } -} - -// XXX I think the handling of mBorderPadding.left is weird here. -void -nsCSSBlockReflowState::GetAvailableSpace() -{ - nsresult rv = NS_OK; - - nsISpaceManager* sm = mSpaceManager; - - // Fill in band data for the specific Y coordinate. Note: We don't - // translate by Y so that the band will be absolute (at least in y); - // this makes the implementation of ClearFloaters simpler. - sm->Translate(mBorderPadding.left, 0); - sm->GetBandData(mY, mInnerSize, mCurrentBand); - sm->Translate(-mBorderPadding.left, 0); - - // Compute the bounding rect of the available space, i.e. space - // between any left and right floaters. The availSpace is translated - // after it's computed to be fully absolute. - mCurrentBand.ComputeAvailSpaceRect(); - mCurrentBand.availSpace.MoveBy(mBorderPadding.left, 0); - - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockReflowState::GetAvailableSpace: band={%d,%d,%d,%d}", - mCurrentBand.availSpace.x, mCurrentBand.availSpace.y, - mCurrentBand.availSpace.width, mCurrentBand.availSpace.height)); -} - -//---------------------------------------------------------------------- - -nsresult -NS_NewCSSBlockFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIFrame* it = new nsCSSBlockFrame(aContent, aParent); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - *aInstancePtrResult = it; - return NS_OK; -} - -nsCSSBlockFrame::nsCSSBlockFrame(nsIContent* aContent, nsIFrame* aParent) - : nsCSSBlockFrameSuper(aContent, aParent) -{ -} - -nsCSSBlockFrame::~nsCSSBlockFrame() -{ - DeleteLineList(mLines); - DeleteLineList(mOverflowLines); - if (nsnull != mRunInFloaters) { - delete mRunInFloaters; - } - nsCSSTextRun::DeleteTextRuns(mTextRuns); -} - -NS_IMETHODIMP -nsCSSBlockFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr) -{ - NS_PRECONDITION(0 != aInstancePtr, "null ptr"); - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - // XXX temporary - if (aIID.Equals(kBlockFrameCID)) { - *aInstancePtr = (void*) (this); - return NS_OK; - } - if (aIID.Equals(kIRunaroundIID)) { - *aInstancePtr = (void*) ((nsIRunaround*) this); - return NS_OK; - } - if (aIID.Equals(kIFloaterContainerIID)) { - *aInstancePtr = (void*) ((nsIFloaterContainer*) this); - return NS_OK; - } - return nsCSSBlockFrameSuper::QueryInterface(aIID, aInstancePtr); -} - -PRBool -nsCSSBlockFrame::IsPseudoFrame() const -{ - PRBool result = PR_FALSE; - - if (nsnull != mGeometricParent) { - nsIContent* parentContent; - - mGeometricParent->GetContent(parentContent); - if (parentContent == mContent) { - result = PR_TRUE; - } - NS_RELEASE(parentContent); - } - - return result; -} - -NS_IMETHODIMP -nsCSSBlockFrame::IsSplittable(nsSplittableType& aIsSplittable) const -{ - aIsSplittable = NS_FRAME_SPLITTABLE_NON_RECTANGULAR; - return NS_OK; -} - -NS_IMETHODIMP -nsCSSBlockFrame::CreateContinuingFrame(nsIPresContext* aCX, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame) -{ - nsCSSBlockFrame* cf = new nsCSSBlockFrame(mContent, aParent); - if (nsnull == cf) { - return NS_ERROR_OUT_OF_MEMORY; - } - PrepareContinuingFrame(aCX, aParent, aStyleContext, cf); - aContinuingFrame = cf; - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockFrame::CreateContinuingFrame: newFrame=%p", cf)); - return NS_OK; -} - -NS_IMETHODIMP -nsCSSBlockFrame::ListTag(FILE* out) const -{ - if ((nsnull != mGeometricParent) && IsPseudoFrame()) { - fprintf(out, "*block<"); - nsIAtom* atom = mContent->GetTag(); - if (nsnull != atom) { - nsAutoString tmp; - atom->ToString(tmp); - fputs(tmp, out); - } - PRInt32 contentIndex; - GetContentIndex(contentIndex); - fprintf(out, ">(%d)@%p", contentIndex, this); - } else { - nsCSSBlockFrameSuper::ListTag(out); - } - return NS_OK; -} - -NS_METHOD -nsCSSBlockFrame::List(FILE* out, PRInt32 aIndent) const -{ - PRInt32 i; - - // Indent - for (i = aIndent; --i >= 0; ) fputs(" ", out); - - // Output the tag - ListTag(out); - nsIView* view; - GetView(view); - if (nsnull != view) { - fprintf(out, " [view=%p]", view); - NS_RELEASE(view); - } - - // Output the first/last content offset - fprintf(out, "[%d,%d,%c] ", - GetFirstContentOffset(), GetLastContentOffset(), - (GetLastContentIsComplete() ? 'T' : 'F')); - if (nsnull != mPrevInFlow) { - fprintf(out, "prev-in-flow=%p ", mPrevInFlow); - } - if (nsnull != mNextInFlow) { - fprintf(out, "next-in-flow=%p ", mNextInFlow); - } - - // Output the rect and state - out << mRect; - if (0 != mState) { - fprintf(out, " [state=%08x]", mState); - } - - // Dump run-in floaters - if (nsnull != mRunInFloaters) { - fputs(" run-in-floaters=<", out); - ListFloaters(out, mRunInFloaters); - for (i = aIndent; --i >= 0; ) fputs(" ", out); - fputs(">", out); - } - - // Output the children, one line at a time - if (nsnull != mLines) { - fputs("<\n", out); - aIndent++; - LineData* line = mLines; - while (nsnull != line) { - line->List(out, aIndent); - line = line->mNext; - } - aIndent--; - for (i = aIndent; --i >= 0; ) fputs(" ", out); - fputs(">", out); - } - else { - fputs("<>", out); - } - - // Output the text-runs - if (nsnull != mTextRuns) { - fputs(" text-runs=<\n", out); - ListTextRuns(out, aIndent + 1, mTextRuns); - for (i = aIndent; --i >= 0; ) fputs(" ", out); - fputs(">", out); - } - fputs("\n", out); - - return NS_OK; -} - -///////////////////////////////////////////////////////////////////////////// -// Child frame enumeration - -NS_IMETHODIMP -nsCSSBlockFrame::ChildCount(PRInt32& aChildCount) const -{ - PRInt32 sum = 0; - LineData* line = mLines; - while (nsnull != line) { - sum += line->mChildCount; - line = line->mNext; - } - aChildCount = sum; - return NS_OK; -} - -NS_IMETHODIMP -nsCSSBlockFrame::ChildAt(PRInt32 aIndex, nsIFrame*& aFrame) const -{ - LineData* line = mLines; - if ((aIndex >= 0) && (nsnull != line)) { - // First find the line that contains the aIndex - while (nsnull != line) { - PRInt32 n = line->mChildCount; - if (aIndex < n) { - // Then find the frame in the line - nsIFrame* frame = mLines->mFirstChild; - while (--n >= 0) { - if (0 == aIndex) { - aFrame = frame; - return NS_OK; - } - aIndex--; - frame->GetNextSibling(frame); - } - NS_NOTREACHED("line mChildCount wrong"); - } - aIndex -= line->mChildCount; - line = line->mNext; - } - } - - aFrame = nsnull; - return NS_OK; -} - -NS_IMETHODIMP -nsCSSBlockFrame::IndexOf(const nsIFrame* aChild, PRInt32& aIndex) const -{ - aIndex = -1; - if (nsnull != mLines) { - PRInt32 index = 0; - nsIFrame* frame = mLines->mFirstChild; - NS_ASSERTION(nsnull != frame, "bad mLines"); - while (nsnull != frame) { - if (frame == aChild) { - aIndex = index; - break; - } - index++; - frame->GetNextSibling(frame); - } - } - return NS_OK; -} - -NS_IMETHODIMP -nsCSSBlockFrame::FirstChild(nsIFrame*& aFirstChild) const -{ - aFirstChild = (nsnull != mLines) ? mLines->mFirstChild : nsnull; - return NS_OK; -} - -NS_IMETHODIMP -nsCSSBlockFrame::NextChild(const nsIFrame* aChild, nsIFrame*& aNextChild) const -{ - NS_PRECONDITION(aChild != nsnull, "null pointer"); - aChild->GetNextSibling(aNextChild); - return NS_OK; -} - -NS_IMETHODIMP -nsCSSBlockFrame::PrevChild(const nsIFrame* aChild, nsIFrame*& aPrevChild) const -{ - NS_PRECONDITION(aChild != nsnull, "null pointer"); - if ((nsnull != mLines) && (mLines->mFirstChild != aChild)) { - nsIFrame* frame = mLines->mFirstChild; - while (nsnull != frame) { - nsIFrame* nextFrame; - frame->GetNextSibling(nextFrame); - if (nextFrame == aChild) { - aPrevChild = frame; - return NS_OK; - } - frame = nextFrame; - } - } - aPrevChild = nsnull; - return NS_OK; -} - -NS_IMETHODIMP -nsCSSBlockFrame::LastChild(nsIFrame*& aLastChild) const -{ - LineData* line = LastLine(mLines); - if (nsnull != line) { - aLastChild = line->LastChild(); - return NS_OK; - } - aLastChild = nsnull; - return NS_OK; -} - -////////////////////////////////////////////////////////////////////// -// Reflow methods - -#if XXX -PRBool -nsCSSBlockFrame::GetLastContentIsComplete() const -{ - PRBool result = PR_TRUE; - LineData* line = LastLine(mLines); - if (nsnull != line) { - return line->GetLastContentIsComplete(); - } - return result; -} - -PRInt32 -nsCSSBlockFrame::GetFirstContentOffset() const -{ - PRInt32 result = 0; - LineData* line = mLines; - if (nsnull != line) { - line->mFirstChild->GetContentIndex(result); - } - return result; -} - -PRInt32 -nsCSSBlockFrame::GetLastContentOffset() const -{ - PRInt32 result = 0; - LineData* line = LastNonEmptyLine(mLines); - if (nsnull != line) { - line->LastChild()->GetContentIndex(result); - } - return result; -} -#endif - -NS_IMETHODIMP -nsCSSBlockFrame::Reflow(nsIPresContext* aPresContext, - nsISpaceManager* aSpaceManager, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState, - nsRect& aDesiredRect, - nsReflowStatus& aStatus) -{ - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("enter nsCSSBlockFrame::Reflow: maxSize=%d,%d reason=%d [%d,%d,%c]", - aReflowState.maxSize.width, - aReflowState.maxSize.height, - aReflowState.reason, - GetFirstContentOffset(), GetLastContentOffset(), - GetLastContentIsComplete()?'T':'F')); - - // If this is the initial reflow, generate any synthetic content - // that needs generating. - if (eReflowReason_Initial == aReflowState.reason) { - NS_ASSERTION(0 != (NS_FRAME_FIRST_REFLOW & mState), "bad mState"); - } - else { - NS_ASSERTION(0 == (NS_FRAME_FIRST_REFLOW & mState), "bad mState"); - } - - // Replace parent provided reflow state with our own significantly - // more extensive version. - nsCSSBlockReflowState state(aPresContext, aSpaceManager, - this, mStyleContext, - aReflowState, - PRBool(nsnull != aMetrics.maxElementSize)); - - nsresult rv = NS_OK; - if (eReflowReason_Initial == state.reason) { - DrainOverflowLines(); - rv = InitialReflow(state); - mState &= ~NS_FRAME_FIRST_REFLOW; - } - else if (eReflowReason_Incremental == state.reason) { - NS_ASSERTION(nsnull == mOverflowLines, "bad overflow list"); - nsIFrame* target; - state.reflowCommand->GetTarget(target); - if (this == target) { - nsIReflowCommand::ReflowType type; - state.reflowCommand->GetType(type); - switch (type) { - case nsIReflowCommand::FrameAppended: - rv = FrameAppendedReflow(state); - break; - - case nsIReflowCommand::FrameInserted: - rv = FrameInsertedReflow(state); - break; - - case nsIReflowCommand::FrameDeleted: - rv = FrameDeletedReflow(state); - break; - - default: - NS_NOTYETIMPLEMENTED("XXX"); - } - } - else { - // Get next frame in reflow command chain - state.reflowCommand->GetNext(state.mInlineLayout.mNextRCFrame); - - // Now do the reflow - rv = ChildIncrementalReflow(state); - } - } - else if (eReflowReason_Resize == state.reason) { - DrainOverflowLines(); - rv = ResizeReflow(state); - } - -#ifdef DTPF - // Update content offsets; we don't track them normally but we do - // need them because we are a pseudo-frame - if (nsnull != mLines) { - nsIFrame* firstChild = mLines->mFirstChild; - if (nsnull != firstChild) { - firstChild->GetContentIndex(mFirstContentOffset); - } - LineData* line = mLines; - while (nsnull != line->mNext) { - NS_ASSERTION(line->mChildCount > 0, "empty line left on list"); - line = line->mNext; - } - line->LastChild()->GetContentIndex(mLastContentOffset); - mLastContentIsComplete = line->GetLastContentIsComplete(); - } - if (state.mBlockIsPseudo) { - // Tell our parent to update it's offsets because our offsets have - // changed. - nsContainerFrame* parent = (nsContainerFrame*) mGeometricParent; - parent->PropagateContentOffsets(this, mFirstContentOffset, - mLastContentOffset, - mLastContentIsComplete); - } -#endif - - // Compute our final size - ComputeFinalSize(state, aMetrics, aDesiredRect); - -#ifdef NS_DEBUG - if (GetVerifyTreeEnable()) { - VerifyChildCount(mLines); - VerifyLines(mLines); - } -#endif - aStatus = rv; - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("exit nsCSSBlockFrame::Reflow: size=%d,%d rv=%x [%d,%d,%c]", - aMetrics.width, aMetrics.height, rv, - GetFirstContentOffset(), GetLastContentOffset(), - GetLastContentIsComplete()?'T':'F')); - return NS_OK; -} - -nsresult -nsCSSBlockFrame::ProcessInitialReflow(nsIPresContext* aPresContext) -{ - // XXX ick; html stuff. pfuui. - - if (nsnull == mPrevInFlow) { - const nsStyleDisplay* display = (const nsStyleDisplay*) - mStyleContext->GetStyleData(eStyleStruct_Display); - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockFrame::ProcessInitialReflow: display=%d", - display->mDisplay)); - if (NS_STYLE_DISPLAY_LIST_ITEM == display->mDisplay) { - // This container is a list-item container. Therefore it needs a - // bullet content object. However, it might have already had the - // bullet crated. Check to see if the first child of the - // container is a synthetic object; if it is, then don't make a - // bullet (XXX what a hack!). - nsIContent* firstContent = mContent->ChildAt(0); - if (nsnull != firstContent) { - PRBool is; - firstContent->IsSynthetic(is); - if (is) { - return NS_OK; - } - } - - nsIHTMLContent* bullet; - nsresult rv = NS_NewHTMLBullet(&bullet); - if (NS_OK != rv) { - return rv; - } - - // Insert the bullet. Do not allow an incremental reflow operation - // to occur. - mContent->InsertChildAt(bullet, 0, PR_FALSE); - } - } - - return NS_OK; -} - -#if XXX -// XXX It should be impossible to write this code because we use -// methods on nsContainerFrame that we have no right using. - -// XXX can't work: our parent can be an nsContainerFrame -or- an -// nsCSSBlockFrame; we can't tell them apart and yet the need to be -// updated when we are a pseudo-frame - -void -nsCSSBlockFrame::PropagateContentOffsets() -{ - NS_PRECONDITION(IsPseudoFrame(), "not a pseudo frame"); - nsIFrame* parent = mGeometricParent; - if (nsnull != parent) { - // If we're the first child frame then update our parent's content offset - nsIFrame* firstChild; - parent->FirstChild(firstChild); - if (firstChild == this) { - parent->SetFirstContentOffset(GetFirstContentOffset()); - } - - // If we're the last child frame then update our parent's content offset - if (nsnull == mNextSibling) { - parent->SetLastContentOffset(GetLastContentOffset()); - parent->SetLastContentIsComplete(GetLastContentIsComplete()); - } - - // If the parent is being used as a pseudo frame then we need to propagate - // the content offsets upwards to its parent frame - if (parent->IsPseudoFrame()) { - parent->PropagateContentOffsets(); - } - } -} -#endif - -void -nsCSSBlockFrame::ComputeFinalSize(nsCSSBlockReflowState& aState, - nsReflowMetrics& aMetrics, - nsRect& aDesiredRect) -{ - aDesiredRect.x = 0; - aDesiredRect.y = 0; - - // Special check for zero sized content: If our content is zero - // sized then we collapse into nothingness. - if ((0 == aState.mKidXMost - aState.mBorderPadding.left) && - (0 == aState.mY - aState.mBorderPadding.top)) { - aDesiredRect.width = 0; - aDesiredRect.height = 0; - } - else { - aDesiredRect.width = aState.mKidXMost + aState.mBorderPadding.right; - if (!aState.mUnconstrainedWidth) { - // Make sure we're at least as wide as the max size we were given - if (aDesiredRect.width < aState.maxSize.width) { - aDesiredRect.width = aState.maxSize.width; - } - } - aState.mY += aState.mBorderPadding.bottom; - nscoord lastBottomMargin = aState.mPrevPosBottomMargin - - aState.mPrevNegBottomMargin; - if (!aState.mUnconstrainedHeight && (lastBottomMargin > 0)) { - // It's possible that we don't have room for the last bottom - // margin (the last bottom margin is the margin following a block - // element that we contain; it isn't applied immediately because - // of the margin collapsing logic). This can happen when we are - // reflowed in a limited amount of space because we don't know in - // advance what the last bottom margin will be. - nscoord maxY = aState.maxSize.height; - if (aState.mY + lastBottomMargin > maxY) { - lastBottomMargin = maxY - aState.mY; - if (lastBottomMargin < 0) { - lastBottomMargin = 0; - } - } - } - aState.mY += lastBottomMargin; - aDesiredRect.height = aState.mY; - - if (!aState.mBlockIsPseudo) { - // Clamp the desired rect height when style height applies - PRIntn ss = aState.mStyleSizeFlags; - if (0 != (ss & NS_SIZE_HAS_HEIGHT)) { - aDesiredRect.height = aState.mBorderPadding.top + - aState.mStyleSize.height + aState.mBorderPadding.bottom; - } - } - } - - aMetrics.width = aDesiredRect.width; - aMetrics.height = aDesiredRect.height; - aMetrics.ascent = aMetrics.height; - aMetrics.descent = 0; - if (aState.mComputeMaxElementSize) { - *aMetrics.maxElementSize = aState.mMaxElementSize; - } - NS_ASSERTION(aDesiredRect.width < 1000000, "whoops"); -} - -// XXX move this somewhere else!!! -static PRBool -TreatFrameAsBlock(const nsStyleDisplay* aDisplay) -{ - switch (aDisplay->mDisplay) { - case NS_STYLE_DISPLAY_BLOCK: - case NS_STYLE_DISPLAY_LIST_ITEM: - case NS_STYLE_DISPLAY_TABLE: - return PR_TRUE; - } - return PR_FALSE; -} - -nsresult -nsCSSBlockFrame::InitialReflow(nsCSSBlockReflowState& aState) -{ - // Create synthetic content (XXX a hack) - nsresult rv = ProcessInitialReflow(aState.mPresContext); - if (NS_OK != rv) { - return rv; - } - - // Create new frames - if (nsnull == mNextInFlow) { - rv = CreateNewFrames(aState.mPresContext); - if (NS_OK != rv) { - return rv; - } - } - - // Generate text-run information - rv = FindTextRuns(aState); - if (NS_OK != rv) { - return rv; - } - - // Reflow everything - aState.GetAvailableSpace(); - return ResizeReflow(aState); -} - -nsresult -nsCSSBlockFrame::FrameAppendedReflow(nsCSSBlockReflowState& aState) -{ - // Create new frames for the appended content. Each line that is - // impacted by this will be marked dirty. - nsresult rv = CreateNewFrames(aState.mPresContext); - if (NS_OK != rv) { - return rv; - } - - // Generate text-run information - rv = FindTextRuns(aState); - if (NS_OK != rv) { - return rv; - } - - // Recover our reflow state. First find the lastCleanLine and the - // firstDirtyLine which follows it. While we are looking, compute - // the maximum xmost of each line. - LineData* firstDirtyLine = mLines; - LineData* lastCleanLine = nsnull; - while (nsnull != firstDirtyLine) { - if (firstDirtyLine->IsDirty()) { - break; - } - nscoord xmost = firstDirtyLine->mBounds.XMost(); -NS_ASSERTION(xmost < 1000000, "bad line width"); - if (xmost > aState.mKidXMost) { - aState.mKidXMost = xmost; - } - lastCleanLine = firstDirtyLine; - firstDirtyLine = firstDirtyLine->mNext; - } - - if (nsnull != lastCleanLine) { - // Start Y off just past the bottom of the line before the last line - aState.mY = lastCleanLine->mBounds.YMost(); - - // Recover previous bottom margin values - if (lastCleanLine->IsBlock()) { - nsIFrame* frame = lastCleanLine->mFirstChild; - const nsStyleSpacing* spacing; - frame->GetStyleData(eStyleStruct_Spacing, - (const nsStyleStruct*&) spacing); - nsMargin margin; - spacing->CalcMarginFor(frame, margin); - if (margin.bottom < 0) { - aState.mPrevPosBottomMargin = 0; - aState.mPrevNegBottomMargin = -margin.bottom; - } - else { - aState.mPrevPosBottomMargin = margin.bottom; - aState.mPrevNegBottomMargin = 0; - } - } - else { - aState.mPrevPosBottomMargin = 0; - aState.mPrevNegBottomMargin = 0; - } - } - aState.GetAvailableSpace(); - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockReflowState::FrameAppendedReflow: y=%d firstDirtyLine=%p", - aState.mY, firstDirtyLine)); - - // Reflow lines from there forward - aState.mPrevLine = lastCleanLine; - return ReflowLinesAt(aState, firstDirtyLine); -} - -nsresult -nsCSSBlockFrame::CreateNewFrames(nsIPresContext* aPresContext) -{ - NS_ASSERTION((nsnull == mOverflowLines) && (nsnull == mNextInFlow), - "bad call to CreateNewFrames"); - - // Get our last line and then get its last child. Use that - // information to determine our kidContentIndex. - LineData* lastLine = LastLine(mLines); - nsIFrame* lastFrame; - PRInt32 kidContentIndex; - if (nsnull != lastLine) { - lastFrame = lastLine->LastChild(); - lastFrame->GetContentIndex(kidContentIndex); - if (lastLine->GetLastContentIsComplete()) { - kidContentIndex++; - } - else { -#ifdef NS_DEBUG - // Because we always create continuations as we find them (XXX - // sigh) instead of when we need them, we can assert that if the - // last child is not complete then it already has a continuation. - nsIFrame* kidNextInFlow; - lastFrame->GetNextInFlow(kidNextInFlow); - NS_ASSERTION(nsnull != kidNextInFlow, "whoops"); -#endif - } - } - else { - // We can't have an empty line list and have a prev-in-flow. If we - // have a prev-in-flow then we are its continuation which means it - // must have pushed some lines into its overflow list; therefore - // we must have some lines. - NS_ASSERTION(nsnull == mPrevInFlow, "prev-in-flow without overflow lines"); - lastFrame = nsnull; - kidContentIndex = 0; - } - - // Make sure that new inlines go onto the end of the lastLine when - // the lastLine is mapping inline frames. - PRInt32 pendingInlines = 0; - if (nsnull != lastLine) { - if (!lastLine->IsBlock()) { - pendingInlines = 1; - } - } - - // Now create frames for all of the new content. - nsresult rv; - PRInt32 lastContentIndex; - lastContentIndex = mContent->ChildCount(); - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("enter nsCSSBlockFrame::CreateNewFrames: kidContentIndex=%d lastContentIndex=%d", - kidContentIndex, lastContentIndex)); - for (; kidContentIndex < lastContentIndex; kidContentIndex++) { - nsIContent* kid; - kid = mContent->ChildAt(kidContentIndex); - if (nsnull == kid) { - break; - } - - // Create frame for our new child and add it to the sibling list - nsIFrame* frame; - rv = nsHTMLBase::CreateFrame(aPresContext, this, kid, nsnull, frame); - NS_RELEASE(kid); - if (NS_OK != rv) { - return rv; - } - if (nsnull != lastFrame) { - lastFrame->SetNextSibling(frame); - } - lastFrame = frame; -//XXX childPrevInFlow = nsnull; - NS_FRAME_TRACE(NS_FRAME_TRACE_NEW_FRAMES, - ("nsCSSBlockFrame::CreateNewFrames: new-frame=%p", frame)); - - // See if the child is a block or non-block - const nsStyleDisplay* kidDisplay; - rv = frame->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&) kidDisplay); - if (NS_OK != rv) { - return rv; - } - PRBool isBlock = TreatFrameAsBlock(kidDisplay); - - // If the child is an inline then add it to the lastLine (if it's - // an inline line, otherwise make a new line). If the child is a - // block then make a new line and put the child in that line. - if (isBlock) { - // If the previous line has pending inline data to be reflowed, - // do so now. - if (0 != pendingInlines) { - // Set this to true in case we don't end up reflowing all of the - // frames on the line (because they end up being pushed). - lastLine->SetLastContentIsComplete(); - lastLine->MarkDirty(); - pendingInlines = 0; - } - - // Create a line for the block - LineData* line = new LineData(frame, 1, - (LINE_IS_BLOCK | - LINE_LAST_CONTENT_IS_COMPLETE)); - if (nsnull == line) { - return NS_ERROR_OUT_OF_MEMORY; - } - if (nsnull == lastLine) { - mLines = line; - } - else { - lastLine->mNext = line; - } - lastLine = line; - } - else { - // Queue up the inlines for reflow later on - if (0 == pendingInlines) { - LineData* line = new LineData(frame, 0, 0); - if (nsnull == line) { - return NS_ERROR_OUT_OF_MEMORY; - } - if (nsnull == lastLine) { - mLines = line; - } - else { - lastLine->mNext = line; - } - lastLine = line; - } - lastLine->mChildCount++; - pendingInlines++; - } - } - - if (0 != pendingInlines) { - // Set this to true in case we don't end up reflowing all of the - // frames on the line (because they end up being pushed). - lastLine->SetLastContentIsComplete(); - lastLine->MarkDirty(); - } - - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("exit nsCSSBlockFrame::CreateNewFrames")); - return NS_OK; -} - -// XXX keep the text-run data in the first-in-flow of the block -nsresult -nsCSSBlockFrame::FindTextRuns(nsCSSBlockReflowState& aState) -{ - // Destroy old run information first - nsCSSTextRun::DeleteTextRuns(mTextRuns); - mTextRuns = nsnull; - aState.mLineLayout.ResetTextRuns(); - - // Ask each child that implements nsIInlineReflow to find its text runs - LineData* line = mLines; - while (nsnull != line) { - if (!line->IsBlock()) { - nsIFrame* frame = line->mFirstChild; - PRInt32 n = line->mChildCount; - while (--n >= 0) { - nsIInlineReflow* inlineReflow; - if (NS_OK == frame->QueryInterface(kIInlineReflowIID, - (void**)&inlineReflow)) { - nsresult rv = inlineReflow->FindTextRuns(aState.mLineLayout, - aState.reflowCommand); - if (NS_OK != rv) { - return rv; - } - } - else { - // A frame that doesn't implement nsIInlineReflow isn't text - // therefore it will end an open text run. - aState.mLineLayout.EndTextRun(); - } - frame->GetNextSibling(frame); - } - } - else { - // A frame that doesn't implement nsIInlineReflow isn't text - // therefore it will end an open text run. - aState.mLineLayout.EndTextRun(); - } - line = line->mNext; - } - aState.mLineLayout.EndTextRun(); - - // Now take the text-runs away from the line layout engine. - mTextRuns = aState.mLineLayout.TakeTextRuns(); - - return NS_OK; -} - -nsresult -nsCSSBlockFrame::FrameInsertedReflow(nsCSSBlockReflowState& aState) -{ - LineData* line = mLines; - while (nsnull != line->mNext) { - if (line->IsDirty()) { - break; - } - line = line->mNext; - } - NS_ASSERTION(nsnull != line, "bad inserted reflow"); - //XXX return ReflowDirtyLines(aState, line); - - // XXX Correct implementation: reflow the dirty lines only; all - // other lines can be moved; recover state before first dirty line. - - // XXX temporary - aState.GetAvailableSpace(); - aState.mPrevLine = nsnull; - return ReflowLinesAt(aState, mLines); -} - -nsresult -nsCSSBlockFrame::FrameDeletedReflow(nsCSSBlockReflowState& aState) -{ - LineData* line = mLines; - while (nsnull != line->mNext) { - if (line->IsDirty()) { - break; - } - line = line->mNext; - } - NS_ASSERTION(nsnull != line, "bad inserted reflow"); - //XXX return ReflowDirtyLines(aState, line); - - // XXX Correct implementation: reflow the dirty lines only; all - // other lines can be moved; recover state before first dirty line. - - // XXX temporary - aState.GetAvailableSpace(); - aState.mPrevLine = nsnull; - return ReflowLinesAt(aState, mLines); -} - -// XXX Todo: some incremental reflows are passing through this block -// and into a child block; those cannot impact our text-runs. In that -// case skip the FindTextRuns work. - -// XXX easy optimizations: find the line that contains the next child -// in the reflow-command path and mark it dirty and only reflow it; -// recover state before it, slide lines down after it. - -nsresult -nsCSSBlockFrame::ChildIncrementalReflow(nsCSSBlockReflowState& aState) -{ - // Generate text-run information; this will also "fluff out" any - // inline children's frame tree. - nsresult rv = FindTextRuns(aState); - if (NS_OK != rv) { - return rv; - } - - // XXX temporary - aState.GetAvailableSpace(); - aState.mPrevLine = nsnull; - return ReflowLinesAt(aState, mLines); -} - -nsresult -nsCSSBlockFrame::ResizeReflow(nsCSSBlockReflowState& aState) -{ - // Mark everything dirty - LineData* line = mLines; - while (nsnull != line) { - line->MarkDirty(); - line = line->mNext; - } - - // Reflow all of our lines - aState.GetAvailableSpace(); - aState.mPrevLine = nsnull; - return ReflowLinesAt(aState, mLines); -} - -nsresult -nsCSSBlockFrame::ReflowLinesAt(nsCSSBlockReflowState& aState, LineData* aLine) -{ - if ((nsnull != mRunInFloaters) && (aLine == mLines)) { - aState.PlaceBelowCurrentLineFloaters(mRunInFloaters); - } - - // Reflow the lines that are already ours - while (nsnull != aLine) { - nsInlineReflowStatus rs; - if (!ReflowLine(aState, aLine, rs)) { - if (NS_IS_REFLOW_ERROR(rs)) { - return nsresult(rs); - } - return NS_FRAME_NOT_COMPLETE; - } - aState.mLineLayout.NextLine(); - aState.mPrevLine = aLine; - aLine = aLine->mNext; - } - - // Pull data from a next-in-flow if we can - while (nsnull != aState.mNextInFlow) { - // Grab first line from our next-in-flow - aLine = aState.mNextInFlow->mLines; - if (nsnull == aLine) { - aState.mNextInFlow = (nsCSSBlockFrame*) aState.mNextInFlow->mNextInFlow; - continue; - } - // XXX See if the line is not dirty; if it's not maybe we can - // avoid the pullup if it can't fit? - aState.mNextInFlow->mLines = aLine->mNext; - aLine->mNext = nsnull; - if (0 == aLine->mChildCount) { - // The line is empty. Try the next one. - NS_ASSERTION(nsnull == aLine->mChildCount, "bad empty line"); - aLine->mNext = aState.mFreeList; - aState.mFreeList = aLine; - continue; - } - - // Make the children in the line ours. - nsIFrame* frame = aLine->mFirstChild; - nsIFrame* lastFrame = nsnull; - PRInt32 n = aLine->mChildCount; - while (--n >= 0) { - nsIFrame* geometricParent; - nsIFrame* contentParent; - frame->GetGeometricParent(geometricParent); - frame->GetContentParent(contentParent); - if (contentParent == geometricParent) { - frame->SetContentParent(this); - } - frame->SetGeometricParent(this); - lastFrame = frame; - frame->GetNextSibling(frame); - } - lastFrame->SetNextSibling(nsnull); - -#ifdef NS_DEBUG - LastChild(lastFrame); - NS_ASSERTION(lastFrame == aState.mPrevChild, "bad aState.mPrevChild"); -#endif - - // Add line to our line list - if (nsnull == aState.mPrevLine) { - NS_ASSERTION(nsnull == mLines, "bad aState.mPrevLine"); - mLines = aLine; - } - else { - NS_ASSERTION(nsnull == aState.mPrevLine->mNext, "bad aState.mPrevLine"); - aState.mPrevLine->mNext = aLine; - aState.mPrevChild->SetNextSibling(aLine->mFirstChild); - } -#ifdef NS_DEBUG - if (GetVerifyTreeEnable()) { - VerifyChildCount(mLines); - } -#endif - - // Now reflow it and any lines that it makes during it's reflow. - while (nsnull != aLine) { - nsInlineReflowStatus rs; - if (!ReflowLine(aState, aLine, rs)) { - if (NS_IS_REFLOW_ERROR(rs)) { - return nsresult(rs); - } - return NS_FRAME_NOT_COMPLETE; - } - aState.mLineLayout.NextLine(); - aState.mPrevLine = aLine; - aLine = aLine->mNext; - } - } - - return NS_FRAME_COMPLETE; -} - -/** - * Reflow a line. The line will either contain a single block frame - * or contain 1 or more inline frames. - */ -PRBool -nsCSSBlockFrame::ReflowLine(nsCSSBlockReflowState& aState, - LineData* aLine, - nsInlineReflowStatus& aReflowResult) -{ - PRBool keepGoing = PR_FALSE; - nsCSSBlockFrame* nextInFlow; - aState.mInlineLayoutPrepared = PR_FALSE; - aLine->ClearDirty(); - - // Reflow mapped frames in the line - PRInt32 n = aLine->mChildCount; - if (0 != n) { - nsIFrame* frame = aLine->mFirstChild; -#ifdef NS_DEBUG - const nsStyleDisplay* display; - frame->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&) display); - PRBool isBlock = TreatFrameAsBlock(display); - NS_ASSERTION(isBlock == aLine->IsBlock(), "bad line isBlock"); -#endif - if (aLine->IsBlock()) { - keepGoing = ReflowBlockFrame(aState, aLine, frame, aReflowResult); - return keepGoing; - } - else { - while (--n >= 0) { - if (!ReflowInlineFrame(aState, aLine, frame, aReflowResult)) { - goto done; - } - frame->GetNextSibling(frame); - } - } - } - - // Pull frames from the next line until we can't - while (nsnull != aLine->mNext) { - LineData** linep = &aLine->mNext; - keepGoing = PullFrame(aState, aLine, &aLine->mNext, - PR_FALSE, aReflowResult); - if (!keepGoing) { - goto done; - } - } - - // Pull frames from the next-in-flow(s) until we can't - nextInFlow = aState.mNextInFlow; - while (nsnull != nextInFlow) { - LineData* line = nextInFlow->mLines; - if (nsnull == line) { - nextInFlow = (nsCSSBlockFrame*) nextInFlow->mNextInFlow; - aState.mNextInFlow = nextInFlow; - continue; - } - keepGoing = PullFrame(aState, aLine, &nextInFlow->mLines, - PR_TRUE, aReflowResult); - if (!keepGoing) { - goto done; - } - } - keepGoing = PR_TRUE; - -done:; - if (!aLine->IsBlock()) { - return PlaceLine(aState, aLine, aReflowResult); - } - return keepGoing; -} - -PRBool -nsCSSBlockFrame::ReflowBlockFrame(nsCSSBlockReflowState& aState, - LineData* aLine, - nsIFrame* aFrame, - nsInlineReflowStatus& aReflowResult) -{ - NS_FRAME_TRACE(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockFrame::ReflowBlockFrame: line=%p frame=%p y=%d", - aLine, aFrame, aState.mY)); - - // Get the block's margins - nsMargin blockMargin; - const nsStyleSpacing* blockSpacing; - aFrame->GetStyleData(eStyleStruct_Spacing, - (const nsStyleStruct*&)blockSpacing); - blockSpacing->CalcMarginFor(aFrame, blockMargin); - - // XXX ebina margins... - nscoord posTopMargin, negTopMargin; - if (blockMargin.top < 0) { - negTopMargin = -blockMargin.top; - posTopMargin = 0; - } - else { - negTopMargin = 0; - posTopMargin = blockMargin.top; - } - nscoord prevPos = aState.mPrevPosBottomMargin; - nscoord prevNeg = aState.mPrevNegBottomMargin; - nscoord maxPos = PR_MAX(prevPos, posTopMargin); - nscoord maxNeg = PR_MAX(prevNeg, negTopMargin); - nscoord topMargin = maxPos - maxNeg; - - // Remember bottom margin for next time - if (blockMargin.bottom < 0) { - aState.mPrevNegBottomMargin = -blockMargin.bottom; - aState.mPrevPosBottomMargin = 0; - } - else { - aState.mPrevNegBottomMargin = 0; - aState.mPrevPosBottomMargin = blockMargin.bottom; - } - - nscoord x = aState.mX + blockMargin.left; - nscoord y = aState.mY + topMargin; - aFrame->WillReflow(*aState.mPresContext); - aFrame->MoveTo(x, y); - - // Compute the available space that the child block can reflow into - nsSize availSize; - if (aState.mUnconstrainedWidth) { - // Never give a block an unconstrained width - if (!aState.mHaveBlockMaxWidth) { - const nsReflowState* rsp = aState.parentReflowState; - aState.mBlockMaxWidth = 0; - while (nsnull != rsp) { - if (NS_UNCONSTRAINEDSIZE != rsp->maxSize.width) { -NS_ASSERTION(rsp->maxSize.width < 1000000, "whoops: bad parent"); - aState.mBlockMaxWidth = rsp->maxSize.width; - const nsStyleSpacing* spacing = nsnull; - rsp->frame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing); - if (nsnull!=spacing) - { - nsMargin borderPadding; - spacing->CalcBorderPaddingFor(rsp->frame, borderPadding); - aState.mBlockMaxWidth -= (borderPadding.right + borderPadding.left); - } - break; - } - rsp = rsp->parentReflowState; - } - NS_ASSERTION(0 != aState.mBlockMaxWidth, "no width for block found"); - aState.mHaveBlockMaxWidth = PR_TRUE; - } - availSize.width = aState.mBlockMaxWidth; - } - else { - availSize.width = aState.mInnerSize.width - - (blockMargin.left + blockMargin.right); - } - availSize.height = aState.mBottomEdge - y; - NS_FRAME_TRACE(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockFrame::ReflowBlockFrame: availSize={%d,%d}", - availSize.width, availSize.height)); - - // Determine the reason for the reflow - nsReflowReason reason = eReflowReason_Resize; - nsFrameState state; - aFrame->GetFrameState(state); - if (NS_FRAME_FIRST_REFLOW & state) { - reason = eReflowReason_Initial; - } - else if (aState.mInlineLayout.mNextRCFrame == aFrame) { - reason = eReflowReason_Incremental; - // Make sure we only incrementally reflow once - aState.mInlineLayout.mNextRCFrame = nsnull; - } - - // Reflow the block frame. Use the run-around API if possible; - // otherwise treat it as a rectangular lump and place it. - nsresult rv; - nsSize kidMaxElementSize; - nsReflowMetrics metrics(aState.mComputeMaxElementSize - ? &kidMaxElementSize - : nsnull); - nsReflowStatus reflowStatus; - nsIRunaround* runAround; - if ((nsnull != aState.mSpaceManager) && - (NS_OK == aFrame->QueryInterface(kIRunaroundIID, (void**)&runAround))) { - - // Reflow the block - nsReflowState reflowState(aFrame, aState, availSize); - reflowState.reason = reason; - nsRect r; - aState.mSpaceManager->Translate(x, y); - rv = runAround->Reflow(aState.mPresContext, aState.mSpaceManager, - metrics, reflowState, r, reflowStatus); - aState.mSpaceManager->Translate(-x, -y); - metrics.width = r.width; - metrics.height = r.height; - metrics.ascent = r.height; - metrics.descent = 0; - } - else { - nsReflowState reflowState(aFrame, aState, availSize); - reflowState.reason = reason; - rv = aFrame->Reflow(aState.mPresContext, metrics, reflowState, - reflowStatus); - } - if (NS_IS_REFLOW_ERROR(rv)) { - aReflowResult = nsInlineReflowStatus(rv); - return PR_FALSE; - } - - if (NS_FRAME_IS_COMPLETE(reflowStatus)) { - nsIFrame* kidNextInFlow; - aFrame->GetNextInFlow(kidNextInFlow); - if (nsnull != kidNextInFlow) { - // Remove all of the childs next-in-flows. Make sure that we ask - // the right parent to do the removal (it's possible that the - // parent is not this because we are executing pullup code) - nsIFrame* parent; - aFrame->GetGeometricParent(parent); - ((nsCSSBlockFrame*)parent)->DeleteNextInFlowsFor(aFrame); - } - aLine->SetLastContentIsComplete(); - aReflowResult = NS_FRAME_COMPLETE; - } - else { - aLine->ClearLastContentIsComplete(); - aReflowResult = NS_FRAME_NOT_COMPLETE; - } - - // See if it fit - nscoord newY = y + metrics.height; - NS_FRAME_TRACE(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockFrame::ReflowBlockFrame: metrics={%d,%d} newY=%d maxY=%d", - metrics.width, metrics.height, newY, aState.mBottomEdge)); - if ((mLines != aLine) && (newY > aState.mBottomEdge)) { - // None of the block fit. Push aLine and any other lines that follow - PushLines(aState); - aReflowResult = NS_INLINE_LINE_BREAK_BEFORE(reflowStatus); - return PR_FALSE; - } - - // Update max-element-size - if (aState.mComputeMaxElementSize) { - if (kidMaxElementSize.width > aState.mMaxElementSize.width) { - aState.mMaxElementSize.width = kidMaxElementSize.width; - } - if (kidMaxElementSize.height > aState.mMaxElementSize.height) { - aState.mMaxElementSize.height = kidMaxElementSize.height; - } - } - - // Save away bounds before other adjustments - aLine->mBounds.x = x; - aLine->mBounds.y = y; - aLine->mBounds.width = metrics.width; - aLine->mBounds.height = metrics.height; - nscoord xmost = aLine->mBounds.XMost(); -NS_ASSERTION(xmost < 1000000, "bad line width"); - if (xmost > aState.mKidXMost) { - aState.mKidXMost = xmost; - } - - // Place child then align it and relatively position it - aFrame->SetRect(aLine->mBounds); - aState.mY = newY; - if (!aState.mUnconstrainedWidth) { - nsCSSLayout::HorizontallyPlaceChildren(aState.mPresContext, - aState.mBlock, - aState.mTextAlign, - aState.mDirection, - aFrame, 1, - metrics.width, - availSize.width); - } - nsCSSLayout::RelativePositionChildren(aState.mPresContext, - aState.mBlock, - aFrame, 1); - aState.mPrevChild = aFrame; - - if (NS_FRAME_IS_NOT_COMPLETE(reflowStatus)) { - // Some of the block fit. We need to have the block frame - // continued, so we make sure that it has a next-in-flow now. - nsIFrame* nextInFlow; - rv = aState.mInlineLayout.MaybeCreateNextInFlow(aFrame, nextInFlow); - if (NS_OK != rv) { - aReflowResult = nsInlineReflowStatus(rv); - return PR_FALSE; - } - if (nsnull != nextInFlow) { - // We made a next-in-flow for the block child frame. Create a - // line to map the block childs next-in-flow. - LineData* line = new LineData(nextInFlow, 1, - (LINE_IS_BLOCK | - LINE_LAST_CONTENT_IS_COMPLETE)); - if (nsnull == line) { - aReflowResult = nsInlineReflowStatus(NS_ERROR_OUT_OF_MEMORY); - return PR_FALSE; - } - line->mNext = aLine->mNext; - aLine->mNext = line; - } - - // Advance mPrevLine because we are keeping aLine (since some of - // the child block frame fit). Then push any remaining lines to - // our next-in-flow - aState.mPrevLine = aLine; - if (nsnull != aLine->mNext) { - PushLines(aState); - } - aReflowResult = NS_INLINE_LINE_BREAK_AFTER(reflowStatus); - return PR_FALSE; - } - return PR_TRUE; -} - -PRBool -nsCSSBlockFrame::ReflowInlineFrame(nsCSSBlockReflowState& aState, - LineData* aLine, - nsIFrame* aFrame, - nsInlineReflowStatus& aReflowResult) -{ - if (!aState.mInlineLayoutPrepared) { - aState.mLineLayout.Prepare(aState.mX); - aState.mInlineLayout.Prepare(aState.mUnconstrainedWidth, aState.mNoWrap, - aState.mComputeMaxElementSize); - aState.mInlineLayout.SetReflowSpace(aState.mCurrentBand.availSpace.x, - aState.mY, - aState.mCurrentBand.availSpace.width, - aState.mCurrentBand.availSpace.height); - // If we we are a list-item container and we are positioning the - // first child on the line (which is true when !mInlineLayoutPrepared) - // and it's the first line, and we are not a continuation, then - // set the mIsBullet flag for the line layout code. - if (aState.mLineLayout.mListPositionOutside && - (0 == aState.mLineLayout.mLineNumber) && - (nsnull == mPrevInFlow)) { - aState.mInlineLayout.mIsBullet = PR_TRUE; - } - aState.mInlineLayoutPrepared = PR_TRUE; - } - - nsresult rv; - nsIFrame* nextInFlow; - aReflowResult = aState.mInlineLayout.ReflowAndPlaceFrame(aFrame); - aState.mInlineLayout.mIsBullet = PR_FALSE; - if (NS_IS_REFLOW_ERROR(aReflowResult)) { - return PR_FALSE; - } - PRBool lineWasComplete = aLine->GetLastContentIsComplete(); - if (!NS_INLINE_IS_BREAK(aReflowResult)) { - aState.mPrevChild = aFrame; - if (NS_FRAME_IS_COMPLETE(aReflowResult)) { - aFrame->GetNextSibling(aFrame); - aLine->SetLastContentIsComplete(); - return PR_TRUE; - } - - // Create continuation frame (if necessary); add it to the end of - // the current line so that it can be pushed to the next line - // properly. - aLine->ClearLastContentIsComplete(); - rv = aState.mInlineLayout.MaybeCreateNextInFlow(aFrame, nextInFlow); - if (NS_OK != rv) { - aReflowResult = nsInlineReflowStatus(rv); - return PR_FALSE; - } - if (nsnull != nextInFlow) { - // Add new child to the line - aLine->mChildCount++; - } - aFrame->GetNextSibling(aFrame); - } - else { - if (NS_INLINE_IS_BREAK_AFTER(aReflowResult)) { - aState.mPrevChild = aFrame; - if (NS_FRAME_IS_COMPLETE(aReflowResult)) { - aLine->SetLastContentIsComplete(); - } - else { - // Create continuation frame (if necessary); add it to the end of - // the current line so that it can be pushed to the next line - // properly. - aLine->ClearLastContentIsComplete(); - rv = aState.mInlineLayout.MaybeCreateNextInFlow(aFrame, nextInFlow); - if (NS_OK != rv) { - aReflowResult = nsInlineReflowStatus(rv); - return PR_FALSE; - } - if (nsnull != nextInFlow) { - // Add new child to the line - aLine->mChildCount++; - } - } - aFrame->GetNextSibling(aFrame); - } - else { - NS_ASSERTION(aLine->GetLastContentIsComplete(), "bad mState"); - } - } - - // Split line since we aren't going to keep going - rv = SplitLine(aState, aLine, aFrame, lineWasComplete); - if (NS_IS_REFLOW_ERROR(rv)) { - aReflowResult = nsInlineReflowStatus(rv); - } - return PR_FALSE; -} - -// XXX alloc lines using free-list in aState - -// XXX refactor this since the split NEVER has to deal with blocks - -nsresult -nsCSSBlockFrame::SplitLine(nsCSSBlockReflowState& aState, - LineData* aLine, - nsIFrame* aFrame, - PRBool aLineWasComplete) -{ - PRInt32 pushCount = aLine->mChildCount - aState.mInlineLayout.mFrameNum; - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockFrame::SplitLine: pushing %d frames", - pushCount)); - if (0 != pushCount) { - NS_ASSERTION(nsnull != aFrame, "whoops"); - LineData* to = aLine->mNext; - if (nsnull != to) { - // Only push into the next line if it's empty; otherwise we can - // end up pushing a frame which is continued into the same frame - // as it's continuation. This causes all sorts of bad side - // effects so we don't allow it. - if (to->mChildCount != 0) { - LineData* insertedLine = new LineData(aFrame, pushCount, 0); - aLine->mNext = insertedLine; - insertedLine->mNext = to; - to = insertedLine; - } else { - to->mFirstChild = aFrame; - to->mChildCount += pushCount; - } - } else { - to = new LineData(aFrame, pushCount, 0); - aLine->mNext = to; - } - if (nsnull == to) { - return NS_ERROR_OUT_OF_MEMORY; - } - to->SetLastContentIsComplete(aLineWasComplete); - aLine->mChildCount -= pushCount; -#ifdef NS_DEBUG - if (GetVerifyTreeEnable()) { - aLine->Verify(); - } -#endif - NS_ASSERTION(0 != aLine->mChildCount, "bad push"); - } - return NS_OK; -} - -PRBool -nsCSSBlockFrame::PullFrame(nsCSSBlockReflowState& aState, - LineData* aLine, - LineData** aFromList, - PRBool aUpdateGeometricParent, - nsInlineReflowStatus& aReflowResult) -{ - LineData* fromLine = *aFromList; - NS_ASSERTION(nsnull != fromLine, "bad line to pull from"); - if (0 == fromLine->mChildCount) { - // Discard empty lines immediately. Empty lines can happen here - // because of DeleteChildsNextInFlow not being able to delete - // lines. - *aFromList = fromLine->mNext; - NS_ASSERTION(nsnull == fromLine->mFirstChild, "bad empty line"); - fromLine->mNext = aState.mFreeList; - aState.mFreeList = fromLine; - return PR_TRUE; - } - - // If our line is not empty and the child in aFromLine is a block - // then we cannot pull up the frame into this line. - if ((0 != aLine->mChildCount) && fromLine->IsBlock()) { - aReflowResult = NS_INLINE_LINE_BREAK_BEFORE(0); - return PR_FALSE; - } - - // Take frame from fromLine - nsIFrame* frame = fromLine->mFirstChild; - if (0 == aLine->mChildCount++) { - aLine->mFirstChild = frame; - aLine->SetIsBlock(fromLine->IsBlock()); -#ifdef NS_DEBUG - const nsStyleDisplay* display; - frame->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&) display); - PRBool isBlock = TreatFrameAsBlock(display); - NS_ASSERTION(isBlock == aLine->IsBlock(), "bad line isBlock"); -#endif - } - if (0 != --fromLine->mChildCount) { - frame->GetNextSibling(fromLine->mFirstChild); - } - else { - // Free up the fromLine now that it's empty - *aFromList = fromLine->mNext; - fromLine->mFirstChild = nsnull; - fromLine->mNext = aState.mFreeList; - aState.mFreeList = fromLine; - } - - // Change geometric parents - if (aUpdateGeometricParent) { - nsIFrame* geometricParent; - nsIFrame* contentParent; - frame->GetGeometricParent(geometricParent); - frame->GetContentParent(contentParent); - if (contentParent == geometricParent) { - frame->SetContentParent(this); - } - frame->SetGeometricParent(this); - - // The frame is being pulled from a next-in-flow; therefore we - // need to add it to our sibling list. - if (nsnull != aState.mPrevChild) { - aState.mPrevChild->SetNextSibling(frame); - } - frame->SetNextSibling(nsnull); - } - - // Reflow the frame - if (aLine->IsBlock()) { - return ReflowBlockFrame(aState, aLine, frame, aReflowResult); - } - else { - return ReflowInlineFrame(aState, aLine, frame, aReflowResult); - } -} - -PRBool -nsCSSBlockFrame::PlaceLine(nsCSSBlockReflowState& aState, - LineData* aLine, - nsInlineReflowStatus aReflowStatus) -{ - // Align the children. This also determines the actual height and - // width of the line. - aState.mInlineLayout.AlignFrames(aLine->mFirstChild, aLine->mChildCount, - aLine->mBounds); - - // See if the line fit. If it doesn't we need to push it. Our first - // line will always fit. - - // XXX This is a good place to check and see if we have - // below-current-line floaters, and if we do make sure that they fit - // too. - nscoord newY = aState.mY + aLine->mBounds.height; - NS_FRAME_TRACE(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockFrame::PlaceLine: newY=%d limit=%d lineHeight=%d", - newY, aState.mBottomEdge, aLine->mBounds.height)); - if ((mLines != aLine) && (newY > aState.mBottomEdge)) { - // Push this line and all of it's children and anything else that - // follows to our next-in-flow - PushLines(aState); - return PR_FALSE; - } - - // Update max-element-size - if (aState.mComputeMaxElementSize) { - nsSize& lineMaxElementSize = aState.mInlineLayout.mMaxElementSize; - if (lineMaxElementSize.width > aState.mMaxElementSize.width) { - aState.mMaxElementSize.width = lineMaxElementSize.width; - } - if (lineMaxElementSize.height > aState.mMaxElementSize.height) { - aState.mMaxElementSize.height = lineMaxElementSize.height; - } - } - - nscoord xmost = aLine->mBounds.XMost(); -NS_ASSERTION(xmost < 1000000, "bad line width"); - if (xmost > aState.mKidXMost) { - aState.mKidXMost = xmost; - } - aState.mY = newY; - - // Based on the last child we reflowed reflow status, we may need to - // clear past any floaters. - if (NS_INLINE_IS_BREAK_AFTER(aReflowStatus)) { - // Apply break to the line - PRUint8 breakType = NS_INLINE_GET_BREAK_TYPE(aReflowStatus); - switch (breakType) { - default: - break; - case NS_STYLE_CLEAR_LEFT: - case NS_STYLE_CLEAR_RIGHT: - case NS_STYLE_CLEAR_LEFT_AND_RIGHT: - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockFrame::PlaceLine: clearing floaters=%d", - breakType)); - aState.ClearFloaters(breakType); - break; - } - // XXX page breaks, etc, need to be passed upwards too! - } - - // Any below current line floaters to place? - // XXX We really want to know whether this is the initial reflow (reflow - // unmapped) or a subsequent reflow in which case we only need to offset - // the existing floaters... - if (aState.mPendingFloaters.Count() > 0) { - if (nsnull == aLine->mFloaters) { - aLine->mFloaters = new nsVoidArray; - } - aLine->mFloaters->operator=(aState.mPendingFloaters); - aState.mPendingFloaters.Clear(); - } - - if (nsnull != aLine->mFloaters) { - aState.PlaceBelowCurrentLineFloaters(aLine->mFloaters); - // XXX Factor in the height of the floaters as well when considering - // whether the line fits. - // The default policy is that if there isn't room for the floaters then - // both the line and the floaters are pushed to the next-in-flow... - } - - if (aState.mY >= aState.mCurrentBand.availSpace.YMost()) { - // The current y coordinate is now past our available space - // rectangle. Get a new band of space. - aState.GetAvailableSpace(); - } - return PR_TRUE; -} - -void -nsCSSBlockFrame::PushLines(nsCSSBlockReflowState& aState) -{ - NS_ASSERTION(nsnull != aState.mPrevLine, "bad push"); - - LineData* lastLine = aState.mPrevLine; - LineData* nextLine = lastLine->mNext; - - lastLine->mNext = nsnull; - mOverflowLines = nextLine; - - // Break frame sibling list - nsIFrame* lastFrame = lastLine->LastChild(); - lastFrame->SetNextSibling(nsnull); - - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockFrame::PushLines: line=%p prevInFlow=%p nextInFlow=%p", - mOverflowLines, mPrevInFlow, mNextInFlow)); -#ifdef NS_DEBUG - if (GetVerifyTreeEnable()) { - VerifyChildCount(mLines); - VerifyChildCount(mOverflowLines, PR_TRUE); - } -#endif -} - -nsresult -nsCSSBlockFrame::DrainOverflowLines() -{ - // First grab the prev-in-flows overflow lines - nsCSSBlockFrame* prevBlock = (nsCSSBlockFrame*) mPrevInFlow; - if (nsnull != prevBlock) { - LineData* line = prevBlock->mOverflowLines; - if (nsnull != line) { - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockFrame::DrainOverflowLines: line=%p prevInFlow=%p", - line, prevBlock)); - prevBlock->mOverflowLines = nsnull; - - // Make all the frames on the mOverflowLines list mine - nsIFrame* lastFrame = nsnull; - nsIFrame* frame = line->mFirstChild; - while (nsnull != frame) { - nsIFrame* geometricParent; - nsIFrame* contentParent; - frame->GetGeometricParent(geometricParent); - frame->GetContentParent(contentParent); - if (contentParent == geometricParent) { - frame->SetContentParent(this); - } - frame->SetGeometricParent(this); - lastFrame = frame; - frame->GetNextSibling(frame); - } - - // Join the line lists - if (nsnull == mLines) { - mLines = line; - } - else { - // Join the sibling lists together - lastFrame->SetNextSibling(mLines->mFirstChild); - - // Place overflow lines at the front of our line list - LineData* lastLine = LastLine(line); - lastLine->mNext = mLines; - mLines = line; - } - - // Update our first-content-index now that we have a new first child - mLines->mFirstChild->GetContentIndex(mFirstContentOffset); - } - } - - // Now grab our own overflow lines - if (nsnull != mOverflowLines) { - // This can happen when we reflow and not everything fits and then - // we are told to reflow again before a next-in-flow is created - // and reflows. - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockFrame::DrainOverflowLines: from me, line=%p", - mOverflowLines)); - LineData* lastLine = LastLine(mLines); - if (nsnull == lastLine) { - mLines = mOverflowLines; - // Update our first-content-index now that we have a new first child - mLines->mFirstChild->GetContentIndex(mFirstContentOffset); - } - else { - lastLine->mNext = mOverflowLines; - nsIFrame* lastFrame = lastLine->LastChild(); - lastFrame->SetNextSibling(mOverflowLines->mFirstChild); - - // Update our last-content-index now that we have a new last child - lastLine = LastLine(mOverflowLines); - lastLine->LastChild()->GetContentIndex(mLastContentOffset); - } - mOverflowLines = nsnull; - } - -#ifdef NS_DEBUG - if (GetVerifyTreeEnable()) { - VerifyChildCount(mLines, PR_TRUE); - } -#endif - return NS_OK; -} - -// XXX a copy of nsHTMLContainerFrame's -NS_IMETHODIMP -nsCSSBlockFrame::ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) -{ - // Get the last-in-flow - nsCSSBlockFrame* lastInFlow = (nsCSSBlockFrame*)GetLastInFlow(); - - // Generate a reflow command for the frame - nsIReflowCommand* cmd; - nsresult result; - - result = NS_NewHTMLReflowCommand(&cmd, lastInFlow, - nsIReflowCommand::FrameAppended); - if (NS_OK == result) { - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - } - - return NS_OK; -} - -// XXX we assume that the insertion is really an assertion and never an append -// XXX what about zero lines case -NS_IMETHODIMP -nsCSSBlockFrame::ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - // Find the frame that precedes this frame - nsIFrame* prevSibling = nsnull; - if (aIndexInParent > 0) { - nsIContent* precedingContent = aContainer->ChildAt(aIndexInParent - 1); - prevSibling = aShell->FindFrameWithContent(precedingContent); - NS_ASSERTION(nsnull != prevSibling, "no frame for preceding content"); - NS_RELEASE(precedingContent); - - // The frame may have a next-in-flow. Get the last-in-flow; we do - // it the hard way because we can't assume that prevSibling is a - // subclass of nsSplittableFrame. - nsIFrame* nextInFlow; - do { - prevSibling->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - prevSibling = nextInFlow; - } - } while (nsnull != nextInFlow); - } - - // Get the parent of the previous sibling (which will be the proper - // next-in-flow for the child). We expect it to be this frame or one - // of our next-in-flow(s). - nsCSSBlockFrame* flow = this; - if (nsnull != prevSibling) { - prevSibling->GetGeometricParent((nsIFrame*&)flow); - } - - // Now that we have the right flow block we can create the new - // frame; test and see if the inserted frame is a block or not. - // XXX create-frame could return that fact - nsIFrame* newFrame; - nsresult rv = nsHTMLBase::CreateFrame(aPresContext, flow, aChild, - nsnull, newFrame); - if (NS_OK != rv) { - return rv; - } - const nsStyleDisplay* display; - newFrame->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&) display); - PRUint16 newFrameIsBlock = TreatFrameAsBlock(display) - ? LINE_IS_BLOCK - : 0; - - // Insert/append the frame into flows line list at the right spot - LineData* newLine; - LineData* line = flow->mLines; - if (nsnull == prevSibling) { - // Insert new frame into the sibling list - newFrame->SetNextSibling(line->mFirstChild); - - if (line->IsBlock() || newFrameIsBlock) { - // Create a new line - newLine = new LineData(newFrame, 1, LINE_LAST_CONTENT_IS_COMPLETE | - newFrameIsBlock); - if (nsnull == newLine) { - return NS_ERROR_OUT_OF_MEMORY; - } - newLine->mNext = flow->mLines; - flow->mLines = newLine; - } else { - // Insert frame at the front of the line - line->mFirstChild = newFrame; - line->mChildCount++; - line->MarkDirty(); - } - } - else { - // Find line containing the previous sibling to the new frame - line = FindLineContaining(line, prevSibling); - NS_ASSERTION(nsnull != line, "no line contains the previous sibling"); - if (nsnull != line) { - if (line->IsBlock()) { - // Create a new line just after line - newLine = new LineData(newFrame, 1, LINE_LAST_CONTENT_IS_COMPLETE | - newFrameIsBlock); - if (nsnull == newLine) { - return NS_ERROR_OUT_OF_MEMORY; - } - newLine->mNext = line->mNext; - line->mNext = newLine; - } - else if (newFrameIsBlock) { - // Split line in two, if necessary. We can't allow a block to - // end up in an inline line. - if (line->IsLastChild(prevSibling)) { - // The new frame goes after prevSibling and prevSibling is - // the last frame on the line. Therefore we don't need to - // split the line, just create a new line. - newLine = new LineData(newFrame, 1, LINE_LAST_CONTENT_IS_COMPLETE | - newFrameIsBlock); - if (nsnull == newLine) { - return NS_ERROR_OUT_OF_MEMORY; - } - newLine->mNext = line->mNext; - line->mNext = newLine; - } - else { - // The new frame goes after prevSibling and prevSibling is - // somewhere in the line, but not at the end. Split the line - // just after prevSibling. - PRInt32 i, n = line->mChildCount; - nsIFrame* frame = line->mFirstChild; - for (i = 0; i < n; i++) { - if (frame == prevSibling) { - nsIFrame* nextSibling; - prevSibling->GetNextSibling(nextSibling); - - // Create new line to hold the remaining frames - NS_ASSERTION(n - i - 1 > 0, "bad line count"); - newLine = new LineData(nextSibling, n - i - 1, - line->mState & LINE_LAST_CONTENT_IS_COMPLETE); - if (nsnull == newLine) { - return NS_ERROR_OUT_OF_MEMORY; - } - newLine->mNext = line->mNext; - line->mNext = newLine; - line->MarkDirty(); - line->SetLastContentIsComplete(); - line->mChildCount = i + 1; - break; - } - frame->GetNextSibling(frame); - } - - // Now create a new line to hold the block - newLine = new LineData(newFrame, 1, - newFrameIsBlock | LINE_LAST_CONTENT_IS_COMPLETE); - if (nsnull == newLine) { - return NS_ERROR_OUT_OF_MEMORY; - } - newLine->mNext = line->mNext; - line->mNext = newLine; - } - } - else { - // Insert frame into the line. - NS_ASSERTION(line->GetLastContentIsComplete(), "bad line LCIC"); - line->mChildCount++; - line->MarkDirty(); - } - } - - // Insert new frame into the sibling list; note: this must be done - // after the above logic because the above logic depends on the - // sibling list being in the "before insertion" state. - nsIFrame* nextSibling; - prevSibling->GetNextSibling(nextSibling); - newFrame->SetNextSibling(nextSibling); - prevSibling->SetNextSibling(newFrame); - } - - // Generate a reflow command - nsIReflowCommand* cmd; - rv = NS_NewHTMLReflowCommand(&cmd, flow, nsIReflowCommand::FrameInserted); - if (NS_OK != rv) { - return rv; - } - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - - // Update the content offsets of the flow block and all that follow - PRBool pseudos = flow->IsPseudoFrame(); - flow->mLastContentOffset++; - if (pseudos) { - nsContainerFrame* flowParent = (nsContainerFrame*)flow->mGeometricParent; - flowParent->PropagateContentOffsets(flow, flow->mFirstContentOffset, - flow->mLastContentOffset, - flow->mLastContentIsComplete); - } - flow = (nsCSSBlockFrame*) flow->mNextInFlow; - while (nsnull != flow) { - flow->mFirstContentOffset++; - flow->mLastContentOffset++; - if (pseudos) { - nsContainerFrame* flowParent = (nsContainerFrame*)flow->mGeometricParent; - flowParent->PropagateContentOffsets(flow, flow->mFirstContentOffset, - flow->mLastContentOffset, - flow->mLastContentIsComplete); - } - flow = (nsCSSBlockFrame*) flow->mNextInFlow; - } - - return NS_OK; -} - -NS_IMETHODIMP -nsCSSBlockFrame::ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - // Find the frame that precedes the frame to destroy and the frame - // to destroy (the first-in-flow if the frame is continued). We also - // find which of our next-in-flows contain the dead frame. - nsCSSBlockFrame* flow; - nsIFrame* deadFrame; - nsIFrame* prevSibling; - if (aIndexInParent > 0) { - nsIContent* precedingContent = aContainer->ChildAt(aIndexInParent - 1); - prevSibling = aShell->FindFrameWithContent(precedingContent); - NS_RELEASE(precedingContent); - - // The frame may have a next-in-flow. Get the last-in-flow; we do - // it the hard way because we can't assume that prevSibling is a - // subclass of nsSplittableFrame. - nsIFrame* nextInFlow; - do { - prevSibling->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - prevSibling = nextInFlow; - } - } while (nsnull != nextInFlow); - - // Get the dead frame (maybe) - prevSibling->GetGeometricParent((nsIFrame*&)flow); - prevSibling->GetNextSibling(deadFrame); - if (nsnull == deadFrame) { - // The deadFrame must be prevSibling's parent's next-in-flows - // first frame. Therefore it doesn't have a prevSibling. - flow = (nsCSSBlockFrame*) flow->mNextInFlow; - if (nsnull != flow) { - deadFrame = flow->mLines->mFirstChild; - } - prevSibling = nsnull; - } - } - else { - prevSibling = nsnull; - flow = this; - deadFrame = mLines->mFirstChild; - } - NS_ASSERTION(nsnull != deadFrame, "yikes! couldn't find frame"); - if (nsnull == deadFrame) { - return NS_OK; - } - - // Generate a reflow command for the appropriate flow frame - nsIReflowCommand* cmd; - nsresult rv = NS_NewHTMLReflowCommand(&cmd, flow, - nsIReflowCommand::FrameDeleted); - if (NS_OK != rv) { - return rv; - } - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - - // Find line that contains deadFrame; we also find the pointer to - // the line. - LineData** linep = &flow->mLines; - LineData* line = flow->mLines; - while (nsnull != line) { - if (line->Contains(deadFrame)) { - break; - } - linep = &line->mNext; - line = line->mNext; - } - - // Remove frame and its continuations - PRBool pseudos = flow->IsPseudoFrame(); - nsIFrame* flowParent = flow->mGeometricParent; - while (nsnull != deadFrame) { - while ((nsnull != line) && (nsnull != deadFrame)) { -#ifdef NS_DEBUG - nsIFrame* parent; - deadFrame->GetGeometricParent(parent); - NS_ASSERTION(flow == parent, "messed up delete code"); -#endif - NS_FRAME_TRACE(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockFrame::ContentDeleted: deadFrame=%p", - deadFrame)); - - // Remove deadFrame from the line - if (line->mFirstChild == deadFrame) { - nsIFrame* nextFrame; - deadFrame->GetNextSibling(nextFrame); - line->mFirstChild = nextFrame; - } - else { - nsIFrame* lastFrame = line->LastChild(); - if (lastFrame == deadFrame) { - line->SetLastContentIsComplete(); - } - } - - // Take deadFrame out of the sibling list - if (nsnull != prevSibling) { - nsIFrame* nextFrame; - deadFrame->GetNextSibling(nextFrame); - prevSibling->SetNextSibling(nextFrame); - } - - // Destroy frame; capture its next-in-flow first in case we need - // to destroy that too. - nsIFrame* nextInFlow; - deadFrame->GetNextInFlow(nextInFlow); - deadFrame->BreakFromNextFlow(); - deadFrame->DeleteFrame(); - deadFrame = nextInFlow; - - // If line is empty, remove it now - LineData* next = line->mNext; - if (0 == --line->mChildCount) { - *linep = next; - line->mNext = nsnull; - delete line; - } - else { - linep = &line->mNext; - } - line = next; - } - - // Update flows last-content-offset. Note that only the last - // content needs updating when a deadFrame is removed from flow - // (because only the children that follow the deletion need - // renumbering). - flow->mLastContentOffset--; - if (pseudos) { - nsContainerFrame* parent = (nsContainerFrame*)flow->mGeometricParent; - parent->PropagateContentOffsets(flow, flow->mFirstContentOffset, - flow->mLastContentOffset, - flow->mLastContentIsComplete); -#if XXX - if (parent != flowParent) { - nsIReflowCommand* cmd; - rv = NS_NewHTMLReflowCommand(&cmd, flow, - nsIReflowCommand::FrameDeleted); - if (NS_OK != rv) { - return rv; - } - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - } -#endif - } - - // Advance to next flow block if the frame has more continuations - if (nsnull != deadFrame) { - flow = (nsCSSBlockFrame*) flow->mNextInFlow; - NS_ASSERTION(nsnull != flow, "whoops, continuation without a parent"); - line = flow->mLines; - prevSibling = nsnull; - } - } - - // Repair any remaining next-in-flows content offsets; these are the - // next-in-flows the follow the last flow container that contained - // one of the deadFrame's. Therefore both content offsets need - // updating (because all the children are following the deletion). - flow = (nsCSSBlockFrame*) flow->mNextInFlow; - while (nsnull != flow) { - flow->mFirstContentOffset--; - flow->mLastContentOffset--; - flow = (nsCSSBlockFrame*) flow->mNextInFlow; - } - -#ifdef NS_DEBUG - if (GetVerifyTreeEnable()) { - // Verify that the above delete code actually deleted the frames! - flow = this; - while (nsnull != flow) { - nsIFrame* frame = flow->mLines->mFirstChild; - while (nsnull != frame) { - nsIContent* content; - frame->GetContent(content); - NS_ASSERTION(content != aChild, "delete failed"); - NS_RELEASE(content); - frame->GetNextSibling(frame); - } - flow = (nsCSSBlockFrame*) flow->mNextInFlow; - } - } -#endif - - return rv; -} - -PRBool -nsCSSBlockFrame::DeleteNextInFlowsFor(nsIFrame* aChild) -{ - NS_PRECONDITION(IsChild(aChild), "bad geometric parent"); - - nsIFrame* nextInFlow; - nsCSSBlockFrame* parent; - - aChild->GetNextInFlow(nextInFlow); - NS_PRECONDITION(nsnull != nextInFlow, "null next-in-flow"); - nextInFlow->GetGeometricParent((nsIFrame*&)parent); - - // If the next-in-flow has a next-in-flow then delete it, too (and - // delete it first). - nsIFrame* nextNextInFlow; - nextInFlow->GetNextInFlow(nextNextInFlow); - if (nsnull != nextNextInFlow) { - parent->DeleteNextInFlowsFor(nextInFlow); - } - -#ifdef NS_DEBUG - PRInt32 childCount; - nsIFrame* firstChild; - nextInFlow->ChildCount(childCount); - nextInFlow->FirstChild(firstChild); - NS_ASSERTION((0 == childCount) && (nsnull == firstChild), - "deleting !empty next-in-flow"); -#endif - - // Disconnect the next-in-flow from the flow list - nextInFlow->BreakFromPrevFlow(); - - // Remove nextInFlow from the parents line list. Also remove it from - // the sibling list. - if (RemoveChild(parent->mLines, nextInFlow)) { - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockFrame::DeleteChildsNextInFlow: frame=%p (from mLines)", - nextInFlow)); - goto done; - } - - // If we get here then we didn't find the child on the line list. If - // it's not there then it has to be on the overflow lines list. - if (nsnull != mOverflowLines) { - if (RemoveChild(parent->mOverflowLines, nextInFlow)) { - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSBlockFrame::DeleteChildsNextInFlow: frame=%p (from overflow)", - nextInFlow)); - goto done; - } - } - NS_NOTREACHED("can't find next-in-flow in overflow list"); - - done:; - // If the parent is us then we will finish reflowing and update the - // content offsets of our parents when we are a pseudo-frame; if the - // parent is not us then it's a next-in-flow which means it will get - // reflowed by our parent and fix its content offsets. So there. -#if XXX - if (parent->IsPseudoFrame()) { - parent->PropagateContentOffsets(); - } -#endif - - // Delete the next-in-flow frame and adjust its parents child count - nextInFlow->DeleteFrame(); - -#ifdef NS_DEBUG - aChild->GetNextInFlow(nextInFlow); - NS_POSTCONDITION(nsnull == nextInFlow, "non null next-in-flow"); -#endif - return PR_TRUE; -} - -PRBool -nsCSSBlockFrame::RemoveChild(LineData* aLines, nsIFrame* aChild) -{ - LineData* line = aLines; - nsIFrame* prevChild = nsnull; - while (nsnull != line) { - nsIFrame* child = line->mFirstChild; - PRInt32 n = line->mChildCount; - while (--n >= 0) { - nsIFrame* nextChild; - child->GetNextSibling(nextChild); - if (child == aChild) { - // Continuations HAVE to be at the start of a line - NS_ASSERTION(child == line->mFirstChild, "bad continuation"); - line->mFirstChild = nextChild; - if (0 == --line->mChildCount) { - line->mFirstChild = nsnull; - } - if (nsnull != prevChild) { - // When nextInFlow and it's continuation are in the same - // container then we remove the nextInFlow from the sibling - // list. - prevChild->SetNextSibling(nextChild); - } - return PR_TRUE; - } - prevChild = child; - child = nextChild; - } - line = line->mNext; - } - return PR_FALSE; -} - -NS_IMETHODIMP -nsCSSBlockFrame::DidReflow(nsIPresContext& aPresContext, - nsDidReflowStatus aStatus) -{ - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("enter nsCSSBlockFrame::DidReflow: status=%d", - aStatus)); - - if (NS_FRAME_REFLOW_FINISHED == aStatus) { - nsFrameState state; - nsIFrame* kid = (nsnull == mLines) ? nsnull : mLines->mFirstChild; - while (nsnull != kid) { - kid->GetFrameState(state); - if (0 != (state & NS_FRAME_IN_REFLOW)) { - kid->DidReflow(aPresContext, aStatus); - } - kid->GetNextSibling(kid); - } - } - - NS_FRAME_TRACE_OUT("nsCSSBlockFrame::DidReflow"); - - // Let nsFrame position and size our view (if we have one), and clear - // the NS_FRAME_IN_REFLOW bit - return nsFrame::DidReflow(aPresContext, aStatus); -} - -//////////////////////////////////////////////////////////////////////// -// Floater support - -void -nsCSSBlockFrame::ReflowFloater(nsIPresContext* aPresContext, - nsCSSBlockReflowState& aState, - nsIFrame* aFloaterFrame) -{ -//XXX fix_me: use the values already stored in the nsCSSBlockReflowState - // Compute the available space for the floater. Use the default - // 'auto' width and height values - nsSize kidAvailSize; - nsSize styleSize; - PRIntn styleSizeFlags = - nsCSSLayout::GetStyleSize(aPresContext, aState, styleSize); - - // XXX The width and height are for the content area only. Add in space for - // border and padding - if (styleSizeFlags & NS_SIZE_HAS_WIDTH) { - kidAvailSize.width = styleSize.width; - } - else { - // If we are floating something and we don't know the width then - // find a maximum width for it to reflow into. - - // XXX if the child is a block (instead of a table, say) then this - // will do the wrong thing. A better choice would be - // NS_UNCONSTRAINEDSIZE, but that has special meaning to tables. - const nsReflowState* rsp = &aState; - kidAvailSize.width = 0; - while (nsnull != rsp) { - if ((0 != rsp->maxSize.width) && - (NS_UNCONSTRAINEDSIZE != rsp->maxSize.width)) { - kidAvailSize.width = rsp->maxSize.width; - break; - } - rsp = rsp->parentReflowState; - } - NS_ASSERTION(0 != kidAvailSize.width, "no width for block found"); - } - - if (styleSizeFlags & NS_SIZE_HAS_HEIGHT) { - kidAvailSize.height = styleSize.height; - } - else { - kidAvailSize.height = NS_UNCONSTRAINEDSIZE; - } - - // Resize reflow the anchored item into the available space - // XXX Check for complete? - nsReflowMetrics desiredSize(nsnull); - nsReflowState reflowState(aFloaterFrame, aState, kidAvailSize, - eReflowReason_Initial); - nsReflowStatus status; - - aFloaterFrame->WillReflow(*aPresContext); - aFloaterFrame->Reflow(aPresContext, desiredSize, reflowState, status); - aFloaterFrame->SizeTo(desiredSize.width, desiredSize.height); - -//XXX aFloaterFrame->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); -} - -PRBool -nsCSSBlockFrame::AddFloater(nsIPresContext* aPresContext, - const nsReflowState& aReflowState, - nsIFrame* aFloater, - nsPlaceholderFrame* aPlaceholder) -{ - // Walk up reflow state chain, looking for ourself - const nsReflowState* rs = &aReflowState; - while (nsnull != rs) { - if (rs->frame == this) { - break; - } - rs = rs->parentReflowState; - } - if (nsnull == rs) { - // Never mind - return PR_FALSE; - } - nsCSSBlockReflowState* state = (nsCSSBlockReflowState*) rs; - - // Get the frame associated with the space manager, and get its - // nsIAnchoredItems interface - nsIFrame* frame = state->mSpaceManager->GetFrame(); - nsIAnchoredItems* anchoredItems = nsnull; - - frame->QueryInterface(kIAnchoredItemsIID, (void**)&anchoredItems); - NS_ASSERTION(nsnull != anchoredItems, "no anchored items interface"); - if (nsnull != anchoredItems) { - anchoredItems->AddAnchoredItem(aFloater, - nsIAnchoredItems::anHTMLFloater, - this); - - // Reflow the floater - ReflowFloater(aPresContext, *state, aFloater); - - // Determine whether we place it at the top or we place it below the - // current line - if (IsLeftMostChild(aPlaceholder)) { - if (nsnull == mRunInFloaters) { - mRunInFloaters = new nsVoidArray; - } - mRunInFloaters->AppendElement(aPlaceholder); - state->PlaceCurrentLineFloater(aFloater); - } else { - // Add the placeholder to our to-do list - state->mPendingFloaters.AppendElement(aPlaceholder); - } - return PR_TRUE; - } - - return PR_FALSE; -} - -PRBool -nsCSSBlockFrame::IsLeftMostChild(nsIFrame* aFrame) -{ - do { - nsIFrame* parent; - aFrame->GetGeometricParent(parent); - - // See if there are any non-zero sized child frames that precede - // aFrame in the child list - nsIFrame* child; - parent->FirstChild(child); - while ((nsnull != child) && (aFrame != child)) { - nsSize size; - - // Is the child zero-sized? - child->GetSize(size); - if ((size.width > 0) || (size.height > 0)) { - // We found a non-zero sized child frame that precedes aFrame - return PR_FALSE; - } - child->GetNextSibling(child); - } - - // aFrame is the left-most non-zero sized frame in its geometric parent. - // Walk up one level and check that its parent is left-most as well - aFrame = parent; - } while (aFrame != this); - return PR_TRUE; -} - -// Used when placing run-in floaters (floaters displayed at the top of -// the block as supposed to below the current line) -void -nsCSSBlockReflowState::PlaceCurrentLineFloater(nsIFrame* aFloater) -{ - nsISpaceManager* sm = mSpaceManager; - - // Get the type of floater - const nsStyleDisplay* floaterDisplay; - aFloater->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&)floaterDisplay); - const nsStyleSpacing* floaterSpacing; - aFloater->GetStyleData(eStyleStruct_Spacing, - (const nsStyleStruct*&)floaterSpacing); - - // Commit some space in the space manager, and adjust our current - // band of available space. - nsRect region; - aFloater->GetRect(region); - region.y = mY; - switch (floaterDisplay->mFloats) { - default: - NS_NOTYETIMPLEMENTED("Unsupported floater type"); - // FALL THROUGH - - case NS_STYLE_FLOAT_LEFT: - region.x = mX; - break; - - case NS_STYLE_FLOAT_RIGHT: - region.x = mCurrentBand.availSpace.XMost() - region.width; - if (region.x < 0) { - region.x = 0; - } - } - - // Factor in the floaters margins - nsMargin floaterMargin; - floaterSpacing->CalcMarginFor(aFloater, floaterMargin); - region.width += floaterMargin.left + floaterMargin.right; - region.height += floaterMargin.top + floaterMargin.bottom; - sm->AddRectRegion(aFloater, region); - - // Set the origin of the floater in world coordinates - nscoord worldX, worldY; - sm->GetTranslation(worldX, worldY); - aFloater->WillReflow(*mPresContext); - aFloater->MoveTo(region.x + worldX + floaterMargin.left, - region.y + worldY + floaterMargin.top); - aFloater->DidReflow(*mPresContext, NS_FRAME_REFLOW_FINISHED); - - // Update the band of available space to reflect space taken up by - // the floater - GetAvailableSpace(); - - // XXX if the floater is a child of an inline frame then this won't - // work because we won't update the correct nsCSSInlineLayout. - mInlineLayout.SetReflowSpace(mCurrentBand.availSpace.x, - mY, - mCurrentBand.availSpace.width, - mCurrentBand.availSpace.height); -} - -void -nsCSSBlockReflowState::PlaceBelowCurrentLineFloaters(nsVoidArray* aFloaterList) -{ - NS_PRECONDITION(aFloaterList->Count() > 0, "no floaters"); - - nsISpaceManager* sm = mSpaceManager; - - // XXX Factor this code with PlaceCurrentLineFloater()... - nsRect region; - PRInt32 numFloaters = aFloaterList->Count(); - for (PRInt32 i = 0; i < numFloaters; i++) { - nsPlaceholderFrame* placeholderFrame = (nsPlaceholderFrame*) - aFloaterList->ElementAt(i); - nsIFrame* floater = placeholderFrame->GetAnchoredItem(); - - // Get the band of available space - // XXX This is inefficient to do this inside the loop... - GetAvailableSpace(); - - // Get the type of floater - const nsStyleDisplay* floaterDisplay; - const nsStyleSpacing* floaterSpacing; - floater->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&)floaterDisplay); - floater->GetStyleData(eStyleStruct_Spacing, - (const nsStyleStruct*&)floaterSpacing); - - floater->GetRect(region); - region.y = mCurrentBand.availSpace.y; - switch (floaterDisplay->mFloats) { - default: - NS_NOTYETIMPLEMENTED("Unsupported floater type"); - // FALL THROUGH - - case NS_STYLE_FLOAT_LEFT: - region.x = mCurrentBand.availSpace.x; - break; - - case NS_STYLE_FLOAT_RIGHT: - region.x = mCurrentBand.availSpace.XMost() - region.width; - if (region.x < 0) { - region.x = 0; - } - } - - // XXX Temporary incremental hack (kipp asks: why is this - // temporary or an incremental hack?) - - // Factor in the floaters margins - nsMargin floaterMargin; - floaterSpacing->CalcMarginFor(floater, floaterMargin); - region.width += floaterMargin.left + floaterMargin.right; - region.height += floaterMargin.top + floaterMargin.bottom; - sm->RemoveRegion(floater);/* XXX temporary code */ - sm->AddRectRegion(floater, region); - - // Set the origin of the floater in world coordinates - nscoord worldX, worldY; - sm->GetTranslation(worldX, worldY); - floater->MoveTo(region.x + worldX + floaterMargin.left, - region.y + worldY + floaterMargin.top); - } - - // Pass on updated available space to the current line - GetAvailableSpace(); - mInlineLayout.SetReflowSpace(mCurrentBand.availSpace.x, mY, - mCurrentBand.availSpace.width, - mCurrentBand.availSpace.height); -} - -void -nsCSSBlockReflowState::ClearFloaters(PRUint8 aBreakType) -{ - for (;;) { - if (mCurrentBand.count <= 1) { - // No floaters in this band therefore nothing to clear - break; - } - - // Find the Y coordinate to clear to. Note that the band trapezoid - // coordinates are relative to the last translation. Since we - // never translate by Y before getting a band, we can use absolute - // comparisons against mY. - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockReflowState::ClearFloaters: mY=%d trapCount=%d", - mY, mCurrentBand.count)); - nscoord clearYMost = mY; - nsRect tmp; - PRInt32 i; - for (i = 0; i < mCurrentBand.count; i++) { - const nsStyleDisplay* display; - nsBandTrapezoid* trapezoid = &mCurrentBand.data[i]; - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockReflowState::ClearFloaters: trap=%d state=%d", - i, trapezoid->state)); - if (nsBandTrapezoid::Available != trapezoid->state) { - if (nsBandTrapezoid::OccupiedMultiple == trapezoid->state) { - PRInt32 fn, numFrames = trapezoid->frames->Count(); - NS_ASSERTION(numFrames > 0, "bad trapezoid frame list"); - for (fn = 0; fn < numFrames; fn++) { - nsIFrame* frame = (nsIFrame*) trapezoid->frames->ElementAt(fn); - frame->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&)display); - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockReflowState::ClearFloaters: frame[%d]=%p floats=%d", - fn, frame, display->mFloats)); - switch (display->mFloats) { - case NS_STYLE_FLOAT_LEFT: - if ((NS_STYLE_CLEAR_LEFT == aBreakType) || - (NS_STYLE_CLEAR_LEFT_AND_RIGHT == aBreakType)) { - trapezoid->GetRect(tmp); - nscoord ym = tmp.YMost(); - if (ym > clearYMost) { - clearYMost = ym; - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockReflowState::ClearFloaters: left clearYMost=%d", - clearYMost)); - } - } - break; - case NS_STYLE_FLOAT_RIGHT: - if ((NS_STYLE_CLEAR_RIGHT == aBreakType) || - (NS_STYLE_CLEAR_LEFT_AND_RIGHT == aBreakType)) { - trapezoid->GetRect(tmp); - nscoord ym = tmp.YMost(); - if (ym > clearYMost) { - clearYMost = ym; - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockReflowState::ClearFloaters: right clearYMost=%d", - clearYMost)); - } - } - break; - } - } - } - else { - trapezoid->frame->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&)display); - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockReflowState::ClearFloaters: frame=%p floats=%d", - trapezoid->frame, display->mFloats)); - switch (display->mFloats) { - case NS_STYLE_FLOAT_LEFT: - if ((NS_STYLE_CLEAR_LEFT == aBreakType) || - (NS_STYLE_CLEAR_LEFT_AND_RIGHT == aBreakType)) { - trapezoid->GetRect(tmp); - nscoord ym = tmp.YMost(); -NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockReflowState::ClearFloaters: left? ym=%d clearYMost=%d", - ym, clearYMost)); - if (ym > clearYMost) { - clearYMost = ym; - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockReflowState::ClearFloaters: left clearYMost=%d", - clearYMost)); - } - } - break; - case NS_STYLE_FLOAT_RIGHT: - if ((NS_STYLE_CLEAR_RIGHT == aBreakType) || - (NS_STYLE_CLEAR_LEFT_AND_RIGHT == aBreakType)) { - trapezoid->GetRect(tmp); - nscoord ym = tmp.YMost(); - if (ym > clearYMost) { - clearYMost = ym; - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockReflowState::ClearFloaters: right clearYMost=%d", - clearYMost)); - } - } - break; - } - } - } - } - - if (clearYMost == mY) { - // Nothing to clear - break; - } - - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSBlockReflowState::ClearFloaters: mY=%d clearYMost=%d", - mY, clearYMost)); - - mY = clearYMost + 1; - - // Get a new band - GetAvailableSpace(); - } -} - -////////////////////////////////////////////////////////////////////// -// Painting, event handling - -PRIntn -nsCSSBlockFrame::GetSkipSides() const -{ - PRIntn skip = 0; - if (nsnull != mPrevInFlow) { - skip |= 1 << NS_SIDE_TOP; - } - if (nsnull != mNextInFlow) { - skip |= 1 << NS_SIDE_BOTTOM; - } - return skip; -} - -NS_IMETHODIMP -nsCSSBlockFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - // Paint our background and border - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - - if (disp->mVisible && mRect.width && mRect.height) { - PRIntn skipSides = GetSkipSides(); - const nsStyleColor* color = - (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - const nsStyleSpacing* spacing = - (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, - aDirtyRect, mRect, *color); - nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this, - aDirtyRect, mRect, *spacing, skipSides); - } - - PaintChildren(aPresContext, aRenderingContext, aDirtyRect); - - if (nsIFrame::GetShowFrameBorders()) { - nsIView* view; - GetView(view); - if (nsnull != view) { - aRenderingContext.SetColor(NS_RGB(0,0,255)); - NS_RELEASE(view); - } - else { - aRenderingContext.SetColor(NS_RGB(255,0,0)); - } - aRenderingContext.DrawRect(0, 0, mRect.width, mRect.height); - } - return NS_OK; -} - -// aDirtyRect is in our coordinate system -// child rect's are also in our coordinate system - -// XXX take advantage of line information to skip entire lines - -void -nsCSSBlockFrame::PaintChildren(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - // Set clip rect so that children don't leak out of us - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - PRBool hidden = PR_FALSE; - if (NS_STYLE_OVERFLOW_HIDDEN == disp->mOverflow) { - aRenderingContext.PushState(); - aRenderingContext.SetClipRect(nsRect(0, 0, mRect.width, mRect.height), - nsClipCombine_kIntersect); - hidden = PR_TRUE; - } - - // XXX reminder: use the coordinates in the dirty rect to figure out - // which set of children are impacted and only do the intersection - // work for them. In addition, stop when we no longer overlap. - - nsIFrame* kid = (nsnull == mLines) ? nsnull : mLines->mFirstChild; - while (nsnull != kid) { - nsIView *pView; - - kid->GetView(pView); - if (nsnull == pView) { - nsRect kidRect; - kid->GetRect(kidRect); - nsRect damageArea; - PRBool overlap = damageArea.IntersectRect(aDirtyRect, kidRect); - if (overlap) { - // Translate damage area into kid's coordinate system - nsRect kidDamageArea(damageArea.x - kidRect.x, - damageArea.y - kidRect.y, - damageArea.width, damageArea.height); - aRenderingContext.PushState(); - aRenderingContext.Translate(kidRect.x, kidRect.y); - kid->Paint(aPresContext, aRenderingContext, kidDamageArea); - if (nsIFrame::GetShowFrameBorders()) { - nsIView* view; - GetView(view); - if (nsnull != view) { - aRenderingContext.SetColor(NS_RGB(0,0,255)); - NS_RELEASE(view); - } - else { - aRenderingContext.SetColor(NS_RGB(255,0,0)); - } - aRenderingContext.DrawRect(0, 0, kidRect.width, kidRect.height); - } - aRenderingContext.PopState(); - } - } - else { - NS_RELEASE(pView); - } - kid->GetNextSibling(kid); - } - - if (hidden) { - aRenderingContext.PopState(); - } -} - -// XXX move into nsFrame -NS_IMETHODIMP -nsCSSBlockFrame::HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus) -{ - aEventStatus = nsEventStatus_eIgnore; - - nsIFrame* kid = (nsnull == mLines) ? nsnull : mLines->mFirstChild; - while (nsnull != kid) { - nsRect kidRect; - kid->GetRect(kidRect); - if (kidRect.Contains(aEvent->point)) { - aEvent->point.MoveBy(-kidRect.x, -kidRect.y); - kid->HandleEvent(aPresContext, aEvent, aEventStatus); - aEvent->point.MoveBy(kidRect.x, kidRect.y); - break; - } - kid->GetNextSibling(kid); - } - - return NS_OK; -} - -// XXX move into nsFrame -NS_IMETHODIMP -nsCSSBlockFrame::GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor) -{ - aCursor = NS_STYLE_CURSOR_INHERIT; - - nsIFrame* kid = (nsnull == mLines) ? nsnull : mLines->mFirstChild; - nsPoint tmp; - while (nsnull != kid) { - nsRect kidRect; - kid->GetRect(kidRect); - if (kidRect.Contains(aPoint)) { - tmp.MoveTo(aPoint.x - kidRect.x, aPoint.y - kidRect.y); - kid->GetCursorAt(aPresContext, tmp, aFrame, aCursor); - break; - } - kid->GetNextSibling(kid); - } - return NS_OK; -} - -////////////////////////////////////////////////////////////////////// -// Debugging - -#ifdef NS_DEBUG -static PRBool -InLineList(LineData* aLines, nsIFrame* aFrame) -{ - while (nsnull != aLines) { - nsIFrame* frame = aLines->mFirstChild; - PRInt32 n = aLines->mChildCount; - while (--n >= 0) { - if (frame == aFrame) { - return PR_TRUE; - } - frame->GetNextSibling(frame); - } - aLines = aLines->mNext; - } - return PR_FALSE; -} - -static PRBool -InSiblingList(LineData* aLine, nsIFrame* aFrame) -{ - if (nsnull != aLine) { - nsIFrame* frame = aLine->mFirstChild; - while (nsnull != frame) { - if (frame == aFrame) { - return PR_TRUE; - } - frame->GetNextSibling(frame); - } - } - return PR_FALSE; -} - -PRBool -nsCSSBlockFrame::IsChild(nsIFrame* aFrame) -{ - nsIFrame* parent; - aFrame->GetGeometricParent(parent); - if (parent != (nsIFrame*)this) { - return PR_FALSE; - } - if (InLineList(mLines, aFrame) && InSiblingList(mLines, aFrame)) { - return PR_TRUE; - } - if (InLineList(mOverflowLines, aFrame) && - InSiblingList(mOverflowLines, aFrame)) { - return PR_TRUE; - } - return PR_FALSE; -} -#endif - -#define VERIFY_ASSERT(_expr, _msg) \ - if (!(_expr)) { \ - DumpTree(); \ - } \ - NS_ASSERTION(_expr, _msg) - -NS_IMETHODIMP -nsCSSBlockFrame::VerifyTree() const -{ -#ifdef NS_DEBUG - NS_ASSERTION(0 == (mState & NS_FRAME_IN_REFLOW), "frame is in reflow"); - - VERIFY_ASSERT(nsnull == mOverflowLines, "bad overflow list"); - - // Verify that child count is the same as the line's mChildCount's - VerifyChildCount(mLines); - - // Verify child content offsets and index-in-parents - PRInt32 offset = GetFirstContentOffset(); - nsIFrame* child = (nsnull == mLines) ? nsnull : mLines->mFirstChild; - while (nsnull != child) { - // Make sure child is ours - nsIFrame* parent; - child->GetGeometricParent(parent); - VERIFY_ASSERT(parent == (nsIFrame*)this, "bad parent"); - - // Make sure that the child's tree is valid - child->VerifyTree(); - - // Make sure child's index-in-parent is correct - PRInt32 indexInParent; - child->GetContentIndex(indexInParent); - VERIFY_ASSERT(offset == indexInParent, "bad child offset"); - - nsIFrame* nextInFlow; - child->GetNextInFlow(nextInFlow); - if (nsnull == nextInFlow) { - offset++; - } - child->GetNextSibling(child); - } - - // Verify that our last content offset is correct - if (0 != mChildCount) { - if (GetLastContentIsComplete()) { - VERIFY_ASSERT(offset == GetLastContentOffset() + 1, "bad last offset"); - } else { - VERIFY_ASSERT(offset == GetLastContentOffset(), "bad last offset"); - } - } - -#if XXX - // Make sure that our flow blocks offsets are all correct - if (nsnull == mPrevInFlow) { - PRInt32 nextOffset = NextChildOffset(); - nsContainerFrame* nextInFlow = (nsContainerFrame*) mNextInFlow; - while (nsnull != nextInFlow) { - VERIFY_ASSERT(0 != nextInFlow->mChildCount, "empty next-in-flow"); - VERIFY_ASSERT(nextInFlow->GetFirstContentOffset() == nextOffset, - "bad next-in-flow first offset"); - nextOffset = nextInFlow->NextChildOffset(); - nextInFlow = (nsContainerFrame*) nextInFlow->mNextInFlow; - } - } -#endif -#endif - return NS_OK; -} diff --git a/mozilla/layout/css/layout/src/nsCSSBlockFrame.h b/mozilla/layout/css/layout/src/nsCSSBlockFrame.h deleted file mode 100644 index e9f592c9a1c..00000000000 --- a/mozilla/layout/css/layout/src/nsCSSBlockFrame.h +++ /dev/null @@ -1,136 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is Netscape Communications - * Corporation. Portions created by Netscape are Copyright (C) 1998 - * Netscape Communications Corporation. All Rights Reserved. - */ -#ifndef nsCSSBlockFrame_h___ -#define nsCSSBlockFrame_h___ - -#include "nsCSSContainerFrame.h" -#include "nsCSSLineLayout.h" -#include "nsCSSInlineLayout.h" -#include "nsVoidArray.h" -#include "nsISpaceManager.h" - -class nsCSSBlockFrame; -struct nsCSSInlineLayout; -struct LineData; - -/* 52b33130-0b99-11d2-932e-00805f8add32 */ -#define NS_BLOCK_FRAME_CID \ -{ 0x52b33130, 0x0b99, 0x11d2, {0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}} - -// XXX hide this as soon as list bullet code is cleaned up - -struct nsCSSBlockReflowState : public nsReflowState { - nsCSSBlockReflowState(nsIPresContext* aPresContext, - nsISpaceManager* aSpaceManager, - nsCSSBlockFrame* aBlock, - nsIStyleContext* aBlockSC, - const nsReflowState& aReflowState, - PRBool aComputeMaxElementSize); - - ~nsCSSBlockReflowState(); - - /** - * Update the mCurrentBand data based on the current mY position. - */ - void GetAvailableSpace(); - - void PlaceCurrentLineFloater(nsIFrame* aFloater); - - void PlaceBelowCurrentLineFloaters(nsVoidArray* aFloaterList); - - void ClearFloaters(PRUint8 aBreakType); - - nsIPresContext* mPresContext; - nsISpaceManager* mSpaceManager; - nsCSSBlockFrame* mBlock; - PRBool mBlockIsPseudo; - nsCSSBlockFrame* mNextInFlow; - PRUint8 mTextAlign; - PRUint8 mDirection; - - nsMargin mBorderPadding; - nsSize mInnerSize; // inner area after removing border+padding - nsSize mStyleSize; - PRIntn mStyleSizeFlags; - nscoord mDeltaWidth; - nscoord mBottomEdge; // maximum Y - - PRPackedBool mUnconstrainedWidth; - PRPackedBool mUnconstrainedHeight; - PRPackedBool mNoWrap; - PRPackedBool mComputeMaxElementSize; - nscoord mX, mY; - nscoord mPrevPosBottomMargin; - nscoord mPrevNegBottomMargin; - nscoord mKidXMost; - - // When a block that contains a block is unconstrained we need to - // give the inner block a limited width otherwise they don't reflow - // properly. - PRPackedBool mHaveBlockMaxWidth; - nscoord mBlockMaxWidth; - - nsSize mMaxElementSize; - - nsCSSLineLayout mLineLayout; - - nsCSSInlineLayout mInlineLayout; - PRBool mInlineLayoutPrepared; - - nsIFrame* mPrevChild; - - LineData* mFreeList; - - nsVoidArray mPendingFloaters; - - LineData* mPrevLine; - - // XXX The next list ordinal for counting list bullets - PRInt32 mNextListOrdinal; - - // XXX what happens if we need more than 12 trapezoids? - struct BlockBandData : public nsBandData { - // Trapezoids used during band processing - nsBandTrapezoid data[12]; - - // Bounding rect of available space between any left and right floaters - nsRect availSpace; - - BlockBandData() { - size = 12; - trapezoids = data; - } - - /** - * Computes the bounding rect of the available space, i.e. space - * between any left and right floaters Uses the current trapezoid - * data, see nsISpaceManager::GetBandData(). Also updates member - * data "availSpace". - */ - void ComputeAvailSpaceRect(); - }; - - BlockBandData mCurrentBand; -}; - -extern nsresult NS_NewCSSBlockFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent); - -#endif /* nsCSSBlockFrame_h___ */ diff --git a/mozilla/layout/css/layout/src/nsCSSContainerFrame.cpp b/mozilla/layout/css/layout/src/nsCSSContainerFrame.cpp deleted file mode 100644 index e683bc0ab59..00000000000 --- a/mozilla/layout/css/layout/src/nsCSSContainerFrame.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is Netscape Communications - * Corporation. Portions created by Netscape are Copyright (C) 1998 - * Netscape Communications Corporation. All Rights Reserved. - */ -#include "nsCSSContainerFrame.h" - -nsCSSContainerFrame::nsCSSContainerFrame(nsIContent* aContent, - nsIFrame* aParent) - : nsHTMLContainerFrame(aContent, aParent) -{ -} - -nsCSSContainerFrame::~nsCSSContainerFrame() -{ -} - -#if 0 -NS_IMETHODIMP -nsCSSContainerFrame::ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) -{ - // Get to the last-in-flow of our frame (that is where appends occur) - nsCSSContainerFrame* lastInFlow = (nsCSSContainerFrame*) GetLastInFlow(); - - // Now generate a reflow command targetted at our last-in-flow frame - nsIReflowCommand* cmd; - nsresult rv = NS_NewHTMLReflowCommand(&cmd, lastInFlow, - nsIReflowCommand::FrameAppended); - if (NS_OK == rv) { - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - } - return rv; -} -#endif diff --git a/mozilla/layout/css/layout/src/nsCSSInlineFrame.cpp b/mozilla/layout/css/layout/src/nsCSSInlineFrame.cpp deleted file mode 100644 index 59f2f92d45a..00000000000 --- a/mozilla/layout/css/layout/src/nsCSSInlineFrame.cpp +++ /dev/null @@ -1,1033 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsCSSInlineFrame.h" -#include "nsCSSLayout.h" - -#include "nsIReflowCommand.h" -#include "nsIStyleContext.h" - -#include "nsHTMLIIDs.h"// XXX -#include "nsHTMLBase.h"// XXX rename to nsCSSBase? - -// XXX TODO: - -// test: ...
    : make sure that it works in pullup case and -// non-pullup case - -// content appended INCREMENTAL reflow -// content inserted INCREMENTAL reflow -// content deleted INCREMENTAL reflow - -nsCSSInlineReflowState::nsCSSInlineReflowState(nsCSSLineLayout& aLineLayout, - nsCSSInlineFrame* aInlineFrame, - nsIStyleContext* aInlineSC, - const nsReflowState& aRS, - PRBool aComputeMaxElementSize) - : nsReflowState(aRS), - mInlineLayout(aLineLayout, aInlineFrame, aInlineSC) -{ - // While we skip around the reflow state that our parent gave us so - // that the parentReflowState is linked properly, we don't want to - // skip over it's reason. - reason = aRS.reason; - - mPresContext = aLineLayout.mPresContext; - mLastChild = nsnull; - - const nsStyleText* styleText = (const nsStyleText*) - aInlineSC->GetStyleData(eStyleStruct_Text); - mNoWrap = PRBool(NS_STYLE_WHITESPACE_NORMAL != styleText->mWhiteSpace); - const nsStyleSpacing* styleSpacing = (const nsStyleSpacing*) - aInlineSC->GetStyleData(eStyleStruct_Spacing); - styleSpacing->CalcBorderPaddingFor(aInlineFrame, mBorderPadding); - - // If we're constrained adjust the available size so it excludes space - // needed for border/padding - nscoord width = maxSize.width; - if (NS_UNCONSTRAINEDSIZE != width) { - width -= mBorderPadding.left + mBorderPadding.right; - } - // XXX I don't think we need this! - nscoord height = maxSize.height; - if (NS_UNCONSTRAINEDSIZE != height) { - height -= mBorderPadding.top + mBorderPadding.bottom; - } - - PRIntn ss = mStyleSizeFlags = - nsCSSLayout::GetStyleSize(mPresContext, *this, mStyleSize); - if (0 != (ss & NS_SIZE_HAS_WIDTH)) { - // When we are given a width, change the reflow behavior to - // unconstrained. - // XXX is this right? - width = NS_UNCONSTRAINEDSIZE; - } - - mInlineLayout.Init(this); - mInlineLayout.Prepare(PRBool(NS_UNCONSTRAINEDSIZE == width), - mNoWrap, aComputeMaxElementSize); - mInlineLayout.SetReflowSpace(mBorderPadding.left, mBorderPadding.top, - width, height/* XXX height??? */); -} - -nsCSSInlineReflowState::~nsCSSInlineReflowState() -{ -} - -//---------------------------------------------------------------------- - -nsresult NS_NewCSSInlineFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIFrame* it = new nsCSSInlineFrame(aContent, aParent); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - *aInstancePtrResult = it; - return NS_OK; -} - -nsCSSInlineFrame::nsCSSInlineFrame(nsIContent* aContent, nsIFrame* aParent) - : nsCSSContainerFrame(aContent, aParent) -{ -} - -nsCSSInlineFrame::~nsCSSInlineFrame() -{ -} - -NS_IMETHODIMP -nsCSSInlineFrame::QueryInterface(REFNSIID aIID, void** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIInlineReflowIID)) { - *aInstancePtrResult = (void*) ((nsIInlineReflow*)this); - return NS_OK; - } - return nsFrame::QueryInterface(aIID, aInstancePtrResult); -} - -PRIntn -nsCSSInlineFrame::GetSkipSides() const -{ - PRIntn skip = 0; - if (nsnull != mPrevInFlow) { - skip |= 1 << NS_SIDE_LEFT; - } - if (nsnull != mNextInFlow) { - skip |= 1 << NS_SIDE_RIGHT; - } - return skip; -} - -NS_IMETHODIMP -nsCSSInlineFrame::CreateContinuingFrame(nsIPresContext* aCX, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame) -{ - nsCSSInlineFrame* cf = new nsCSSInlineFrame(mContent, aParent); - if (nsnull == cf) { - return NS_ERROR_OUT_OF_MEMORY; - } - PrepareContinuingFrame(aCX, aParent, aStyleContext, cf); - aContinuingFrame = cf; - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSInlineFrame::CreateContinuingFrame: newFrame=%p", cf)); - return NS_OK; -} - -PRBool -nsCSSInlineFrame::DeleteNextInFlowsFor(nsIFrame* aChild) -{ - return DeleteChildsNextInFlow(aChild); -} - -NS_IMETHODIMP -nsCSSInlineFrame::FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand) -{ - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("enter nsCSSInlineFrame::FindTextRuns [%d,%d,%c]", - mFirstContentOffset, mLastContentOffset, mLastContentIsComplete?'T':'F')); - - nsIFrame* frame; - PRInt32 n; - nsresult rv = NS_OK; - - // Gather up children from the overflow lists - DrainOverflowLists(); - - // Create new frames if necessary - if (NS_FRAME_FIRST_REFLOW & mState) { - if ((nsnull == mPrevInFlow) && (nsnull == mNextInFlow) && - (0 == mChildCount)) { - rv = CreateNewFrames(aLineLayout.mPresContext); - if (NS_OK != rv) { - goto done; - } - } - } - else if (nsnull != aReflowCommand) { - nsIFrame* target; - aReflowCommand->GetTarget(target); - if (this == target) { - nsIReflowCommand::ReflowType type; - aReflowCommand->GetType(type); - if (nsIReflowCommand::FrameAppended == type) { - rv = CreateNewFrames(aLineLayout.mPresContext); - if (NS_OK != rv) { - goto done; - } - } - } - } - - // Ask each child frame for its text runs - frame = mFirstChild; - n = mChildCount; - while (--n >= 0) { - nsIInlineReflow* inlineReflow; - if (NS_OK == frame->QueryInterface(kIInlineReflowIID, - (void**)&inlineReflow)) { - rv = inlineReflow->FindTextRuns(aLineLayout, aReflowCommand); - if (NS_OK != rv) { - return rv; - } - } - else { - // A frame that doesn't implement nsIInlineReflow isn't text - // therefore it will end an open text run. - aLineLayout.EndTextRun(); - } - frame->GetNextSibling(frame); - } - - done:; - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("exit nsCSSInlineFrame::FindTextRuns rv=%x [%d,%d,%c]", - rv, mFirstContentOffset, mLastContentOffset, - mLastContentIsComplete?'T':'F')); - return rv; -} - -NS_IMETHODIMP -nsCSSInlineFrame::InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState) -{ - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("enter nsCSSInlineFrame::InlineReflow maxSize=%d,%d reason=%d kids=%d nif=%p [%d,%d,%c]", - aReflowState.maxSize.width, aReflowState.maxSize.height, - aReflowState.reason, mChildCount, mNextInFlow, - mFirstContentOffset, mLastContentOffset, mLastContentIsComplete?'T':'F')); - - // If this is the initial reflow, generate any synthetic content - // that needs generating. - if (eReflowReason_Initial == aReflowState.reason) { - NS_ASSERTION(0 != (NS_FRAME_FIRST_REFLOW & mState), "bad mState"); - } - else { - NS_ASSERTION(0 == (NS_FRAME_FIRST_REFLOW & mState), "bad mState"); - } - - nsCSSInlineReflowState state(aLineLayout, this, mStyleContext, - aReflowState, - PRBool(nsnull != aMetrics.maxElementSize)); - nsresult rv = NS_OK; - if (eReflowReason_Initial == state.reason) { - DrainOverflowLists(); - rv = InitialReflow(state); - mState &= ~NS_FRAME_FIRST_REFLOW; - } - else if (eReflowReason_Incremental == state.reason) { - // XXX For now we drain our overflow list in case our parent - // reflowed our prev-in-flow and our prev-in-flow pushed some - // children forward to us (e.g. a speculative pullup from us that - // failed) - DrainOverflowLists(); - - NS_ASSERTION(nsnull == mOverflowList, "unexpected overflow list"); - nsIFrame* target; - state.reflowCommand->GetTarget(target); - if (this == target) { - nsIReflowCommand::ReflowType type; - state.reflowCommand->GetType(type); - switch (type) { - case nsIReflowCommand::FrameAppended: - rv = FrameAppendedReflow(state); - break; - - default: - // XXX For now map the other incremental operations into full reflows - rv = ResizeReflow(state); - break; - } - } - else { - // Get next frame in reflow command chain - state.reflowCommand->GetNext(state.mInlineLayout.mNextRCFrame); - - // Continue the reflow - rv = ChildIncrementalReflow(state); - } - } - else if (eReflowReason_Resize == state.reason) { - DrainOverflowLists(); - rv = ResizeReflow(state); - } - ComputeFinalSize(state, aMetrics); - - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("exit nsCSSInlineFrame::InlineReflow size=%d,%d rv=%x kids=%d nif=%p [%d,%d,%c]", - aMetrics.width, aMetrics.height, rv, mChildCount, mNextInFlow, - mFirstContentOffset, mLastContentOffset, - mLastContentIsComplete?'T':'F')); - return rv; -} - -void -nsCSSInlineFrame::ComputeFinalSize(nsCSSInlineReflowState& aState, - nsReflowMetrics& aMetrics) -{ - // Align our child frames. Note that inline frames "shrink wrap" - // around their contents therefore we need to fixup the available - // width in nsCSSInlineLayout so that it doesn't do any horizontal - // alignment. - nsRect bounds; - aState.mInlineLayout.mAvailWidth = - aState.mInlineLayout.mX - aState.mInlineLayout.mLeftEdge; - aState.mInlineLayout.AlignFrames(mFirstChild, mChildCount, bounds); - - // Compute the final width. Use the style width when supplied. - PRIntn ss = aState.mStyleSizeFlags; - if (0 != (ss & NS_SIZE_HAS_WIDTH)) { - // XXX check css2 spec: I think the spec dictates the size of the - // entire box, not the content area - aMetrics.width = aState.mBorderPadding.left + aState.mStyleSize.width + - aState.mBorderPadding.right; - } - else { - // Make sure that we collapse into nothingness if our content is - // zero sized - if (0 == bounds.width) { - aMetrics.width = 0; - } - else { - aMetrics.width = aState.mBorderPadding.left + bounds.width + - aState.mBorderPadding.right; - } - } - - // Compute the final height. Use the style height when supplied. -#if XXX_fix_me - if (0 != (ss & NS_SIZE_HAS_HEIGHT)) { - aMetrics.height = aState.mBorderPadding.top + aState.mStyleSize.height + - aState.mBorderPadding.bottom; - // XXX Apportion extra height evenly to the ascent/descent, taking - // into account roundoff properly. What about when the height is - // smaller than the computed height? Does the css2 spec say - // anything about this? - aMetrics.ascent = ?; - aMetrics.descent = ?; - } - else -#endif - { - // Make sure that we collapse into nothingness if our content is - // zero sized - if (0 == bounds.height) { - aMetrics.ascent = 0; - aMetrics.descent = 0; - aMetrics.height = 0; - } - else { - aMetrics.ascent = aState.mBorderPadding.top + - aState.mInlineLayout.mMaxAscent; - aMetrics.descent = aState.mInlineLayout.mMaxDescent + - aState.mBorderPadding.bottom; - aMetrics.height = aMetrics.ascent + aMetrics.descent; - } - } - - // Adjust max-element size if this frame's no-wrap flag is set. - if (aState.mInlineLayout.mComputeMaxElementSize) { - if (aState.mNoWrap) { - aMetrics.maxElementSize->width = aMetrics.width; - aMetrics.maxElementSize->height = aMetrics.height; - } - else { - *aMetrics.maxElementSize = aState.mInlineLayout.mMaxElementSize; - } - } -} - -nsInlineReflowStatus -nsCSSInlineFrame::InitialReflow(nsCSSInlineReflowState& aState) -{ - NS_PRECONDITION(nsnull == mNextInFlow, "bad frame-appended-reflow"); - NS_PRECONDITION(mLastContentIsComplete == PR_TRUE, "bad state"); - - nsresult rv = ProcessInitialReflow(aState.mPresContext); - if (NS_OK != rv) { - return rv; - } - -#if XXX - // Create any frames that need creating; note that they should have - // been created during FindTextRuns which should have been called - // before this, but we check anyway. - if ((nsnull == mPrevInFlow) && (nsnull == mNextInFlow) && - (0 == mChildCount)) { - nsresult rv = CreateNewFrames(aState.mPresContext); - if (NS_OK != rv) { - return rv; - } - } -#endif - - nsInlineReflowStatus rs = NS_FRAME_COMPLETE; - if (0 != mChildCount) { - if (!ReflowMapped(aState, rs)) { - return rs; - } - } - return rs; -} - -nsInlineReflowStatus -nsCSSInlineFrame::FrameAppendedReflow(nsCSSInlineReflowState& aState) -{ - NS_PRECONDITION(nsnull == mNextInFlow, "bad frame-appended-reflow"); - NS_PRECONDITION(mLastContentIsComplete == PR_TRUE, "bad state"); - -#if XXX - // Create any frames that need creating - nsresult rv = CreateNewFrames(aState.mPresContext); - if (NS_OK != rv) { - return rv; - } -#endif - - nsInlineReflowStatus rs = NS_FRAME_COMPLETE; - if (0 != mChildCount) { - if (!ReflowMapped(aState, rs)) { - return rs; - } - } - return rs; -} - -nsresult -nsCSSInlineFrame::CreateNewFrames(nsIPresContext* aPresContext) -{ - // reason: initial: (a) null nif, pif: create frames - // (b) pullup: don't create frames - // reason: incremental: (a) append targetted at us => create frames - - // Get the childPrevInFlow for our eventual first child if we are a - // continuation and we have no children and the last child in our - // prev-in-flow is incomplete. While we are at it, we also compute - // our kidContentIndex. - PRInt32 kidContentIndex; - nsIFrame* childPrevInFlow = nsnull; - nsIFrame* prevChild = nsnull; - if ((nsnull == mFirstChild) && (nsnull != mPrevInFlow)) { - nsCSSInlineFrame* prev = (nsCSSInlineFrame*)mPrevInFlow; - NS_ASSERTION(prev->mLastContentOffset >= prev->mFirstContentOffset, - "bad prevInFlow"); - kidContentIndex = prev->NextChildOffset(); - if (!prev->mLastContentIsComplete) { - // Our prev-in-flow's last child is not complete - prev->LastChild(childPrevInFlow); - } - } - else { - kidContentIndex = NextChildOffset(); - LastChild(prevChild); - } - - nsresult rv; - PRInt32 lastContentIndex; - lastContentIndex = mContent->ChildCount(); - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("enter nsCSSInlineFrame::CreateNewFrames: kidContentIndex=%d lastContentIndex=%d childPrevInFlow=%p", - kidContentIndex, lastContentIndex, childPrevInFlow)); - while (kidContentIndex < lastContentIndex) { - nsIContent* kid; - kid = mContent->ChildAt(kidContentIndex); - if (nsnull == kid) { - // Our content container is bad - break; - } - - // Create child - nsIFrame* child; - rv = nsHTMLBase::CreateFrame(aPresContext, this, kid, childPrevInFlow, - child); - NS_RELEASE(kid); - if (NS_OK != rv) { - return rv; - } - if (nsnull == prevChild) { - mFirstChild = child; - mFirstContentOffset = kidContentIndex; - } - else { - prevChild->SetNextSibling(child); - } - mChildCount++; - kidContentIndex++; - childPrevInFlow = nsnull; - prevChild = child; - NS_FRAME_TRACE(NS_FRAME_TRACE_NEW_FRAMES, - ("nsCSSInlineFrame::CreateNewFrames: new-frame=%p prev-in-flow=%p", - child, childPrevInFlow)); - } - if (kidContentIndex == 0) { - NS_ASSERTION(lastContentIndex == 0, "bad kid content index"); - mLastContentOffset = 0; - } else { - mLastContentOffset = kidContentIndex - 1; - } - NS_ASSERTION(mFirstContentOffset <= mLastContentOffset, "bad fco/lco"); - mLastContentIsComplete = PR_TRUE; - - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("exit nsCSSInlineFrame::CreateNewFrames")); - return NS_OK; -} - -nsInlineReflowStatus -nsCSSInlineFrame::ChildIncrementalReflow(nsCSSInlineReflowState& aState) -{ - // XXX we can do better SOMEDAY - return ResizeReflow(aState); -} - -nsInlineReflowStatus -nsCSSInlineFrame::ResizeReflow(nsCSSInlineReflowState& aState) -{ - nsInlineReflowStatus rs = NS_FRAME_COMPLETE; - if (0 != mChildCount) { - if (!ReflowMapped(aState, rs)) { - return rs; - } - } - - if (NS_FRAME_IS_COMPLETE(rs)) { - // Try to fit some more children from our next in flow - if (nsnull != mNextInFlow) { - if (!PullUpChildren(aState, rs)) { - return rs; - } - } - } - - return rs; -} - -PRBool -nsCSSInlineFrame::ReflowMapped(nsCSSInlineReflowState& aState, - nsInlineReflowStatus& aReflowStatus) -{ - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("enter nsCSSInlineFrame::ReflowMapped: childCount=%d", mChildCount)); - - nsresult rv; - - PRBool keepGoing = PR_FALSE; - PRInt32 kidContentIndex = mFirstContentOffset; - nsIFrame* prevChild = nsnull; - nsIFrame* child = mFirstChild; - while (nsnull != child) { - aReflowStatus = aState.mInlineLayout.ReflowAndPlaceFrame(child); - if (NS_IS_REFLOW_ERROR(aReflowStatus)) { - return PR_FALSE; - } - - // Update our mLastContentIsComplete flag - mLastContentIsComplete = NS_FRAME_IS_COMPLETE(aReflowStatus); - if (!mLastContentIsComplete) { - // Create a continuation frame for the child now - rv = MaybeCreateNextInFlow(aState, child);/* XXX rename method */ - if (NS_OK != rv) { - aReflowStatus = nsInlineReflowStatus(rv); - return PR_FALSE; - } - } - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSInlineFrame::ReflowMapped: frame=%p c=%c kidRS=%x", - child, mLastContentIsComplete ? 'T' : 'F', aReflowStatus)); - - // See if a break is needed and if one is needed, what kind of break - if (!NS_INLINE_IS_BREAK(aReflowStatus)) { - // Advance past the child we just reflowed. - prevChild = child; - child->GetNextSibling(child); - - // If child is complete then continue reflowing - if (mLastContentIsComplete) { - kidContentIndex++; - continue; - } - - // When our child is not complete we need to push any children - // that follow to our next-in-flow. - PushKids(aState, prevChild, child); - mLastContentOffset = kidContentIndex; - goto done; - } - else if (NS_INLINE_IS_BREAK_AFTER(aReflowStatus)) { - // We need to break-after the child. We also need to return - // the break-after state to our parent because it means our - // parent needs to break-after us (and so on until the type of - // break requested is satisfied). - mLastContentOffset = kidContentIndex; - - // Advance past the child we are breaking after (if it was - // incomplete then we already created its next-in-flow above) - prevChild = child; - child->GetNextSibling(child); - if (nsnull != child) { - // Push extra children to a next-in-flow (and therefore we - // know we aren't complete) - PushKids(aState, prevChild, child); - aReflowStatus |= NS_FRAME_NOT_COMPLETE; - } - else if (mLastContentIsComplete) { - // Determine our completion status. We might be complete IFF - // the child we just reflowed happens to be the last - // possible child we can contain. - PRInt32 lastContentIndex; - lastContentIndex = mContent->ChildCount(); - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("nsCSSInlineFrame::ReflowMapped: HERE kidContentIndex=%d lastContentIndex=%d frame=%p c=%c kidRS=%x", - kidContentIndex, lastContentIndex, child, mLastContentIsComplete ? 'T' : 'F', aReflowStatus)); - if (++kidContentIndex == lastContentIndex) { - // We are complete. Yippee. :-) - aReflowStatus &= ~NS_FRAME_NOT_COMPLETE; - } - else { - // We are not complete. Bummer dude. - aReflowStatus |= NS_FRAME_NOT_COMPLETE; - } - } - goto done; - } else { - // We need to break-before the child. Unlink break-after, a - // break-before may be changed into just incomplete if there are - // children preceeding this child (because the other children we - // have do not need to be broken-before). - mLastContentIsComplete = PR_TRUE; - if (nsnull == prevChild) { - // We are breaking before our very first child - // frame. Therefore we need return the break-before status as - // it is. And by definition we are incomplete. - aReflowStatus |= NS_FRAME_NOT_COMPLETE; - mLastContentOffset = kidContentIndex; - } - else { - // We have other children before the child that needs the - // break-before. Therefore map the break-before from the child - // into a break-after for us, preserving the break-type in the - // process. This is important when the break type is not just - // a simple line break. - aReflowStatus = NS_FRAME_NOT_COMPLETE | NS_INLINE_BREAK | - NS_INLINE_BREAK_AFTER | (NS_INLINE_BREAK_TYPE_MASK & aReflowStatus); - mLastContentOffset = kidContentIndex - 1; - PushKids(aState, prevChild, child); - } - goto done; - } - } - if (kidContentIndex == 0) { - mLastContentOffset = 0; - } else { - mLastContentOffset = kidContentIndex - 1; - } - mLastContentIsComplete = PR_TRUE; - keepGoing = PR_TRUE; - -done:; - aState.mLastChild = prevChild; - NS_POSTCONDITION(mFirstContentOffset <= mLastContentOffset, - "bad content offsets"); - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("exit nsCSSInlineFrame::ReflowMapped: childCount=%d rs=%x", - mChildCount, aReflowStatus)); - return keepGoing; -} - -PRBool -nsCSSInlineFrame::PullUpChildren(nsCSSInlineReflowState& aState, - nsInlineReflowStatus& aReflowStatus) -{ - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("enter nsCSSInlineFrame::PullUpChildren: childCount=%d", - mChildCount)); - - // Get correct kidContentIndex - PRInt32 kidContentIndex; - if ((nsnull == mFirstChild) && (nsnull != mPrevInFlow)) { - nsCSSInlineFrame* prev = (nsCSSInlineFrame*)mPrevInFlow; - NS_ASSERTION(prev->mLastContentOffset >= prev->mFirstContentOffset, - "bad prevInFlow"); - kidContentIndex = prev->NextChildOffset(); - } - else { - kidContentIndex = NextChildOffset(); - } - - PRBool keepGoing = PR_FALSE; - nsresult rv; - aReflowStatus = NS_FRAME_COMPLETE; - nsCSSInlineFrame* nextInFlow = (nsCSSInlineFrame*) mNextInFlow; - nsIFrame* prevChild = aState.mLastChild; -#ifdef NS_DEBUG - if (nsnull == prevChild) { - NS_ASSERTION(nsnull == mFirstChild, "bad prevChild"); - NS_ASSERTION(0 == mChildCount, "bad child count"); - } - else { - NS_ASSERTION(nsnull != mFirstChild, "bad prevChild"); - NS_ASSERTION(0 != mChildCount, "bad child count"); - } -#endif - while (nsnull != nextInFlow) { - // Get child from our next-in-flow - nsIFrame* child = PullOneChild(nextInFlow, prevChild); - if (nsnull == child) { - nextInFlow = (nsCSSInlineFrame*) nextInFlow->mNextInFlow; - continue; - } - NS_FRAME_TRACE(NS_FRAME_TRACE_PUSH_PULL, - ("nsCSSInlineFrame::PullUpChildren: trying to pullup %p", child)); - - // Reflow it - aReflowStatus = aState.mInlineLayout.ReflowAndPlaceFrame(child); - if (NS_IS_REFLOW_ERROR(aReflowStatus)) { - goto done; - } - - // XXX This code is identical to ReflowMapped; maybe they should - // be one routine? - - // Update our mLastContentIsComplete flag - mLastContentIsComplete = NS_FRAME_IS_COMPLETE(aReflowStatus); - if (!mLastContentIsComplete) { - // Create a continuation frame for the child now - rv = MaybeCreateNextInFlow(aState, child);/* XXX rename method */ - if (NS_OK != rv) { - aReflowStatus = nsInlineReflowStatus(rv); - return PR_FALSE; - } - } - - // See if a break is needed and if one is needed, what kind of break - if (!NS_INLINE_IS_BREAK(aReflowStatus)) { - // Advance past the child we just reflowed. - prevChild = child; - child->GetNextSibling(child); - - // If child is complete then continue reflowing - if (mLastContentIsComplete) { - kidContentIndex++; - continue; - } - - // When our child is not complete we need to push any children - // that follow to our next-in-flow. - PushKids(aState, prevChild, child); - mLastContentOffset = kidContentIndex; - goto done; - } - else if (NS_INLINE_IS_BREAK_AFTER(aReflowStatus)) { - // We need to break-after the child. We also need to return - // the break-after state to our parent because it means our - // parent needs to break-after us (and so on until the type of - // break requested is satisfied). - mLastContentOffset = kidContentIndex; - - // Advance past the child we are breaking after (if it was - // incomplete then we already created its next-in-flow above) - prevChild = child; - child->GetNextSibling(child); - if (nsnull != child) { - // Push extra children to a next-in-flow (and therefore we - // know we aren't complete) - PushKids(aState, prevChild, child); - aReflowStatus |= NS_FRAME_NOT_COMPLETE; - } - else if (mLastContentIsComplete) { - // Determine our completion status. We might be complete IFF - // the child we just reflowed happens to be the last - // possible child we can contain. - PRInt32 lastContentIndex; - lastContentIndex = mContent->ChildCount(); - if (++kidContentIndex == lastContentIndex) { - // We are complete. Yippee. :-) - aReflowStatus &= ~NS_FRAME_NOT_COMPLETE; - } - else { - // We are not complete. Bummer dude. - aReflowStatus |= NS_FRAME_NOT_COMPLETE; - } - } - goto done; - } else { - // We need to break-before the child. Unlink break-after, a - // break-before may be changed into just incomplete if there are - // children preceeding this child (because the other children we - // have do not need to be broken-before). - if (nsnull == prevChild) { - // We are breaking before our very first child - // frame. Therefore we need return the break-before status as - // it is. And by definition we are incomplete. - aReflowStatus |= NS_FRAME_NOT_COMPLETE; - mLastContentOffset = kidContentIndex; - } - else { - // We have other children before the child that needs the - // break-before. Therefore map the break-before from the child - // into a break-after for us, preserving the break-type in the - // process. This is important when the break type is not just - // a simple line break. - aReflowStatus = NS_FRAME_NOT_COMPLETE | NS_INLINE_BREAK | - NS_INLINE_BREAK_AFTER | (NS_INLINE_BREAK_TYPE_MASK & aReflowStatus); - mLastContentOffset = kidContentIndex - 1; - PushKids(aState, prevChild, child); - } - goto done; - } - } - if (kidContentIndex == 0) { - mLastContentOffset = 0; - } else { - mLastContentOffset = kidContentIndex - 1; - } - NS_ASSERTION(mFirstContentOffset <= mLastContentOffset, "bad fco/lco"); - mLastContentIsComplete = PR_TRUE; - keepGoing = PR_TRUE; - -done:; -// XXX Why bother? Assuming our offsets are correct then our -// next-in-flow will pick up where we left off. -#if XXX - nextInFlow = (nsCSSInlineFrame*) mNextInFlow; - if ((nsnull != nextInFlow) && (nsnull == nextInFlow->mFirstChild)) { - if (NS_FRAME_IS_NOT_COMPLETE(aReflowStatus)) { - AdjustOffsetOfEmptyNextInFlows(); - } - } -#endif - - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("exit nsCSSInlineFrame::PullUpChildren: childCount=%d rs=%x", - mChildCount, aReflowStatus)); - return keepGoing; -} - -nsIFrame* -nsCSSInlineFrame::PullOneChild(nsCSSInlineFrame* aNextInFlow, - nsIFrame* aLastChild) -{ - NS_PRECONDITION(nsnull != aNextInFlow, "null ptr"); - - // Get first available frame from the next-in-flow; if it's out of - // frames check it's overflow list. - nsIFrame* kidFrame = aNextInFlow->mFirstChild; - if (nsnull == kidFrame) { - if (nsnull == aNextInFlow->mOverflowList) { - return nsnull; - } - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("nsCSSInlineFrame::PullOneChild: from overflow list, frame=%p", - kidFrame)); - kidFrame = aNextInFlow->mOverflowList; - kidFrame->GetNextSibling(aNextInFlow->mOverflowList); - } - else { - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("nsCSSInlineFrame::PullOneChild: frame=%p (%d kids left)", - kidFrame, aNextInFlow->mChildCount - 1)); - - // Take the frame away from the next-in-flow. Update it's first - // content offset. - kidFrame->GetNextSibling(aNextInFlow->mFirstChild); - aNextInFlow->mChildCount--; - if (nsnull != aNextInFlow->mFirstChild) { - aNextInFlow->SetFirstContentOffset(aNextInFlow->mFirstChild); - } - } - - // Now give the frame to this container - kidFrame->SetGeometricParent(this); - nsIFrame* contentParent; - kidFrame->GetContentParent(contentParent); - if (aNextInFlow == contentParent) { - kidFrame->SetContentParent(this); - } - - // Add the frame on our list - if (nsnull == aLastChild) { - mFirstChild = kidFrame; - SetFirstContentOffset(kidFrame); - } else { - NS_ASSERTION(IsLastChild(aLastChild), "bad last child"); - aLastChild->SetNextSibling(kidFrame); - } - kidFrame->SetNextSibling(nsnull); - mChildCount++; - - return kidFrame; -} - -nsresult -nsCSSInlineFrame::MaybeCreateNextInFlow(nsCSSInlineReflowState& aState, - nsIFrame* aFrame) -{ - nsIFrame* nextInFlow; - nsresult rv = aState.mInlineLayout.MaybeCreateNextInFlow(aFrame, nextInFlow); - if (NS_OK != rv) { - return rv; - } - if (nsnull != nextInFlow) { - mChildCount++; - } - return NS_OK; -} - -void -nsCSSInlineFrame::PushKids(nsCSSInlineReflowState& aState, - nsIFrame* aPrevChild, - nsIFrame* aPushedChild) -{ - NS_ASSERTION(nsnull == mOverflowList, "bad overflow list"); - - // Count how many children are being pushed - PRInt32 pushCount = mChildCount - aState.mInlineLayout.mFrameNum; - - // Only ask container base class to push children if there is - // something to push... - if (0 != pushCount) { - NS_FRAME_TRACE(NS_FRAME_TRACE_PUSH_PULL, - ("nsCSSInlineFrame::PushKids: pushing %d children", pushCount)); - // Break sibling list - aPrevChild->SetNextSibling(nsnull); - mChildCount -= pushCount; - - // Place overflow frames on our overflow list; our next-in-flow - // will pick them up when it is reflowed - mOverflowList = aPushedChild; - } -#ifdef NS_DEBUG - PRInt32 len = LengthOf(mFirstChild); - NS_ASSERTION(len == mChildCount, "child count is wrong"); -#endif -} - -void -nsCSSInlineFrame::DrainOverflowLists() -{ - // Our prev-in-flows overflow list goes before my children and must - // be re-parented. - if (nsnull != mPrevInFlow) { - nsCSSInlineFrame* prevInFlow = (nsCSSInlineFrame*) mPrevInFlow; - if (nsnull != prevInFlow->mOverflowList) { - nsIFrame* frame = prevInFlow->mOverflowList; - nsIFrame* lastFrame = nsnull; - PRInt32 count = 0; - while (nsnull != frame) { - // Reparent the frame - frame->SetGeometricParent(this); - nsIFrame* contentParent; - frame->GetContentParent(contentParent); - if (prevInFlow == contentParent) { - frame->SetContentParent(this); - } - - // Advance through the list - count++; - lastFrame = frame; - frame->GetNextSibling(frame); - } - - // Join the two frame lists together and update our child count -#if XXX - if (nsnull == mFirstChild) { - // We are a continuation of our prev-in-flow; we assume that - // the last child was complete. - mLastContentIsComplete = PR_TRUE; - } -#endif - nsIFrame* newFirstChild = prevInFlow->mOverflowList; - newFirstChild->GetContentIndex(mFirstContentOffset); - lastFrame->SetNextSibling(mFirstChild); - mFirstChild = newFirstChild; - prevInFlow->mOverflowList = nsnull; - mChildCount += count; - } - } - - // Our overflow list goes to the end of our child list - if (nsnull != mOverflowList) { - // Append the overflow list to the end of our child list - nsIFrame* lastFrame; - LastChild(lastFrame); - if (nsnull == lastFrame) { - mFirstChild = mOverflowList; - mFirstChild->GetContentIndex(mFirstContentOffset); - } - else { - lastFrame->SetNextSibling(mOverflowList); - } - - // Count how many frames are on the overflow list and then update - // our count - nsIFrame* frame = mOverflowList; - PRInt32 count = 0; - while (nsnull != frame) { - count++; - frame->GetNextSibling(frame); - } - mChildCount += count; - mOverflowList = nsnull; -#if XXX - // We get here when we pushed some children to a potential - // next-in-flow and then our parent decided to reflow us instead - // of continuing us. - NS_ASSERTION(nsnull == mNextInFlow, "huh?"); - mLastContentIsComplete = PR_TRUE; -#endif - } - - // XXX What do we set mLastContentIsComplete to? - -#ifdef NS_DEBUG - PRInt32 len = LengthOf(mFirstChild); - NS_ASSERTION(len == mChildCount, "child count is wrong"); -#endif -} diff --git a/mozilla/layout/css/layout/src/nsCSSInlineFrame.h b/mozilla/layout/css/layout/src/nsCSSInlineFrame.h deleted file mode 100644 index 53ea252fd75..00000000000 --- a/mozilla/layout/css/layout/src/nsCSSInlineFrame.h +++ /dev/null @@ -1,132 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsCSSInlineFrame_h___ -#define nsCSSInlineFrame_h___ - -#include "nsCSSContainerFrame.h" -#include "nsCSSInlineLayout.h" -#include "nsCSSLineLayout.h" - -class nsCSSInlineFrame; - -/** - * Reflow state object for managing css inline layout. Most of the state - * is managed by the nsCSSInlineLayout object. - */ -struct nsCSSInlineReflowState : public nsReflowState { - nsCSSInlineReflowState(nsCSSLineLayout& aLineLayout, - nsCSSInlineFrame* aInlineFrame, - nsIStyleContext* aInlineSC, - const nsReflowState& aReflowState, - PRBool aComputeMaxElementSize); - ~nsCSSInlineReflowState(); - - nsIPresContext* mPresContext; - nsCSSInlineLayout mInlineLayout; - - nsIFrame* mLastChild; // last child we have reflowed (so far) - - nsMargin mBorderPadding; - PRBool mNoWrap; - PRIntn mStyleSizeFlags; - nsSize mStyleSize; -}; - -//---------------------------------------------------------------------- - -/** - * CSS "inline" layout class. - * - * Note: This class does not support being used as a pseudo frame. - */ -class nsCSSInlineFrame : public nsCSSContainerFrame, - public nsIInlineReflow -{ -public: - // nsISupports - NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr); - - // nsIFrame - NS_IMETHOD CreateContinuingFrame(nsIPresContext* aCX, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame); -#if XXX_not_yet - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); -#endif - - // nsIInlineReflow - NS_IMETHOD FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand); - NS_IMETHOD InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState); - - // nsCSSContainerFrame - virtual PRBool DeleteNextInFlowsFor(nsIFrame* aChild); - -protected: - nsCSSInlineFrame(nsIContent* aContent, nsIFrame* aParent); - - virtual ~nsCSSInlineFrame(); - - virtual PRIntn GetSkipSides() const; - - nsresult InitialReflow(nsCSSInlineReflowState& aState); - - nsresult FrameAppendedReflow(nsCSSInlineReflowState& aState); - - nsresult ChildIncrementalReflow(nsCSSInlineReflowState& aState); - - nsresult ResizeReflow(nsCSSInlineReflowState& aState); - - void ComputeFinalSize(nsCSSInlineReflowState& aState, - nsReflowMetrics& aMetrics); - - PRBool ReflowMapped(nsCSSInlineReflowState& aState, - nsInlineReflowStatus& aReflowStatus); - - PRBool PullUpChildren(nsCSSInlineReflowState& aState, - nsInlineReflowStatus& aReflowStatus); - - nsIFrame* PullOneChild(nsCSSInlineFrame* aNextInFlow, - nsIFrame* aLastChild); - - nsresult CreateNewFrames(nsIPresContext* aPresContext); - - nsresult MaybeCreateNextInFlow(nsCSSInlineReflowState& aState, - nsIFrame* aFrame); - - void PushKids(nsCSSInlineReflowState& aState, - nsIFrame* aPrevChild, nsIFrame* aPushedChild); - - void DrainOverflowLists(); - - friend nsresult NS_NewCSSInlineFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent); -}; - -extern nsresult NS_NewCSSInlineFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent); - -#endif /* nsCSSInlineFrame_h___ */ diff --git a/mozilla/layout/css/layout/src/nsCSSInlineLayout.cpp b/mozilla/layout/css/layout/src/nsCSSInlineLayout.cpp deleted file mode 100644 index 2dc5be65238..00000000000 --- a/mozilla/layout/css/layout/src/nsCSSInlineLayout.cpp +++ /dev/null @@ -1,449 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is Netscape Communications - * Corporation. Portions created by Netscape are Copyright (C) 1998 - * Netscape Communications Corporation. All Rights Reserved. - */ -#include "nsCSSInlineLayout.h" -#include "nsCSSLineLayout.h" -#include "nsCSSLayout.h" -#include "nsHTMLIIDs.h" -#include "nsCSSContainerFrame.h" - -#include "nsIFontMetrics.h" -#include "nsIStyleContext.h" -#include "nsIPresContext.h" -#include "nsIReflowCommand.h" -#include "nsIRunaround.h" - -nsCSSInlineLayout::nsCSSInlineLayout(nsCSSLineLayout& aLineLayout, - nsCSSContainerFrame* aContainerFrame, - nsIStyleContext* aContainerStyle) - : mLineLayout(aLineLayout) -{ - mContainerFrame = aContainerFrame; - mAscents = mAscentBuf; - mMaxAscents = sizeof(mAscentBuf) / sizeof(mAscentBuf[0]); - - mContainerFont = (const nsStyleFont*) - aContainerStyle->GetStyleData(eStyleStruct_Font); - mContainerText = (const nsStyleText*) - aContainerStyle->GetStyleData(eStyleStruct_Text); - mContainerDisplay = (const nsStyleDisplay*) - aContainerStyle->GetStyleData(eStyleStruct_Display); - mDirection = mContainerDisplay->mDirection; - mIsBullet = PR_FALSE; - mNextRCFrame = nsnull; -} - -nsCSSInlineLayout::~nsCSSInlineLayout() -{ - if (mAscents != mAscentBuf) { - delete [] mAscents; - } -} - -void -nsCSSInlineLayout::Init(const nsReflowState* aContainerReflowState) -{ - mContainerReflowState = aContainerReflowState; -} - -nsresult -nsCSSInlineLayout::SetAscent(nscoord aAscent) -{ - PRInt32 frameNum = mFrameNum; - if (frameNum == mMaxAscents) { - mMaxAscents *= 2; - nscoord* newAscents = new nscoord[mMaxAscents]; - if (nsnull == newAscents) { - return NS_ERROR_OUT_OF_MEMORY; - } - nsCRT::memcpy(newAscents, mAscents, sizeof(nscoord) * frameNum); - if (mAscents != mAscentBuf) { - delete [] mAscents; - } - mAscents = newAscents; - } - mAscents[frameNum] = aAscent; - return NS_OK; -} - -void -nsCSSInlineLayout::Prepare(PRBool aUnconstrainedWidth, - PRBool aNoWrap, - PRBool aComputeMaxElementSize) -{ - mIsBullet = PR_FALSE; - mFrameNum = 0; - mUnconstrainedWidth = aUnconstrainedWidth; - mNoWrap = aNoWrap; - mComputeMaxElementSize = aComputeMaxElementSize; - if (aComputeMaxElementSize) { - mMaxElementSize.width = 0; - mMaxElementSize.height = 0; - } - mMaxAscent = 0; - mMaxDescent = 0; -} - -void -nsCSSInlineLayout::SetReflowSpace(nscoord aX, nscoord aY, - nscoord aAvailWidth, nscoord aAvailHeight) -{ - mAvailWidth = aAvailWidth; - mAvailHeight = aAvailHeight; - mX = aX; - mY = aY; - mLeftEdge = aX; - mRightEdge = aX + aAvailWidth; -} - -//XXX block children of inline frames needs handling *here* - -nsInlineReflowStatus -nsCSSInlineLayout::ReflowAndPlaceFrame(nsIFrame* aFrame) -{ - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSInlineLayout::ReflowAndPlaceFrame: frame=%p x=%d", - aFrame, mX)); - - // Compute the maximum size of the frame. If there is no room at all - // for it, then trigger a line-break before the frame. - nsSize maxSize; - nsMargin margin; - if (!ComputeMaxSize(aFrame, margin, maxSize)) { - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSInlineLayout::ReflowAndPlaceFrame: break-before")); - return NS_INLINE_LINE_BREAK_BEFORE(0);/* XXX indicate never-reflowed? */ - } - - // Get reflow reason set correctly. It's possible that we created a - // child and then decided that we cannot reflow it (for example, a - // block frame that isn't at the start of a line). In this case the - // reason will be wrong so we need to check the frame state. - nsReflowReason reason = eReflowReason_Resize; - nsFrameState state; - aFrame->GetFrameState(state); - if (NS_FRAME_FIRST_REFLOW & state) { - reason = eReflowReason_Initial; - } - else if (mNextRCFrame == aFrame) { - reason = eReflowReason_Incremental; - // Make sure we only incrementally reflow once - mNextRCFrame = nsnull; - } - - // Setup reflow state for reflowing the frame - nsReflowState reflowState(aFrame, *mContainerReflowState, maxSize); - reflowState.reason = reason; - nsInlineReflowStatus rs; - nsSize frameMaxElementSize; - nsReflowMetrics metrics(mComputeMaxElementSize - ? &frameMaxElementSize - : nsnull); - PRBool isAware; - aFrame->WillReflow(*mLineLayout.mPresContext); - rs = ReflowFrame(aFrame, metrics, reflowState, isAware); - if (NS_IS_REFLOW_ERROR(rs)) { - return rs; - } - if (NS_INLINE_IS_BREAK_BEFORE(rs)) { - return rs; - } - - // XXX the 0,0 part of this is hack: get rid of it - if (!isAware && ((0 != metrics.width) || (0 != metrics.height))) { - mLineLayout.SetSkipLeadingWhiteSpace(PR_FALSE); - } - - // It's possible the frame didn't fit - if (metrics.width > maxSize.width) { - if (!IsFirstChild()) { - // We are out of room. - // XXX mKidPrevInFlow - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSInlineLayout::ReflowAndPlaceFrame: !fit size=%d,%d", - metrics.width, metrics.height)); - - // XXX if the child requested a break and we need to break too... - - return NS_INLINE_LINE_BREAK_BEFORE(0); - } - } - - nsRect frameRect(mX, mY, metrics.width, metrics.height); - return PlaceFrame(aFrame, frameRect, metrics, margin, rs); -} - -// XXX RTL -PRBool -nsCSSInlineLayout::IsFirstChild() -{ - return 0 == mFrameNum; -} - -PRBool -nsCSSInlineLayout::ComputeMaxSize(nsIFrame* aFrame, - nsMargin& aKidMargin, - nsSize& aResult) -{ - const nsStyleSpacing* kidSpacing; - aFrame->GetStyleData(eStyleStruct_Spacing, - (const nsStyleStruct*&)kidSpacing); - kidSpacing->CalcMarginFor(aFrame, aKidMargin); - if (mUnconstrainedWidth || mNoWrap) { - aResult.width = NS_UNCONSTRAINEDSIZE; - } - else { - aResult.width = mRightEdge - mX; - aResult.width -= aKidMargin.left + aKidMargin.right; - if (!IsFirstChild() && (aResult.width <= 0)) { - // XXX Make sure child is dirty for next time - aFrame->WillReflow(*mLineLayout.mPresContext); - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSInlineLayout::ComputeMaxSize: !fit")); - return PR_FALSE; - } - } - - // Give the child a limited height in case it's a block child and - // our height was limited. - aResult.height = mAvailHeight; - return PR_TRUE; -} - -nsInlineReflowStatus -nsCSSInlineLayout::ReflowFrame(nsIFrame* aKidFrame, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState, - PRBool& aInlineAware) -{ - // There are 3 ways to reflow the child frame: using the nsIRunaround - // interface, using the nsIInlineReflow interface or using the default - // Reflow method in nsIFrame. The order of precedence is nsIRunaround, - // nsIInlineReflow, nsIFrame. For all three API's we map the reflow status - // into an nsInlineReflowStatus. - - nsresult rv; - nsIRunaround* runAround; - nsIInlineReflow* inlineReflow; - if ((nsnull != mLineLayout.mSpaceManager) && - (NS_OK == aKidFrame->QueryInterface(kIRunaroundIID, - (void**)&runAround))) { - nsRect r; - runAround->Reflow(mLineLayout.mPresContext, mLineLayout.mSpaceManager, - aMetrics, aReflowState, r, rv); - aMetrics.width = r.width; - aMetrics.height = r.height; - aMetrics.ascent = r.height; - aMetrics.descent = 0; - aInlineAware = PR_FALSE; - } - else if (NS_OK == aKidFrame->QueryInterface(kIInlineReflowIID, - (void**)&inlineReflow)) { - rv = inlineReflow->InlineReflow(mLineLayout, aMetrics, aReflowState); - aInlineAware = PR_TRUE; - } - else { - aKidFrame->Reflow(mLineLayout.mPresContext, aMetrics, aReflowState, rv); - aInlineAware = PR_FALSE; - } - - if (NS_FRAME_IS_COMPLETE(rv)) { - nsIFrame* kidNextInFlow; - aKidFrame->GetNextInFlow(kidNextInFlow); - if (nsnull != kidNextInFlow) { - // Remove all of the childs next-in-flows. Make sure that we ask - // the right parent to do the removal (it's possible that the - // parent is not this because we are executing pullup code) - nsIFrame* parent; - aKidFrame->GetGeometricParent(parent); - ((nsCSSContainerFrame*)parent)->DeleteNextInFlowsFor(aKidFrame); - } - } - - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSInlineLayout::ReflowFrame: frame=%p reflowStatus=%x %saware", - aKidFrame, rv, aInlineAware ? "" :"not ")); - return rv; -} - -nsInlineReflowStatus -nsCSSInlineLayout::PlaceFrame(nsIFrame* aFrame, - nsRect& aFrameRect, - const nsReflowMetrics& aFrameMetrics, - const nsMargin& aFrameMargin, - nsInlineReflowStatus aFrameReflowStatus) -{ - nscoord horizontalMargins = 0; - - // Special case to position outside list bullets. - // XXX RTL bullets - if (mIsBullet) { - // We are placing the first child of the container and we have - // list-style-position of "outside" therefore this is the - // bullet that is being reflowed. The bullet is placed in the - // padding area of this block. Don't worry about getting the Y - // coordinate of the bullet right (vertical alignment will - // take care of that). - - // Compute gap between bullet and inner rect left edge - nsIFontMetrics* fm = - mLineLayout.mPresContext->GetMetricsFor(mContainerFont->mFont); - nscoord kidAscent = fm->GetMaxAscent(); - nscoord dx = fm->GetHeight() / 2; // from old layout engine - NS_RELEASE(fm); - - // XXX RTL bullets - aFrameRect.x = mX - aFrameRect.width - dx; - aFrame->SetRect(aFrameRect); - } - else { - // Place normal in-flow child - aFrame->SetRect(aFrameRect); - - // XXX RTL - // Advance - const nsStyleDisplay* frameDisplay; - aFrame->GetStyleData(eStyleStruct_Display, - (const nsStyleStruct*&) frameDisplay); - switch (frameDisplay->mFloats) { - default: - NS_NOTYETIMPLEMENTED("Unsupported floater type"); - // FALL THROUGH - - case NS_STYLE_FLOAT_LEFT: - case NS_STYLE_FLOAT_RIGHT: - // When something is floated, its margins are applied there - // not here. - break; - - case NS_STYLE_FLOAT_NONE: - horizontalMargins = aFrameMargin.left + aFrameMargin.right; - break; - } - mX += aFrameMetrics.width + horizontalMargins; - } - - NS_FRAME_LOG(NS_FRAME_TRACE_CHILD_REFLOW, - ("nsCSSInlineLayout::PlaceFrame: frame=%p {%d, %d, %d, %d}", - aFrame, - aFrameRect.x, aFrameRect.y, - aFrameRect.width, aFrameRect.height)); - - // XXX this is not right; the max-element-size of a child depends on - // it's margins which it doesn't know how to add in - - // Fold in child's max-element-size information into our own - if (mComputeMaxElementSize) { - if (aFrameMetrics.maxElementSize->width > mMaxElementSize.width) { - mMaxElementSize.width = aFrameMetrics.maxElementSize->width; - } - if (aFrameMetrics.maxElementSize->height > mMaxElementSize.height) { - mMaxElementSize.height = aFrameMetrics.maxElementSize->height; - } - } - - if (aFrameMetrics.ascent > mMaxAscent) { - mMaxAscent = aFrameMetrics.ascent; - } - if (aFrameMetrics.descent > mMaxDescent) { - mMaxDescent = aFrameMetrics.descent; - } - nsresult rv = SetAscent(aFrameMetrics.ascent); - if (NS_OK != rv) { - return nsInlineReflowStatus(rv); - } - mFrameNum++; - - return aFrameReflowStatus; -} - -void -nsCSSInlineLayout::AlignFrames(nsIFrame* aFrame, PRInt32 aFrameCount, - nsRect& aBounds) -{ - NS_PRECONDITION(aFrameCount == mFrameNum, "bogus reflow"); - - // Vertically align the children on the line; this will compute - // the actual line height for us. - - // XXX Fold in vertical alignment code here and make it update the - // max ascent and max descent values properly. When line-height is - // involved, give half of it to ascent and half to descent - - nscoord lineHeight = - nsCSSLayout::VerticallyAlignChildren(mLineLayout.mPresContext, - mContainerFrame, mContainerFont, - mY, aFrame, aFrameCount, - mAscents, mMaxAscent/* XXX maxDescent */); - nscoord lineWidth = mX - mLeftEdge; - - // Save away line bounds before other adjustments - aBounds.x = mLeftEdge; - aBounds.y = mY; - aBounds.width = lineWidth; - aBounds.height = lineHeight; - - // Now horizontally place the children - if (!mUnconstrainedWidth && (mAvailWidth > lineWidth)) { - nsCSSLayout::HorizontallyPlaceChildren(mLineLayout.mPresContext, - mContainerFrame, - mContainerText->mTextAlign, - mDirection, - aFrame, aFrameCount, - lineWidth, - mAvailWidth); - } - - // Last, apply relative positioning - nsCSSLayout::RelativePositionChildren(mLineLayout.mPresContext, - mContainerFrame, - aFrame, aFrameCount); -} - -nsresult -nsCSSInlineLayout::MaybeCreateNextInFlow(nsIFrame* aFrame, - nsIFrame*& aNextInFlowResult) -{ - aNextInFlowResult = nsnull; - - nsIFrame* nextInFlow; - aFrame->GetNextInFlow(nextInFlow); - if (nsnull == nextInFlow) { - // Create a continuation frame for the child frame and insert it - // into our lines child list. - nsIFrame* nextFrame; - aFrame->GetNextSibling(nextFrame); - nsIStyleContext* kidSC; - aFrame->GetStyleContext(mLineLayout.mPresContext, kidSC); - aFrame->CreateContinuingFrame(mLineLayout.mPresContext, mContainerFrame, - kidSC, nextInFlow); - NS_RELEASE(kidSC); - if (nsnull == nextInFlow) { - return NS_ERROR_OUT_OF_MEMORY; - } - aFrame->SetNextSibling(nextInFlow); - nextInFlow->SetNextSibling(nextFrame); - - NS_FRAME_LOG(NS_FRAME_TRACE_NEW_FRAMES, - ("nsCSSInlineLayout::MaybeCreateNextInFlow: frame=%p nextInFlow=%p", - aFrame, nextInFlow)); - - aNextInFlowResult = nextInFlow; - } - return NS_OK; -} diff --git a/mozilla/layout/css/layout/src/nsCSSInlineLayout.h b/mozilla/layout/css/layout/src/nsCSSInlineLayout.h deleted file mode 100644 index beeccf6b862..00000000000 --- a/mozilla/layout/css/layout/src/nsCSSInlineLayout.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is Netscape Communications - * Corporation. Portions created by Netscape are Copyright (C) 1998 - * Netscape Communications Corporation. All Rights Reserved. - */ -#ifndef nsCSSInlineLayout_h___ -#define nsCSSInlineLayout_h___ - -#include "nsCSSContainerFrame.h" -#include "nsIInlineReflow.h" -class nsCSSLineLayout; -struct nsStyleDisplay; -struct nsStyleFont; -struct nsStyleText; - -/** - * This structure contains the horizontal layout state for line - * layout frame placement. This is factored out of nsCSSLineLayout so - * that the block layout code and the inline layout code can use - * nsCSSLineLayout to reflow and place frames. - */ -struct nsCSSInlineLayout { - nsCSSInlineLayout(nsCSSLineLayout& aLineLayout, - nsCSSContainerFrame* aContainerFrame, - nsIStyleContext* aContainerStyle); - ~nsCSSInlineLayout(); - - void Init(const nsReflowState* aContainerReflowState); - - void Prepare(PRBool aUnconstrainedWidth, - PRBool aNoWrap, - PRBool aComputeMaxElementSize); - - void SetReflowSpace(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight); - - nsInlineReflowStatus ReflowAndPlaceFrame(nsIFrame* aFrame); - - /** - * Align the frames that have been reflowed by this object. - * aBounds is filled in with the size of the "line" before any - * horziontal alignment or relative positioning. aBounds.width will - * be the line width, aBounds.height will be the line height. - */ - void AlignFrames(nsIFrame* aFrame, PRInt32 aFrameCount, nsRect& aBounds); - - PRBool IsFirstChild(); - - nsresult SetAscent(nscoord aAscent); - - PRBool ComputeMaxSize(nsIFrame* aFrame, - nsMargin& aKidMargin, - nsSize& aResult); - - nsInlineReflowStatus ReflowFrame(nsIFrame* aFrame, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - PRBool& aInlineAware); - - nsInlineReflowStatus PlaceFrame(nsIFrame* aFrame, - nsRect& kidRect, - const nsReflowMetrics& kidMetrics, - const nsMargin& kidMargin, - nsInlineReflowStatus kidReflowStatus); - - nsresult MaybeCreateNextInFlow(nsIFrame* aFrame, - nsIFrame*& aNextInFlowResult); - - nsCSSLineLayout& mLineLayout; - nsCSSContainerFrame* mContainerFrame; - const nsStyleFont* mContainerFont; - const nsStyleText* mContainerText; - const nsStyleDisplay* mContainerDisplay; - const nsReflowState* mContainerReflowState; - PRUint8 mDirection; - - PRPackedBool mUnconstrainedWidth; - PRPackedBool mNoWrap; - PRPackedBool mComputeMaxElementSize; - PRPackedBool mIsBullet; - nscoord mAvailWidth; - nscoord mAvailHeight; - nscoord mX, mY; - nscoord mLeftEdge, mRightEdge; - - PRInt32 mFrameNum; - nscoord* mAscents; - nscoord mAscentBuf[20]; - nscoord mMaxAscents; - - nscoord mMaxAscent; - nscoord mMaxDescent; - nsSize mMaxElementSize; - - nsIFrame* mNextRCFrame; -}; - -#endif /* nsCSSInlineLayout_h___ */ diff --git a/mozilla/layout/css/layout/src/nsCSSLineLayout.cpp b/mozilla/layout/css/layout/src/nsCSSLineLayout.cpp deleted file mode 100644 index 11889c2f8bf..00000000000 --- a/mozilla/layout/css/layout/src/nsCSSLineLayout.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is Netscape Communications - * Corporation. Portions created by Netscape are Copyright (C) 1998 - * Netscape Communications Corporation. All Rights Reserved. - */ -#include "nsCSSLineLayout.h" -#include "nsCSSLayout.h" - -#if 0 -#include "nsIFontMetrics.h" -#include "nsIPresContext.h" -#include "nsIRunaround.h" -#include "nsIStyleContext.h" - -// XXX nsCSSIIDs.[h,cpp] -static NS_DEFINE_IID(kIInlineReflowIID, NS_IINLINE_REFLOW_IID); -static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID); -#endif - -void -nsCSSTextRun::List(FILE* out, PRInt32 aIndent) -{ - PRInt32 i; - for (i = aIndent; --i >= 0; ) fputs(" ", out); - PRInt32 n = mArray.Count(); - fprintf(out, "%p: count=%d <", this, n); - for (i = 0; i < n; i++) { - nsIFrame* text = (nsIFrame*) mArray.ElementAt(i); - text->ListTag(out); - printf(" "); - } - fputs(">\n", out); -} - -//---------------------------------------------------------------------- - -nsCSSLineLayout::nsCSSLineLayout(nsIPresContext* aPresContext, - nsISpaceManager* aSpaceManager) -{ - mPresContext = aPresContext; - mSpaceManager = aSpaceManager; - mListPositionOutside = PR_FALSE; - mLineNumber = 0; - mLeftEdge = 0; - mColumn = 0; - mSkipLeadingWS = PR_TRUE; - - mTextRuns = nsnull; - ResetTextRuns(); -} - -nsCSSLineLayout::~nsCSSLineLayout() -{ - nsCSSTextRun::DeleteTextRuns(mTextRuns); -} - -void -nsCSSLineLayout::ResetTextRuns() -{ - nsCSSTextRun::DeleteTextRuns(mTextRuns); - mTextRuns = nsnull; - mTextRunP = &mTextRuns; - mNewTextRun = nsnull; -} - -nsCSSTextRun* -nsCSSLineLayout::TakeTextRuns() -{ - nsCSSTextRun* result = mTextRuns; - mTextRuns = nsnull; - ResetTextRuns(); - return result; -} - -void -nsCSSLineLayout::EndTextRun() -{ - mNewTextRun = nsnull; -} - -nsresult -nsCSSLineLayout::AddText(nsIFrame* aTextFrame) -{ - if (nsnull == mNewTextRun) { - mNewTextRun = new nsCSSTextRun(); - if (nsnull == mNewTextRun) { - return NS_ERROR_OUT_OF_MEMORY; - } - *mTextRunP = mNewTextRun; - mTextRunP = &mNewTextRun->mNext; - } - mNewTextRun->mArray.AppendElement(aTextFrame); - return NS_OK;/* XXX */ -} diff --git a/mozilla/layout/css/layout/src/nsCSSLineLayout.h b/mozilla/layout/css/layout/src/nsCSSLineLayout.h deleted file mode 100644 index 6f14202b27a..00000000000 --- a/mozilla/layout/css/layout/src/nsCSSLineLayout.h +++ /dev/null @@ -1,120 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is Netscape Communications - * Corporation. Portions created by Netscape are Copyright (C) 1998 - * Netscape Communications Corporation. All Rights Reserved. - */ -#ifndef nsCSSLineLayout_h___ -#define nsCSSLineLayout_h___ - -#include "nsIFrame.h" -#include "nsVoidArray.h" - -// This structure represents a run of text. In mText are the -// nsIFrame's that are considered text frames. -struct nsCSSTextRun { - nsCSSTextRun() { - mNext = nsnull; - } - - static void DeleteTextRuns(nsCSSTextRun* aRun) { - while (nsnull != aRun) { - nsCSSTextRun* next = aRun->mNext; - delete aRun; - aRun = next; - } - } - - void List(FILE* out, PRInt32 aIndent); - - nsVoidArray mArray; - nsCSSTextRun* mNext; - -protected: - ~nsCSSTextRun() { - } -}; - -//---------------------------------------------------------------------- - -class nsCSSLineLayout { -public: - nsCSSLineLayout(nsIPresContext* aPresContext, - nsISpaceManager* aSpaceManager); - ~nsCSSLineLayout(); - - // Reset the text-run information in preparation for a FindTextRuns - void ResetTextRuns(); - - // Add another piece of text to a text-run during FindTextRuns. - // Note: continuation frames must NOT add themselves; just the - // first-in-flow - nsresult AddText(nsIFrame* aTextFrame); - - // Close out a text-run during FindTextRuns. - void EndTextRun(); - - // This returns the first nsCSSTextRun found during a - // FindTextRuns. The internal text-run state is reset. - nsCSSTextRun* TakeTextRuns(); - - // Prepare this line-layout for the reflow of a new line - void Prepare(nscoord aLeftEdge) { - mLeftEdge = aLeftEdge; - mColumn = 0; - mSkipLeadingWS = PR_TRUE; - } - - PRInt32 GetColumn() { - return mColumn; - } - - void SetColumn(PRInt32 aNewColumn) { - mColumn = aNewColumn; - } - - void NextLine() { - mLineNumber++; - } - - nsIPresContext* mPresContext; - nsISpaceManager* mSpaceManager; - - PRBool mListPositionOutside; - PRInt32 mLineNumber; - nscoord mLeftEdge; - PRInt32 mColumn; - - //XXX temporary? - - void SetSkipLeadingWhiteSpace(PRBool aNewSetting) { - mSkipLeadingWS = aNewSetting; - } - PRBool GetSkipLeadingWhiteSpace() { return mSkipLeadingWS; } - - PRBool mSkipLeadingWS; - -protected: - // These slots are used during FindTextRuns - nsCSSTextRun* mTextRuns; - nsCSSTextRun** mTextRunP; - nsCSSTextRun* mNewTextRun; - - // These slots are used during InlineReflow - nsCSSTextRun* mReflowTextRuns; - nsCSSTextRun* mTextRun; -}; - -#endif /* nsCSSLineLayout_h___ */ diff --git a/mozilla/layout/css/makefile.win b/mozilla/layout/css/makefile.win deleted file mode 100644 index 8a66827b3aa..00000000000 --- a/mozilla/layout/css/makefile.win +++ /dev/null @@ -1,22 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\.. - -DIRS = layout - -include <$(DEPTH)\layout\config\rules.mak> diff --git a/mozilla/layout/events/Makefile b/mozilla/layout/events/Makefile deleted file mode 100644 index 4469ce304d1..00000000000 --- a/mozilla/layout/events/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../.. - -DIRS = public src - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/events/public/Makefile b/mozilla/layout/events/public/Makefile deleted file mode 100644 index da3ff3bd61e..00000000000 --- a/mozilla/layout/events/public/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../../.. - -MODULE = raptor - -EXPORTS = \ - nsIEventListenerManager.h \ - nsIEventStateManager.h \ - $(NULL) - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/events/public/makefile.win b/mozilla/layout/events/public/makefile.win deleted file mode 100644 index c1fcc7bbb8d..00000000000 --- a/mozilla/layout/events/public/makefile.win +++ /dev/null @@ -1,29 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. -IGNORE_MANIFEST=1 - -EXPORTS = \ - nsIEventListenerManager.h \ - nsIEventStateManager.h \ - $(NULL) - -MODULE=raptor - -include <$(DEPTH)\config\rules.mak> - diff --git a/mozilla/layout/events/public/nsIEventListenerManager.h b/mozilla/layout/events/public/nsIEventListenerManager.h deleted file mode 100644 index f85f75d8a77..00000000000 --- a/mozilla/layout/events/public/nsIEventListenerManager.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIEventListenerManager_h__ -#define nsIEventListenerManager_h__ - -#include "nsGUIEvent.h" -#include "nsISupports.h" -#include "nsVoidArray.h" - -class nsIPresContext; -class nsIDOMEventListener; -class nsIDOMEvent; - -/* - * Event listener manager interface. - */ -#define NS_IEVENTLISTENERMANAGER_IID \ -{ /* cd91bcf0-ded9-11d1-bd85-00805f8ae3f4 */ \ -0xcd91bcf0, 0xded9, 0x11d1, \ -{0xbd, 0x85, 0x00, 0x80, 0x5f, 0x8a, 0xe3, 0xf4} } - -class nsIEventListenerManager : public nsISupports { - -public: - - /** - * Retrieves events listeners of all types. - * @param - */ - - virtual nsresult GetEventListeners(nsVoidArray *aListeners, const nsIID& aIID) = 0; - - /** - * Sets events listeners of all types. - * @param an event listener - */ - - virtual nsresult AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID) = 0; - - /** - * Removes events listeners of all types. - * @param an event listener - */ - - virtual nsresult RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID) = 0; - - /** - * Causes a check for event listeners and processing by them if they exist. - * @param an event listener - */ - - virtual nsresult HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus) = 0; - - /** - * Captures all events designated for descendant objects at the current level. - * @param an event listener - */ - - virtual nsresult CaptureEvent(nsIDOMEventListener *aListener) = 0; - - /** - * Releases all events designated for descendant objects at the current level. - * @param an event listener - */ - - virtual nsresult ReleaseEvent(nsIDOMEventListener *aListener) = 0; - -}; - -#endif // nsIEventListenerManager_h__ diff --git a/mozilla/layout/events/public/nsIEventStateManager.h b/mozilla/layout/events/public/nsIEventStateManager.h deleted file mode 100644 index 03489f17164..00000000000 --- a/mozilla/layout/events/public/nsIEventStateManager.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIEventStateManager_h__ -#define nsIEventStateManager_h__ - -#include "nsGUIEvent.h" -#include "nsISupports.h" -#include "nsVoidArray.h" - -class nsIPresContext; -class nsIDOMEventState; -class nsIDOMEvent; - -/* - * Event listener manager interface. - */ -#define NS_IEVENTSTATEMANAGER_IID \ -{ /* c8488290-07ce-11d2-bd88-00805f8ae3f4 */ \ -0xc8488290, 0x07ce, 0x11d2, \ -{0xbd, 0x88, 0x00, 0x80, 0x5f, 0x8a, 0xe3, 0xf4} } - -class nsIEventStateManager : public nsISupports { - -public: - - /** - * Gets the current event target. - * @param - */ - - NS_IMETHOD GetEventTarget(nsISupports **aResult) = 0; - - /** - * Gets the current event target. - * @param - */ - - NS_IMETHOD SetEventTarget(nsISupports *aSupports) = 0; - -}; - -#endif // nsIEventStateManager_h__ diff --git a/mozilla/layout/events/src/Makefile b/mozilla/layout/events/src/Makefile deleted file mode 100644 index b97d5f22f09..00000000000 --- a/mozilla/layout/events/src/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../../.. - -LIBRARY_NAME = raptorevents_s - -DEFINES += -D_IMPL_NS_HTML - -CPPSRCS = \ - nsEventListenerManager.cpp \ - nsEventStateManager.cpp \ - nsDOMEvent.cpp \ - $(NULL) - -MODULE = raptor - -EXPORTS = \ - nsEventListenerManager.h \ - nsEventStateManager.h \ - $(NULL) - -REQUIRES = xpcom raptor dom js - -include $(DEPTH)/config/config.mk - -INCLUDES += -I$(PUBLIC)/dom - -MKSHLIB := - -include $(DEPTH)/config/rules.mk - diff --git a/mozilla/layout/events/src/makefile.win b/mozilla/layout/events/src/makefile.win deleted file mode 100644 index 111651d3103..00000000000 --- a/mozilla/layout/events/src/makefile.win +++ /dev/null @@ -1,56 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. -IGNORE_MANIFEST=1 - -include <$(DEPTH)\config\config.mak> - -LIBRARY_NAME=raptorevents_s -MODULE=raptor -REQUIRES=xpcom raptor dom js - -DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN - -CPPSRCS= nsEventListenerManager.cpp \ - nsEventStateManager.cpp \ - nsDOMEvent.cpp \ - $(NULL) - -CPP_OBJS= .\$(OBJDIR)\nsEventListenerManager.obj \ - .\$(OBJDIR)\nsEventStateManager.obj \ - .\$(OBJDIR)\nsDOMEvent.obj \ - $(NULL) - - -EXPORTS= nsEventListenerManager.h nsEventStateManager.h - -LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor \ - -I$(PUBLIC)\dom -I$(PUBLIC)\js - -LCFLAGS = \ - $(LCFLAGS) \ - $(DEFINES) \ - $(NULL) - -include <$(DEPTH)\config\rules.mak> - -libs:: $(LIBRARY) - $(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib - -clobber:: - rm -f $(DIST)\lib\$(LIBRARY_NAME).lib diff --git a/mozilla/layout/events/src/nsDOMEvent.cpp b/mozilla/layout/events/src/nsDOMEvent.cpp deleted file mode 100644 index 866ae23846b..00000000000 --- a/mozilla/layout/events/src/nsDOMEvent.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsDOMEvent.h" -#include "nsIDOMNode.h" - -static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID); -static NS_DEFINE_IID(kIDOMEventIID, NS_IDOMEVENT_IID); -static NS_DEFINE_IID(kINSEventIID, NS_INSEVENT_IID); - -nsDOMEvent::nsDOMEvent() { -} - -nsDOMEvent::~nsDOMEvent() { -} - -NS_IMPL_ADDREF(nsDOMEvent) -NS_IMPL_RELEASE(nsDOMEvent) - -nsresult nsDOMEvent::QueryInterface(const nsIID& aIID, - void** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIDOMEventIID)) { - *aInstancePtrResult = (void*) ((nsIDOMEvent*)this); - AddRef(); - return NS_OK; - } - if (aIID.Equals(kINSEventIID)) { - *aInstancePtrResult = (void*) ((nsINSEvent*)this); - AddRef(); - return NS_OK; - } - return NS_NOINTERFACE; -} - -// nsIDOMEventInterface -NS_METHOD nsDOMEvent::GetType(nsString& aType) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsDOMEvent::GetTarget(nsIDOMNode** aTarget) -{ - return kTarget->QueryInterface(kIDOMNodeIID, (void**)aTarget); -} - -NS_METHOD nsDOMEvent::GetScreenX(PRInt32& aX) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsDOMEvent::GetScreenY(PRInt32& aY) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsDOMEvent::GetClientX(PRInt32& aX) -{ - //XXX these are not client coords yet - aX = kEvent->point.x; - return NS_OK; -} - -NS_METHOD nsDOMEvent::GetClientY(PRInt32& aY) -{ - //XXX these are not client coords yet - aY = kEvent->point.y; - return NS_OK; -} - -NS_METHOD nsDOMEvent::GetAltKey(PRBool& aIsDown) -{ - aIsDown = ((nsInputEvent*)kEvent)->isAlt; - return NS_OK; -} - -NS_METHOD nsDOMEvent::GetCtrlKey(PRBool& aIsDown) -{ - aIsDown = ((nsInputEvent*)kEvent)->isControl; - return NS_OK; -} - -NS_METHOD nsDOMEvent::GetShiftKey(PRBool& aIsDown) -{ - aIsDown = ((nsInputEvent*)kEvent)->isShift; - return NS_OK; -} - -NS_METHOD nsDOMEvent::GetMetaKey(PRBool& aIsDown) -{ - return NS_OK; -} - -NS_METHOD nsDOMEvent::GetCharCode(PRUint32& aCharCode) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsDOMEvent::GetKeyCode(PRUint32& aKeyCode) -{ - switch (kEvent->message) { - case NS_KEY_UP: - case NS_KEY_DOWN: - aKeyCode = ((nsKeyEvent*)kEvent)->keyCode; - break; - default: - return NS_ERROR_FAILURE; - } - return NS_OK; -} - -NS_METHOD nsDOMEvent::GetButton(PRUint32& aButton) -{ - switch (kEvent->message) { - case NS_MOUSE_LEFT_BUTTON_UP: - case NS_MOUSE_LEFT_BUTTON_DOWN: - case NS_MOUSE_LEFT_DOUBLECLICK: - aButton = 1; - break; - case NS_MOUSE_MIDDLE_BUTTON_UP: - case NS_MOUSE_MIDDLE_BUTTON_DOWN: - aButton = 2; - break; - case NS_MOUSE_RIGHT_BUTTON_UP: - case NS_MOUSE_RIGHT_BUTTON_DOWN: - case NS_MOUSE_RIGHT_DOUBLECLICK: - aButton = 3; - break; - default: - return NS_ERROR_FAILURE; - } - return NS_OK; -} - -// nsINSEventInterface -NS_METHOD nsDOMEvent::GetLayerX(PRInt32& aX) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsDOMEvent::GetLayerY(PRInt32& aY) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_METHOD nsDOMEvent::SetGUIEvent(nsGUIEvent *aEvent) -{ - kEvent = aEvent; - return NS_OK; -} - -NS_METHOD nsDOMEvent::SetEventTarget(nsISupports *aTarget) -{ - kTarget = aTarget; - return NS_OK; -} diff --git a/mozilla/layout/events/src/nsDOMEvent.h b/mozilla/layout/events/src/nsDOMEvent.h deleted file mode 100644 index 9e93e8ff7cd..00000000000 --- a/mozilla/layout/events/src/nsDOMEvent.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsDOMEvent_h__ -#define nsDOMEvent_h__ - -#include "nsIDOMEvent.h" -#include "nsINSEvent.h" -#include "nsISupports.h" -#include "nsPoint.h" -#include "nsGUIEvent.h" -class nsIContent; - -class nsDOMEvent : public nsIDOMEvent, public nsINSEvent { - -public: - - enum nsEventStatus { - nsEventStatus_eIgnore, // The event is ignored, do default processing - nsEventStatus_eConsumeNoDefault, // The event is consumed, don't do default processing - nsEventStatus_eConsumeDoDefault // The event is consumed, but do default processing - }; - - nsDOMEvent(); - virtual ~nsDOMEvent(); - - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr); - NS_IMETHOD_(nsrefcnt) AddRef(); - NS_IMETHOD_(nsrefcnt) Release(); - - // nsIDOMEventInterface - NS_IMETHOD GetType(nsString& aType); - - NS_IMETHOD GetTarget(nsIDOMNode** aTarget); - - NS_IMETHOD GetScreenX(PRInt32& aX); - NS_IMETHOD GetScreenY(PRInt32& aY); - - NS_IMETHOD GetClientX(PRInt32& aX); - NS_IMETHOD GetClientY(PRInt32& aY); - - NS_IMETHOD GetAltKey(PRBool& aIsDown); - NS_IMETHOD GetCtrlKey(PRBool& aIsDown); - NS_IMETHOD GetShiftKey(PRBool& aIsDown); - NS_IMETHOD GetMetaKey(PRBool& aIsDown); - - NS_IMETHOD GetCharCode(PRUint32& aCharCode); - NS_IMETHOD GetKeyCode(PRUint32& aKeyCode); - NS_IMETHOD GetButton(PRUint32& aButton); - - // nsINSEventInterface - NS_IMETHOD GetLayerX(PRInt32& aX); - NS_IMETHOD GetLayerY(PRInt32& aY); - - NS_IMETHOD SetGUIEvent(nsGUIEvent *aEvent); - NS_IMETHOD SetEventTarget(nsISupports *aTarget); - -protected: - - PRUint32 mRefCnt : 31; - nsGUIEvent *kEvent; - nsISupports *kTarget; - -}; -#endif // nsDOMEvent_h__ diff --git a/mozilla/layout/events/src/nsEventListenerManager.cpp b/mozilla/layout/events/src/nsEventListenerManager.cpp deleted file mode 100644 index 3e5490bf498..00000000000 --- a/mozilla/layout/events/src/nsEventListenerManager.cpp +++ /dev/null @@ -1,340 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsISupports.h" -#include "nsGUIEvent.h" -#include "nsIPresContext.h" -#include "nsDOMEvent.h" -#include "nsEventListenerManager.h" -#include "nsIDOMEventListener.h" -#include "nsIDOMMouseListener.h" -#include "nsIDOMMouseMotionListener.h" -#include "nsIDOMKeyListener.h" -#include "nsIDOMFocusListener.h" -#include "nsIDOMLoadListener.h" -#include "nsIDOMDragListener.h" -#include "nsIEventStateManager.h" - -static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID); -static NS_DEFINE_IID(kIDOMEventListenerIID, NS_IDOMEVENTLISTENER_IID); -static NS_DEFINE_IID(kIDOMMouseListenerIID, NS_IDOMMOUSELISTENER_IID); -static NS_DEFINE_IID(kIDOMMouseMotionListenerIID, NS_IDOMMOUSEMOTIONLISTENER_IID); -static NS_DEFINE_IID(kIDOMKeyListenerIID, NS_IDOMKEYLISTENER_IID); -static NS_DEFINE_IID(kIDOMFocusListenerIID, NS_IDOMFOCUSLISTENER_IID); -static NS_DEFINE_IID(kIDOMLoadListenerIID, NS_IDOMLOADLISTENER_IID); -static NS_DEFINE_IID(kIDOMDragListenerIID, NS_IDOMDRAGLISTENER_IID); -static NS_DEFINE_IID(kIDOMEventIID, NS_IDOMEVENT_IID); - -nsEventListenerManager::nsEventListenerManager() { - mEventListeners = nsnull; - mMouseListeners = nsnull; - mMouseMotionListeners = nsnull; - mKeyListeners = nsnull; - mLoadListeners = nsnull; - mFocusListeners = nsnull; - mDragListeners = nsnull; -} - -nsEventListenerManager::~nsEventListenerManager() { -} - -NS_IMPL_ADDREF(nsEventListenerManager) -NS_IMPL_RELEASE(nsEventListenerManager) - -nsresult nsEventListenerManager::QueryInterface(const nsIID& aIID, - void** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIEventListenerManagerIID)) { - *aInstancePtrResult = (void*) ((nsIEventListenerManager*)this); - AddRef(); - return NS_OK; - } - return NS_NOINTERFACE; -} - -nsresult nsEventListenerManager::TranslateGUI2DOM(nsGUIEvent*& aGUIEvent, - nsIPresContext& aPresContext, - nsIDOMEvent** aDOMEvent) -{ - nsIEventStateManager *mManager; - nsISupports *mTarget; - - nsDOMEvent* it = new nsDOMEvent(); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - - it->SetGUIEvent(aGUIEvent); - if (NS_OK == aPresContext.GetEventStateManager(&mManager)) { - mManager->GetEventTarget(&mTarget); - NS_RELEASE(mManager); - } - it->SetEventTarget(mTarget); - - return it->QueryInterface(kIDOMEventIID, (void **) aDOMEvent); -} - -nsresult nsEventListenerManager::GetEventListeners(nsVoidArray *aListeners, const nsIID& aIID) -{ - return NS_OK; -} - -/** -* Sets events listeners of all types. -* @param an event listener -*/ - -nsresult nsEventListenerManager::AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID) -{ - if (aIID.Equals(kIDOMMouseListenerIID)) { - if (nsnull == mMouseListeners) { - mMouseListeners = new nsVoidArray(); - mMouseListeners->InsertElementAt((void*)aListener, mMouseListeners->Count()); - } - } - if (aIID.Equals(kIDOMMouseMotionListenerIID)) { - if (nsnull == mMouseMotionListeners) { - mMouseMotionListeners = new nsVoidArray(); - mMouseMotionListeners->InsertElementAt((void*)aListener, mMouseMotionListeners->Count()); - } - } - if (aIID.Equals(kIDOMKeyListenerIID)) { - if (nsnull == mKeyListeners) { - mKeyListeners = new nsVoidArray(); - mKeyListeners->InsertElementAt((void*)aListener, mKeyListeners->Count()); - } - } - if (aIID.Equals(kIDOMLoadListenerIID)) { - if (nsnull == mLoadListeners) { - mLoadListeners = new nsVoidArray(); - mLoadListeners->InsertElementAt((void*)aListener, mLoadListeners->Count()); - } - } - if (aIID.Equals(kIDOMFocusListenerIID)) { - if (nsnull == mFocusListeners) { - mFocusListeners = new nsVoidArray(); - mFocusListeners->InsertElementAt((void*)aListener, mFocusListeners->Count()); - } - } - if (aIID.Equals(kIDOMDragListenerIID)) { - if (nsnull == mDragListeners) { - mDragListeners = new nsVoidArray(); - mDragListeners->InsertElementAt((void*)aListener, mDragListeners->Count()); - } - } - return NS_OK; -} - -/** -* Removes event listeners of all types. -* @param an event listener -*/ - -nsresult nsEventListenerManager::RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID) -{ - if (aIID.Equals(kIDOMMouseListenerIID)) { - if (nsnull == mMouseListeners) { - mMouseListeners = new nsVoidArray(); - mMouseListeners->RemoveElement((void*)aListener); - } - } - if (aIID.Equals(kIDOMMouseMotionListenerIID)) { - if (nsnull == mMouseMotionListeners) { - mMouseMotionListeners = new nsVoidArray(); - mMouseMotionListeners->RemoveElement((void*)aListener); - } - } - if (aIID.Equals(kIDOMKeyListenerIID)) { - if (nsnull == mKeyListeners) { - mKeyListeners = new nsVoidArray(); - mKeyListeners->RemoveElement((void*)aListener); - } - } - if (aIID.Equals(kIDOMLoadListenerIID)) { - if (nsnull == mLoadListeners) { - mLoadListeners = new nsVoidArray(); - mLoadListeners->RemoveElement((void*)aListener); - } - } - if (aIID.Equals(kIDOMFocusListenerIID)) { - if (nsnull == mFocusListeners) { - mFocusListeners = new nsVoidArray(); - mFocusListeners->RemoveElement((void*)aListener); - } - } - if (aIID.Equals(kIDOMDragListenerIID)) { - if (nsnull == mDragListeners) { - mDragListeners = new nsVoidArray(); - mDragListeners->RemoveElement((void*)aListener); - } - } - return NS_OK; -} - -/** -* Causes a check for event listeners and processing by them if they exist. -* @param an event listener -*/ - -nsresult nsEventListenerManager::HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus) -{ - nsresult mRet; - - switch(aEvent->message) { - case NS_MOUSE_LEFT_BUTTON_DOWN: - case NS_MOUSE_MIDDLE_BUTTON_DOWN: - case NS_MOUSE_RIGHT_BUTTON_DOWN: - if (nsnull != mMouseListeners) { - for (int i=0; iCount(); i++) { - if (nsnull == aDOMEvent) { - TranslateGUI2DOM(aEvent, aPresContext, &aDOMEvent); - } - if (nsnull != aDOMEvent) { - mRet = ((nsIDOMMouseListener*)(mMouseListeners->ElementAt(i)))->MouseDown(aDOMEvent); - aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; - } - } - } - break; - case NS_MOUSE_LEFT_BUTTON_UP: - case NS_MOUSE_MIDDLE_BUTTON_UP: - case NS_MOUSE_RIGHT_BUTTON_UP: - if (nsnull != mMouseListeners) { - for (int i=0; iCount(); i++) { - if (nsnull == aDOMEvent) { - TranslateGUI2DOM(aEvent, aPresContext, &aDOMEvent); - } - if (nsnull != aDOMEvent) { - mRet = ((nsIDOMMouseListener*)(mMouseListeners->ElementAt(i)))->MouseUp(aDOMEvent); - aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; - } - } - } - break; - case NS_MOUSE_LEFT_DOUBLECLICK: - case NS_MOUSE_RIGHT_DOUBLECLICK: - if (nsnull != mMouseListeners) { - for (int i=0; iCount(); i++) { - if (nsnull == aDOMEvent) { - TranslateGUI2DOM(aEvent, aPresContext, &aDOMEvent); - } - if (nsnull != aDOMEvent) { - mRet = ((nsIDOMMouseListener*)(mMouseListeners->ElementAt(i)))->MouseDblClick(aDOMEvent); - aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; - } - } - } - break; - case NS_MOUSE_ENTER: - if (nsnull != mMouseListeners) { - for (int i=0; iCount(); i++) { - if (nsnull == aDOMEvent) { - TranslateGUI2DOM(aEvent, aPresContext, &aDOMEvent); - } - if (nsnull != aDOMEvent) { - mRet = ((nsIDOMMouseListener*)(mMouseListeners->ElementAt(i)))->MouseOver(aDOMEvent); - aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; - } - } - } - break; - case NS_MOUSE_EXIT: - if (nsnull != mMouseListeners) { - for (int i=0; iCount(); i++) { - if (nsnull == aDOMEvent) { - TranslateGUI2DOM(aEvent, aPresContext, &aDOMEvent); - } - if (nsnull != aDOMEvent) { - mRet = ((nsIDOMMouseListener*)(mMouseListeners->ElementAt(i)))->MouseOut(aDOMEvent); - aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; - } - } - } - break; - case NS_MOUSE_MOVE: - if (nsnull != mMouseMotionListeners) { - for (int i=0; iCount(); i++) { - if (nsnull == aDOMEvent) { - TranslateGUI2DOM(aEvent, aPresContext, &aDOMEvent); - } - if (nsnull != aDOMEvent) { - mRet = ((nsIDOMMouseMotionListener*)(mMouseMotionListeners->ElementAt(i)))->MouseMove(aDOMEvent); - aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; - } - } - } - break; - case NS_KEY_UP: - if (nsnull != mKeyListeners) { - for (int i=0; iCount(); i++) { - if (nsnull == aDOMEvent) { - TranslateGUI2DOM(aEvent, aPresContext, &aDOMEvent); - } - if (nsnull != aDOMEvent) { - mRet = ((nsIDOMKeyListener*)(mKeyListeners->ElementAt(i)))->KeyUp(aDOMEvent); - aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; - } - } - } - break; - case NS_KEY_DOWN: - if (nsnull != mKeyListeners) { - for (int i=0; iCount(); i++) { - if (nsnull == aDOMEvent) { - TranslateGUI2DOM(aEvent, aPresContext, &aDOMEvent); - } - if (nsnull != aDOMEvent) { - mRet = ((nsIDOMKeyListener*)(mKeyListeners->ElementAt(i)))->KeyDown(aDOMEvent); - aEventStatus = (NS_OK == mRet) ? nsEventStatus_eIgnore : nsEventStatus_eConsumeNoDefault; - } - } - } - break; - - } - - return NS_OK; -} - -/** -* Captures all events designated for descendant objects at the current level. -* @param an event listener -*/ - -nsresult nsEventListenerManager::CaptureEvent(nsIDOMEventListener *aListener) -{ - return NS_OK; -} - -/** -* Releases all events designated for descendant objects at the current level. -* @param an event listener -*/ - -nsresult nsEventListenerManager::ReleaseEvent(nsIDOMEventListener *aListener) -{ - return NS_OK; -} - diff --git a/mozilla/layout/events/src/nsEventListenerManager.h b/mozilla/layout/events/src/nsEventListenerManager.h deleted file mode 100644 index c0d4be2e612..00000000000 --- a/mozilla/layout/events/src/nsEventListenerManager.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsEventListenerManager_h__ -#define nsEventListenerManager_h__ - -#include "nsIEventListenerManager.h" -class nsIDOMEvent; - -/* - * Event listener manager - */ - -class nsEventListenerManager : public nsIEventListenerManager { - -public: - nsEventListenerManager(); - virtual ~nsEventListenerManager(); - - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr); - NS_IMETHOD_(nsrefcnt) AddRef(); - NS_IMETHOD_(nsrefcnt) Release(); - - /** - * Retrieves events listeners of all types. - * @param - */ - - virtual nsresult GetEventListeners(nsVoidArray *aListeners, const nsIID& aIID); - - /** - * Sets events listeners of all types. - * @param an event listener - */ - - virtual nsresult AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); - - virtual nsresult RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); - - virtual nsresult CaptureEvent(nsIDOMEventListener *aListener); - virtual nsresult ReleaseEvent(nsIDOMEventListener *aListener); - - virtual nsresult HandleEvent(nsIPresContext& aPresContext, nsGUIEvent* aEvent, nsIDOMEvent* aDOMEvent, nsEventStatus& aEventStatus); - -protected: - - PRUint32 mRefCnt : 31; - - virtual nsresult TranslateGUI2DOM(nsGUIEvent*& aGUIEvent, - nsIPresContext& aPresContext, - nsIDOMEvent** aDOMEvent); - - nsVoidArray* mEventListeners; - nsVoidArray* mMouseListeners; - nsVoidArray* mMouseMotionListeners; - nsVoidArray* mKeyListeners; - nsVoidArray* mLoadListeners; - nsVoidArray* mFocusListeners; - nsVoidArray* mDragListeners; - -}; - -#endif // nsEventListenerManager_h__ diff --git a/mozilla/layout/events/src/nsEventStateManager.cpp b/mozilla/layout/events/src/nsEventStateManager.cpp deleted file mode 100644 index fd9119ef67a..00000000000 --- a/mozilla/layout/events/src/nsEventStateManager.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsISupports.h" -#include "nsIEventStateManager.h" -#include "nsEventStateManager.h" - -static NS_DEFINE_IID(kIEventStateManagerIID, NS_IEVENTSTATEMANAGER_IID); -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - -nsEventStateManager::nsEventStateManager() { - mEventTarget = nsnull; - NS_INIT_REFCNT(); -} - -nsEventStateManager::~nsEventStateManager() { -} - -NS_IMPL_ADDREF(nsEventStateManager) -NS_IMPL_RELEASE(nsEventStateManager) -NS_IMPL_QUERY_INTERFACE(nsEventStateManager, kIEventStateManagerIID); - -NS_METHOD nsEventStateManager::GetEventTarget(nsISupports **aResult) -{ - NS_PRECONDITION(nsnull != aResult, "null ptr"); - if (nsnull == aResult) { - return NS_ERROR_NULL_POINTER; - } - *aResult = mEventTarget; - NS_IF_ADDREF(mEventTarget); - return NS_OK; -} - -NS_METHOD nsEventStateManager::SetEventTarget(nsISupports *aSupports) -{ - mEventTarget = aSupports; - return NS_OK; -} - -nsresult NS_NewEventStateManager(nsIEventStateManager** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "nsnull ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIEventStateManager* manager = new nsEventStateManager(); - if (nsnull == manager) { - return NS_ERROR_OUT_OF_MEMORY; - } - return manager->QueryInterface(kIEventStateManagerIID, (void **) aInstancePtrResult); -} - diff --git a/mozilla/layout/events/src/nsEventStateManager.h b/mozilla/layout/events/src/nsEventStateManager.h deleted file mode 100644 index bafaa090187..00000000000 --- a/mozilla/layout/events/src/nsEventStateManager.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsEventStateManager_h__ -#define nsEventStateManager_h__ - -#include "nsIEventStateManager.h" -class nsIDOMEvent; - -/* - * Event listener manager - */ - -class nsEventStateManager : public nsIEventStateManager { - -public: - nsEventStateManager(); - virtual ~nsEventStateManager(); - - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr); - NS_IMETHOD_(nsrefcnt) AddRef(); - NS_IMETHOD_(nsrefcnt) Release(); - - NS_IMETHOD GetEventTarget(nsISupports **aResult); - NS_IMETHOD SetEventTarget(nsISupports *aSupports); - -protected: - - PRUint32 mRefCnt : 31; - - nsISupports* mEventTarget; - -}; - -extern nsresult NS_NewEventStateManager(nsIEventStateManager** aInstancePtrResult); - -#endif // nsEventStateManager_h__ diff --git a/mozilla/layout/generic/broken-image.gif b/mozilla/layout/generic/broken-image.gif deleted file mode 100644 index 6e734ac51b2f6c2ca3216757850159f578cc7aae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmZ?wbh9u|RA5kG_{;zX4M4J?0f-tJ4jeeZ@E^$i{~t*G2LZ4O1fc_Bg7h-5{F`vX zbM;(>*FIDJCunG0T2`8@CB&M@l%aUOB({95{mZ|k*l`BhB zw{7p>>M9ZGGg8ruvJvJK50#T}XpiOMT*A)Dlp@h!*~hYka~b=Jd5)`PixZb_VBezJ zrLn_)!v=W~X$LNj33W^NZq4=LICaqL-1!T#mzYoYD;$&V+;) zj>3K}<}dfI>*u|Scq02gN7DJrPR8$V?@w}{s21^S`9hvUp;LA48VhPHnwzwWXVngk UiHZ)Q924ReBuiXMW?`@f0Q*yf!vFvP diff --git a/mozilla/layout/generic/nsHTMLContainerFrame.cpp b/mozilla/layout/generic/nsHTMLContainerFrame.cpp deleted file mode 100644 index 9e3a244557b..00000000000 --- a/mozilla/layout/generic/nsHTMLContainerFrame.cpp +++ /dev/null @@ -1,385 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLContainerFrame.h" -#include "nsIRenderingContext.h" -#include "nsIPresContext.h" -#include "nsIPresShell.h" -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" -#include "nsCSSRendering.h" -#include "nsIContent.h" -#include "nsHTMLAtoms.h" -#include "nsIWidget.h" -#include "nsILinkHandler.h" -#include "nsHTMLValue.h" -#include "nsGUIEvent.h" -#include "nsIDocument.h" -#include "nsIURL.h" -#include "nsIPtr.h" -#include "nsAbsoluteFrame.h" -#include "nsPlaceholderFrame.h" -#include "nsIContentDelegate.h" -#include "nsIHTMLContent.h" -#include "nsHTMLParts.h" -#include "nsHTMLBase.h" -#include "nsScrollFrame.h" -#include "nsIView.h" -#include "nsIReflowCommand.h" - -NS_DEF_PTR(nsIStyleContext); - -nsHTMLContainerFrame::nsHTMLContainerFrame(nsIContent* aContent, nsIFrame* aParent) - : nsContainerFrame(aContent, aParent) -{ -} - -nsHTMLContainerFrame::~nsHTMLContainerFrame() -{ -} - -NS_METHOD nsHTMLContainerFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - // Paint our background and border - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - - if (disp->mVisible && mRect.width && mRect.height) { - PRIntn skipSides = GetSkipSides(); - const nsStyleColor* color = - (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - const nsStyleSpacing* spacing = - (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, - aDirtyRect, mRect, *color); - nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this, - aDirtyRect, mRect, *spacing, skipSides); - } - - PaintChildren(aPresContext, aRenderingContext, aDirtyRect); - - if (nsIFrame::GetShowFrameBorders()) { - nsIView* view; - GetView(view); - if (nsnull != view) { - aRenderingContext.SetColor(NS_RGB(0,0,255)); - NS_RELEASE(view); - } - else { - aRenderingContext.SetColor(NS_RGB(255,0,0)); - } - aRenderingContext.DrawRect(0, 0, mRect.width, mRect.height); - } - return NS_OK; -} - -NS_METHOD nsHTMLContainerFrame::HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus) -{ - return nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus); -} - -NS_METHOD nsHTMLContainerFrame::GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor) -{ - // Get my cursor - const nsStyleColor* styleColor = (const nsStyleColor*) - mStyleContext->GetStyleData(eStyleStruct_Color); - PRInt32 myCursor = styleColor->mCursor; - - // Get child's cursor, if any - nsresult rv = nsContainerFrame::GetCursorAt(aPresContext, aPoint, aFrame, - aCursor); - if (NS_OK != rv) return rv; - if (aCursor != NS_STYLE_CURSOR_INHERIT) { - nsIAtom* tag = mContent->GetTag(); - if (nsHTMLAtoms::a == tag) { - // Anchor tags override their child cursors in some cases. - if ((NS_STYLE_CURSOR_IBEAM == aCursor) && - (NS_STYLE_CURSOR_INHERIT != myCursor)) { - aCursor = myCursor; - } - } - NS_RELEASE(tag); - return rv; - } - - if (NS_STYLE_CURSOR_INHERIT != myCursor) { - // If this container has a particular cursor, use it, otherwise - // let the child decide. - *aFrame = this; - aCursor = myCursor; - return NS_OK; - } - - // No specific cursor for us - aCursor = NS_STYLE_CURSOR_INHERIT; - return NS_OK; -} - -NS_METHOD nsHTMLContainerFrame::ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) -{ - // Get the last-in-flow - nsHTMLContainerFrame* lastInFlow = (nsHTMLContainerFrame*)GetLastInFlow(); - - // Generate a reflow command for the frame - nsIReflowCommand* cmd; - nsresult result; - - result = NS_NewHTMLReflowCommand(&cmd, lastInFlow, nsIReflowCommand::FrameAppended); - if (NS_OK == result) { - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - } - - return NS_OK; -} - -NS_IMETHODIMP -nsHTMLContainerFrame::ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(!IsPseudoFrame(), "pseudos not supported here"); - - // Find the frame that precedes the insertion point - nsIFrame* prevSibling = nsnull; - if (aIndexInParent > 0) { - nsIContent* precedingContent = aContainer->ChildAt(aIndexInParent - 1); - prevSibling = aShell->FindFrameWithContent(precedingContent); - NS_RELEASE(precedingContent); - - // The frame may have a next-in-flow. Get the last-in-flow - nsIFrame* nextInFlow; - do { - prevSibling->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - prevSibling = nextInFlow; - } - } while (nsnull != nextInFlow); - } - - // Get the geometric parent for the prevSibling. We expect it to be - // this frame or one of its next-in-flow(s). - nsHTMLContainerFrame* flow = this; - if (nsnull != prevSibling) { - prevSibling->GetGeometricParent((nsIFrame*&)flow); - } - - // Create the new frame as a child of the same parent as prevSibling - nsIFrame* newFrame; - nsresult rv = nsHTMLBase::CreateFrame(aPresContext, flow, aChild, nsnull, - newFrame); - if (NS_OK != rv) { - return rv; - } - flow->mChildCount++; - - // Place the new frame into the parents sibling list - if (nsnull == prevSibling) { - newFrame->SetNextSibling(flow->mFirstChild); - flow->mFirstChild = newFrame; - } - else { - nsIFrame* nextSibling; - prevSibling->GetNextSibling(nextSibling); - newFrame->SetNextSibling(nextSibling); - prevSibling->SetNextSibling(newFrame); - if (nsnull == nextSibling) { - // newFrame ended up being flow's last child - flow->mLastContentIsComplete = PR_TRUE; - } - } - flow->mLastContentOffset++; - - // Generate a reflow command - nsIReflowCommand* cmd; - rv = NS_NewHTMLReflowCommand(&cmd, flow, - nsIReflowCommand::FrameInserted, - newFrame); - if (NS_OK != rv) { - return rv; - } - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - - // Fix up the next-in-flows of parent now that it has a new child - flow = (nsHTMLContainerFrame*) flow->mNextInFlow; - while (nsnull != flow) { - flow->mFirstContentOffset++; - flow->mLastContentOffset++; - } - return rv; -} - -NS_IMETHODIMP -nsHTMLContainerFrame::ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(!IsPseudoFrame(), "pseudos not supported here"); - - // Find the frame that precedes the deletion point - nsHTMLContainerFrame* flow; - nsIFrame* deadFrame; - nsIFrame* prevSibling; - if (aIndexInParent > 0) { - nsIContent* precedingContent = aContainer->ChildAt(aIndexInParent - 1); - prevSibling = aShell->FindFrameWithContent(precedingContent); - NS_RELEASE(precedingContent); - - // The frame may have a next-in-flow. Get the last-in-flow - nsIFrame* nextInFlow; - do { - prevSibling->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - prevSibling = nextInFlow; - } - } while (nsnull != nextInFlow); - - // Get the dead frame (maybe) - prevSibling->GetGeometricParent((nsIFrame*&)flow); - prevSibling->GetNextSibling(deadFrame); - if (nsnull == deadFrame) { - // The deadFrame must be prevSibling's parent's next-in-flows - // first frame. Therefore it doesn't have a prevSibling. - flow = (nsHTMLContainerFrame*) flow->mNextInFlow; - if (nsnull != flow) { - deadFrame = flow->mFirstChild; - } - prevSibling = nsnull; - } - } - else { - prevSibling = nsnull; - flow = this; - deadFrame = flow->mFirstChild; - } - NS_ASSERTION(nsnull != deadFrame, "yikes! couldn't find frame"); - if (nsnull == deadFrame) { - return NS_OK; - } - - // Generate a reflow command - nsIReflowCommand* cmd; - nsresult rv = NS_NewHTMLReflowCommand(&cmd, flow, - nsIReflowCommand::FrameDeleted); - if (NS_OK != rv) { - return rv; - } - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - - // Take the frame away; Note that we also have to take away any - // continuations so we loop here until deadFrame is nsnull. - while (nsnull != deadFrame) { - // If the last frame for the flow is the frame we are deleting - // then the flow will become complete. - if (!flow->mLastContentIsComplete) { - nsIFrame* lastFrame; - flow->LastChild(lastFrame); - if (lastFrame == deadFrame) { - flow->mLastContentIsComplete = PR_TRUE; - } - } - - // Remove frame from sibling list - nsIFrame* nextSib; - deadFrame->GetNextSibling(nextSib); - if (nsnull != prevSibling) { - prevSibling->SetNextSibling(nextSib); - } - else { - flow->mFirstChild = nextSib; - } - - // Update flows child count and last-content-offset. Note that - // only the last content needs updating when a deadFrame is - // removed from flow (because only the children that follow the - // deletion need renumbering). - flow->mChildCount--; - flow->mLastContentOffset--; - - // Break frame out of its flow and then destroy it - nsIFrame* nextInFlow; - deadFrame->GetNextInFlow(nextInFlow); - deadFrame->BreakFromNextFlow(); - deadFrame->DeleteFrame(); - deadFrame = nextInFlow; - - if (nsnull != deadFrame) { - // Get the parent of deadFrame's continuation - deadFrame->GetGeometricParent((nsIFrame*&) flow); - - // When we move to a next-in-flow then the deadFrame will be the - // first child of the new parent. Therefore we know that - // prevSibling will be null. - prevSibling = nsnull; - } - } - - // Repair any remaining next-in-flows content offsets; these are the - // next-in-flows the follow the last flow container that contained - // one of the deadFrame's. Therefore both content offsets need - // updating (because all the children are following the deletion). - flow = (nsHTMLContainerFrame*) flow->mNextInFlow; - while (nsnull != flow) { - flow->mFirstContentOffset--; - flow->mLastContentOffset--; - flow = (nsHTMLContainerFrame*) flow->mNextInFlow; - } - - return rv; -} - -nsresult -nsHTMLContainerFrame::ProcessInitialReflow(nsIPresContext* aPresContext) -{ - if (nsnull == mPrevInFlow) { - const nsStyleDisplay* display = (const nsStyleDisplay*) - mStyleContext->GetStyleData(eStyleStruct_Display); - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("nsHTMLContainerFrame::ProcessInitialReflow: display=%d", - display->mDisplay)); - if (NS_STYLE_DISPLAY_LIST_ITEM == display->mDisplay) { - // This container is a list-item container. Therefore it needs a - // bullet content object. - nsIHTMLContent* bullet; - nsresult rv = NS_NewHTMLBullet(&bullet); - if (NS_OK != rv) { - return rv; - } - - // Insert the bullet. Do not allow an incremental reflow operation - // to occur. - mContent->InsertChildAt(bullet, 0, PR_FALSE); - } - } - - return NS_OK; -} diff --git a/mozilla/layout/generic/nsHTMLContainerFrame.h b/mozilla/layout/generic/nsHTMLContainerFrame.h deleted file mode 100644 index 52d886fb856..00000000000 --- a/mozilla/layout/generic/nsHTMLContainerFrame.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLContainerFrame_h___ -#define nsHTMLContainerFrame_h___ - -#include "nsContainerFrame.h" -class nsString; - -// Base class for html container frames that provides common -// functionality. -class nsHTMLContainerFrame : public nsContainerFrame { -public: - nsHTMLContainerFrame(nsIContent* aContent, - nsIFrame* aParent); - - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - NS_IMETHOD HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus); - NS_IMETHOD GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor); - NS_IMETHOD ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer); - NS_IMETHOD ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - -protected: - virtual ~nsHTMLContainerFrame(); - - virtual PRIntn GetSkipSides() const = 0; - - nsresult ProcessInitialReflow(nsIPresContext* aPresContext); -}; - -#endif /* nsHTMLContainerFrame_h___ */ - diff --git a/mozilla/layout/generic/nsHTMLParts.h b/mozilla/layout/generic/nsHTMLParts.h deleted file mode 100644 index a348495dedc..00000000000 --- a/mozilla/layout/generic/nsHTMLParts.h +++ /dev/null @@ -1,172 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLParts_h___ -#define nsHTMLParts_h___ - -#include "nscore.h" -#include "nsISupports.h" -#include "nsIReflowCommand.h" -class nsIArena; -class nsIAtom; -class nsIContent; -class nsIDocument; -class nsIHTMLContent; -class nsIHTMLContentSink; -class nsITextContent; -class nsIURL; -class nsString; -class nsIWebWidget; - -// XXX naming consistency puhleeze! - -extern nsresult NS_NewHTMLContentSink(nsIHTMLContentSink** aInstancePtrResult, - nsIDocument* aDoc, - nsIURL* aURL, - nsIWebWidget* aWebWidget); - -/** - * Create a new content object for the given tag. - * Returns NS_ERROR_NOT_AVAILABLE for an unknown/unhandled tag. - * Returns some other error on error. - * Returns NS_OK on success - */ -extern nsresult NS_CreateHTMLElement(nsIHTMLContent** aInstancePtrResult, - const nsString& aTag); - -// Create an html root part -extern nsresult - NS_NewRootPart(nsIHTMLContent** aInstancePtrResult, - nsIDocument* aDocument); -extern nsresult - NS_NewHTMLComment(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag, - const nsString& aComment); - -// Head parts -extern nsresult - NS_NewHTMLHead(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); -extern nsresult - NS_NewHTMLMeta(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); -extern nsresult - NS_NewHTMLTitle(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag, - const nsString& aTitle); - -// Create an html body part -extern nsresult - NS_NewBodyPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -// Create a new generic html container (e.g. P, DIV, SPAN, B, I, etc). -// Not used for tables or framesets (see below). -extern nsresult - NS_NewHTMLContainer(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); -extern nsresult - NS_NewHTMLContainer(nsIHTMLContent** aInstancePtrResult, - nsIArena* aArena, nsIAtom* aTag); - -extern nsresult - NS_NewHTMLBreak(nsIHTMLContent** aInstancePtrResult, nsIAtom* aTag); - -extern nsresult - NS_NewHTMLWordBreak(nsIHTMLContent** aInstancePtrResult, nsIAtom* aTag); - -extern nsresult - NS_NewHTMLSpacer(nsIHTMLContent** aInstancePtrResult, nsIAtom* aTag); - -extern nsresult - NS_NewHTMLBullet(nsIHTMLContent** aInstancePtrResult); - -// Create a new text content object. The memory for the unicode string -// will be allocated from the heap. The object returned will support -// the nsIHTMLContent interface as well as the nsITextContent -// interface -extern nsresult - NS_NewHTMLText(nsIHTMLContent** aInstancePtrResult, - const PRUnichar* us, PRInt32 uslen = 0); -extern nsresult - NS_NewHTMLText(nsIHTMLContent** aInstancePtrResult, - nsIArena* aArena, const PRUnichar* us, PRInt32 uslen = 0); - -// Create a new text content object. The memory for the unicode string -// is allocated by the caller. The caller is responsible for -// deallocating the memory (e.g. use an nsIArena). The object returned -// will support the nsIHTMLContent interface as well as the -// nsITextContent interface -extern nsresult - NS_NewSharedHTMLText(nsIHTMLContent** aInstancePtrResult, - PRUnichar* us, PRInt32 uslen = 0); -extern nsresult - NS_NewSharedHTMLText(nsIHTMLContent** aInstancePtrResult, - nsIArena* aArena, PRUnichar* us, PRInt32 uslen = 0); - -/** Create a new horizontal rule content object (e.g
    .) */ -extern nsresult -NS_NewHRulePart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table content object
    */ -extern nsresult -NS_NewTablePart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table row group object */ -extern nsresult -NS_NewTableRowGroupPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table row content object */ -extern nsresult -NS_NewTableRowPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table column group content object */ -extern nsresult -NS_NewTableColGroupPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table column content object */ -extern nsresult -NS_NewTableColPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table cell content object
    */ -extern nsresult -NS_NewTableCellPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table caption content object
    */ -extern nsresult -NS_NewTableCaptionPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -extern nsresult -NS_NewHTMLImage(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new HTML reflow command */ -extern nsresult -NS_NewHTMLReflowCommand(nsIReflowCommand** aInstancePtrResult, - nsIFrame* aTargetFrame, - nsIReflowCommand::ReflowType aReflowType, - nsIFrame* aChildFrame = nsnull); - -#endif /* nsHTMLParts_h___ */ diff --git a/mozilla/layout/generic/nsHTMLReflowCommand.cpp b/mozilla/layout/generic/nsHTMLReflowCommand.cpp deleted file mode 100644 index 8a5218b0dbe..00000000000 --- a/mozilla/layout/generic/nsHTMLReflowCommand.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLReflowCommand.h" -#include "nsIFrame.h" -#include "nsIPresContext.h" -#include "nsIPresShell.h" -#include "nsIContent.h" -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" -#include "nsIFloaterContainer.h" -#include "nsHTMLIIDs.h" - -static NS_DEFINE_IID(kIReflowCommandIID, NS_IREFLOWCOMMAND_IID); - -nsresult -NS_NewHTMLReflowCommand(nsIReflowCommand** aInstancePtrResult, - nsIFrame* aTargetFrame, - nsIReflowCommand::ReflowType aReflowType, - nsIFrame* aChildFrame) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsHTMLReflowCommand* cmd = new nsHTMLReflowCommand(aTargetFrame, aReflowType, aChildFrame); - if (nsnull == cmd) { - return NS_ERROR_OUT_OF_MEMORY; - } - - return cmd->QueryInterface(kIReflowCommandIID, (void**)aInstancePtrResult); -} - - -// Construct a reflow command given a target frame, reflow command type, -// and optional child frame -nsHTMLReflowCommand::nsHTMLReflowCommand(nsIFrame* aTargetFrame, - ReflowType aReflowType, - nsIFrame* aChildFrame) - : mType(aReflowType), mTargetFrame(aTargetFrame), mChildFrame(aChildFrame) -{ - NS_PRECONDITION(mTargetFrame != nsnull, "null target frame"); - NS_INIT_REFCNT(); -} - -nsHTMLReflowCommand::~nsHTMLReflowCommand() -{ -} - -NS_IMPL_ISUPPORTS(nsHTMLReflowCommand, kIReflowCommandIID); - -nsIFrame* nsHTMLReflowCommand::GetContainingBlock(nsIFrame* aFloater) -{ - nsIFrame* containingBlock = nsnull; - nsIFloaterContainer* container = nsnull; - - for (aFloater->GetContentParent(containingBlock); - nsnull != containingBlock; - containingBlock->GetContentParent(containingBlock)) - { - if (NS_OK == containingBlock->QueryInterface(kIFloaterContainerIID, (void**)&container)) { - break; - } - } - - return containingBlock; -} - -void nsHTMLReflowCommand::BuildPath() -{ - mPath.Clear(); - - // Floating frames are handled differently. The path goes from the target - // frame to the containing block, and then up the hierarchy - nsStyleDisplay* display; - mTargetFrame->GetStyleData(eStyleStruct_Display, (nsStyleStruct*&)display); - if (NS_STYLE_FLOAT_NONE != display->mFloats) { - mPath.AppendElement((void*)mTargetFrame); - - for (nsIFrame* f = GetContainingBlock(mTargetFrame); - nsnull != f; - f->GetGeometricParent(f)) { - mPath.AppendElement((void*)f); - } - - } else { - for (nsIFrame* f = mTargetFrame; nsnull != f; f->GetGeometricParent(f)) { - mPath.AppendElement((void*)f); - } - } -} - -NS_IMETHODIMP nsHTMLReflowCommand::Dispatch(nsIPresContext& aPresContext, - nsReflowMetrics& aDesiredSize, - const nsSize& aMaxSize) -{ - // Build the path from the target frame (index 0) to the root frame - BuildPath(); - - // Send an incremental reflow notification to the root frame - nsIFrame* root = (nsIFrame*)mPath[mPath.Count() - 1]; - -#ifdef NS_DEBUG - nsIPresShell* shell = aPresContext.GetShell(); - if (nsnull != shell) { - NS_ASSERTION(shell->GetRootFrame() == root, "bad root frame"); - NS_RELEASE(shell); - } -#endif - - if (nsnull != root) { - mPath.RemoveElementAt(mPath.Count() - 1); - - nsReflowState reflowState(root, *this, aMaxSize); - nsReflowStatus status; - root->Reflow(&aPresContext, aDesiredSize, reflowState, status); - } - - return NS_OK; -} - -NS_IMETHODIMP nsHTMLReflowCommand::GetNext(nsIFrame*& aNextFrame) -{ - PRInt32 count = mPath.Count(); - - aNextFrame = nsnull; - if (count > 0) { - aNextFrame = (nsIFrame*)mPath[count - 1]; - mPath.RemoveElementAt(count - 1); - } - return NS_OK; -} - -NS_IMETHODIMP nsHTMLReflowCommand::GetTarget(nsIFrame*& aTargetFrame) const -{ - aTargetFrame = mTargetFrame; - return NS_OK; -} - -NS_IMETHODIMP nsHTMLReflowCommand::GetType(ReflowType& aReflowType) const -{ - aReflowType = mType; - return NS_OK; -} - -NS_IMETHODIMP nsHTMLReflowCommand::GetChildFrame(nsIFrame*& aChildFrame) const -{ - aChildFrame = mChildFrame; - return NS_OK; -} - diff --git a/mozilla/layout/generic/nsHTMLReflowCommand.h b/mozilla/layout/generic/nsHTMLReflowCommand.h deleted file mode 100644 index c1a3d41ac4b..00000000000 --- a/mozilla/layout/generic/nsHTMLReflowCommand.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLReflowCommand_h___ -#define nsHTMLReflowCommand_h___ - -#include "nsIReflowCommand.h" -#include "nsVoidArray.h" - -/** - * An HTML reflow command - */ -class nsHTMLReflowCommand : public nsIReflowCommand { -public: - /** - * Construct an HTML reflow command of type aReflowType and with target - * frame aTargetFrame. You can also specify an optional child frame, e.g. - * to indicate the inserted child frame - */ - nsHTMLReflowCommand(nsIFrame* aTargetFrame, - ReflowType aReflowType, - nsIFrame* aChildFrame = nsnull); - - virtual ~nsHTMLReflowCommand(); - - // nsISupports - NS_DECL_ISUPPORTS - - // nsIReflowCommand - NS_IMETHOD Dispatch(nsIPresContext& aPresContext, - nsReflowMetrics& aDesiredSize, - const nsSize& aMaxSize); - NS_IMETHOD GetNext(nsIFrame*& aNextFrame); - NS_IMETHOD GetTarget(nsIFrame*& aTargetFrame) const; - NS_IMETHOD GetType(ReflowType& aReflowType) const; - NS_IMETHOD GetChildFrame(nsIFrame*& aChildFrame) const; - -protected: - void BuildPath(); - nsIFrame* GetContainingBlock(nsIFrame* aFloater); - -private: - ReflowType mType; - nsIFrame* mTargetFrame; - nsIFrame* mChildFrame; - nsVoidArray mPath; -}; - -#endif /* nsHTMLReflowCommand_h___ */ diff --git a/mozilla/layout/generic/nsIFrame.h b/mozilla/layout/generic/nsIFrame.h deleted file mode 100644 index 1c87fe134f1..00000000000 --- a/mozilla/layout/generic/nsIFrame.h +++ /dev/null @@ -1,663 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIFrame_h___ -#define nsIFrame_h___ - -#include -#include "nslayout.h" -#include "nsISupports.h" -#include "nsSize.h" -#include "nsGUIEvent.h" -#include "nsStyleStruct.h" - -class nsIContent; -class nsIFrame; -class nsIPresContext; -class nsIPresShell; -class nsIRenderingContext; -class nsISizeOfHandler; -class nsISpaceManager; -class nsIStyleContext; -class nsIView; -class nsIWidget; -class nsIReflowCommand; - -struct nsPoint; -struct nsRect; -struct nsReflowMetrics; -struct nsStyleStruct; - -struct PRLogModuleInfo; - -// IID for the nsIFrame interface {12B193D0-9F70-11d1-8500-00A02468FAB6} -#define NS_IFRAME_IID \ -{ 0x12b193d0, 0x9f70, 0x11d1, \ - {0x85, 0x0, 0x0, 0xa0, 0x24, 0x68, 0xfa, 0xb6}} - -/** - * Reflow metrics used to return the frame's desired size and alignment - * information. - * - * @see #Reflow() - * @see #GetReflowMetrics() - */ -struct nsReflowMetrics { - nscoord width, height; // desired width and height - nscoord ascent, descent; - nsSize* maxElementSize; // null if you don't need to compute the max element size - - nsReflowMetrics(nsSize* aMaxElementSize) {maxElementSize = aMaxElementSize;} -}; - -/** - * Constant used to indicate an unconstrained size. - * - * @see #Reflow() - */ -#define NS_UNCONSTRAINEDSIZE NS_MAXSIZE - -enum nsReflowReason { - eReflowReason_Initial = 0, // initial reflow of a newly created frame - eReflowReason_Incremental = 1, // an incremental change has occured. see the reflow command for details - eReflowReason_Resize = 2 // general request to determine a desired size -}; - -/** - * Reflow state passed to a frame during reflow. The reflow states are linked - * together. The max size represents the available space on which to reflow - * your frame, and is computed as the parent frame's available content area - * minus any room for margins that your frame requests. - * - * @see #Reflow() - */ -struct nsReflowState { - nsReflowReason reason; // the reason for the reflow - nsIReflowCommand* reflowCommand; // only used for incremental changes - nsSize maxSize; // the available space in which to reflow - const nsReflowState* parentReflowState; // pointer to parent's reflow state - nsIFrame* frame; // the frame being reflowed - - // Constructs an initial reflow state (no parent reflow state) for a - // non-incremental reflow command - nsReflowState(nsIFrame* aFrame, - nsReflowReason aReason, - const nsSize& aMaxSize); - - // Constructs an initial reflow state (no parent reflow state) for an - // incremental reflow command - nsReflowState(nsIFrame* aFrame, - nsIReflowCommand& aReflowCommand, - const nsSize& aMaxSize); - - // Construct a reflow state for the given frame, parent reflow state, and - // max size. Uses the reflow reason and reflow command from the parent's - // reflow state - nsReflowState(nsIFrame* aFrame, - const nsReflowState& aParentReflowState, - const nsSize& aMaxSize); - - // Constructs a reflow state that overrides the reflow reason of the parent - // reflow state. Sets the reflow command to NULL - nsReflowState(nsIFrame* aFrame, - const nsReflowState& aParentReflowState, - const nsSize& aMaxSize, - nsReflowReason aReflowReason); -}; - -//---------------------------------------------------------------------- - -/** - * Reflow status returned by the reflow methods. - * - * NS_FRAME_NOT_COMPLETE bit flag means the frame does not map all its - * content, and that the parent frame should create a continuing frame. - * If this bit isn't set it means the frame does map all its content. - * - * NS_FRAME_REFLOW_NEXTINFLOW bit flag means that the next-in-flow is - * dirty, and also needs to be reflowed. This status only makes sense - * for a frame that is not complete, i.e. you wouldn't set both - * NS_FRAME_COMPLETE and NS_FRAME_REFLOW_NEXTINFLOW - * - * The low 8 bits of the nsReflowStatus are reserved for future extensions; - * the remaining 24 bits are zero (and available for extensions; however - * API's that accept/return nsReflowStatus must not receive/return any - * extension bits). - * - * @see #Reflow() - * @see #CreateContinuingFrame() - */ -typedef PRUint32 nsReflowStatus; - -#define NS_FRAME_COMPLETE 0 // Note: not a bit! -#define NS_FRAME_NOT_COMPLETE 0x1 -#define NS_FRAME_REFLOW_NEXTINFLOW 0x2 - -#define NS_FRAME_IS_COMPLETE(status) \ - (0 == ((status) & NS_FRAME_NOT_COMPLETE)) - -#define NS_FRAME_IS_NOT_COMPLETE(status) \ - (0 != ((status) & NS_FRAME_NOT_COMPLETE)) - -// This macro tests to see if an nsReflowStatus is an error value -// or just a regular return value -#define NS_IS_REFLOW_ERROR(_status) (PRInt32(_status) < 0) - -//---------------------------------------------------------------------- - -/** - * Indication of how the frame can be split. This is used when doing runaround - * of floaters, and when pulling up child frames from a next-in-flow. - * - * The choices are splittable, not splittable at all, and splittable in - * a non-rectangular fashion. This last type only applies to block-level - * elements, and indicates whether splitting can be used when doing runaround. - * If you can split across page boundaries, but you expect each continuing - * frame to be the same width then return frSplittable and not - * frSplittableNonRectangular. - * - * @see #IsSplittable() - */ -typedef PRUint32 nsSplittableType; - -#define NS_FRAME_NOT_SPLITTABLE 0 // Note: not a bit! -#define NS_FRAME_SPLITTABLE 0x1 -#define NS_FRAME_SPLITTABLE_NON_RECTANGULAR 0x3 - -#define NS_FRAME_IS_SPLITTABLE(type)\ - (0 != ((type) & NS_FRAME_SPLITTABLE)) - -#define NS_FRAME_IS_NOT_SPLITTABLE(type)\ - (0 == ((type) & NS_FRAME_SPLITTABLE)) - -//---------------------------------------------------------------------- - -/** - * Frame state bits. Any bits not listed here are reserved for future - * extensions, but must be stored by the frames. - */ -typedef PRUint32 nsFrameState; - -#define NS_FRAME_IN_REFLOW 0x00000001 - -// This bit is set when a frame is created. After it has been reflowed -// once (during the DidReflow with a finished state) the bit is -// cleared. -#define NS_FRAME_FIRST_REFLOW 0x00000002 - -//---------------------------------------------------------------------- - -/** - * DidReflow status values. - */ -typedef PRBool nsDidReflowStatus; - -#define NS_FRAME_REFLOW_NOT_FINISHED PR_FALSE -#define NS_FRAME_REFLOW_FINISHED PR_TRUE - -//---------------------------------------------------------------------- - -/** - * A frame in the layout model. This interface is supported by all frame - * objects. - * - * Frames are NOT reference counted. Use the DeleteFrame() member function - * to delete a frame - */ -class nsIFrame : private nsISupports -{ -public: - /** - * QueryInterface() defined in nsISupports. This is the only member - * function of nsISupports that is public. - */ - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr) = 0; - - /** - * Add this object's size information to the sizeof handler. Note that - * this does not add in the size of content, style, or view's - * (those are sized seperately). - */ - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const = 0; - - /** - * Deletes this frame and each of its child frames (recursively calls - * DeleteFrame() for each child) - */ - NS_IMETHOD DeleteFrame() = 0; - - /** - * Get the content object associated with this frame. Adds a reference to - * the content object so the caller must do a release. - * - * @see nsISupports#Release() - */ - NS_IMETHOD GetContent(nsIContent*& aContent) const = 0; - - /** - * Get the index in parent of the frame's content object - */ - NS_IMETHOD GetContentIndex(PRInt32& aIndexInParent) const = 0; - - /** - * Get the style context associated with this frame. Note that GetStyleContext() - * adds a reference to the style context so the caller must do a release. - * - * @see nsISupports#Release() - */ - NS_IMETHOD GetStyleContext(nsIPresContext* aContext, - nsIStyleContext*& aStyleContext) = 0; - NS_IMETHOD SetStyleContext(nsIPresContext* aPresContext, - nsIStyleContext* aContext) = 0; - - /** - * Get the style data associated with this frame - */ - NS_IMETHOD GetStyleData(nsStyleStructID aSID, const nsStyleStruct*& aStyleStruct) const = 0; - - /** - * Accessor functions for geometric and content parent. - */ - NS_IMETHOD GetContentParent(nsIFrame*& aParent) const = 0; - NS_IMETHOD SetContentParent(const nsIFrame* aParent) = 0; - NS_IMETHOD GetGeometricParent(nsIFrame*& aParent) const = 0; - NS_IMETHOD SetGeometricParent(const nsIFrame* aParent) = 0; - - /** - * Bounding rect of the frame. The values are in twips, and the origin is - * relative to the upper-left of the geometric parent. The size includes the - * content area, borders, and padding. - */ - NS_IMETHOD GetRect(nsRect& aRect) const = 0; - NS_IMETHOD GetOrigin(nsPoint& aPoint) const = 0; - NS_IMETHOD GetSize(nsSize& aSize) const = 0; - NS_IMETHOD SetRect(const nsRect& aRect) = 0; - NS_IMETHOD MoveTo(nscoord aX, nscoord aY) = 0; - NS_IMETHOD SizeTo(nscoord aWidth, nscoord aHeight) = 0; - - /** - * Child frame enumeration - */ - NS_IMETHOD ChildCount(PRInt32& aChildCount) const = 0; - NS_IMETHOD ChildAt(PRInt32 aIndex, nsIFrame*& aFrame) const = 0; - NS_IMETHOD IndexOf(const nsIFrame* aChild, PRInt32& aIndex) const = 0; - NS_IMETHOD FirstChild(nsIFrame*& aFirstChild) const = 0; - NS_IMETHOD NextChild(const nsIFrame* aChild, nsIFrame*& aNextChild) const = 0; - NS_IMETHOD PrevChild(const nsIFrame* aChild, nsIFrame*& aPrevChild) const = 0; - NS_IMETHOD LastChild(nsIFrame*& aLastChild) const = 0; - - /** - * Painting - */ - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) = 0; - - /** - * Handle an event. - */ - NS_IMETHOD HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus) = 0; - - /** - * Get the cursor for a given point in the frame tree. The - * call returns the desired cursor (or NS_STYLE_CURSOR_INHERIT if - * no cursor is wanted). In addition, if a cursor is desired - * then *aFrame is set to the frame that wants the cursor. - */ - NS_IMETHOD GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor) = 0; - - /** - * Get the current frame-state value for this frame. aResult is - * filled in with the state bits. The return value has no - * meaning. - */ - NS_IMETHOD GetFrameState(nsFrameState& aResult) = 0; - - /** - * Set the current frame-state value for this frame. The return - * value has no meaning. - */ - NS_IMETHOD SetFrameState(nsFrameState aNewState) = 0; - - /** - * Pre-reflow hook. Before a frame is incrementally reflowed or - * resize-reflowed this method will be called warning the frame of - * the impending reflow. This call may be invoked zero or more times - * before a subsequent DidReflow call. This method when called the - * first time will set the NS_FRAME_IN_REFLOW bit in the frame - * state bits. - */ - NS_IMETHOD WillReflow(nsIPresContext& aPresContext) = 0; - - /** - * The frame is given a maximum size and asked for its desired size. - * This is the frame's opportunity to reflow its children. - * - * @param aDesiredSize out parameter where you should return the - * desired size and ascent/descent info. You should include any - * space you want for border/padding in the desired size you return. - * - * It's okay to return a desired size that exceeds the max - * size if that's the smallest you can be, i.e. it's your - * minimum size. - * - * maxElementSize is an optional parameter for returning your - * maximum element size. If may be null in which case you - * don't have to compute a maximum element size. The - * maximum element size must be less than or equal to your - * desired size. - * - * @param aReflowState information about your reflow including the reason - * for the reflow and the available space in which to lay out. Each - * dimension of the available space can either be constrained or - * unconstrained (a value of NS_UNCONSTRAINEDSIZE). If constrained - * you should choose a value that's less than or equal to the - * constrained size. If unconstrained you can choose as - * large a value as you like. - * - * Note that the available space can be negative. In this case you - * still must return an accurate desired size. If you're a container - * you must always reflow at least one frame regardless of the - * available space - */ - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) = 0; - - /** - * Post-reflow hook. After a frame is incrementally reflowed or - * resize-reflowed this method will be called telling the frame of - * the outcome. This call may be invoked many times, while - * NS_FRAME_IN_REFLOW is set, before it is finally called once with - * a NS_FRAME_REFLOW_COMPLETE value. When called with a - * NS_FRAME_REFLOW_COMPLETE value the NS_FRAME_IN_REFLOW bit in the - * frame state will be cleared. - */ - NS_IMETHOD DidReflow(nsIPresContext& aPresContext, - nsDidReflowStatus aStatus) = 0; - - /** - * This call is invoked when content is appended to the content tree. - * - * This frame is the frame that maps the content object that has appended - * content. A typical response to this notification is to generate a - * FrameAppended incremental reflow command. You then handle the incremental - * reflow command by creating frames for the appended content. - */ - NS_IMETHOD ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) = 0; - - /** - * This call is invoked when content is inserted in the content - * tree. - * - * This frame is the frame that maps the content object that has inserted - * content. A typical response to this notification is to update the - * index-in-parent values for the affected child frames, create and insert - * new frame(s), and generate a FrameInserted incremental reflow command. - * - * You respond to the incremental reflow command by reflowing the newly - * inserted frame and any impacted frames. - * - * @param aIndexInParent the index in the content container where - * the new content was inserted. - */ - NS_IMETHOD ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) = 0; - - /** - * This call is invoked when content is replaced in the content - * tree. The container frame that maps that content is asked to deal - * with the replaced content by deleting old frames and then - * creating new frames and updating the index-in-parent values for - * it's affected children. In addition, the call must generate - * reflow commands that will incrementally reflow and repair the - * damaged portion of the frame tree. - * - * @param aIndexInParent the index in the content container where - * the new content was inserted. */ - NS_IMETHOD ContentReplaced(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInParent) = 0; - - /** - * This call is invoked when content is deleted from the content - * tree. The container frame that maps that content is asked to deal - * with the deleted content by deleting frames and updating the - * index-in-parent values for it's affected children. In addition, - * the call must generate reflow commands that will incrementally - * reflow and repair the damaged portion of the frame tree. - * - * @param aIndexInParent the index in the content container where - * the new content was deleted. - */ - NS_IMETHOD ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) = 0; - - /** - * This call is invoked when content is changed in the content tree. - * The first frame that maps that content is asked to deal with the - * change by generating an incremental reflow command. - * - * @param aIndexInParent the index in the content container where - * the new content was deleted. - */ - NS_IMETHOD ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent) = 0; - - /** - * Return the reflow metrics for this frame. If the frame is a - * container then the values for ascent and descent are computed - * across the the various children in the appropriate manner - * (e.g. for a line frame the ascent value would be the maximum - * ascent of the line's children). Note that the metrics returned - * apply to the frame as it exists at the time of the call. - */ - NS_IMETHOD GetReflowMetrics(nsIPresContext* aPresContext, - nsReflowMetrics& aMetrics) = 0; - - /** - * Return how your frame can be split. - */ - NS_IMETHOD IsSplittable(nsSplittableType& aIsSplittable) const = 0; - - /** - * Flow member functions. CreateContinuingFrame() is responsible for - * appending the continuing frame to the flow. - */ - NS_IMETHOD CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame) = 0; - - NS_IMETHOD GetPrevInFlow(nsIFrame*& aPrevInFlow) const = 0; - NS_IMETHOD SetPrevInFlow(nsIFrame*) = 0; - NS_IMETHOD GetNextInFlow(nsIFrame*& aNextInFlow) const = 0; - NS_IMETHOD SetNextInFlow(nsIFrame*) = 0; - - NS_IMETHOD AppendToFlow(nsIFrame* aAfterFrame) = 0; - NS_IMETHOD PrependToFlow(nsIFrame* aBeforeFrame) = 0; - NS_IMETHOD RemoveFromFlow() = 0; - NS_IMETHOD BreakFromPrevFlow() = 0; - NS_IMETHOD BreakFromNextFlow() = 0; - - /** - * Accessor functions to get/set the associated view object - */ - NS_IMETHOD GetView(nsIView*& aView) const = 0; // may be null - NS_IMETHOD SetView(nsIView* aView) = 0; - - /** - * Find the first geometric parent that has a view - */ - NS_IMETHOD GetParentWithView(nsIFrame*& aParent) const = 0; - - /** - * Returns the offset from this frame to the closest geometric parent that - * has a view. Also returns the containing view or null in case of error - */ - NS_IMETHOD GetOffsetFromView(nsPoint& aOffset, nsIView*& aView) const = 0; - - /** - * Returns the window that contains this frame. If this frame has a - * view and the view has a window, then this frames window is - * returned, otherwise this frame's geometric parent is checked - * recursively upwards. - */ - NS_IMETHOD GetWindow(nsIWidget*&) const = 0; - - /** - * Is this frame a "containing block"? - */ - NS_IMETHOD IsPercentageBase(PRBool& aBase) const = 0; - - /** - * Gets the size of an "auto" margin. - */ - NS_IMETHOD GetAutoMarginSize(PRUint8 aSide, nscoord& aSize) const = 0; - - /** - * Sibling pointer used to link together frames - */ - NS_IMETHOD GetNextSibling(nsIFrame*& aNextSibling) const = 0; - NS_IMETHOD SetNextSibling(nsIFrame* aNextSibling) = 0; - - /** - * Does this frame have content that is considered "transparent"? - * This is binary transparency as opposed to translucency. MMP - */ - NS_IMETHOD IsTransparent(PRBool& aTransparent) const = 0; - - // Debugging - NS_IMETHOD List(FILE* out = stdout, PRInt32 aIndent = 0) const= 0; - NS_IMETHOD ListTag(FILE* out = stdout) const = 0; - NS_IMETHOD VerifyTree() const = 0; - - /** - * See if tree verification is enabled. To enable tree verification add - * "frameverifytree:1" to your NSPR_LOG_MODULES environment variable - * (any non-zero debug level will work). Or, call SetVerifyTreeEnable - * with PR_TRUE. - */ - static NS_LAYOUT PRBool GetVerifyTreeEnable(); - - /** - * Set the verify-tree enable flag. - */ - static NS_LAYOUT void SetVerifyTreeEnable(PRBool aEnabled); - - /** - * The frame class and related classes share an nspr log module - * for logging frame activity. - * - * Note: the log module is created during library initialization which - * means that you cannot perform logging before then. - */ - static NS_LAYOUT PRLogModuleInfo* GetLogModuleInfo(); - - // Show frame borders when rendering - static NS_LAYOUT void ShowFrameBorders(PRBool aEnable); - static NS_LAYOUT PRBool GetShowFrameBorders(); - -protected: - static NS_LAYOUT PRLogModuleInfo* gLogModule; -}; - -// Constructs an initial reflow state (no parent reflow state) for a -// non-incremental reflow command -inline nsReflowState::nsReflowState(nsIFrame* aFrame, - nsReflowReason aReason, - const nsSize& aMaxSize) -{ - NS_PRECONDITION(aReason != eReflowReason_Incremental, "unexpected reflow reason"); -#ifdef NS_DEBUG - nsIFrame* parent; - aFrame->GetGeometricParent(parent); - NS_PRECONDITION(nsnull == parent, "not root frame"); -#endif - reason = aReason; - reflowCommand = nsnull; - maxSize = aMaxSize; - parentReflowState = nsnull; - frame = aFrame; -} - -// Constructs an initial reflow state (no parent reflow state) for an -// incremental reflow command -inline nsReflowState::nsReflowState(nsIFrame* aFrame, - nsIReflowCommand& aReflowCommand, - const nsSize& aMaxSize) -{ -#ifdef NS_DEBUG - nsIFrame* parent; - aFrame->GetGeometricParent(parent); - NS_PRECONDITION(nsnull == parent, "not root frame"); -#endif - reason = eReflowReason_Incremental; - reflowCommand = &aReflowCommand; - maxSize = aMaxSize; - parentReflowState = nsnull; - frame = aFrame; -} - -// Construct a reflow state for the given frame, parent reflow state, and -// max size. Uses the reflow reason and reflow command from the parent's -// reflow state -inline nsReflowState::nsReflowState(nsIFrame* aFrame, - const nsReflowState& aParentReflowState, - const nsSize& aMaxSize) -{ - reason = aParentReflowState.reason; - reflowCommand = aParentReflowState.reflowCommand; - maxSize = aMaxSize; - parentReflowState = &aParentReflowState; - frame = aFrame; -} - -// Constructs a reflow state that overrides the reflow reason of the parent -// reflow state. Sets the reflow command to NULL -inline nsReflowState::nsReflowState(nsIFrame* aFrame, - const nsReflowState& aParentReflowState, - const nsSize& aMaxSize, - nsReflowReason aReflowReason) -{ - reason = aReflowReason; - reflowCommand = nsnull; - maxSize = aMaxSize; - parentReflowState = &aParentReflowState; - frame = aFrame; -} - -#endif /* nsIFrame_h___ */ diff --git a/mozilla/layout/generic/nsImageMap.cpp b/mozilla/layout/generic/nsImageMap.cpp deleted file mode 100644 index db80818da81..00000000000 --- a/mozilla/layout/generic/nsImageMap.cpp +++ /dev/null @@ -1,750 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIImageMap.h" -#include "nsString.h" -#include "nsVoidArray.h" -#include "nsCoord.h" -#include "nsIRenderingContext.h" -#include "nsIPresContext.h" -#include "nsIURL.h" -#include "nsISizeOfHandler.h" - -#undef SCALE -#define SCALE(a,b) nscoord((a) * (b)) - -class Area { -public: - Area(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress); - virtual ~Area(); - - void ParseCoords(const nsString& aSpec); - - virtual PRBool IsInside(nscoord x, nscoord y) = 0; - virtual void Draw(nsIPresContext& aCX, - nsIRenderingContext& aRC) = 0; - virtual void GetShapeName(nsString& aResult) = 0; - - void ToHTML(nsString& aResult); - - const nsString& GetBase() const { return mBase; } - const nsString& GetHREF() const { return mHREF; } - const nsString& GetTarget() const { return mTarget; } - const nsString& GetAltText() const { return mAltText; } - PRBool GetSuppress() const { return mSuppressFeedback; } - - virtual void SizeOf(nsISizeOfHandler* aHandler) const; - - nsString mBase; - nsString mHREF; - nsString mTarget; - nsString mAltText; - nscoord* mCoords; - PRInt32 mNumCoords; - PRBool mSuppressFeedback; -}; - -Area::Area(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress) - : mBase(aBaseURL), mHREF(aHREF), mTarget(aTarget), mAltText(aAltText), - mSuppressFeedback(aSuppress) -{ - mCoords = nsnull; - mNumCoords = 0; -} - -Area::~Area() -{ - delete [] mCoords; -} - -void -Area::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - aHandler->Add((size_t) (- ((PRInt32)sizeof(nsString) * 4) ) ); - mBase.SizeOf(aHandler); - mHREF.SizeOf(aHandler); - mTarget.SizeOf(aHandler); - mAltText.SizeOf(aHandler); - aHandler->Add(mNumCoords * sizeof(nscoord)); -} - -// XXX move into nsCRT -#define XP_IS_SPACE(_ch) \ - (((_ch) == ' ') || ((_ch) == '\t') || ((_ch) == '\r') || ((_ch) == '\n')) - -#include -#define XP_ATOI(_s) ::atoi(_s) - -// XXX straight copy from laymap.c -static nscoord* lo_parse_coord_list(char *str, PRInt32* value_cnt) -{ - char *tptr; - char *n_str; - PRInt32 i, cnt; - PRInt32 *value_list; - - /* - * Nothing in an empty list - */ - *value_cnt = 0; - if ((str == NULL)||(*str == '\0')) - { - return((PRInt32 *)NULL); - } - - /* - * Skip beginning whitespace, all whitespace is empty list. - */ - n_str = str; - while (XP_IS_SPACE(*n_str)) - { - n_str++; - } - if (*n_str == '\0') - { - return((PRInt32 *)NULL); - } - - /* - * Make a pass where any two numbers separated by just whitespace - * are given a comma separator. Count entries while passing. - */ - cnt = 0; - while (*n_str != '\0') - { - PRBool has_comma; - - /* - * Skip to a separator - */ - tptr = n_str; - while ((!XP_IS_SPACE(*tptr))&&(*tptr != ',')&&(*tptr != '\0')) - { - tptr++; - } - n_str = tptr; - - /* - * If no more entries, break out here - */ - if (*n_str == '\0') - { - break; - } - - /* - * Skip to the end of the separator, noting if we have a - * comma. - */ - has_comma = PR_FALSE; - while ((XP_IS_SPACE(*tptr))||(*tptr == ',')) - { - if (*tptr == ',') - { - if (has_comma == PR_FALSE) - { - has_comma = PR_TRUE; - } - else - { - break; - } - } - tptr++; - } - /* - * If this was trailing whitespace we skipped, we are done. - */ - if ((*tptr == '\0')&&(has_comma == PR_FALSE)) - { - break; - } - /* - * Else if the separator is all whitespace, and this is not the - * end of the string, add a comma to the separator. - */ - else if (has_comma == PR_FALSE) - { - *n_str = ','; - } - - /* - * count the entry skipped. - */ - cnt++; - - n_str = tptr; - } - /* - * count the last entry in the list. - */ - cnt++; - - *value_cnt = cnt; - - /* - * Allocate space for the coordinate array. - */ - value_list = new nscoord[cnt]; - if (value_list == NULL) - { - return((PRInt32 *)NULL); - } - - /* - * Second pass to copy integer values into list. - */ - tptr = str; - for (i=0; i'); -} - -//---------------------------------------------------------------------- - -class DefaultArea : public Area { -public: - DefaultArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress); - ~DefaultArea(); - - virtual PRBool IsInside(nscoord x, nscoord y); - virtual void Draw(nsIPresContext& aCX, - nsIRenderingContext& aRC); - virtual void GetShapeName(nsString& aResult); -}; - -DefaultArea::DefaultArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress) - : Area(aBaseURL, aHREF, aTarget, aAltText, aSuppress) -{ -} - -DefaultArea::~DefaultArea() -{ -} - -PRBool DefaultArea::IsInside(nscoord x, nscoord y) -{ - return PR_TRUE; -} - -void DefaultArea::Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) -{ -} - -void DefaultArea::GetShapeName(nsString& aResult) -{ - aResult.Append("default"); -} - -//---------------------------------------------------------------------- - -class RectArea : public Area { -public: - RectArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress); - ~RectArea(); - - virtual PRBool IsInside(nscoord x, nscoord y); - virtual void Draw(nsIPresContext& aCX, - nsIRenderingContext& aRC); - virtual void GetShapeName(nsString& aResult); -}; - -RectArea::RectArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress) - : Area(aBaseURL, aHREF, aTarget, aAltText, aSuppress) -{ -} - -RectArea::~RectArea() -{ -} - -PRBool RectArea::IsInside(nscoord x, nscoord y) -{ - if (mNumCoords >= 4) { // Note: > is for nav compatabilty - nscoord x1 = mCoords[0]; - nscoord y1 = mCoords[1]; - nscoord x2 = mCoords[2]; - nscoord y2 = mCoords[3]; - if ((x1 > x2)|| (y1 > y2)) { - // Can't be inside a screwed up rect - return PR_FALSE; - } - if ((x >= x1) && (x <= x2) && (y >= y1) && (y <= y2)) { - return PR_TRUE; - } - } - return PR_FALSE; -} - -void RectArea::Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) -{ - if (mNumCoords >= 4) { - float p2t = aCX.GetPixelsToTwips(); - nscoord x1 = SCALE(p2t, mCoords[0]); - nscoord y1 = SCALE(p2t, mCoords[1]); - nscoord x2 = SCALE(p2t, mCoords[2]); - nscoord y2 = SCALE(p2t, mCoords[3]); - if ((x1 > x2)|| (y1 > y2)) { - return; - } - aRC.DrawRect(x1, y1, x2 - x1, y2 - y1); - } -} - -void RectArea::GetShapeName(nsString& aResult) -{ - aResult.Append("rect"); -} - -//---------------------------------------------------------------------- - -class PolyArea : public Area { -public: - PolyArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress); - ~PolyArea(); - - virtual PRBool IsInside(nscoord x, nscoord y); - virtual void Draw(nsIPresContext& aCX, - nsIRenderingContext& aRC); - virtual void GetShapeName(nsString& aResult); -}; - -PolyArea::PolyArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress) - : Area(aBaseURL, aHREF, aTarget, aAltText, aSuppress) -{ -} - -PolyArea::~PolyArea() -{ -} - -PRBool PolyArea::IsInside(nscoord x, nscoord y) -{ - if (mNumCoords >= 6) { - PRInt32 intersects = 0; - nscoord wherex = x; - nscoord wherey = y; - PRInt32 totalv = mNumCoords / 2; - PRInt32 totalc = totalv * 2; - nscoord xval = mCoords[totalc - 2]; - nscoord yval = mCoords[totalc - 1]; - PRInt32 end = totalc; - PRInt32 pointer = 1; - - if ((yval >= wherey) != (mCoords[pointer] >= wherey)) - if ((xval >= wherex) == (mCoords[0] >= wherex)) - intersects += (xval >= wherex) ? 1 : 0; - else - intersects += ((xval - (yval - wherey) * - (mCoords[0] - xval) / - (mCoords[pointer] - yval)) >= wherex) ? 1 : 0; - - // XXX I wonder what this is doing; this is a translation of ptinpoly.c - while (pointer < end) { - yval = mCoords[pointer]; - pointer += 2; - if (yval >= wherey) { - while((pointer < end) && (mCoords[pointer] >= wherey)) - pointer+=2; - if (pointer >= end) - break; - if ((mCoords[pointer-3] >= wherex) == - (mCoords[pointer-1] >= wherex)) { - intersects += (mCoords[pointer-3] >= wherex) ? 1 : 0; - } else { - intersects += - ((mCoords[pointer-3] - (mCoords[pointer-2] - wherey) * - (mCoords[pointer-1] - mCoords[pointer-3]) / - (mCoords[pointer] - mCoords[pointer - 2])) >= wherex) ? 1:0; - } - } else { - while((pointer < end) && (mCoords[pointer] < wherey)) - pointer+=2; - if (pointer >= end) - break; - if ((mCoords[pointer-3] >= wherex) == - (mCoords[pointer-1] >= wherex)) { - intersects += (mCoords[pointer-3] >= wherex) ? 1:0; - } else { - intersects += - ((mCoords[pointer-3] - (mCoords[pointer-2] - wherey) * - (mCoords[pointer-1] - mCoords[pointer-3]) / - (mCoords[pointer] - mCoords[pointer - 2])) >= wherex) ? 1:0; - } - } - } - if ((intersects & 1) != 0) { - return PR_TRUE; - } - } - return PR_FALSE; -} - -void PolyArea::Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) -{ - if (mNumCoords >= 6) { - float p2t = aCX.GetPixelsToTwips(); - nscoord x0 = SCALE(p2t, mCoords[0]); - nscoord y0 = SCALE(p2t, mCoords[1]); - for (PRInt32 i = 2; i < mNumCoords; i += 2) { - nscoord x1 = SCALE(p2t, mCoords[i]); - nscoord y1 = SCALE(p2t, mCoords[i+1]); - aRC.DrawLine(x0, y0, x1, y1); - x0 = x1; - y0 = y1; - } - aRC.DrawLine(x0, y0, mCoords[0], mCoords[1]); - } -} - -void PolyArea::GetShapeName(nsString& aResult) -{ - aResult.Append("polygon"); -} - -//---------------------------------------------------------------------- - -class CircleArea : public Area { -public: - CircleArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress); - ~CircleArea(); - - virtual PRBool IsInside(nscoord x, nscoord y); - virtual void Draw(nsIPresContext& aCX, - nsIRenderingContext& aRC); - virtual void GetShapeName(nsString& aResult); -}; - -CircleArea::CircleArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress) - : Area(aBaseURL, aHREF, aTarget, aAltText, aSuppress) -{ -} - -CircleArea::~CircleArea() -{ -} - -PRBool CircleArea::IsInside(nscoord x, nscoord y) -{ - // Note: > is for nav compatabilty - if (mNumCoords >= 3) { - nscoord x1 = mCoords[0]; - nscoord y1 = mCoords[1]; - nscoord radius = mCoords[2]; - if (radius < 0) { - return PR_FALSE; - } - nscoord dx = x1 - x; - nscoord dy = y1 - y; - nscoord dist = (dx * dx) + (dy * dy); - if (dist <= (radius * radius)) { - return PR_TRUE; - } - } - return PR_FALSE; -} - -void CircleArea::Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) -{ - if (mNumCoords >= 3) { - float p2t = aCX.GetPixelsToTwips(); - nscoord x1 = SCALE(p2t, mCoords[0]); - nscoord y1 = SCALE(p2t, mCoords[1]); - nscoord radius = SCALE(p2t, mCoords[2]); - if (radius < 0) { - return; - } - nscoord x = x1 - radius / 2; - nscoord y = y1 - radius / 2; - nscoord w = 2 * radius; - aRC.DrawEllipse(x, y, w, w); - } -} - -void CircleArea::GetShapeName(nsString& aResult) -{ - aResult.Append("circle"); -} - -//---------------------------------------------------------------------- - -static NS_DEFINE_IID(kIImageMapIID, NS_IIMAGEMAP_IID); - -class ImageMapImpl : public nsIImageMap { -public: - ImageMapImpl(nsIAtom* aTag); - ~ImageMapImpl(); - - NS_DECL_ISUPPORTS - - NS_IMETHOD SetName(const nsString& aMapName); - - NS_IMETHOD GetName(nsString& aResult); - - NS_IMETHOD AddArea(const nsString& aBaseURL, - const nsString& aShape, - const nsString& aCoords, - const nsString& aHREF, - const nsString& aTarget, - const nsString& aAltText, - PRBool aSuppress); - - NS_IMETHOD IsInside(nscoord aX, nscoord aY, - nsIURL* aDocURL, - nsString& aAbsURL, - nsString& aTarget, - nsString& aAltText, - PRBool* aSuppress); - - NS_IMETHOD IsInside(nscoord aX, nscoord aY); - - NS_IMETHOD Draw(nsIPresContext& aCX, nsIRenderingContext& aRC); - - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - - nsString mName; - nsIAtom* mTag; - nsVoidArray mAreas; -}; - -ImageMapImpl::ImageMapImpl(nsIAtom* aTag) -{ - mTag = aTag; - NS_IF_ADDREF(aTag); -} - -ImageMapImpl::~ImageMapImpl() -{ - NS_IF_RELEASE(mTag); - PRInt32 i, n = mAreas.Count(); - for (i = 0; i < n; i++) { - Area* area = (Area*) mAreas.ElementAt(i); - delete area; - } -} - -NS_IMPL_ISUPPORTS(ImageMapImpl, kIImageMapIID); - -NS_IMETHODIMP ImageMapImpl::SetName(const nsString& aMapName) -{ - mName = aMapName; - return NS_OK; -} - -NS_IMETHODIMP ImageMapImpl::GetName(nsString& aResult) -{ - aResult = mName; - return NS_OK; -} - -NS_IMETHODIMP ImageMapImpl::AddArea(const nsString& aBaseURL, - const nsString& aShape, - const nsString& aCoords, - const nsString& aHREF, - const nsString& aTarget, - const nsString& aAltText, - PRBool aSuppress) -{ - Area* area; - if ((0 == aShape.Length()) || aShape.EqualsIgnoreCase("rect")) { - area = new RectArea(aBaseURL, aHREF, aTarget, aAltText, aSuppress); - } else if (aShape.EqualsIgnoreCase("poly") || - aShape.EqualsIgnoreCase("polygon")) { - area = new PolyArea(aBaseURL, aHREF, aTarget, aAltText, aSuppress); - } else if (aShape.EqualsIgnoreCase("circle")) { - area = new CircleArea(aBaseURL, aHREF, aTarget, aAltText, aSuppress); - } - else { - area = new DefaultArea(aBaseURL, aHREF, aTarget, aAltText, aSuppress); - } - area->ParseCoords(aCoords); - mAreas.AppendElement(area); - return NS_OK; -} - -NS_IMETHODIMP ImageMapImpl::IsInside(nscoord aX, nscoord aY, - nsIURL* aDocURL, - nsString& aAbsURL, - nsString& aTarget, - nsString& aAltText, - PRBool* aSuppress) -{ - PRInt32 i, n = mAreas.Count(); - for (i = 0; i < n; i++) { - Area* area = (Area*) mAreas.ElementAt(i); - if (area->IsInside(aX, aY)) { - NS_MakeAbsoluteURL(aDocURL, area->mBase, area->mHREF, aAbsURL); - aTarget = area->mTarget; - aAltText = area->mAltText; - *aSuppress = area->mSuppressFeedback; - return NS_OK; - } - } - return NS_NOT_INSIDE; -} - -NS_IMETHODIMP ImageMapImpl::IsInside(nscoord aX, nscoord aY) -{ - PRInt32 i, n = mAreas.Count(); - for (i = 0; i < n; i++) { - Area* area = (Area*) mAreas.ElementAt(i); - if (area->IsInside(aX, aY)) { - return NS_OK; - } - } - return NS_NOT_INSIDE; -} - -NS_IMETHODIMP ImageMapImpl::Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) -{ - PRInt32 i, n = mAreas.Count(); - for (i = 0; i < n; i++) { - Area* area = (Area*) mAreas.ElementAt(i); - area->Draw(aCX, aRC); - } - return NS_OK; -} - -NS_IMETHODIMP -ImageMapImpl::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - - aHandler->Add((size_t) (- ((PRInt32) sizeof(mName)))); - mName.SizeOf(aHandler); - - if (!aHandler->HaveSeen(mTag)) { - mTag->SizeOf(aHandler); - } - - aHandler->Add((size_t) (- ((PRInt32) sizeof(mAreas)))); - mAreas.SizeOf(aHandler); - - PRInt32 i, n = mAreas.Count(); - for (i = 0; i < n; i++) { - Area* area = (Area*) mAreas[i]; - area->SizeOf(aHandler); - } - return NS_OK; -} - -NS_HTML nsresult NS_NewImageMap(nsIImageMap** aInstancePtrResult, - nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - ImageMapImpl* it = new ImageMapImpl(aTag); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIImageMapIID, (void**) aInstancePtrResult); -} diff --git a/mozilla/layout/generic/nsLeafFrame.cpp b/mozilla/layout/generic/nsLeafFrame.cpp deleted file mode 100644 index 601c890906d..00000000000 --- a/mozilla/layout/generic/nsLeafFrame.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsLeafFrame.h" -#include "nsIStyleContext.h" -#include "nsCSSRendering.h" -#include "nsHTMLParts.h" -#include "nsIPresShell.h" - -nsLeafFrame::nsLeafFrame(nsIContent* aContent, nsIFrame* aParentFrame) - : nsFrame(aContent, aParentFrame) -{ -} - -nsLeafFrame::~nsLeafFrame() -{ -} - -NS_METHOD nsLeafFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - - if (disp->mVisible) { - const nsStyleColor* myColor = - (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - const nsStyleSpacing* mySpacing = - (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, - aDirtyRect, mRect, *myColor); - nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this, - aDirtyRect, mRect, *mySpacing, 0); - } - return NS_OK; -} - -NS_METHOD nsLeafFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - NS_PRECONDITION(mState & NS_FRAME_IN_REFLOW, "frame is not in reflow"); - - // XXX add in code to check for width/height being set via css - // and if set use them instead of calling GetDesiredSize. - - - GetDesiredSize(aPresContext, aReflowState, aDesiredSize); - AddBordersAndPadding(aPresContext, aDesiredSize); - if (nsnull != aDesiredSize.maxElementSize) { - aDesiredSize.maxElementSize->width = aDesiredSize.width; - aDesiredSize.maxElementSize->height = aDesiredSize.height; - } - aStatus = NS_FRAME_COMPLETE; - return NS_OK; -} - -// XXX how should border&padding effect baseline alignment? -// => descent = borderPadding.bottom for example -void nsLeafFrame::AddBordersAndPadding(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize) -{ - const nsStyleSpacing* space = - (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsMargin borderPadding; - space->CalcBorderPaddingFor(this, borderPadding); - aDesiredSize.width += borderPadding.left + borderPadding.right; - aDesiredSize.height += borderPadding.top + borderPadding.bottom; - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; -} - -void nsLeafFrame::GetInnerArea(nsIPresContext* aPresContext, - nsRect& aInnerArea) const -{ - const nsStyleSpacing* space = - (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsMargin borderPadding; - space->CalcBorderPaddingFor(this, borderPadding); - aInnerArea.x = borderPadding.left; - aInnerArea.y = borderPadding.top; - aInnerArea.width = mRect.width - - (borderPadding.left + borderPadding.right); - aInnerArea.height = mRect.height - - (borderPadding.top + borderPadding.bottom); -} - -NS_METHOD nsLeafFrame::ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent) -{ - // Generate a reflow command with this frame as the target frame - nsIReflowCommand* cmd; - nsresult result; - - result = NS_NewHTMLReflowCommand(&cmd, this, nsIReflowCommand::ContentChanged); - if (NS_OK == result) { - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - } - - return result; -} - diff --git a/mozilla/layout/generic/nsLeafFrame.h b/mozilla/layout/generic/nsLeafFrame.h deleted file mode 100644 index 53fc23f6636..00000000000 --- a/mozilla/layout/generic/nsLeafFrame.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsLeafFrame_h___ -#define nsLeafFrame_h___ - -#include "nsFrame.h" - -/** - * Abstract class that provides simple fixed-size layout for leaf objects - * (e.g. images, form elements, etc.). Deriviations provide the implementation - * of the GetDesiredSize method. The rendering method knows how to render - * borders and backgrounds. - */ -class nsLeafFrame : public nsFrame { -public: - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent); - -protected: - nsLeafFrame(nsIContent* aContent, nsIFrame* aParentFrame); - virtual ~nsLeafFrame(); - - /** - * Return the desired size of the frame's content area. Note that this - * method doesn't need to deal with padding or borders (the caller will - * deal with it). In addition, the ascent will be set to the height - * and the descent will be set to zero. - */ - virtual void GetDesiredSize(nsIPresContext* aPresContext, - const nsReflowState& aReflowState, - nsReflowMetrics& aDesiredSize) = 0; - - /** - * Get the inner rect of this frame. This takes the outer size (mRect) - * and subtracts off the borders and padding. - */ - void GetInnerArea(nsIPresContext* aPresContext, nsRect& aInnerArea) const; - - /** - * Subroutine to add in borders and padding - */ - void AddBordersAndPadding(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize); -}; - -#endif /* nsLeafFrame_h___ */ diff --git a/mozilla/layout/generic/nsPageFrame.cpp b/mozilla/layout/generic/nsPageFrame.cpp deleted file mode 100644 index ab07ac7ddaf..00000000000 --- a/mozilla/layout/generic/nsPageFrame.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsPageFrame.h" -#include "nsIContent.h" -#include "nsIContentDelegate.h" -#include "nsIPresContext.h" -#include "nsIStyleContext.h" -#include "nsIReflowCommand.h" -#include "nsIRenderingContext.h" -#include "nsHTMLAtoms.h" - -nsPageFrame::nsPageFrame(nsIContent* aContent, nsIFrame* aParent) - : nsContainerFrame(aContent, aParent) -{ -} - -void nsPageFrame::CreateFirstChild(nsIPresContext* aPresContext) -{ - // XXX this is a copy of the root-content-frame's version - - // Create a frame for the body child - PRInt32 i, n; - n = mContent->ChildCount(); - for (i = 0; i < n; i++) { - nsIContent* child = mContent->ChildAt(i); - if (nsnull != child) { - nsIAtom* tag; - tag = child->GetTag(); - if (nsHTMLAtoms::body == tag) { - // Create a frame - nsIContentDelegate* cd = child->GetDelegate(aPresContext); - if (nsnull != cd) { - nsIStyleContext* kidStyleContext = - aPresContext->ResolveStyleContextFor(child, this); - nsresult rv = cd->CreateFrame(aPresContext, child, this, - kidStyleContext, mFirstChild); - NS_RELEASE(kidStyleContext); - if (NS_OK == rv) { - mChildCount = 1; - mFirstContentOffset = i; - mLastContentOffset = i; - } - NS_RELEASE(cd); - } - } - NS_IF_RELEASE(tag); - NS_RELEASE(child); - } - } -} - -NS_METHOD nsPageFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ -#ifdef NS_DEBUG - PreReflowCheck(); -#endif - aStatus = NS_FRAME_COMPLETE; // initialize out parameter - - // XXX Do something sensible in page mode... - if (eReflowReason_Incremental == aReflowState.reason) { - // We don't expect the target of the reflow command to be page frame -#ifdef NS_DEUG - NS_ASSERTION(nsnull != aReflowState.reflowCommand, "null reflow command"); - - nsIFrame* target; - aReflowState.reflowCommand->GetTarget(target); - NS_ASSERTION(target != this, "page frame is reflow command target"); -#endif - - // Verify the next reflow command frame is our one and only child frame - nsIFrame* next; - aReflowState.reflowCommand->GetNext(next); - NS_ASSERTION(next == mFirstChild, "bad reflow frame"); - - // Dispatch the reflow command to our content child. Allow it to be as high - // as it wants - nsSize maxSize(aReflowState.maxSize.width, NS_UNCONSTRAINEDSIZE); - nsReflowState kidReflowState(mFirstChild, aReflowState, maxSize); - - aStatus = ReflowChild(mFirstChild, aPresContext, aDesiredSize, kidReflowState); - - // Place and size the child. Make sure the child is at least as - // tall as our max size (the containing window) - if (aDesiredSize.height < aReflowState.maxSize.height) { - aDesiredSize.height = aReflowState.maxSize.height; - } - - nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height); - mFirstChild->SetRect(rect); - - } else { - // Do we have any children? - if (nsnull == mFirstChild) { - if (nsnull == mPrevInFlow) { - // Create the first child frame - CreateFirstChild(aPresContext); - } else { - nsPageFrame* prevPage = (nsPageFrame*)mPrevInFlow; - - NS_ASSERTION(!prevPage->mLastContentIsComplete, "bad continuing page"); - nsIFrame* prevLastChild; - prevPage->LastChild(prevLastChild); - - // Create a continuing child of the previous page's last child - nsIStyleContext* kidSC; - prevLastChild->GetStyleContext(aPresContext, kidSC); - nsresult rv = prevLastChild->CreateContinuingFrame(aPresContext, this, - kidSC, mFirstChild); - NS_RELEASE(kidSC); - - mChildCount = 1; - mLastContentOffset = mFirstContentOffset; - } - } - - // Resize our frame allowing it only to be as big as we are - // XXX Pay attention to the page's border and padding... - if (nsnull != mFirstChild) { - nsReflowState kidReflowState(mFirstChild, aReflowState, aReflowState.maxSize); - - // Get the child's desired size - mFirstChild->WillReflow(*aPresContext); - aStatus = ReflowChild(mFirstChild, aPresContext, aDesiredSize, kidReflowState); - mLastContentIsComplete = NS_FRAME_IS_COMPLETE(aStatus); - - // Make sure the child is at least as tall as our max size (the containing window) - if (aDesiredSize.height < aReflowState.maxSize.height) { - aDesiredSize.height = aReflowState.maxSize.height; - } - - // Place and size the child - nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height); - mFirstChild->SetRect(rect); - mFirstChild->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - - // Is the frame complete? - if (NS_FRAME_IS_COMPLETE(aStatus)) { - nsIFrame* childNextInFlow; - - mFirstChild->GetNextInFlow(childNextInFlow); - NS_ASSERTION(nsnull == childNextInFlow, "bad child flow list"); - } - } - - // Return our desired size - aDesiredSize.width = aReflowState.maxSize.width; - aDesiredSize.height = aReflowState.maxSize.height; - } - - // We are always a pseudo-frame; make sure our content offset is - // properly pushed upwards - nsContainerFrame* parent = (nsContainerFrame*) mGeometricParent; - parent->PropagateContentOffsets(this, mFirstContentOffset, - mLastContentOffset, mLastContentIsComplete); - -#ifdef NS_DEBUG - PostReflowCheck(aStatus); -#endif - return NS_OK; -} - -NS_METHOD -nsPageFrame::CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame) -{ - nsPageFrame* cf = new nsPageFrame(mContent, aParent); - if (nsnull == cf) { - return NS_ERROR_OUT_OF_MEMORY; - } - PrepareContinuingFrame(aPresContext, aParent, aStyleContext, cf); - aContinuingFrame = cf; - return NS_OK; -} - -NS_METHOD nsPageFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - nsContainerFrame::Paint(aPresContext, aRenderingContext, aDirtyRect); - - // For the time being paint a border around the page so we know - // where each page begins and ends - aRenderingContext.SetColor(NS_RGB(0, 0, 0)); - aRenderingContext.DrawRect(0, 0, mRect.width, mRect.height); - return NS_OK; -} - -NS_METHOD nsPageFrame::ListTag(FILE* out) const -{ - fprintf(out, "*PAGE@%p", this); - return NS_OK; -} - diff --git a/mozilla/layout/generic/nsPageFrame.h b/mozilla/layout/generic/nsPageFrame.h deleted file mode 100644 index 4e2913e3b9d..00000000000 --- a/mozilla/layout/generic/nsPageFrame.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsPageFrame_h___ -#define nsPageFrame_h___ - -#include "nsHTMLContainerFrame.h" - -// Pseudo frame created by the root content frame -class nsPageFrame : public nsContainerFrame { -public: - nsPageFrame(nsIContent* aContent, nsIFrame* aParent); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aMaxSize, - nsReflowStatus& aStatus); - - NS_IMETHOD CreateContinuingFrame(nsIPresContext* aCX, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame); - - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - - // Debugging - NS_IMETHOD ListTag(FILE* out = stdout) const; - -protected: - void CreateFirstChild(nsIPresContext* aPresContext); -}; - -#endif /* nsPageFrame_h___ */ - diff --git a/mozilla/layout/generic/nsPlaceholderFrame.cpp b/mozilla/layout/generic/nsPlaceholderFrame.cpp deleted file mode 100644 index 8e492acffb3..00000000000 --- a/mozilla/layout/generic/nsPlaceholderFrame.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsPlaceholderFrame.h" -#include "nsIContent.h" -#include "nsIContentDelegate.h" -#include "nsIFloaterContainer.h" -#include "nsBodyFrame.h" -#include "nsIStyleContext.h" -#include "nsCSSLayout.h" -#include "nsIView.h" -#include "nsHTMLIIDs.h" - -nsresult -nsPlaceholderFrame::NewFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIFrame* it = new nsPlaceholderFrame(aContent, aParent); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - *aInstancePtrResult = it; - return NS_OK; -} - -nsPlaceholderFrame::nsPlaceholderFrame(nsIContent* aContent, nsIFrame* aParent) - : nsFrame(aContent, aParent) -{ -} - -nsPlaceholderFrame::~nsPlaceholderFrame() -{ -} - -NS_IMETHODIMP -nsPlaceholderFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - // Get the floater container in which we're inserted - nsIFrame* containingBlock; - nsIFloaterContainer* container = nsnull; - - for (containingBlock = mGeometricParent; - nsnull != containingBlock; - containingBlock->GetGeometricParent(containingBlock)) - { - if (NS_OK == containingBlock->QueryInterface(kIFloaterContainerIID, (void**)&container)) { - break; - } - } - NS_ASSERTION(nsnull != container, "no floater container"); - - // Have we created the anchored item yet? - if (nsnull == mAnchoredItem) { - // If the content object is a container then wrap it in a body pseudo-frame - - // XXX begin hack - // XXX More hack. We don't want to blindly wrap a body pseudo-frame around - // a table content object, because the body pseudo-frame will map the table's - // content children rather than create a table frame and let it map the - // children... - PRBool select = PR_FALSE; - nsIAtom* atom = mContent->GetTag(); - nsAutoString tmp; - if (nsnull != atom) { - atom->ToString(tmp); - if (tmp.EqualsIgnoreCase("select") || - tmp.EqualsIgnoreCase("table")) { - select = PR_TRUE; - } - NS_RELEASE(atom); - } - // XXX end hack - - if (mContent->CanContainChildren() && !select) { - nsBodyFrame::NewFrame(&mAnchoredItem, mContent, this); - - // Use our style context for the pseudo-frame - mAnchoredItem->SetStyleContext(aPresContext, mStyleContext); - } else { - // Create the anchored item - nsIContentDelegate* delegate = mContent->GetDelegate(aPresContext); - nsresult rv = delegate->CreateFrame(aPresContext, mContent, - mGeometricParent, mStyleContext, - mAnchoredItem); - NS_RELEASE(delegate); - if (NS_OK != rv) { - return rv; - } - } - - // Notify our containing block that there's a new floater - container->AddFloater(aPresContext, aReflowState, mAnchoredItem, this); - - } else { - // XXX This causes anchored-items sizes to get fixed up; this is - // not quite right because this class should be implementing one - // of the incremental reflow methods and propagating things down - // properly to the contained frame. - nsReflowMetrics desiredSize(nsnull); - nsReflowState reflowState(mAnchoredItem, aReflowState, aReflowState.maxSize, - eReflowReason_Resize); - mAnchoredItem->WillReflow(*aPresContext); - mAnchoredItem->Reflow(aPresContext, desiredSize, reflowState, aStatus); - mAnchoredItem->SizeTo(desiredSize.width, desiredSize.height); - -//XXXdeprecated container->PlaceFloater(aPresContext, mAnchoredItem, this); - mAnchoredItem->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - } - - return nsFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); -} - -NS_IMETHODIMP nsPlaceholderFrame::ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) -{ - NS_ASSERTION(mContent == aContainer, "bad content-appended target"); - - // Forward the notification to the floater - if (nsnull != mAnchoredItem) { - return mAnchoredItem->ContentAppended(aShell, aPresContext, aContainer); - } - - return NS_OK; -} - -NS_IMETHODIMP nsPlaceholderFrame::ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-inserted target"); - - // Forward the notification to the floater - if (nsnull != mAnchoredItem) { - return mAnchoredItem->ContentInserted(aShell, aPresContext, aContainer, - aChild, aIndexInParent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsPlaceholderFrame::ContentReplaced(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-replaced target"); - - // Forward the notification to the floater - if (nsnull != mAnchoredItem) { - return mAnchoredItem->ContentReplaced(aShell, aPresContext, aContainer, - aOldChild, aNewChild, aIndexInParent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsPlaceholderFrame::ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-deleted target"); - - // Forward the notification to the floater - if (nsnull != mAnchoredItem) { - return mAnchoredItem->ContentDeleted(aShell, aPresContext, aContainer, - aChild, aIndexInParent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsPlaceholderFrame::ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent) -{ - NS_ASSERTION(mContent == aChild, "bad content-changed target"); - - // Forward the notification to the floater - if (nsnull != mAnchoredItem) { - return mAnchoredItem->ContentChanged(aShell, aPresContext, aChild, aSubContent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsPlaceholderFrame::ListTag(FILE* out) const -{ - fputs("*placeholder", out); - PRInt32 contentIndex; - GetContentIndex(contentIndex); - fprintf(out, "(%d)@%p", contentIndex, this); - return NS_OK; -} diff --git a/mozilla/layout/generic/nsPlaceholderFrame.h b/mozilla/layout/generic/nsPlaceholderFrame.h deleted file mode 100644 index 82378033c32..00000000000 --- a/mozilla/layout/generic/nsPlaceholderFrame.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsPlaceholderFrame_h___ -#define nsPlaceholderFrame_h___ - -#include "nsFrame.h" - -// Implementation of a frame that's used as a placeholder for an anchored item -class nsPlaceholderFrame : public nsFrame { -public: - /** - * Create a new placeholder frame - */ - static nsresult NewFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent); - - // Returns the associated anchored item - nsIFrame* GetAnchoredItem() const {return mAnchoredItem;} - - // nsIFrame overrides - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer); - NS_IMETHOD ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentReplaced(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent); - - NS_IMETHOD ListTag(FILE* out = stdout) const; - -protected: - nsIFrame* mAnchoredItem; - - // Constructor. Takes as arguments the content object and the Frame for - // the content parent - nsPlaceholderFrame(nsIContent* aContent, nsIFrame* aParent); - virtual ~nsPlaceholderFrame(); -}; - -#endif /* nsPlaceholderFrame_h___ */ diff --git a/mozilla/layout/generic/nsSelection.cpp b/mozilla/layout/generic/nsSelection.cpp deleted file mode 100644 index 4f36d8b703e..00000000000 --- a/mozilla/layout/generic/nsSelection.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsSelection.h" -#include "nsISelection.h" - -NS_LAYOUT nsresult -NS_NewSelection(nsISelection** aInstancePtrResult) -{ - static NS_DEFINE_IID(kISelectionIID, NS_ISELECTION_IID); - nsSelection * sel = new nsSelection(); - return sel->QueryInterface(kISelectionIID, (void**) aInstancePtrResult); -} - -nsresult nsSelection::QueryInterface(const nsIID& aIID, - void** aInstancePtrResult) -{ - static NS_DEFINE_IID(kISelectionIID, NS_ISELECTION_IID); - NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kISelectionIID)) { - *aInstancePtrResult = (void*) ((nsISelection*)this); - AddRef(); - return NS_OK; - } - return !NS_OK; -} - -nsSelection::nsSelection() { - NS_INIT_REFCNT(); - mRange = new nsSelectionRange(); -} - -nsSelection::~nsSelection() { - delete mRange; -} - -NS_IMPL_ADDREF(nsSelection) -NS_IMPL_RELEASE(nsSelection) - -/** - * Returns whether there is a valid selection - */ -PRBool nsSelection::IsValidSelection() { - return (PRBool)(mRange->GetStartContent() == nsnull || - mRange->GetEndContent() == nsnull); - -} - - -/** - * Clears the current selection (invalidates the selection) - */ -void nsSelection::ClearSelection() { - mRange->GetStartPoint()->SetPoint(nsnull, -1, PR_TRUE); - mRange->GetEndPoint()->SetPoint(nsnull, -1, PR_TRUE); -} - - - -/** - * Copies the data from one nsSelectionPoint in the range to another, - * it does NOT just assign the pointers - */ -void nsSelection::SetRange(nsSelectionRange * aSelectionRange) { - mRange->SetRange(aSelectionRange->GetStartPoint(), - aSelectionRange->GetEndPoint()); -} - -/** - * Copies the data from one nsSelectionPoint in the range to another, - * it does NOT just assign the pointers - */ -void nsSelection::GetRange(nsSelectionRange * aSelectionRange) { - mRange->SetRange(aSelectionRange->GetStartPoint(), - aSelectionRange->GetEndPoint()); -} - - -/** - * For debug only, it potentially leaks memory - */ -char * nsSelection::ToString() { - return mRange->ToString();; -} - diff --git a/mozilla/layout/generic/nsSpaceManager.cpp b/mozilla/layout/generic/nsSpaceManager.cpp deleted file mode 100644 index 0ef29a7a04f..00000000000 --- a/mozilla/layout/generic/nsSpaceManager.cpp +++ /dev/null @@ -1,1070 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsSpaceManager.h" -#include "nsPoint.h" -#include "nsRect.h" -#include "nsSize.h" -#include -#include "nsVoidArray.h" - -static NS_DEFINE_IID(kISpaceManagerIID, NS_ISPACEMANAGER_IID); - -PR_CALLBACK PLHashNumber -NS_HashNumber(const void* key) -{ - return (PLHashNumber)key; -} - -PR_CALLBACK PRIntn -NS_RemoveFrameInfoEntries(PLHashEntry* he, PRIntn i, void* arg) -{ - nsSpaceManager::FrameInfo* frameInfo = (nsSpaceManager::FrameInfo*)he->value; - - NS_ASSERTION(nsnull != frameInfo, "null frameInfo"); - delete frameInfo; - return HT_ENUMERATE_REMOVE; -} - -///////////////////////////////////////////////////////////////////////////// -// BandList - -nsSpaceManager::BandList::BandList() - : BandRect(-1, -1, -1, -1, (nsIFrame*)nsnull) -{ - PR_INIT_CLIST(this); - numFrames = 0; -} - -void nsSpaceManager::BandList::Clear() -{ - if (!IsEmpty()) { - BandRect* bandRect = Head(); - - while (bandRect != this) { - BandRect* next = bandRect->Next(); - - delete bandRect; - bandRect = next; - } - - PR_INIT_CLIST(this); - } -} - - -///////////////////////////////////////////////////////////////////////////// -// nsSpaceManager - -nsSpaceManager::nsSpaceManager(nsIFrame* aFrame) - : mFrame(aFrame) -{ - NS_INIT_REFCNT(); - mX = mY = 0; - mFrameInfoMap = nsnull; -} - -void nsSpaceManager::ClearFrameInfo() -{ - if (nsnull != mFrameInfoMap) { - PL_HashTableEnumerateEntries(mFrameInfoMap, NS_RemoveFrameInfoEntries, 0); - PL_HashTableDestroy(mFrameInfoMap); - mFrameInfoMap = nsnull; - } -} - -nsSpaceManager::~nsSpaceManager() -{ - mBandList.Clear(); - ClearFrameInfo(); -} - -NS_IMPL_ISUPPORTS(nsSpaceManager, kISpaceManagerIID); - -nsIFrame* nsSpaceManager::GetFrame() const -{ - return mFrame; -} - -void nsSpaceManager::Translate(nscoord aDx, nscoord aDy) -{ - mX += aDx; - mY += aDy; -} - -void nsSpaceManager::GetTranslation(nscoord& aX, nscoord& aY) const -{ - aX = mX; - aY = mY; -} - -nscoord nsSpaceManager::YMost() const -{ - nscoord yMost; - - if (mBandList.IsEmpty()) { - yMost = 0; - } else { - BandRect* lastRect = mBandList.Tail(); - - yMost = lastRect->bottom; - } - - return yMost; -} - -/** - * Internal function that returns the list of available and unavailable space - * within the band - * - * @param aBand the first rect in the band - * @param aY the y-offset in world coordinates - * @param aMaxSize the size to use to constrain the band data - * @param aAvailableBand - */ -PRInt32 nsSpaceManager::GetBandAvailableSpace(const BandRect* aBand, - nscoord aY, - const nsSize& aMaxSize, - nsBandData& aBandData) const -{ - nscoord topOfBand = aBand->top; - nscoord localY = aY - mY; - nscoord height = PR_MIN(aBand->bottom - aY, aMaxSize.height); - nsBandTrapezoid* trapezoid = aBandData.trapezoids; - nscoord rightEdge = mX + aMaxSize.width; - - // Initialize the band data - aBandData.count = 0; - - // Skip any rectangles that are to the left of the local coordinate space - while (aBand->top == topOfBand) { - if (aBand->right > mX) { - break; - } - - // Get the next rect in the band - aBand = aBand->Next(); - } - - // This is used to track the current x-location within the band. This is in - // world coordinates - nscoord left = mX; - - // Process the remaining rectangles that are within the clip width - while ((aBand->top == topOfBand) && (aBand->left < rightEdge)) { - // Compare the left edge of the occupied space with the current left - // coordinate - if (aBand->left > left) { - // The rect is to the right of our current left coordinate, so we've - // found some available space - trapezoid->state = nsBandTrapezoid::Available; - trapezoid->frame = nsnull; - - // Assign the trapezoid a rectangular shape. The trapezoid must be in the - // local coordinate space, so convert the current left coordinate - *trapezoid = nsRect(left - mX, localY, aBand->left - left, height); - - // Move to the next output rect - trapezoid++; - aBandData.count++; - } - - // The rect represents unavailable space, so add another trapezoid - if (1 == aBand->numFrames) { - trapezoid->state = nsBandTrapezoid::Occupied; - trapezoid->frame = aBand->frame; - } else { - NS_ASSERTION(aBand->numFrames > 1, "unexpected frame count"); - trapezoid->state = nsBandTrapezoid::OccupiedMultiple; - trapezoid->frames = aBand->frames; - } - - nscoord x = aBand->left; - // The first band can straddle the clip rect - if (x < mX) { - // Clip the left edge - x = mX; - } - - // Assign the trapezoid a rectangular shape. The trapezoid must be in the - // local coordinate space, so convert the rects's left coordinate - *trapezoid = nsRect(x - mX, localY, aBand->right - x, height); - - // Move to the next output rect - trapezoid++; - aBandData.count++; - - // Adjust our current x-location within the band - left = aBand->right; - - // Move to the next rect within the band - aBand = aBand->Next(); - } - - // No more rects left in the band. If we haven't yet reached the right edge, - // then all the remaining space is available - if (left < rightEdge) { - trapezoid->state = nsBandTrapezoid::Available; - trapezoid->frame = nsnull; - - // Assign the trapezoid a rectangular shape. The trapezoid must be in the - // local coordinate space, so convert the current left coordinate - *trapezoid = nsRect(left - mX, localY, rightEdge - left, height); - aBandData.count++; - } - - return aBandData.count; -} - -PRInt32 nsSpaceManager::GetBandData(nscoord aYOffset, - const nsSize& aMaxSize, - nsBandData& aBandData) const -{ - // Convert the y-offset to world coordinates - nscoord y = mY + aYOffset; - - // If there are no unavailable rects or the offset is below the bottommost - // band, then all the space is available - if (y >= YMost()) { - // All the requested space is available - aBandData.count = 1; - aBandData.trapezoids[0] = nsRect(0, aYOffset, aMaxSize.width, aMaxSize.height); - aBandData.trapezoids[0].state = nsBandTrapezoid::Available; - aBandData.trapezoids[0].frame = nsnull; - } else { - // Find the first band that contains the y-offset or is below the y-offset - NS_ASSERTION(!mBandList.IsEmpty(), "no bands"); - BandRect* band = mBandList.Head(); - - aBandData.count = 0; - while (nsnull != band) { - if (band->top > y) { - // The band is below the y-offset. The area between the y-offset and - // the top of the band is available - aBandData.count = 1; - aBandData.trapezoids[0] = - nsRect(0, aYOffset, aMaxSize.width, PR_MIN(band->top - y, aMaxSize.height)); - aBandData.trapezoids[0].state = nsBandTrapezoid::Available; - aBandData.trapezoids[0].frame = nsnull; - break; - } else if (y < band->bottom) { - // The band contains the y-offset. Return a list of available and - // unavailable rects within the band - return GetBandAvailableSpace(band, y, aMaxSize, aBandData); - } else { - // Skip to the next band - band = GetNextBand(band); - } - } - } - - NS_POSTCONDITION(aBandData.count > 0, "unexpected band data count"); - return aBandData.count; -} - -/** - * Skips to the start of the next band. - * - * @param aBandRect A rect within the band - * @returns The start of the next band, or nsnull of this is the last band. - */ -nsSpaceManager::BandRect* nsSpaceManager::GetNextBand(const BandRect* aBandRect) const -{ - nscoord topOfBand = aBandRect->top; - - aBandRect = aBandRect->Next(); - while (aBandRect != &mBandList) { - // Check whether this rect is part of the same band - if (aBandRect->top != topOfBand) { - // We found the start of the next band - return (BandRect*)aBandRect; - } - - aBandRect = aBandRect->Next(); - } - - // No bands left - return nsnull; -} - -/** - * Divides the current band into two vertically - * - * @param aBandRect the first rect in the band - * @param aBottom where to split the band. This becomes the bottom of the top - * part - */ -void nsSpaceManager::DivideBand(BandRect* aBandRect, nscoord aBottom) -{ - NS_PRECONDITION(aBottom < aBandRect->bottom, "bad height"); - nscoord topOfBand = aBandRect->top; - BandRect* nextBand = GetNextBand(aBandRect); - - if (nsnull == nextBand) { - nextBand = (BandRect*)&mBandList; - } - - while (topOfBand == aBandRect->top) { - // Split the band rect into two vertically - BandRect* bottomBandRect = aBandRect->SplitVertically(aBottom); - - // Insert the new bottom part - nextBand->InsertBefore(bottomBandRect); - - // Move to the next rect in the band - aBandRect = aBandRect->Next(); - } -} - -PRBool nsSpaceManager::CanJoinBands(BandRect* aBand, BandRect* aPrevBand) -{ - PRBool result; - nscoord topOfBand = aBand->top; - nscoord topOfPrevBand = aPrevBand->top; - - // The bands can be joined if: - // - they're adjacent - // - they have the same number of rects - // - each rect has the same left and right edge as its corresponding rect, and - // the rects are occupied by the same frames - if (aPrevBand->bottom == aBand->top) { - // Compare each of the rects in the two bands - while (PR_TRUE) { - if ((aBand->left != aPrevBand->left) || (aBand->right != aPrevBand->right)) { - // The rects have different edges - result = PR_FALSE; - break; - } - - if (!aBand->HasSameFrameList(aPrevBand)) { - // The rects are occupied by different frames - result = PR_FALSE; - break; - } - - // Move to the next rects within the bands - aBand = aBand->Next(); - aPrevBand = aPrevBand->Next(); - - // Have we reached the end of either band? - PRBool endOfBand = aBand->top != topOfBand; - PRBool endOfPrevBand = aPrevBand->top != topOfPrevBand; - - if (endOfBand || endOfPrevBand) { - result = endOfBand & endOfPrevBand; - break; // all done - } - } - - } else { - // The bands aren't adjacent - result = PR_FALSE; - } - - return result; -} - -/** - * Tries to join the two adjacent bands. Returns PR_TRUE if successful and - * PR_FALSE otherwise - * - * If the two bands are joined, the previous band is the the band that's deleted - */ -PRBool nsSpaceManager::JoinBands(BandRect* aBand, BandRect* aPrevBand) -{ - if (CanJoinBands(aBand, aPrevBand)) { - BandRect* startOfNextBand = aBand; - - while (aPrevBand != startOfNextBand) { - // Adjust the top of the band we're keeping, and then move to the next - // rect within the band - aBand->top = aPrevBand->top; - aBand = aBand->Next(); - - // Delete the rect from the previous band - BandRect* next = aPrevBand->Next(); - - aPrevBand->Remove(); - delete aPrevBand; - aPrevBand = next; - } - - return PR_TRUE; - } - - return PR_FALSE; -} - -/** - * Adds a new rect to a band. - * - * @param aBand the first rect in the band - * @param aBandRect the band rect to add to the band - */ -void nsSpaceManager::AddRectToBand(BandRect* aBand, - BandRect* aBandRect) -{ - NS_PRECONDITION((aBand->top == aBandRect->top) && - (aBand->bottom == aBandRect->bottom), "bad band"); - NS_PRECONDITION(1 == aBandRect->numFrames, "shared band rect"); - nscoord topOfBand = aBand->top; - - // Figure out where in the band horizontally to insert the rect - do { - // Compare the left edge of the new rect with the left edge of the existing - // rect - if (aBandRect->left < aBand->left) { - // The new rect's left edge is to the left of the existing rect's left edge. - // Could be any of these cases (N is new rect, E is existing rect): - // - // Case 1: left-of Case 2: overlaps Case 3: N.contains(E) - // --------------- ---------------- --------------------- - // +-----+ +-----+ +-----+ +---------+ - // | N | | E | | N | | N | - // +-----+ +-----+ +-----+ +---------+ - // +-----+ +---+ - // | E | | E | - // +-----+ +---+ - // - // Do the two rectangles overlap? - if (aBandRect->right <= aBand->left) { - // No, the new rect is completely to the left of the existing rect - // (case #1). Insert a new rect - aBand->InsertBefore(aBandRect); - return; - } - - // Yes, they overlap. Compare the right edges. - if (aBandRect->right > aBand->right) { - // The new rect's right edge is to the right of the existing rect's - // right edge (case #3). Split the new rect - BandRect* r1 = aBandRect->SplitHorizontally(aBand->left); - - // Insert the part of the new rect that's to the left of the existing - // rect as a new band rect - aBand->InsertBefore(aBandRect); - - // Continue below with the part that overlaps the existing rect - aBandRect = r1; - - } else { - if (aBand->right > aBandRect->right) { - // The existing rect extends past the new rect (case #2). Split the - // existing rect - BandRect* r1 = aBand->SplitHorizontally(aBandRect->right); - - // Insert the new right half of the existing rect - aBand->InsertAfter(r1); - } - - // Insert the part of the new rect that's to the left of the existing - // rect - aBandRect->right = aBand->left; - aBand->InsertBefore(aBandRect); - - // Mark the existing rect as shared - aBand->AddFrame(aBandRect->frame); - return; - } - } - - if (aBandRect->left > aBand->left) { - // The new rect's left edge is to the right of the existing rect's left - // edge. Could be any one of these cases: - // - // Case 4: right-of Case 5: overlaps Case 6: E.Contains(N) - // --------------- ---------------- --------------------- - // +-----+ +-----+ +-----+ +------------+ - // | E | | N | | E | | E | - // +-----+ +-----+ +-----+ +------------+ - // +-----+ +-----+ - // | N | | N | - // +-----+ +-----+ - // - if (aBandRect->left >= aBand->right) { - // The new rect is to the right of the existing rect (case #4), so move - // to the next rect in the band - aBand = aBand->Next(); - continue; - } - - // The rects overlap, so divide the existing rect into two rects: the - // part to the left of the new rect, and the part that overlaps - BandRect* r1 = aBand->SplitHorizontally(aBandRect->left); - - // Insert the new right half of the existing rect, and make it the current - // rect - aBand->InsertAfter(r1); - aBand = r1; - } - - // At this point the left edge of the new rect is the same as the left edge - // of the existing rect - NS_ASSERTION(aBandRect->left == aBand->left, "unexpected rect"); - - // Compare which rect is wider, the new rect or the existing rect - if (aBand->right > aBandRect->right) { - // The existing rect is wider (case #6). Divide the existing rect into - // two rects: the part that overlaps, and the part to the right of the - // new rect - BandRect* r1 = aBand->SplitHorizontally(aBandRect->right); - - // Insert the new right half of the existing rect - aBand->InsertAfter(r1); - - // Mark the overlap as being shared - aBand->AddFrame(aBandRect->frame); - return; - - } else { - // Indicate the frames share the existing rect - aBand->AddFrame(aBandRect->frame); - - if (aBand->right == aBandRect->right) { - // The new and existing rect have the same right edge. We're all done, - // and the new band rect is no longer needed - delete aBandRect; - return; - } else { - // The new rect is wider than the existing rect (cases #5). Set the - // new rect to be the overhang, and move to the next rect within the band - aBandRect->left = aBand->right; - aBand = aBand->Next(); - continue; - } - } - } while (aBand->top == topOfBand); - - // Insert a new rect - aBand->InsertBefore(aBandRect); -} - -// When comparing a rect to a band there are seven cases to consider. -// 'R' is the rect and 'B' is the band. -// -// Case 1 Case 2 Case 3 Case 4 -// ------ ------ ------ ------ -// +-----+ +-----+ +-----+ +-----+ -// | R | | R | +-----+ +-----+ | | | | -// +-----+ +-----+ | | | R | | B | | B | -// +-----+ | B | +-----+ | | +-----+ | | -// | | | | +-----+ | R | +-----+ -// | B | +-----+ +-----+ -// | | -// +-----+ -// -// -// -// Case 5 Case 6 Case 7 -// ------ ------ ------ -// +-----+ +-----+ +-----+ +-----+ -// | | | R | | B | | | +-----+ -// | B | +-----+ +-----+ | R | | B | -// | | | | +-----+ -// +-----+ +-----+ -// +-----+ -// | R | -// +-----+ -// -void nsSpaceManager::InsertBandRect(BandRect* aBandRect) -{ - // If there are no existing bands or this rect is below the bottommost - // band, then add a new band - if (aBandRect->top >= YMost()) { - mBandList.Append(aBandRect); - return; - } - - // Examine each band looking for a band that intersects this rect - NS_ASSERTION(!mBandList.IsEmpty(), "no bands"); - BandRect* band = mBandList.Head(); - - while (nsnull != band) { - // Compare the top edge of this rect with the top edge of the band - if (aBandRect->top < band->top) { - // The top edge of the rect is above the top edge of the band. - // Is there any overlap? - if (aBandRect->bottom <= band->top) { - // Case #1. This rect is completely above the band, so insert a - // new band before the current band - band->InsertBefore(aBandRect); - break; // we're all done - } - - // Case #2 and case #7. Divide this rect, creating a new rect for - // the part that's above the band - BandRect* bandRect1 = new BandRect(aBandRect->left, aBandRect->top, - aBandRect->right, band->top, - aBandRect->frame); - - // Insert bandRect1 as a new band - band->InsertBefore(bandRect1); - - // Modify this rect to exclude the part above the band - aBandRect->top = band->top; - - } else if (aBandRect->top > band->top) { - // The top edge of the rect is below the top edge of the band. Is there - // any overlap? - if (aBandRect->top >= band->bottom) { - // Case #5. This rect is below the current band. Skip to the next band - band = GetNextBand(band); - continue; - } - - // Case #3 and case #4. Divide the current band into two bands with the - // top band being the part that's above the rect - DivideBand(band, aBandRect->top); - - // Skip to the bottom band that we just created - band = GetNextBand(band); - } - - // At this point the rect and the band should have the same y-offset - NS_ASSERTION(aBandRect->top == band->top, "unexpected band"); - - // Is the band higher than the rect? - if (band->bottom > aBandRect->bottom) { - // Divide the band into two bands with the top band the same height - // as the rect - DivideBand(band, aBandRect->bottom); - } - - if (aBandRect->bottom == band->bottom) { - // Add the rect to the band - AddRectToBand(band, aBandRect); - break; - - } else { - // Case #4 and case #7. The rect contains the band vertically. Divide - // the rect, creating a new rect for the part that overlaps the band - BandRect* bandRect1 = new BandRect(aBandRect->left, aBandRect->top, - aBandRect->right, band->bottom, - aBandRect->frame); - - // Add bandRect1 to the band - AddRectToBand(band, bandRect1); - - // Modify aBandRect to be the part below the band - aBandRect->top = band->bottom; - - // Continue with the next band - band = GetNextBand(band); - if (nsnull == band) { - // Append a new bottommost band - mBandList.Append(aBandRect); - break; - } - } - } -} - -PRBool nsSpaceManager::AddRectRegion(nsIFrame* aFrame, const nsRect& aUnavailableSpace) -{ - NS_PRECONDITION(nsnull != aFrame, "null frame"); - - // See if there is already a region associated with aFrame - FrameInfo* frameInfo = GetFrameInfoFor(aFrame); - - if (nsnull != frameInfo) { - NS_WARNING("aFrame is already associated with a region"); - return PR_FALSE; - } - - // Convert the frame to world coordinates - nsRect rect(aUnavailableSpace.x + mX, aUnavailableSpace.y + mY, - aUnavailableSpace.width, aUnavailableSpace.height); - - // Verify that the offset is within the defined coordinate space - if ((rect.x < 0) || (rect.y < 0)) { - NS_WARNING("invalid offset for rect region"); - return PR_FALSE; - } - - // Create a frame info structure - frameInfo = CreateFrameInfo(aFrame, rect); - - // Is the rect empty? - if (aUnavailableSpace.IsEmpty()) { - // The rect doesn't consume any space, so don't add any band data - return PR_TRUE; - } - - // Allocate a band rect - BandRect* bandRect = new BandRect(rect.x, rect.y, rect.XMost(), rect.YMost(), aFrame); - - // Insert the band rect - InsertBandRect(bandRect); - return PR_TRUE; -} - -PRBool nsSpaceManager::ResizeRectRegion(nsIFrame* aFrame, - nscoord aDeltaWidth, - nscoord aDeltaHeight, - AffectedEdge aEdge) -{ - // Get the frame info associated with with aFrame - FrameInfo* frameInfo = GetFrameInfoFor(aFrame); - - if (nsnull == frameInfo) { - NS_WARNING("no region associated with aFrame"); - return PR_FALSE; - } - - nsRect rect(frameInfo->rect); - rect.SizeBy(aDeltaWidth, aDeltaHeight); - if (aEdge == LeftEdge) { - rect.x += aDeltaWidth; - } - - // Verify that the offset is within the defined coordinate space - if ((rect.x < 0) || (rect.y < 0)) { - NS_WARNING("invalid offset when resizing rect region"); - return PR_FALSE; - } - - // For the time being just remove it and add it back in - RemoveRegion(aFrame); - return AddRectRegion(aFrame, rect); -} - -PRBool nsSpaceManager::OffsetRegion(nsIFrame* aFrame, nscoord aDx, nscoord aDy) -{ - // Get the frame info associated with with aFrame - FrameInfo* frameInfo = GetFrameInfoFor(aFrame); - - if (nsnull == frameInfo) { - NS_WARNING("no region associated with aFrame"); - return PR_FALSE; - } - - nsRect rect(frameInfo->rect); - rect.MoveBy(aDx, aDy); - - // Verify that the offset is within the defined coordinate space - if ((rect.x < 0) || (rect.y < 0)) { - NS_WARNING("invalid offset when offseting rect region"); - return PR_FALSE; - } - - // For the time being just remove it and add it back in - RemoveRegion(aFrame); - return AddRectRegion(aFrame, rect); -} - -PRBool nsSpaceManager::RemoveRegion(nsIFrame* aFrame) -{ - // Get the frame info associated with aFrame - FrameInfo* frameInfo = GetFrameInfoFor(aFrame); - - if (nsnull == frameInfo) { - NS_WARNING("no region associated with aFrame"); - return PR_FALSE; - } - - if (!frameInfo->rect.IsEmpty()) { - NS_ASSERTION(!mBandList.IsEmpty(), "no bands"); - BandRect* band = mBandList.Head(); - BandRect* prevBand = nsnull; - PRBool prevFoundMatchingRect = PR_FALSE; - - // Iterate each band looking for rects tagged with aFrame - while (nsnull != band) { - BandRect* rect = band; - BandRect* prevRect = nsnull; - nscoord topOfBand = band->top; - PRBool foundMatchingRect = PR_FALSE; - PRBool prevIsSharedRect = PR_FALSE; - - // Iterate each rect in the band - do { - PRBool isSharedRect = PR_FALSE; - - if (rect->IsOccupiedBy(aFrame)) { - // Remember that we found a matching rect in this band - foundMatchingRect = PR_TRUE; - - if (rect->numFrames > 1) { - // The band rect is occupied by more than one frame - rect->RemoveFrame(aFrame); - - // Remember that this rect was being shared by more than one frame - // including aFrame - isSharedRect = PR_TRUE; - } else { - // The rect isn't shared so just delete it - BandRect* next = rect->Next(); - rect->Remove(); - if (rect == band) { - // The rect we're deleting is the start of the band - if (topOfBand == next->top) { - band = next; - } else { - band = nsnull; - } - } - delete rect; - rect = next; - - // We don't need to try and coalesce adjacent rects in this case - prevRect = nsnull; - prevIsSharedRect = PR_FALSE; - continue; - } - } - - // If we found a shared rect occupied by aFrame, then we need to try - // and coalesce adjacent rects - if (prevIsSharedRect || (isSharedRect && (nsnull != prevRect))) { - NS_ASSERTION(nsnull != prevRect, "no previous rect"); - if ((prevRect->right == rect->left) && (prevRect->HasSameFrameList(rect))) { - // Modify the current rect's left edge, and delete the previous rect - rect->left = prevRect->left; - prevRect->Remove(); - if (prevRect == band) { - // the rect we're deleting is the start of the band - band = rect; - } - delete prevRect; - } - } - - // Get the next rect in the band - prevRect = rect; - prevIsSharedRect = isSharedRect; - rect = rect->Next(); - } while (rect->top == topOfBand); - - if (nsnull != band) { - // If we found a rect occupied by aFrame in this band or the previous band - // then try to join the two bands - if ((nsnull != prevBand) && (foundMatchingRect || prevFoundMatchingRect)) { - // Try and join this band with the previous band - JoinBands(band, prevBand); - } - } - - // Move to the next band - prevFoundMatchingRect = foundMatchingRect; - prevBand = band; - band = (rect == &mBandList) ? nsnull : rect; - } - } - - DestroyFrameInfo(frameInfo); - return PR_TRUE; -} - -void nsSpaceManager::ClearRegions() -{ - ClearFrameInfo(); - mBandList.Clear(); -} - -nsSpaceManager::FrameInfo* nsSpaceManager::GetFrameInfoFor(nsIFrame* aFrame) -{ - FrameInfo* result = nsnull; - - if (nsnull != mFrameInfoMap) { - result = (FrameInfo*)PL_HashTableLookup(mFrameInfoMap, (const void*)aFrame); - } - - return result; -} - -nsSpaceManager::FrameInfo* nsSpaceManager::CreateFrameInfo(nsIFrame* aFrame, - const nsRect& aRect) -{ - if (nsnull == mFrameInfoMap) { - mFrameInfoMap = PL_NewHashTable(17, NS_HashNumber, PL_CompareValues, - PL_CompareValues, nsnull, nsnull); - } - - FrameInfo* frameInfo = new FrameInfo(aFrame, aRect); - - PL_HashTableAdd(mFrameInfoMap, (const void*)aFrame, frameInfo); - return frameInfo; -} - -void nsSpaceManager::DestroyFrameInfo(FrameInfo* aFrameInfo) -{ - PL_HashTableRemove(mFrameInfoMap, (const void*)aFrameInfo->frame); - delete aFrameInfo; -} - -///////////////////////////////////////////////////////////////////////////// -// FrameInfo - -nsSpaceManager::FrameInfo::FrameInfo(nsIFrame* aFrame, const nsRect& aRect) - : frame(aFrame), rect(aRect) -{ -} - -///////////////////////////////////////////////////////////////////////////// -// BandRect - -nsSpaceManager::BandRect::BandRect(nscoord aLeft, - nscoord aTop, - nscoord aRight, - nscoord aBottom, - nsIFrame* aFrame) -{ - left = aLeft; - top = aTop; - right = aRight; - bottom = aBottom; - frame = aFrame; - numFrames = 1; -} - -nsSpaceManager::BandRect::BandRect(nscoord aLeft, - nscoord aTop, - nscoord aRight, - nscoord aBottom, - nsVoidArray* aFrames) -{ - left = aLeft; - top = aTop; - right = aRight; - bottom = aBottom; - frames = new nsVoidArray; - frames->operator=(*aFrames); - numFrames = frames->Count(); -} - -nsSpaceManager::BandRect::~BandRect() -{ - if (numFrames > 1) { - delete frames; - } -} - -nsSpaceManager::BandRect* nsSpaceManager::BandRect::SplitVertically(nscoord aBottom) -{ - NS_PRECONDITION((aBottom > top) && (aBottom < bottom), "bad argument"); - - // Create a new band rect for the bottom part - BandRect* bottomBandRect; - - if (numFrames > 1) { - bottomBandRect = new BandRect(left, aBottom, right, bottom, frames); - } else { - bottomBandRect = new BandRect(left, aBottom, right, bottom, frame); - } - - // This band rect becomes the top part, so adjust the bottom edge - bottom = aBottom; - - return bottomBandRect; -} - -nsSpaceManager::BandRect* nsSpaceManager::BandRect::SplitHorizontally(nscoord aRight) -{ - NS_PRECONDITION((aRight > left) && (aRight < right), "bad argument"); - - // Create a new band rect for the right part - BandRect* rightBandRect; - - if (numFrames > 1) { - rightBandRect = new BandRect(aRight, top, right, bottom, frames); - } else { - rightBandRect = new BandRect(aRight, top, right, bottom, frame); - } - - // This band rect becomes the left part, so adjust the right edge - right = aRight; - - return rightBandRect; -} - -PRBool nsSpaceManager::BandRect::IsOccupiedBy(const nsIFrame* aFrame) const -{ - PRBool result; - - if (1 == numFrames) { - result = (frame == aFrame); - } else { - PRInt32 count = frames->Count(); - - result = PR_FALSE; - for (PRInt32 i = 0; i < count; i++) { - nsIFrame* f = (nsIFrame*)frames->ElementAt(i); - - if (f == aFrame) { - result = PR_TRUE; - break; - } - } - } - - return result; -} - -void nsSpaceManager::BandRect::AddFrame(const nsIFrame* aFrame) -{ - if (1 == numFrames) { - nsIFrame* f = frame; - frames = new nsVoidArray; - frames->AppendElement(f); - } - - numFrames++; - frames->AppendElement((void*)aFrame); - NS_POSTCONDITION(frames->Count() == numFrames, "bad frame count"); -} - -void nsSpaceManager::BandRect::RemoveFrame(const nsIFrame* aFrame) -{ - NS_PRECONDITION(numFrames > 1, "only one frame"); - frames->RemoveElement((void*)aFrame); - numFrames--; - - if (1 == numFrames) { - nsIFrame* f = (nsIFrame*)frames->ElementAt(0); - - delete frames; - frame = f; - } -} - -PRBool nsSpaceManager::BandRect::HasSameFrameList(const BandRect* aBandRect) const -{ - PRBool result; - - // Check whether they're occupied by the same number of frames - if (numFrames != aBandRect->numFrames) { - result = PR_FALSE; - } else if (1 == numFrames) { - result = frame == aBandRect->frame; - } else { - result = PR_TRUE; - - // For each frame occupying this band rect check whether it also occupies - // aBandRect - PRInt32 count = frames->Count(); - for (PRInt32 i = 0; i < count; i++) { - nsIFrame* f = (nsIFrame*)frames->ElementAt(i); - - if (-1 == aBandRect->frames->IndexOf(f)) { - result = PR_FALSE; - break; - } - } - } - - return result; -} diff --git a/mozilla/layout/generic/nsSpaceManager.h b/mozilla/layout/generic/nsSpaceManager.h deleted file mode 100644 index d09eece1719..00000000000 --- a/mozilla/layout/generic/nsSpaceManager.h +++ /dev/null @@ -1,162 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsSpaceManager_h___ -#define nsSpaceManager_h___ - -#include "nsISpaceManager.h" -#include "prclist.h" -#include "plhash.h" - -/** - * Implementation of nsISpaceManager that maintains a region data structure of - * unavailable space - */ -class nsSpaceManager : public nsISpaceManager { -public: - nsSpaceManager(nsIFrame* aFrame); - ~nsSpaceManager(); - - // nsISupports - NS_DECL_ISUPPORTS - - // nsISpaceManager - virtual nsIFrame* GetFrame() const; - - virtual void Translate(nscoord aDx, nscoord aDy); - virtual void GetTranslation(nscoord& aX, nscoord& aY) const; - virtual nscoord YMost() const; - - virtual PRInt32 GetBandData(nscoord aYOffset, - const nsSize& aMaxSize, - nsBandData& aBandData) const; - - virtual PRBool AddRectRegion(nsIFrame* aFrame, const nsRect& aUnavailableSpace); - virtual PRBool ResizeRectRegion(nsIFrame* aFrame, - nscoord aDeltaWidth, - nscoord aDeltaHeight, - AffectedEdge aEdge); - virtual PRBool OffsetRegion(nsIFrame* aFrame, nscoord aDx, nscoord aDy); - virtual PRBool RemoveRegion(nsIFrame* aFrame); - - virtual void ClearRegions(); - -protected: - // Structure that maintains information about the region associated - // with a particular frame - struct FrameInfo { - nsIFrame* const frame; - nsRect rect; // rectangular region - - FrameInfo(nsIFrame* aFrame, const nsRect& aRect); - }; - - // Doubly linked list of band rects - struct BandRect : PRCListStr { - nscoord left, top; - nscoord right, bottom; - PRIntn numFrames; // number of frames occupying this rect - union { - nsIFrame* frame; // single frame occupying the space - nsVoidArray* frames; // list of frames occupying the space - }; - - BandRect(nscoord aLeft, nscoord aTop, - nscoord aRight, nscoord aBottom, - nsIFrame*); - BandRect(nscoord aLeft, nscoord aTop, - nscoord aRight, nscoord aBottom, - nsVoidArray*); - ~BandRect(); - - // List operations - BandRect* Next() const {return (BandRect*)PR_NEXT_LINK(this);} - BandRect* Prev() const {return (BandRect*)PR_PREV_LINK(this);} - void InsertBefore(BandRect* aBandRect) {PR_INSERT_BEFORE(aBandRect, this);} - void InsertAfter(BandRect* aBandRect) {PR_INSERT_AFTER(aBandRect, this);} - void Remove() {PR_REMOVE_LINK(this);} - - // Split the band rect into two vertically, with this band rect becoming - // the top part, and a new band rect being allocated and returned for the - // bottom part - // - // Does not insert the new band rect into the linked list - BandRect* SplitVertically(nscoord aBottom); - - // Split the band rect into two horizontally, with this band rect becoming - // the left part, and a new band rect being allocated and returned for the - // right part - // - // Does not insert the new band rect into the linked list - BandRect* SplitHorizontally(nscoord aRight); - - // Accessor functions - PRBool IsOccupiedBy(const nsIFrame*) const; - void AddFrame(const nsIFrame*); - void RemoveFrame(const nsIFrame*); - PRBool HasSameFrameList(const BandRect* aBandRect) const; - }; - - // Circular linked list of band rects - struct BandList : BandRect { - BandList(); - - // Accessors - PRBool IsEmpty() const {return PR_CLIST_IS_EMPTY((PRCListStr*)this);} - BandRect* Head() const {return (BandRect*)PR_LIST_HEAD(this);} - BandRect* Tail() const {return (BandRect*)PR_LIST_TAIL(this);} - - // Operations - void Append(BandRect* aBandRect) {PR_APPEND_LINK(aBandRect, this);} - - // Remove and delete all the band rects in the list - void Clear(); - }; - - nsIFrame* const mFrame; // frame associated with the space manager - nscoord mX, mY; // translation from local to global coordinate space - BandList mBandList; // header for circular linked list of band rects - PLHashTable* mFrameInfoMap; - -protected: - FrameInfo* GetFrameInfoFor(nsIFrame* aFrame); - FrameInfo* CreateFrameInfo(nsIFrame* aFrame, const nsRect& aRect); - void DestroyFrameInfo(FrameInfo*); - - void ClearFrameInfo(); - void ClearBandRects(); - - BandRect* GetNextBand(const BandRect* aBandRect) const; - void DivideBand(BandRect* aBand, nscoord aBottom); - PRBool CanJoinBands(BandRect* aBand, BandRect* aPrevBand); - PRBool JoinBands(BandRect* aBand, BandRect* aPrevBand); - void AddRectToBand(BandRect* aBand, BandRect* aBandRect); - void InsertBandRect(BandRect* aBandRect); - - PRInt32 GetBandAvailableSpace(const BandRect* aBand, - nscoord aY, - const nsSize& aMaxSize, - nsBandData& aAvailableSpace) const; - -private: - nsSpaceManager(const nsSpaceManager&); // no implementation - void operator=(const nsSpaceManager&); // no implementation - friend PR_CALLBACK PRIntn NS_RemoveFrameInfoEntries(PLHashEntry*, PRIntn, void*); -}; - -#endif /* nsSpaceManager_h___ */ - diff --git a/mozilla/layout/html/Makefile b/mozilla/layout/html/Makefile deleted file mode 100644 index ade9e2b075b..00000000000 --- a/mozilla/layout/html/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../.. - -# Don't do tests for now -#DIRS = base document forms style table build tests -DIRS = base content document forms style table - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/html/base/Makefile b/mozilla/layout/html/base/Makefile deleted file mode 100644 index b0ff7c06fd4..00000000000 --- a/mozilla/layout/html/base/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../../.. - -DIRS = src - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/html/base/makefile.win b/mozilla/layout/html/base/makefile.win deleted file mode 100644 index 5620ead1bde..00000000000 --- a/mozilla/layout/html/base/makefile.win +++ /dev/null @@ -1,22 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. - -DIRS=src - -include <$(DEPTH)\layout\config\rules.mak> diff --git a/mozilla/layout/html/base/src/MANIFEST b/mozilla/layout/html/base/src/MANIFEST deleted file mode 100644 index 8a3e4949c85..00000000000 --- a/mozilla/layout/html/base/src/MANIFEST +++ /dev/null @@ -1,5 +0,0 @@ -# -# This is a list of local files which get copied to the mozilla:dist:layout directory -# - -nsGlobalVariables.h diff --git a/mozilla/layout/html/base/src/Makefile b/mozilla/layout/html/base/src/Makefile deleted file mode 100644 index 5768072207f..00000000000 --- a/mozilla/layout/html/base/src/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../../../.. - -LIBRARY_NAME = raptorhtmlbase_s - -# Note the sophisticated alphabetical ordering :-| -CPPSRCS = \ - nsAbsoluteFrame.cpp \ - nsBRPart.cpp \ - nsBodyFrame.cpp \ - nsBodyPart.cpp \ - nsGlobalVariables.cpp \ - nsHRPart.cpp \ - nsHTMLAtoms.cpp \ - nsHTMLBase.cpp \ - nsHTMLBullet.cpp \ - nsHTMLContainer.cpp \ - nsHTMLContainerFrame.cpp \ - nsHTMLContent.cpp \ - nsHTMLIIDs.cpp \ - nsHTMLImage.cpp \ - nsHTMLReflowCommand.cpp \ - nsHTMLTagContent.cpp \ - nsImageMap.cpp \ - nsLeafFrame.cpp \ - nsPageFrame.cpp \ - nsPlaceholderFrame.cpp \ - nsRootPart.cpp \ - nsScrollFrame.cpp \ - nsSpacerPart.cpp \ - nsTextContent.cpp \ - nsWBRPart.cpp \ - nsDOMIterator.cpp \ - nsDOMAttributes.cpp \ - $(NULL) -EXPORTS = \ - nsGlobalVariables.h \ - $(NULL) - -MODULE = raptor - -REQUIRES = xpcom raptor dom netlib js - -include $(DEPTH)/config/config.mk - -LCFLAGS += -D_IMPL_NS_HTML - -INCLUDES += -I../../style/src -I../../../base/src -I../../../css/layout/src -I. - -MKSHLIB := - -include $(DEPTH)/config/rules.mk - -install:: - $(INSTALL) broken-image.gif $(DIST)/bin/res/html diff --git a/mozilla/layout/html/base/src/broken-image.gif b/mozilla/layout/html/base/src/broken-image.gif deleted file mode 100644 index 6e734ac51b2f6c2ca3216757850159f578cc7aae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmZ?wbh9u|RA5kG_{;zX4M4J?0f-tJ4jeeZ@E^$i{~t*G2LZ4O1fc_Bg7h-5{F`vX zbM;(>*FIDJCunG0T2`8@CB&M@l%aUOB({95{mZ|k*l`BhB zw{7p>>M9ZGGg8ruvJvJK50#T}XpiOMT*A)Dlp@h!*~hYka~b=Jd5)`PixZb_VBezJ zrLn_)!v=W~X$LNj33W^NZq4=LICaqL-1!T#mzYoYD;$&V+;) zj>3K}<}dfI>*u|Scq02gN7DJrPR8$V?@w}{s21^S`9hvUp;LA48VhPHnwzwWXVngk UiHZ)Q924ReBuiXMW?`@f0Q*yf!vFvP diff --git a/mozilla/layout/html/base/src/makefile.win b/mozilla/layout/html/base/src/makefile.win deleted file mode 100644 index 0a5af7566d9..00000000000 --- a/mozilla/layout/html/base/src/makefile.win +++ /dev/null @@ -1,106 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\..\.. - -LIBRARY_NAME=raptorhtmlbase_s -MODULE=raptor -REQUIRES=xpcom raptor js -DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN - -CPPSRCS= \ - nsAbsoluteFrame.cpp \ - nsBRPart.cpp \ - nsBodyFrame.cpp \ - nsBodyPart.cpp \ - nsGlobalVariables.cpp \ - nsHRPart.cpp \ - nsHTMLAtoms.cpp \ - nsHTMLBase.cpp \ - nsHTMLBullet.cpp \ - nsHTMLContainer.cpp \ - nsHTMLContainerFrame.cpp \ - nsHTMLContent.cpp \ - nsHTMLIIDs.cpp \ - nsHTMLImage.cpp \ - nsHTMLReflowCommand.cpp \ - nsHTMLTagContent.cpp \ - nsImageMap.cpp \ - nsLeafFrame.cpp \ - nsPageFrame.cpp \ - nsPlaceholderFrame.cpp \ - nsRootPart.cpp \ - nsScrollFrame.cpp \ - nsSpacerPart.cpp \ - nsTextContent.cpp \ - nsWBRPart.cpp \ - nsDOMIterator.cpp \ - nsDOMAttributes.cpp \ - $(NULL) - -CPP_OBJS= \ - .\$(OBJDIR)\nsAbsoluteFrame.obj \ - .\$(OBJDIR)\nsBRPart.obj \ - .\$(OBJDIR)\nsBodyFrame.obj \ - .\$(OBJDIR)\nsBodyPart.obj \ - .\$(OBJDIR)\nsGlobalVariables.obj \ - .\$(OBJDIR)\nsHRPart.obj \ - .\$(OBJDIR)\nsHTMLAtoms.obj \ - .\$(OBJDIR)\nsHTMLBase.obj \ - .\$(OBJDIR)\nsHTMLBullet.obj \ - .\$(OBJDIR)\nsHTMLContainer.obj \ - .\$(OBJDIR)\nsHTMLContainerFrame.obj \ - .\$(OBJDIR)\nsHTMLContent.obj \ - .\$(OBJDIR)\nsHTMLIIDs.obj \ - .\$(OBJDIR)\nsHTMLImage.obj \ - .\$(OBJDIR)\nsHTMLReflowCommand.obj \ - .\$(OBJDIR)\nsHTMLTagContent.obj \ - .\$(OBJDIR)\nsImageMap.obj \ - .\$(OBJDIR)\nsLeafFrame.obj \ - .\$(OBJDIR)\nsPageFrame.obj \ - .\$(OBJDIR)\nsPlaceholderFrame.obj \ - .\$(OBJDIR)\nsRootPart.obj \ - .\$(OBJDIR)\nsScrollFrame.obj \ - .\$(OBJDIR)\nsSpacerPart.obj \ - .\$(OBJDIR)\nsTextContent.obj \ - .\$(OBJDIR)\nsWBRPart.obj \ - .\$(OBJDIR)\nsDOMIterator.obj \ - .\$(OBJDIR)\nsDOMAttributes.obj \ - $(NULL) - -EXPORTS=nsGlobalVariables.h - -LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I$(PUBLIC)\js \ - -I$(PUBLIC)\dom -I$(PUBLIC)\netlib \ - -I..\..\style\src -I..\..\..\css\layout\src \ - -I..\..\..\base\src - -LCFLAGS = \ - $(LCFLAGS) \ - $(DEFINES) \ - $(NULL) - -include <$(DEPTH)\layout\config\rules.mak> - -libs:: $(LIBRARY) - $(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib - -install:: - $(MAKE_INSTALL) broken-image.gif $(DIST)\bin\res\html - -clobber:: - rm -f $(DIST)\lib\$(LIBRARY_NAME).lib diff --git a/mozilla/layout/html/base/src/nsAbsoluteFrame.cpp b/mozilla/layout/html/base/src/nsAbsoluteFrame.cpp deleted file mode 100644 index 19bb568afbe..00000000000 --- a/mozilla/layout/html/base/src/nsAbsoluteFrame.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsAbsoluteFrame.h" -#include "nsBodyFrame.h" -#include "nsIAbsoluteItems.h" -#include "nsIContentDelegate.h" -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" -#include "nsHTMLIIDs.h" - -nsresult -nsAbsoluteFrame::NewFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIFrame* it = new nsAbsoluteFrame(aContent, aParent); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - *aInstancePtrResult = it; - return NS_OK; -} - -nsAbsoluteFrame::nsAbsoluteFrame(nsIContent* aContent, nsIFrame* aParent) - : nsFrame(aContent, aParent) -{ -} - -nsAbsoluteFrame::~nsAbsoluteFrame() -{ -} - -NS_IMETHODIMP nsAbsoluteFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - // Have we created the absolutely positioned item yet? - if (nsnull == mFrame) { - // If the content object is a container then wrap it in a body pseudo-frame - if (mContent->CanContainChildren()) { - nsBodyFrame::NewFrame(&mFrame, mContent, this); - - // Use our style context for the pseudo-frame - mFrame->SetStyleContext(aPresContext, mStyleContext); - - } else { - // Ask the content delegate to create the frame - nsIContentDelegate* delegate = mContent->GetDelegate(aPresContext); - - nsresult rv = delegate->CreateFrame(aPresContext, mContent, this, - mStyleContext, mFrame); - NS_RELEASE(delegate); - if (NS_OK != rv) { - return rv; - } - } - - // Get the containing block - nsIFrame* containingBlock = GetContainingBlock(); - NS_ASSERTION(nsnull != containingBlock, "no initial containing block"); - - // Query for its nsIAbsoluteItems interface - nsIAbsoluteItems* absoluteItemContainer; - containingBlock->QueryInterface(kIAbsoluteItemsIID, (void**)&absoluteItemContainer); - - // Notify it that there's a new absolutely positioned frame, passing it the - // anchor frame - NS_ASSERTION(nsnull != absoluteItemContainer, "no nsIAbsoluteItems support"); - absoluteItemContainer->AddAbsoluteItem(this); - } - - // Return our desired size as (0, 0) - return nsFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); -} - -NS_IMETHODIMP nsAbsoluteFrame::ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) -{ - NS_ASSERTION(mContent == aContainer, "bad content-appended target"); - - // Forward the notification to the absolutely positioned frame - if (nsnull != mFrame) { - return mFrame->ContentAppended(aShell, aPresContext, aContainer); - } - - return NS_OK; -} - -NS_IMETHODIMP nsAbsoluteFrame::ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-inserted target"); - - // Forward the notification to the absolutely positioned frame - if (nsnull != mFrame) { - return mFrame->ContentInserted(aShell, aPresContext, aContainer, aChild, - aIndexInParent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsAbsoluteFrame::ContentReplaced(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-replaced target"); - - // Forward the notification to the absolutely positioned frame - if (nsnull != mFrame) { - return mFrame->ContentReplaced(aShell, aPresContext, aContainer, - aOldChild, aNewChild, aIndexInParent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsAbsoluteFrame::ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-deleted target"); - - // Forward the notification to the absolutely positioned frame - if (nsnull != mFrame) { - return mFrame->ContentDeleted(aShell, aPresContext, aContainer, aChild, - aIndexInParent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsAbsoluteFrame::ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent) -{ - NS_ASSERTION(mContent == aChild, "bad content-changed target"); - - // Forward the notification to the absolutely positioned frame - if (nsnull != mFrame) { - return mFrame->ContentChanged(aShell, aPresContext, aChild, aSubContent); - } - - return NS_OK; -} - -nsIFrame* nsAbsoluteFrame::GetContainingBlock() const -{ - // Look for a containing frame that is absolutely positioned. If we don't - // find one then use the initial containg block which is the BODY - nsIFrame* lastFrame = (nsIFrame*)this; - nsIFrame* result; - - GetContentParent(result); - while (nsnull != result) { - const nsStylePosition* position; - - // Get the style data - result->GetStyleData(eStyleStruct_Position, (const nsStyleStruct*&)position); - - if (position->mPosition == NS_STYLE_POSITION_ABSOLUTE) { - break; - } - - // Get the next contentual parent - lastFrame = result; - result->GetContentParent(result); - } - - if (nsnull == result) { - // Walk back down the tree until we find a frame that supports nsIAnchoredItems - // XXX This is pretty yucky, but there isn't currently a better way to do - // this... - lastFrame->FirstChild(result); - - while (nsnull != result) { - nsIAbsoluteItems* interface; - if (NS_OK == result->QueryInterface(kIAbsoluteItemsIID, (void**)&interface)) { - break; - } - - result->FirstChild(result); - } - } - - return result; -} - -NS_IMETHODIMP nsAbsoluteFrame::ListTag(FILE* out) const -{ - fputs("*absolute", out); - PRInt32 contentIndex; - GetContentIndex(contentIndex); - fprintf(out, "(%d)@%p", contentIndex, this); - return NS_OK; -} diff --git a/mozilla/layout/html/base/src/nsAbsoluteFrame.h b/mozilla/layout/html/base/src/nsAbsoluteFrame.h deleted file mode 100644 index 419d3409813..00000000000 --- a/mozilla/layout/html/base/src/nsAbsoluteFrame.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsAbsoluteFrame_h___ -#define nsAbsoluteFrame_h___ - -#include "nsFrame.h" - -// Implementation of a frame that's used as a placeholder for an absolutely -// positioned frame -class nsAbsoluteFrame : public nsFrame { -public: - /** - * Create a placeholder for an absolutely positioned frame. Also creates - * the absolutely positioned frame itself - * - * @see #GetAbsoluteFrame() - */ - static nsresult NewFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent); - - // Returns the associated anchored item - nsIFrame* GetAbsoluteFrame() const {return mFrame;} - - // nsIFrame overrides - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer); - NS_IMETHOD ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentReplaced(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent); - - NS_IMETHOD ListTag(FILE* out = stdout) const; - -protected: - nsIFrame* mFrame; // the absolutely positioned frame - - // Constructor. Takes as arguments the content object, the index in parent, - // and the Frame for the content parent - nsAbsoluteFrame(nsIContent* aContent, nsIFrame* aParent); - - virtual ~nsAbsoluteFrame(); - - nsIFrame* GetContainingBlock() const; -}; - -#endif /* nsAbsoluteFrame_h___ */ diff --git a/mozilla/layout/html/base/src/nsBRPart.cpp b/mozilla/layout/html/base/src/nsBRPart.cpp deleted file mode 100644 index 66ab36558b5..00000000000 --- a/mozilla/layout/html/base/src/nsBRPart.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsFrame.h" -#include "nsHTMLParts.h" -#include "nsHTMLTagContent.h" -#include "nsHTMLIIDs.h" -#include "nsIPresContext.h" -#include "nsIInlineReflow.h" -#include "nsCSSLineLayout.h" -#include "nsStyleConsts.h" -#include "nsHTMLAtoms.h" -#include "nsIStyleContext.h" -#include "nsIFontMetrics.h" -#include "nsIRenderingContext.h" - -class BRFrame : public nsFrame, public nsIInlineReflow { -public: - BRFrame(nsIContent* aContent, nsIFrame* aParentFrame); - - // nsISupports - NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr); - - // nsIFrame - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - - // nsIInlineReflow - NS_IMETHOD FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand); - NS_IMETHOD InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState); - -protected: - virtual ~BRFrame(); -}; - -BRFrame::BRFrame(nsIContent* aContent, - nsIFrame* aParentFrame) - : nsFrame(aContent, aParentFrame) -{ -} - -BRFrame::~BRFrame() -{ -} - -NS_IMETHODIMP -BRFrame::QueryInterface(REFNSIID aIID, void** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIInlineReflowIID)) { - *aInstancePtrResult = (void*) ((nsIInlineReflow*)this); - return NS_OK; - } - return nsFrame::QueryInterface(aIID, aInstancePtrResult); -} - -NS_METHOD -BRFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - if (nsIFrame::GetShowFrameBorders()) { - const nsStyleColor* color = (const nsStyleColor*) - mStyleContext->GetStyleData(eStyleStruct_Color); - float p2t = aPresContext.GetPixelsToTwips(); - aRenderingContext.SetColor(color->mColor); - aRenderingContext.FillRect(0, 0, nscoord(5 * p2t), mRect.height); - } - return NS_OK; -} - -NS_IMETHODIMP -BRFrame::FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand) -{ - aLineLayout.EndTextRun(); - return NS_OK; -} - -NS_IMETHODIMP -BRFrame::InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState) -{ - if (nsnull != aMetrics.maxElementSize) { - aMetrics.maxElementSize->width = 0; - aMetrics.maxElementSize->height = 0; - } - - // We have no width, but we're the height of the default font - const nsStyleFont* font = (const nsStyleFont*) - mStyleContext->GetStyleData(eStyleStruct_Font); - nsIFontMetrics* fm = aLineLayout.mPresContext->GetMetricsFor(font->mFont); - - aMetrics.width = 0; - if (nsIFrame::GetShowFrameBorders()) { - // Reserve a tiny bit of space so that our frame won't be zero - // sized so we get a chance to paint. - aMetrics.width = 1; - } - - aMetrics.height = fm->GetHeight(); - aMetrics.ascent = fm->GetMaxAscent(); - aMetrics.descent = fm->GetMaxDescent(); - NS_RELEASE(fm); - - // Return our inline reflow status - const nsStyleDisplay* display = (const nsStyleDisplay*) - mStyleContext->GetStyleData(eStyleStruct_Display); - PRUint32 breakType = display->mBreakType; - if (NS_STYLE_CLEAR_NONE == breakType) { - breakType = NS_STYLE_CLEAR_LINE; - } - - return NS_INLINE_BREAK | NS_INLINE_BREAK_AFTER | - NS_INLINE_MAKE_BREAK_TYPE(breakType); -} - -//---------------------------------------------------------------------- - -class BRPart : public nsHTMLTagContent { -public: - BRPart(nsIAtom* aTag); - - virtual void SetAttribute(nsIAtom* aAttribute, const nsString& aValue); - virtual void MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext); - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - -protected: - virtual ~BRPart(); - virtual nsContentAttr AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const; -}; - -BRPart::BRPart(nsIAtom* aTag) - : nsHTMLTagContent(aTag) -{ -} - -BRPart::~BRPart() -{ -} - -nsresult -BRPart::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame = new BRFrame(this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -static nsHTMLTagContent::EnumTable kClearTable[] = { - { "left", NS_STYLE_CLEAR_LEFT }, - { "right", NS_STYLE_CLEAR_RIGHT }, - { "all", NS_STYLE_CLEAR_LEFT_AND_RIGHT }, - { "both", NS_STYLE_CLEAR_LEFT_AND_RIGHT }, - { 0 } -}; - -void -BRPart::SetAttribute(nsIAtom* aAttribute, const nsString& aString) -{ - if (aAttribute == nsHTMLAtoms::clear) { - nsHTMLValue value; - if (ParseEnumValue(aString, kClearTable, value)) { - nsHTMLTagContent::SetAttribute(aAttribute, value); - } - return; - } - nsHTMLTagContent::SetAttribute(aAttribute, aString); -} - -void -BRPart::MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext) -{ - if (nsnull != mAttributes) { - nsStyleDisplay* display = (nsStyleDisplay*) - aContext->GetMutableStyleData(eStyleStruct_Display); - nsHTMLValue value; - GetAttribute(nsHTMLAtoms::clear, value); - if (value.GetUnit() == eHTMLUnit_Enumerated) { - display->mBreakType = value.GetIntValue(); - } - } -} - -nsContentAttr -BRPart::AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const -{ - if (aAttribute == nsHTMLAtoms::clear) { - if ((eHTMLUnit_Enumerated == aValue.GetUnit()) && - (NS_STYLE_CLEAR_NONE != aValue.GetIntValue())) { - EnumValueToString(aValue, kClearTable, aResult); - return eContentAttr_HasValue; - } - } - return eContentAttr_NotThere; -} - -//---------------------------------------------------------------------- - -nsresult -NS_NewHTMLBreak(nsIHTMLContent** aInstancePtrResult, nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* it = new BRPart(aTag); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void**) aInstancePtrResult); -} diff --git a/mozilla/layout/html/base/src/nsBodyFrame.cpp b/mozilla/layout/html/base/src/nsBodyFrame.cpp deleted file mode 100644 index 484f696e14b..00000000000 --- a/mozilla/layout/html/base/src/nsBodyFrame.cpp +++ /dev/null @@ -1,812 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsBodyFrame.h" -#include "nsIContent.h" -#include "nsIContentDelegate.h" -#include "nsIReflowCommand.h" -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" -#include "nsIPresContext.h" -#include "nsIPresShell.h" -#include "nsIViewManager.h" -#include "nsIDeviceContext.h" -#include "nsIRunaround.h" -#include "nsSpaceManager.h" -#include "nsHTMLAtoms.h" -#include "nsIView.h" -#include "nsViewsCID.h" -#include "nsAbsoluteFrame.h" -#include "nsHTMLIIDs.h" -#include "nsCSSBlockFrame.h" - -nsresult nsBodyFrame::NewFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIFrame* it = new nsBodyFrame(aContent, aParent); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - *aInstancePtrResult = it; - return NS_OK; -} - -nsBodyFrame::nsBodyFrame(nsIContent* aContent, nsIFrame* aParentFrame) - : nsHTMLContainerFrame(aContent, aParentFrame) -{ - mIsPseudoFrame = IsPseudoFrame(); - mSpaceManager = new nsSpaceManager(this); - NS_ADDREF(mSpaceManager); -} - -nsBodyFrame::~nsBodyFrame() -{ - NS_RELEASE(mSpaceManager); -} - -///////////////////////////////////////////////////////////////////////////// -// nsIUnknown - -nsresult -nsBodyFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr) -{ - NS_PRECONDITION(0 != aInstancePtr, "null ptr"); - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIAnchoredItemsIID)) { - *aInstancePtr = (void*) ((nsIAnchoredItems*) this); - return NS_OK; - } - if (aIID.Equals(kIAbsoluteItemsIID)) { - *aInstancePtr = (void*) ((nsIAbsoluteItems*) this); - return NS_OK; - } - return nsHTMLContainerFrame::QueryInterface(aIID, aInstancePtr); -} - -///////////////////////////////////////////////////////////////////////////// -// nsIFrame - -NS_METHOD nsBodyFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - NS_FRAME_TRACE_REFLOW_IN("nsBodyFrame::Reflow"); - - aStatus = NS_FRAME_COMPLETE; // initialize out parameter - - // Do we have any children? - if (nsnull == mFirstChild) { - // No, create a pseudo block frame -//XXX remove this code and uncomment the assertion when the table code plays nice -#ifdef NS_DEBUG - if (eReflowReason_Initial != aReflowState.reason) { - printf("XXX: table code isn't setting the reflow reason properly! [nsBodyFrame.cpp]\n"); - } -#endif -//XXX NS_ASSERTION(eReflowReason_Initial == aReflowState.reason, "bad reason"); - CreateColumnFrame(aPresContext); - } - else { -//XXX remove this code and uncomment the assertion when the table code plays nice -#ifdef NS_DEBUG - if (eReflowReason_Initial == aReflowState.reason) { - printf("XXX: table code isn't setting the reflow reason properly! [nsBodyFrame.cpp]\n"); - } -#endif -//XXX NS_ASSERTION(eReflowReason_Initial != aReflowState.reason, "bad reason"); - } - - if (eReflowReason_Incremental == aReflowState.reason) { - - // The reflow command should never be target for us -#ifdef NS_DEBUG - NS_ASSERTION(nsnull != aReflowState.reflowCommand, "null reflow command"); - nsIFrame* target; - aReflowState.reflowCommand->GetTarget(target); - NS_ASSERTION(target != this, "bad reflow command target"); -#endif - - // Is the next frame in the reflow chain the pseudo block-frame or an - // absolutely positioned frame? - // - // If the next frame is the pseudo block-frame then fall thru to the main - // code below. The only thing that should be handled below is absolutely - // positioned elements... - nsIFrame* next; - aReflowState.reflowCommand->GetNext(next); - if (mFirstChild != next) { - // It's an absolutely positioned frame that's the target. - // XXX FIX ME. For an absolutely positioned item we need to properly - // compute the available space and then resize the frame if necessary... - nsReflowState reflowState(next, aReflowState, aReflowState.maxSize); - return next->Reflow(aPresContext, aDesiredSize, reflowState, aStatus); - } - } - - // Reflow the child frame - if (nsnull != mFirstChild) { - // Get our border/padding info - const nsStyleSpacing* mySpacing = - (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsMargin borderPadding; - mySpacing->CalcBorderPaddingFor(this, borderPadding); - - // Compute the child frame's max size - nsSize kidMaxSize = GetColumnAvailSpace(aPresContext, borderPadding, - aReflowState.maxSize); - mSpaceManager->Translate(borderPadding.left, borderPadding.top); - - if (eReflowReason_Resize == aReflowState.reason) { - // Clear any regions that are marked as unavailable - // XXX Temporary hack until everything is incremental... - mSpaceManager->ClearRegions(); - } - - // Get the column's desired rect - nsIRunaround* reflowRunaround; - nsReflowState reflowState(mFirstChild, aReflowState, kidMaxSize); - nsRect desiredRect; - - mFirstChild->WillReflow(*aPresContext); - mFirstChild->MoveTo(borderPadding.left, borderPadding.top); - mFirstChild->QueryInterface(kIRunaroundIID, (void**)&reflowRunaround); - reflowRunaround->Reflow(aPresContext, mSpaceManager, aDesiredSize, - reflowState, desiredRect, aStatus); - - // If the frame is complete, then check whether there's a next-in-flow that - // needs to be deleted - if (NS_FRAME_IS_COMPLETE(aStatus)) { - nsIFrame* kidNextInFlow; - - mFirstChild->GetNextInFlow(kidNextInFlow); - if (nsnull != kidNextInFlow) { - // Remove all of the childs next-in-flows - DeleteChildsNextInFlow(mFirstChild); - } - } - - mSpaceManager->Translate(-borderPadding.left, -borderPadding.top); - - // Place and size the frame - desiredRect.x += borderPadding.left; - desiredRect.y += borderPadding.top; - mFirstChild->SetRect(desiredRect); -// mFirstChild->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - -#if XXX - // the block knows to PropagateContentOffsets so this isn't necessary - - // Set our last content offset and whether the last content is complete - // based on the state of the pseudo frame - nsCSSBlockFrame* blockPseudoFrame = (nsCSSBlockFrame*)mFirstChild; - mLastContentOffset = blockPseudoFrame->GetLastContentOffset(); - mLastContentIsComplete = blockPseudoFrame->GetLastContentIsComplete(); -#endif - - // Reflow any absolutely positioned frames that need reflowing - ReflowAbsoluteItems(aPresContext, aReflowState); - - // Return our desired size - ComputeDesiredSize(desiredRect, aReflowState.maxSize, borderPadding, aDesiredSize); - } - else { - aDesiredSize.width = 0; - aDesiredSize.height = 0; - aDesiredSize.ascent = 0; - aDesiredSize.descent = 0; - if (nsnull != aDesiredSize.maxElementSize) { - aDesiredSize.maxElementSize->width = 0; - aDesiredSize.maxElementSize->height = 0; - } - } - - NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, - ("exit nsBodyFrame::Reflow: status=%d width=%d height=%d", - aStatus, aDesiredSize.width, aDesiredSize.height)); - return NS_OK; -} - -NS_METHOD nsBodyFrame::ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) -{ - NS_ASSERTION(mContent == aContainer, "bad content-appended target"); - - // Pass along the notification to our pseudo frame. It will generate a - // reflow command - return mFirstChild->ContentAppended(aShell, aPresContext, aContainer); -} - -NS_METHOD nsBodyFrame::ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-inserted target"); - - // Pass along the notification to our pseudo frame that maps all the content - return mFirstChild->ContentInserted(aShell, aPresContext, aContainer, - aChild, aIndexInParent); -} - -NS_METHOD nsBodyFrame::ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-deleted target"); - - // Pass along the notification to our pseudo frame that maps all the content - return mFirstChild->ContentDeleted(aShell, aPresContext, aContainer, - aChild, aIndexInParent); -} - -NS_METHOD -nsBodyFrame::CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame) -{ - nsBodyFrame* cf = new nsBodyFrame(mContent, aParent); - if (nsnull == cf) { - return NS_ERROR_OUT_OF_MEMORY; - } - PrepareContinuingFrame(aPresContext, aParent, aStyleContext, cf); - aContinuingFrame = cf; - return NS_OK; -} - -///////////////////////////////////////////////////////////////////////////// -// Helper functions - -void nsBodyFrame::CreateColumnFrame(nsIPresContext* aPresContext) -{ - nsIStyleContext* styleContext = - aPresContext->ResolvePseudoStyleContextFor(nsHTMLAtoms::columnPseudo, this); - - // Do we have a prev-in-flow? - if (nsnull == mPrevInFlow) { - // No, create a column pseudo frame - NS_NewCSSBlockFrame(&mFirstChild, mContent, this); - mChildCount = 1; - mFirstChild->SetStyleContext(aPresContext,styleContext); - } else { - // Create a continuing column - nsBodyFrame* prevBody = (nsBodyFrame*)mPrevInFlow; - nsIFrame* prevColumn = prevBody->mFirstChild; - NS_ASSERTION(prevBody->ChildIsPseudoFrame(prevColumn), - "bad previous column"); - - prevColumn->CreateContinuingFrame(aPresContext, this, styleContext, - mFirstChild); - mChildCount = 1; - } - - NS_RELEASE(styleContext); -} - -nsSize nsBodyFrame::GetColumnAvailSpace(nsIPresContext* aPresContext, - const nsMargin& aBorderPadding, - const nsSize& aMaxSize) -{ - nsSize result(aMaxSize); - - // If we're not being used as a pseudo frame then make adjustments - // for border/padding and a vertical scrollbar - if (!mIsPseudoFrame) { - // If our width is constrained then subtract for the border/padding - if (aMaxSize.width != NS_UNCONSTRAINEDSIZE) { - result.width -= aBorderPadding.left + - aBorderPadding.right; - if (! aPresContext->IsPaginated()) { - nsIDeviceContext* dc = aPresContext->GetDeviceContext(); - result.width -= NS_TO_INT_ROUND(dc->GetScrollBarWidth()); - NS_RELEASE(dc); - } - } - // If our height is constrained then subtract for the border/padding - if (aMaxSize.height != NS_UNCONSTRAINEDSIZE) { - result.height -= aBorderPadding.top + - aBorderPadding.bottom; - } - } - - return result; -} - -void -nsBodyFrame::ComputeDesiredSize(const nsRect& aDesiredRect, - const nsSize& aMaxSize, - const nsMargin& aBorderPadding, - nsReflowMetrics& aDesiredSize) -{ - // Note: Body used as a pseudo-frame shrink wraps - aDesiredSize.height = PR_MAX(aDesiredRect.YMost(), mSpaceManager->YMost()); - aDesiredSize.width = aDesiredRect.XMost(); - - // Take into account absolutely positioned elements when computing the - // desired size - for (PRInt32 i = 0; i < mAbsoluteItems.Count(); i++) { - // Get the anchor frame - nsAbsoluteFrame* anchorFrame = (nsAbsoluteFrame*)mAbsoluteItems[i]; - nsIFrame* absoluteFrame = anchorFrame->GetAbsoluteFrame(); - nsRect rect; - - absoluteFrame->GetRect(rect); - if (rect.XMost() > aDesiredSize.width) { - aDesiredSize.width = rect.XMost(); - } - if (rect.YMost() > aDesiredSize.height) { - aDesiredSize.height = rect.YMost(); - } - } - - if (!mIsPseudoFrame) { - // Make sure we're at least as wide as our available width - aDesiredSize.width = PR_MAX(aDesiredSize.width, aMaxSize.width); - aDesiredSize.height += aBorderPadding.top + - aBorderPadding.bottom; - } - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; -} - -// Add the frame to the end of the child list -void nsBodyFrame::AddFrame(nsIFrame* aFrame) -{ - nsIFrame* lastChild; - - LastChild(lastChild); - lastChild->SetNextSibling(aFrame); - aFrame->SetNextSibling(nsnull); - mChildCount++; -} - -void -nsBodyFrame::PropagateContentOffsets(nsIFrame* aChild, - PRInt32 aFirstContentOffset, - PRInt32 aLastContentOffset, - PRBool aLastContentIsComplete) -{ - NS_PRECONDITION(ChildIsPseudoFrame(aChild), "not a pseudo frame"); - - // First update our offsets - if (mFirstChild == aChild) { - mFirstContentOffset = aFirstContentOffset; - mLastContentOffset = aLastContentOffset; - mLastContentIsComplete = aLastContentIsComplete; - } - - // If we are a pseudo-frame then we need to update our parent - if (IsPseudoFrame()) { - nsContainerFrame* parent = (nsContainerFrame*) mGeometricParent; - parent->PropagateContentOffsets(this, mFirstContentOffset, - mLastContentOffset, - mLastContentIsComplete); - } -} - -///////////////////////////////////////////////////////////////////////////// -// nsIAnchoredItems - -void nsBodyFrame::AddAnchoredItem(nsIFrame* aAnchoredItem, - AnchoringPosition aPosition, - nsIFrame* aContainer) -{ - // Set the geometric parent and add the anchored frame to the child list - aAnchoredItem->SetGeometricParent(this); - AddFrame(aAnchoredItem); -} - -void nsBodyFrame::RemoveAnchoredItem(nsIFrame* aAnchoredItem) -{ - NS_PRECONDITION(IsChild(aAnchoredItem), "bad anchored item"); - NS_ASSERTION(aAnchoredItem != mFirstChild, "unexpected anchored item"); - // Remove the anchored item from the child list - // XXX Implement me - mChildCount--; -} - -///////////////////////////////////////////////////////////////////////////// -// nsIAbsoluteItems - -NS_METHOD nsBodyFrame::AddAbsoluteItem(nsAbsoluteFrame* aAnchorFrame) -{ - // Add the absolute anchor frame to our list of absolutely positioned - // items. - mAbsoluteItems.AppendElement(aAnchorFrame); - return NS_OK; -} - -NS_METHOD nsBodyFrame::RemoveAbsoluteItem(nsAbsoluteFrame* aAnchorFrame) -{ - NS_NOTYETIMPLEMENTED("removing an absolutely positioned frame"); - return NS_ERROR_NOT_IMPLEMENTED; -} - -// Called at the end of the Reflow() member function so we can process -// any abolutely positioned items that need to be reflowed -void nsBodyFrame::ReflowAbsoluteItems(nsIPresContext* aPresContext, - const nsReflowState& aReflowState) -{ - for (PRInt32 i = 0; i < mAbsoluteItems.Count(); i++) { - // Get the anchor frame and its absolutely positioned frame - nsAbsoluteFrame* anchorFrame = (nsAbsoluteFrame*)mAbsoluteItems[i]; - nsIFrame* absoluteFrame = anchorFrame->GetAbsoluteFrame(); - PRBool placeFrame = PR_FALSE; - PRBool reflowFrame = PR_FALSE; - nsReflowReason reflowReason = eReflowReason_Resize; - - // Get its style information - const nsStyleDisplay* display; - const nsStylePosition* position; - - absoluteFrame->GetStyleData(eStyleStruct_Display, (nsStyleStruct*&)display); - absoluteFrame->GetStyleData(eStyleStruct_Position, (nsStyleStruct*&)position); - - // See whether the frame is a newly added frame - nsIFrame* parent; - absoluteFrame->GetGeometricParent(parent); - if (parent != this) { - // The absolutely position item hasn't yet been added to our child list - absoluteFrame->SetGeometricParent(this); - - // Add the absolutely positioned frame to the end of the child list - AddFrame(absoluteFrame); - - // Make sure the frame has a view - nsIView* view; - absoluteFrame->GetView(view); - if (nsnull == view) { - view = CreateAbsoluteView(position, display); - absoluteFrame->SetView(view); - } - NS_RELEASE(view); - - // See whether this is the frame's initial reflow - nsFrameState frameState; - absoluteFrame->GetFrameState(frameState); - if (frameState & NS_FRAME_FIRST_REFLOW) { - reflowReason = eReflowReason_Initial; - } - - // We need to place and reflow the absolutely positioned frame - placeFrame = reflowFrame = PR_TRUE; - - } else { - // We need to place the frame if the left-offset or the top-offset are - // auto or a percentage - if ((eStyleUnit_Coord != position->mLeftOffset.GetUnit()) || - (eStyleUnit_Coord != position->mTopOffset.GetUnit())) { - placeFrame = PR_TRUE; - } - - // We need to reflow the frame if its width or its height is auto or - // a percentage - if ((eStyleUnit_Coord != position->mWidth.GetUnit()) || - (eStyleUnit_Coord != position->mHeight.GetUnit())) { - reflowFrame = PR_TRUE; - } - } - - if (placeFrame || reflowFrame) { - // Get the rect for the absolutely positioned element - nsRect rect; - ComputeAbsoluteFrameBounds(anchorFrame, aReflowState, position, rect); - - absoluteFrame->WillReflow(*aPresContext); - absoluteFrame->MoveTo(rect.x, rect.y); - - if (reflowFrame) { - // Resize reflow the absolutely positioned element - nsSize availSize(rect.width, rect.height); - - if (NS_STYLE_OVERFLOW_VISIBLE == display->mOverflow) { - // Don't constrain the height since the container should be enlarged - // to contain overflowing frames - availSize.height = NS_UNCONSTRAINEDSIZE; - } - - nsReflowMetrics desiredSize(nsnull); - nsReflowState reflowState(absoluteFrame, aReflowState, availSize, - reflowReason); - nsReflowStatus status; - absoluteFrame->Reflow(aPresContext, desiredSize, reflowState, status); - - // Figure out what size to actually use. If we let the child choose its - // size, then use what the child requested. Otherwise, use the value - // specified in the style information - if ((eStyleUnit_Auto == position->mWidth.GetUnit()) || - ((desiredSize.width > availSize.width) && - (NS_STYLE_OVERFLOW_VISIBLE == display->mOverflow))) { - rect.width = desiredSize.width; - } - if ((eStyleUnit_Auto == position->mHeight.GetUnit()) || - (NS_UNCONSTRAINEDSIZE == rect.height) || - ((desiredSize.height > rect.height) && - (NS_STYLE_OVERFLOW_VISIBLE == display->mOverflow))) { - rect.height = desiredSize.height; - } - absoluteFrame->SetRect(rect); - } - } - } -} - -nsIView* nsBodyFrame::CreateAbsoluteView(const nsStylePosition* aPosition, - const nsStyleDisplay* aDisplay) const -{ - nsIView* view; - - static NS_DEFINE_IID(kViewCID, NS_VIEW_CID); - static NS_DEFINE_IID(kIViewIID, NS_IVIEW_IID); - - // Create the view - nsresult result = NSRepository::CreateInstance(kViewCID, - nsnull, - kIViewIID, - (void **)&view); - if (NS_OK == result) { - // XXX Even though since we're absolutely positioned we should have a view, - // we might not... - nsIView* containingView; - GetView(containingView); - if (nsnull == containingView) { - nsPoint offset; - GetOffsetFromView(offset, containingView); - } - - // Initialize the view - nsIViewManager* viewManager = containingView->GetViewManager(); - NS_ASSERTION(nsnull != viewManager, "null view manager"); - - // Is there a clip rect specified? - nsViewClip clip = {0, 0, 0, 0}; - PRUint8 clipType = (aDisplay->mClipFlags & NS_STYLE_CLIP_TYPE_MASK); - nsViewClip* pClip = nsnull; - - if (NS_STYLE_CLIP_RECT == clipType) { - if ((NS_STYLE_CLIP_LEFT_AUTO & aDisplay->mClipFlags) == 0) { - clip.mLeft = aDisplay->mClip.left; - } - if ((NS_STYLE_CLIP_RIGHT_AUTO & aDisplay->mClipFlags) == 0) { - clip.mRight = aDisplay->mClip.right; - } - if ((NS_STYLE_CLIP_TOP_AUTO & aDisplay->mClipFlags) == 0) { - clip.mTop = aDisplay->mClip.top; - } - if ((NS_STYLE_CLIP_BOTTOM_AUTO & aDisplay->mClipFlags) == 0) { - clip.mBottom = aDisplay->mClip.bottom; - } - pClip = &clip; - } - else if (NS_STYLE_CLIP_INHERIT == clipType) { - // XXX need to handle clip inherit (get from parent style context) - NS_NOTYETIMPLEMENTED("clip inherit"); - } - - // Get the z-index to use - PRInt32 zIndex = 0; - if (aPosition->mZIndex.GetUnit() == eStyleUnit_Integer) { - zIndex = aPosition->mZIndex.GetIntValue(); - } else if (aPosition->mZIndex.GetUnit() == eStyleUnit_Auto) { - zIndex = 0; - } else if (aPosition->mZIndex.GetUnit() == eStyleUnit_Inherit) { - // XXX need to handle z-index "inherit" - NS_NOTYETIMPLEMENTED("zIndex: inherit"); - } - - // Initialize the view with a size of (0, 0). When we're done reflowing - // the frame the view will be sized and positioned - view->Init(viewManager, nsRect(0, 0, 0, 0), containingView, nsnull, - nsnull, nsnull, zIndex, pClip); - viewManager->InsertChild(containingView, view, 0); - NS_RELEASE(viewManager); - NS_RELEASE(containingView); - } - - return view; -} - -// Translate aPoint from aFrameFrom's coordinate space to our coordinate space -void nsBodyFrame::TranslatePoint(nsIFrame* aFrameFrom, nsPoint& aPoint) const -{ - nsIFrame* parent; - - aFrameFrom->GetGeometricParent(parent); - while ((nsnull != parent) && (parent != (nsIFrame*)this)) { - nsPoint origin; - - parent->GetOrigin(origin); - aPoint += origin; - parent->GetGeometricParent(parent); - } -} - -void nsBodyFrame::ComputeAbsoluteFrameBounds(nsIFrame* aAnchorFrame, - const nsReflowState& aReflowState, - const nsStylePosition* aPosition, - nsRect& aRect) const -{ - // Compute the offset and size of the view based on the position properties, - // and the inner rect of the containing block (which we get from the reflow - // state) - // - // If either the left or top are 'auto' then get the offset of the anchor - // frame from this frame - nsPoint offset; - if ((eStyleUnit_Auto == aPosition->mLeftOffset.GetUnit()) || - (eStyleUnit_Auto == aPosition->mTopOffset.GetUnit())) { - aAnchorFrame->GetOrigin(offset); - TranslatePoint(aAnchorFrame, offset); - } - - // left-offset - if (eStyleUnit_Auto == aPosition->mLeftOffset.GetUnit()) { - // Use the current x-offset of the anchor frame translated into our - // coordinate space - aRect.x = offset.x; - } else if (eStyleUnit_Coord == aPosition->mLeftOffset.GetUnit()) { - aRect.x = aPosition->mLeftOffset.GetCoordValue(); - } else { - NS_ASSERTION(eStyleUnit_Percent == aPosition->mLeftOffset.GetUnit(), - "unexpected offset type"); - // Percentage values refer to the width of the containing block. If the - // width is unconstrained then just use 0 - if (NS_UNCONSTRAINEDSIZE == aReflowState.maxSize.width) { - aRect.x = 0; - } else { - aRect.x = (nscoord)((float)aReflowState.maxSize.width * - aPosition->mLeftOffset.GetPercentValue()); - } - } - - // top-offset - if (eStyleUnit_Auto == aPosition->mTopOffset.GetUnit()) { - // Use the current y-offset of the anchor frame translated into our - // coordinate space - aRect.y = offset.y; - } else if (eStyleUnit_Coord == aPosition->mTopOffset.GetUnit()) { - aRect.y = aPosition->mTopOffset.GetCoordValue(); - } else { - NS_ASSERTION(eStyleUnit_Percent == aPosition->mTopOffset.GetUnit(), - "unexpected offset type"); - // Percentage values refer to the height of the containing block. If the - // height is unconstrained then interpret it like 'auto' - if (NS_UNCONSTRAINEDSIZE == aReflowState.maxSize.height) { - aRect.y = offset.y; - } else { - aRect.y = (nscoord)((float)aReflowState.maxSize.height * - aPosition->mTopOffset.GetPercentValue()); - } - } - - // XXX We aren't properly handling 'auto' width and height - // XXX The width/height represent the size of the content area only, and not - // the frame size... - - // width - if (eStyleUnit_Auto == aPosition->mWidth.GetUnit()) { - // Use the right-edge of the containing block - aRect.width = aReflowState.maxSize.width; - } else if (eStyleUnit_Coord == aPosition->mWidth.GetUnit()) { - aRect.width = aPosition->mWidth.GetCoordValue(); - } else { - NS_ASSERTION(eStyleUnit_Percent == aPosition->mWidth.GetUnit(), - "unexpected width type"); - // Percentage values refer to the width of the containing block - if (NS_UNCONSTRAINEDSIZE == aReflowState.maxSize.width) { - aRect.width = NS_UNCONSTRAINEDSIZE; - } else { - aRect.width = (nscoord)((float)aReflowState.maxSize.width * - aPosition->mWidth.GetPercentValue()); - } - } - - // height - if (eStyleUnit_Auto == aPosition->mHeight.GetUnit()) { - // Allow it to be as high as it wants - aRect.height = NS_UNCONSTRAINEDSIZE; - } else if (eStyleUnit_Coord == aPosition->mHeight.GetUnit()) { - aRect.height = aPosition->mHeight.GetCoordValue(); - } else { - NS_ASSERTION(eStyleUnit_Percent == aPosition->mHeight.GetUnit(), - "unexpected height type"); - // Percentage values refer to the height of the containing block. If the - // height is unconstrained, then interpret it like 'auto' and make the - // height unconstrained - if (NS_UNCONSTRAINEDSIZE == aReflowState.maxSize.height) { - aRect.height = NS_UNCONSTRAINEDSIZE; - } else { - aRect.height = (nscoord)((float)aReflowState.maxSize.height * - aPosition->mHeight.GetPercentValue()); - } - } -} - -///////////////////////////////////////////////////////////////////////////// -// nsHTMLContainerFrame - -// XXX use same logic as block frame? -PRIntn nsBodyFrame::GetSkipSides() const -{ - PRIntn skip = 0; - if (nsnull != mPrevInFlow) { - skip |= 1 << NS_SIDE_TOP; - } - if (nsnull != mNextInFlow) { - skip |= 1 << NS_SIDE_BOTTOM; - } - return skip; -} - -///////////////////////////////////////////////////////////////////////////// -// Diagnostics - -NS_METHOD nsBodyFrame::VerifyTree() const -{ -#ifdef NS_DEBUG - NS_ASSERTION(0 == (mState & NS_FRAME_IN_REFLOW), "frame is in reflow"); - - // Check our child count - PRInt32 len = LengthOf(mFirstChild); - NS_ASSERTION(len == mChildCount, "bad child count"); - nsIFrame* lastChild; - - LastChild(lastChild); - if (len != 0) { - NS_ASSERTION(nsnull != lastChild, "bad last child"); - } - NS_ASSERTION(nsnull == mOverflowList, "bad overflow list"); - - // Make sure our content offsets are sane - NS_ASSERTION(mFirstContentOffset <= mLastContentOffset, "bad offsets"); - - // Verify child content offsets - nsIFrame* child = mFirstChild; - while (nsnull != child) { - // Make sure that the child's tree is valid - child->VerifyTree(); - child->GetNextSibling(child); - } - - // Make sure that our flow blocks offsets are all correct - if (nsnull == mPrevInFlow) { - PRInt32 nextOffset = NextChildOffset(); - nsBodyFrame* nextInFlow = (nsBodyFrame*) mNextInFlow; - while (nsnull != nextInFlow) { - NS_ASSERTION(0 != nextInFlow->mChildCount, "empty next-in-flow"); - NS_ASSERTION(nextInFlow->GetFirstContentOffset() == nextOffset, - "bad next-in-flow first offset"); - nextOffset = nextInFlow->NextChildOffset(); - nextInFlow = (nsBodyFrame*) nextInFlow->mNextInFlow; - } - } -#endif - return NS_OK; -} - diff --git a/mozilla/layout/html/base/src/nsBodyFrame.h b/mozilla/layout/html/base/src/nsBodyFrame.h deleted file mode 100644 index c922dfffd65..00000000000 --- a/mozilla/layout/html/base/src/nsBodyFrame.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsBodyFrame_h___ -#define nsBodyFrame_h___ - -#include "nsHTMLContainerFrame.h" -#include "nsIAnchoredItems.h" -#include "nsIAbsoluteItems.h" -#include "nsVoidArray.h" - -class nsSpaceManager; - -struct nsStyleDisplay; -struct nsStylePosition; - -class nsBodyFrame : public nsHTMLContainerFrame, - public nsIAnchoredItems, - public nsIAbsoluteItems -{ -public: - static nsresult NewFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent); - - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer); - - NS_IMETHOD ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - - NS_IMETHOD ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - - NS_IMETHOD CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame); - - // nsIAnchoredItems - virtual void AddAnchoredItem(nsIFrame* aAnchoredItem, - AnchoringPosition aPosition, - nsIFrame* aContainer); - virtual void RemoveAnchoredItem(nsIFrame* aAnchoredItem); - - // nsIAbsoluteItems - NS_IMETHOD AddAbsoluteItem(nsAbsoluteFrame* aAnchorFrame); - NS_IMETHOD RemoveAbsoluteItem(nsAbsoluteFrame* aAnchorFrame); - - NS_IMETHOD VerifyTree() const; - - // nsContainerFrame - virtual void PropagateContentOffsets(nsIFrame* aChild, - PRInt32 aFirstContentOffset, - PRInt32 aLastContentOffset, - PRBool aLastContentIsComplete); - -protected: - PRBool mIsPseudoFrame; - - nsBodyFrame(nsIContent* aContent, nsIFrame* aParentFrame); - - ~nsBodyFrame(); - - void ComputeDesiredSize(const nsRect& aDesiredRect, - const nsSize& aMaxSize, - const nsMargin& aBorderPadding, - nsReflowMetrics& aDesiredSize); - - virtual PRIntn GetSkipSides() const; - - void ReflowAbsoluteItems(nsIPresContext* aPresContext, - const nsReflowState& aReflowState); - - nsIView* CreateAbsoluteView(const nsStylePosition* aPosition, - const nsStyleDisplay* aDisplay) const; - - void TranslatePoint(nsIFrame* aFrameFrom, nsPoint& aPoint) const; - - void ComputeAbsoluteFrameBounds(nsIFrame* aAnchorFrame, - const nsReflowState& aState, - const nsStylePosition* aPosition, - nsRect& aRect) const; - - void AddFrame(nsIFrame* aFrame); - -private: - nsSpaceManager* mSpaceManager; - nsVoidArray mAbsoluteItems; - - void CreateColumnFrame(nsIPresContext* aPresContext); - nsSize GetColumnAvailSpace(nsIPresContext* aPresContext, - const nsMargin& aBorderPadding, - const nsSize& aMaxSize); -}; - -#endif /* nsBodyFrame_h___ */ diff --git a/mozilla/layout/html/base/src/nsBodyPart.cpp b/mozilla/layout/html/base/src/nsBodyPart.cpp deleted file mode 100644 index a6d4cacfb0c..00000000000 --- a/mozilla/layout/html/base/src/nsBodyPart.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLContainer.h" -#include "nsBodyFrame.h" -#include "nsIPresContext.h" -#include "nsHTMLIIDs.h" - -class BodyPart : public nsHTMLContainer { -public: - BodyPart(nsIAtom* aTag); - - NS_IMETHOD_(nsrefcnt) AddRef(); - NS_IMETHOD_(nsrefcnt) Release(); - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - -protected: - virtual ~BodyPart(); -}; - -BodyPart::BodyPart(nsIAtom* aTag) - : nsHTMLContainer(aTag) -{ -} - -BodyPart::~BodyPart() -{ -} - -nsrefcnt BodyPart::AddRef(void) -{ - return ++mRefCnt; -} - -nsrefcnt BodyPart::Release(void) -{ - if (--mRefCnt == 0) { - delete this; - return 0; - } - return mRefCnt; -} - -nsresult -BodyPart::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame = nsnull; - nsresult rv = nsBodyFrame::NewFrame(&frame, this, aParentFrame); - if (NS_OK != rv) { - return rv; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -nsresult -NS_NewBodyPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* body = new BodyPart(aTag); - if (nsnull == body) { - return NS_ERROR_OUT_OF_MEMORY; - } - return body->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/html/base/src/nsDOMAttributes.cpp b/mozilla/layout/html/base/src/nsDOMAttributes.cpp deleted file mode 100644 index b9106252bf9..00000000000 --- a/mozilla/layout/html/base/src/nsDOMAttributes.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsDOMAttributes.h" -#include "nsIContent.h" -#include "nsIHTMLContent.h" -#include "nsString.h" -#include "nsIAtom.h" -#include "nsISupportsArray.h" - -nsDOMAttribute::nsDOMAttribute(nsString &aName, nsString &aValue) -{ - mName = new nsString(aName); - mValue = new nsString(aValue); - mRefCnt = 1; - mScriptObject = nsnull; -} - -nsDOMAttribute::~nsDOMAttribute() -{ - NS_PRECONDITION(nsnull != mName && nsnull != mValue, "attribute must be valid"); - delete mName; - delete mValue; -} - -nsresult nsDOMAttribute::QueryInterface(REFNSIID aIID, void** aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - static NS_DEFINE_IID(kIDOMAttributeIID, NS_IDOMATTRIBUTE_IID); - static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID); - if (aIID.Equals(kIDOMAttributeIID)) { - *aInstancePtr = (void*)(nsIDOMAttribute*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIScriptObjectOwnerIID)) { - *aInstancePtr = (void*)(nsIScriptObjectOwner*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kISupportsIID)) { - *aInstancePtr = (void*)(nsISupports*)(nsIDOMAttribute*)this; - AddRef(); - return NS_OK; - } - return NS_NOINTERFACE; -} - -NS_IMPL_ADDREF(nsDOMAttribute) - -NS_IMPL_RELEASE(nsDOMAttribute) - - -nsresult nsDOMAttribute::GetScriptObject(nsIScriptContext *aContext, void** aScriptObject) -{ - nsresult res = NS_OK; - if (nsnull == mScriptObject) { - res = NS_NewScriptAttribute(aContext, this, nsnull, (void **)&mScriptObject); - } - *aScriptObject = mScriptObject; - return res; -} - -nsresult nsDOMAttribute::ResetScriptObject() -{ - mScriptObject = nsnull; - return NS_OK; -} - -// -// nsIDOMAttribute interface -// -nsresult nsDOMAttribute::GetName(nsString &aName) -{ - aName = *mName; - return NS_OK; -} - -nsresult nsDOMAttribute::GetValue(nsString &aValue) -{ - aValue = *mValue; - return NS_OK; -} - -nsresult nsDOMAttribute::SetValue(nsString &aValue) -{ - delete mValue; - mValue = new nsString(aValue); - return NS_OK; -} - -nsresult nsDOMAttribute::GetSpecified(PRBool *aSpecified) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDOMAttribute::SetSpecified(PRBool specified) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDOMAttribute::ToString(nsString &aString) -{ - aString = *mName; - aString += " = "; - aString += *mValue; - return NS_OK; -} - - - -// -// nsDOMAttributeList interface -// -nsDOMAttributeList::nsDOMAttributeList(nsIHTMLContent &aContent) : - mContent(aContent) -{ - mRefCnt = 1; - mContent.AddRef(); - mScriptObject = nsnull; -} - -nsDOMAttributeList::~nsDOMAttributeList() -{ - mContent.Release(); -} - -nsresult nsDOMAttributeList::QueryInterface(REFNSIID aIID, void** aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - static NS_DEFINE_IID(kIDOMAttributeListIID, NS_IDOMATTRIBUTELIST_IID); - static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID); - if (aIID.Equals(kIDOMAttributeListIID)) { - *aInstancePtr = (void*)(nsIDOMAttributeList*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIScriptObjectOwnerIID)) { - *aInstancePtr = (void*)(nsIScriptObjectOwner*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kISupportsIID)) { - *aInstancePtr = (void*)(nsISupports*)(nsIDOMAttributeList*)this; - AddRef(); - return NS_OK; - } - return NS_NOINTERFACE; -} - -NS_IMPL_ADDREF(nsDOMAttributeList) - -NS_IMPL_RELEASE(nsDOMAttributeList) - -nsresult nsDOMAttributeList::GetScriptObject(nsIScriptContext *aContext, void** aScriptObject) -{ - nsresult res = NS_OK; - if (nsnull == mScriptObject) { - res = NS_NewScriptAttributeList(aContext, this, nsnull, (void**)&mScriptObject); - } - *aScriptObject = mScriptObject; - return res; -} - -nsresult nsDOMAttributeList::ResetScriptObject() -{ - mScriptObject = nsnull; - return NS_OK; -} - -nsresult nsDOMAttributeList::GetAttribute(nsString &aAttrName, nsIDOMAttribute** aAttribute) -{ - nsAutoString value; - mContent.GetAttribute(aAttrName, value); - *aAttribute = new nsDOMAttribute(aAttrName, value); - return NS_OK; -} - -nsresult nsDOMAttributeList::SetAttribute(nsIDOMAttribute *aAttribute) -{ - nsAutoString name, value; - aAttribute->GetName(name); - aAttribute->GetValue(value); - mContent.SetAttribute(name, value); - return NS_OK; -} - -nsresult nsDOMAttributeList::Remove(nsString &attrName, nsIDOMAttribute** aAttribute) -{ - nsAutoString name, upper; - (*aAttribute)->GetName(name); - name.ToUpperCase(upper); - nsIAtom* attr = NS_NewAtom(upper); - mContent.UnsetAttribute(attr); - return NS_OK; -} - -nsresult nsDOMAttributeList::Item(PRUint32 aIndex, nsIDOMAttribute** aAttribute) -{ - nsresult res = NS_ERROR_FAILURE; - nsAutoString name, value; - nsISupportsArray *attributes = nsnull; - if (NS_OK == NS_NewISupportsArray(&attributes)) { - PRInt32 count = mContent.GetAllAttributeNames(attributes); - if (count > 0) { - if ((PRInt32)aIndex < count) { - nsISupports *att = attributes->ElementAt(aIndex); - static NS_DEFINE_IID(kIAtom, NS_IATOM_IID); - nsIAtom *atName = nsnull; - if (nsnull != att && NS_OK == att->QueryInterface(kIAtom, (void**)&atName)) { - atName->ToString(name); - if (eContentAttr_NotThere != mContent.GetAttribute(name, value)) { - *aAttribute = new nsDOMAttribute(name, value); - res = NS_OK; - } - NS_RELEASE(atName); - } - } - } - NS_RELEASE(attributes); - } - - return res; -} - -nsresult nsDOMAttributeList::GetLength(PRUint32 *aLength) -{ - *aLength = mContent.GetAttributeCount(); - return NS_OK; -} - - - diff --git a/mozilla/layout/html/base/src/nsDOMAttributes.h b/mozilla/layout/html/base/src/nsDOMAttributes.h deleted file mode 100644 index 02cebaa9479..00000000000 --- a/mozilla/layout/html/base/src/nsDOMAttributes.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsDOMAttributes_h__ -#define nsDOMAttributes_h__ - -#include "nsIDOMAttribute.h" -#include "nsIDOMAttributeList.h" -#include "nsIScriptObjectOwner.h" - -class nsIContent; -class nsIHTMLContent; - -class nsDOMAttribute : public nsIDOMAttribute, public nsIScriptObjectOwner { -public: - nsDOMAttribute(nsString &aName, nsString &aValue); - virtual ~nsDOMAttribute(); - - NS_DECL_ISUPPORTS - - NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject); - NS_IMETHOD ResetScriptObject(); - - // nsIDOMAttribute interface - NS_IMETHOD GetName(nsString &aName); - NS_IMETHOD GetValue(nsString &aValue); - NS_IMETHOD SetValue(nsString &aValue); - NS_IMETHOD GetSpecified(PRBool *aSpecified); - NS_IMETHOD SetSpecified(PRBool specified); - NS_IMETHOD ToString(nsString &aString); - -private: - nsString *mName; - nsString *mValue; - void *mScriptObject; -}; - - -class nsDOMAttributeList : public nsIDOMAttributeList, public nsIScriptObjectOwner { -public: - nsDOMAttributeList(nsIHTMLContent &aContent); - virtual ~nsDOMAttributeList(); - - NS_DECL_ISUPPORTS - - NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject); - NS_IMETHOD ResetScriptObject(); - - // nsIDOMAttributeList interface - NS_IMETHOD GetAttribute(nsString &aAttrName, nsIDOMAttribute** aAttribute); - NS_IMETHOD SetAttribute(nsIDOMAttribute *aAttribute); - NS_IMETHOD Remove(nsString &attrName, nsIDOMAttribute** aAttribute); - NS_IMETHOD Item(PRUint32 aIndex, nsIDOMAttribute** aAttribute); - NS_IMETHOD GetLength(PRUint32 *aLength); - -private: - nsIHTMLContent &mContent; - void *mScriptObject; -}; - - -#endif - diff --git a/mozilla/layout/html/base/src/nsDOMIterator.cpp b/mozilla/layout/html/base/src/nsDOMIterator.cpp deleted file mode 100644 index f1722cdac82..00000000000 --- a/mozilla/layout/html/base/src/nsDOMIterator.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsDOMIterator.h" -#include "nsIDOMNode.h" - -static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID); - -nsDOMIterator::nsDOMIterator(nsIContent &aContent) : mContent(aContent) -{ - mRefCnt = 1; - - // keep the content alive so the array of children - // does not go away without "this" to know - mContent.AddRef(); - - mPosition = -1; - mScriptObject = nsnull; -} - -nsDOMIterator::~nsDOMIterator() -{ - mContent.Release(); -} - -nsresult nsDOMIterator::QueryInterface(REFNSIID aIID, void** aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - static NS_DEFINE_IID(kIDOMNodeIteratorIID, NS_IDOMNODEITERATOR_IID); - static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID); - if (aIID.Equals(kIDOMNodeIteratorIID)) { - *aInstancePtr = (void*)(nsIDOMNodeIterator*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIScriptObjectOwnerIID)) { - *aInstancePtr = (void*)(nsIScriptObjectOwner*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kISupportsIID)) { - *aInstancePtr = (void*)(nsISupports*)(nsIDOMNodeIterator*)this; - AddRef(); - return NS_OK; - } - return NS_NOINTERFACE; -} - -NS_IMPL_ADDREF(nsDOMIterator) - -NS_IMPL_RELEASE(nsDOMIterator) - - -nsresult nsDOMIterator::GetScriptObject(nsIScriptContext *aContext, void** aScriptObject) -{ - nsresult res = NS_OK; - if (nsnull == mScriptObject) { - res = NS_NewScriptNodeIterator(aContext, this, nsnull, (void**)&mScriptObject); - } - *aScriptObject = mScriptObject; - return res; -} - -nsresult nsDOMIterator::ResetScriptObject() -{ - mScriptObject = nsnull; - return NS_OK; -} - -// nsIDOMIterator interface -nsresult nsDOMIterator::SetFilter(PRInt32 aFilter, PRBool aFilterOn) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsDOMIterator::GetLength(PRUint32 *aLength) -{ - *aLength = mContent.ChildCount(); - return NS_OK; -} - -nsresult nsDOMIterator::GetCurrentNode(nsIDOMNode **aNode) -{ - nsIContent *content = nsnull; - nsresult res = NS_OK; - content = mContent.ChildAt(mPosition); - if (nsnull != content) { - res = content->QueryInterface(kIDOMNodeIID, (void**)aNode); - NS_RELEASE(content); - } - else { - *aNode = nsnull; - } - - return res; -} - -nsresult nsDOMIterator::GetNextNode(nsIDOMNode **aNode) -{ - nsIContent *content = nsnull; - nsresult res = NS_OK; - content = mContent.ChildAt(++mPosition); - if (nsnull != content) { - res = content->QueryInterface(kIDOMNodeIID, (void**)aNode); - NS_RELEASE(content); - } - else { - mPosition = mContent.ChildCount(); - *aNode = nsnull; - } - - return res; -} - -nsresult nsDOMIterator::GetPreviousNode(nsIDOMNode **aNode) -{ - nsIContent *content = nsnull; - nsresult res = NS_OK; - content = mContent.ChildAt(--mPosition); - if (nsnull != content) { - res = content->QueryInterface(kIDOMNodeIID, (void**)aNode); - NS_RELEASE(content); - } - else { - mPosition = -1; - *aNode = nsnull; - } - - return res; -} - -nsresult nsDOMIterator::ToFirst(nsIDOMNode **aNode) -{ - nsIContent *content = nsnull; - nsresult res = NS_OK; - mPosition = 0; - content = mContent.ChildAt(mPosition); - if (nsnull != content) { - res = content->QueryInterface(kIDOMNodeIID, (void**)aNode); - NS_RELEASE(content); - } - else { - *aNode = nsnull; - } - - return res; -} - -nsresult nsDOMIterator::ToLast(nsIDOMNode **aNode) -{ - nsIContent *content = nsnull; - nsresult res = NS_OK; - mPosition = mPosition = mContent.ChildCount(); - content = mContent.ChildAt(mPosition); - if (nsnull != content) { - res = content->QueryInterface(kIDOMNodeIID, (void**)aNode); - NS_RELEASE(content); - } - else { - *aNode = nsnull; - } - - return res; -} - -nsresult nsDOMIterator::MoveTo(int aNth, nsIDOMNode **aNode) -{ - mPosition = aNth; - return GetCurrentNode(aNode); -} - - diff --git a/mozilla/layout/html/base/src/nsDOMIterator.h b/mozilla/layout/html/base/src/nsDOMIterator.h deleted file mode 100644 index 1a582c91957..00000000000 --- a/mozilla/layout/html/base/src/nsDOMIterator.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsDOMIterator_h__ -#define nsDOMIterator_h__ - -#include "nsIDOMNodeIterator.h" -#include "nsIContent.h" -#include "nsIScriptObjectOwner.h" - -class nsDOMIterator : public nsIDOMNodeIterator, public nsIScriptObjectOwner { -public: - nsDOMIterator(nsIContent &aContent); - virtual ~nsDOMIterator(); - - NS_DECL_ISUPPORTS - - NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject); - NS_IMETHOD ResetScriptObject(); - - // nsIDOMIterator interface - NS_IMETHOD SetFilter(PRInt32 aFilter, PRBool aFilterOn); - NS_IMETHOD GetLength(PRUint32 *aLength); - NS_IMETHOD GetCurrentNode(nsIDOMNode **aNode); - NS_IMETHOD GetNextNode(nsIDOMNode **aNode); - NS_IMETHOD GetPreviousNode(nsIDOMNode **aNode); - NS_IMETHOD ToFirst(nsIDOMNode **aNode); - NS_IMETHOD ToLast(nsIDOMNode **aNode); - NS_IMETHOD MoveTo(int aNth, nsIDOMNode **aNode); - -private: - nsIContent &mContent; - PRInt32 mPosition; - void *mScriptObject; -}; - - -#endif - diff --git a/mozilla/layout/html/base/src/nsGlobalVariables.cpp b/mozilla/layout/html/base/src/nsGlobalVariables.cpp deleted file mode 100644 index 6fb5a24d9c1..00000000000 --- a/mozilla/layout/html/base/src/nsGlobalVariables.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsGlobalVariables.h" - -nsGlobalVariables* nsGlobalVariables::gInstance; - -nsGlobalVariables::nsGlobalVariables() -{ - mPresentationContext = nsnull; - mBeveledLines=PR_TRUE; - mBlackLines=PR_FALSE; - mBlackText=PR_FALSE; -} - -nsGlobalVariables::~nsGlobalVariables() -{} - -/** -* -* WARNING: This should only be called when the program exits -* No attemp to release this prior to termination will have -* disastrous consequences. -* -**/ -void nsGlobalVariables::Release() -{ - if (gInstance != nsnull) - delete gInstance; - gInstance = nsnull; -} - -nsGlobalVariables * nsGlobalVariables::Instance() -{ - if (nsnull==gInstance) - gInstance = new nsGlobalVariables(); - return gInstance; -} - -PRBool nsGlobalVariables::GetPrinting(nsIPresContext * aPresentationContext) -{ - return (PRBool) (aPresentationContext == mPresentationContext); -} - -void nsGlobalVariables::SetPrinting(nsIPresContext * aPresentationContext) -{ - mPresentationContext = aPresentationContext; -} - -PRBool nsGlobalVariables::GetBeveledLines() -{ - return mBeveledLines; -} - -void nsGlobalVariables::SetBeveledLines(PRBool aBeveledLines) -{ - mBeveledLines = aBeveledLines; -} - -PRBool nsGlobalVariables::GetBlackLines() -{ - return mBlackLines; -} - -void nsGlobalVariables::SetBlackLines(PRBool aBlackLines) -{ - mBlackLines = aBlackLines; -} - -PRBool nsGlobalVariables::GetBlackText() -{ - return mBlackText; -} - -void nsGlobalVariables::SetBlackText(PRBool aBlackText) -{ - mBlackText = aBlackText; -} - -PRBool nsGlobalVariables::GetBackground() -{ - return mBackground; -} - -void nsGlobalVariables::SetBackground(PRBool aBackground) -{ - mBackground = aBackground; -} diff --git a/mozilla/layout/html/base/src/nsGlobalVariables.h b/mozilla/layout/html/base/src/nsGlobalVariables.h deleted file mode 100644 index 36049f78b2f..00000000000 --- a/mozilla/layout/html/base/src/nsGlobalVariables.h +++ /dev/null @@ -1,133 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef globalvariables_h___ -#define globalvariables_h___ - -#include "nslayout.h" - -// forward declarations -class nsIPresContext; -class nsGlobalVariables; - -/** - * The objective is to emulate the Dogbert page setup control over printing - * behavior. The initial implementation used the style system. However, Kipp - * pointed out that the net result is that exactly one class used it and the - * weight to the system was probably around >2kb for what's really a simple - * PRBool property that only the rendering code uses - can you say bloatware! - * - * Hence, this class. - */ -class nsGlobalVariables -{ -private: - /** The PRBools below are only valid if the rendering presentation context - * is the printing presentation context. - */ - nsIPresContext * mPresentationContext; - - /** mBeveledLines == true means print all HRs as though they have set the - * NOSHADE attribute. - */ - PRBool mBeveledLines; - - /** mBlackLines == true means print all HR and table ruling lines black, - * ignoring whatever color attribute has been set. - */ - PRBool mBlackLines; - - /** mBlackText == true means print all text black, ignoring whatever color - * attribute has been set. - */ - PRBool mBlackText; - - /** mBackground == true means print the background. - */ - PRBool mBackground; - - /** mInstance is the one-and-only instantiation of this class. - * It is accessable only through Instance - */ - static nsGlobalVariables *gInstance; - - /** constructor - */ - nsGlobalVariables(); - -public: - - /** destructor - */ - virtual ~nsGlobalVariables(); - - /** public way to release global instance variables. - * WARNING: This should only be called when the program exits - * No attemp to release this prior to termination will have - * disastrous consequences. - */ - static NS_HTML void Release(); - - /** public accessor. - * This is the ONLY way to get the one-and-only GlobalVariable object. - * I own the storage for the returned pointer, so do not delete it when you're done! - */ - static nsGlobalVariables * Instance(); - - /** - */ - PRBool GetPrinting(nsIPresContext * aPresentationContext); - - /** - */ - void SetPrinting(nsIPresContext * aPresentationContext); - - /** - */ - PRBool GetBeveledLines(); - - /** - */ - void SetBeveledLines(PRBool aBeveledLines); - - /** - */ - PRBool GetBlackLines(); - - /** - */ - void SetBlackLines(PRBool aBlackLines); - - /** - */ - PRBool GetBlackText(); - - /** - */ - void SetBlackText(PRBool aBlackText); - - /** - */ - PRBool GetBackground(); - - /** - */ - void SetBackground(PRBool aBackground); - -}; - -#endif diff --git a/mozilla/layout/html/base/src/nsHRPart.cpp b/mozilla/layout/html/base/src/nsHRPart.cpp deleted file mode 100644 index 45f120658b8..00000000000 --- a/mozilla/layout/html/base/src/nsHRPart.cpp +++ /dev/null @@ -1,485 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLTagContent.h" -#include "nsLeafFrame.h" -#include "nsIRenderingContext.h" -#include "nsGlobalVariables.h" -#include "nsIStyleContext.h" -#include "nsColor.h" -#include "nsIPresContext.h" -#include "nsIStyleContext.h" -#include "nsHTMLIIDs.h" -#include "nsHTMLAtoms.h" -#include "nsIFontMetrics.h" -#include "nsIHTMLAttributes.h" -#include "nsStyleConsts.h" -#include "nsCSSRendering.h" - -#undef DEBUG_HR_REFCNT - -// default hr thickness in pixels -#define DEFAULT_THICKNESS 3 - -class HRulePart : public nsHTMLTagContent { -public: - HRulePart(nsIAtom* aTag); - -#ifdef DEBUG_HR_REFCNT - NS_IMETHOD_(nsrefcnt) AddRef(void); - NS_IMETHOD_(nsrefcnt) Release(void); -#endif - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - - virtual void SetAttribute(nsIAtom* aAttribute, const nsString& aValue); - - virtual void MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext); - - PRInt32 GetThickness(); - - PRBool GetNoShade(); - -protected: - virtual ~HRulePart(); - - virtual nsContentAttr AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const; -}; - -class HRuleFrame : public nsLeafFrame { -public: - HRuleFrame(nsIContent* aContent, - nsIFrame* aParentFrame); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - -protected: - virtual ~HRuleFrame(); - - virtual void GetDesiredSize(nsIPresContext* aPresContext, - const nsReflowState& aReflowState, - nsReflowMetrics& aDesiredSize); -}; - -HRuleFrame::HRuleFrame(nsIContent* aContent, - nsIFrame* aParentFrame) - : nsLeafFrame(aContent, aParentFrame) -{ -} - -HRuleFrame::~HRuleFrame() -{ -} - -NS_METHOD -HRuleFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - if (PR_FALSE == disp->mVisible) { - return NS_OK; - } - - float p2t = aPresContext.GetPixelsToTwips(); - nscoord thickness = nscoord(p2t * ((HRulePart*)mContent)->GetThickness()); - - // Get style data - const nsStyleSpacing* spacing = (const nsStyleSpacing*) - mStyleContext->GetStyleData(eStyleStruct_Spacing); - const nsStyleColor* color = (const nsStyleColor*) - mStyleContext->GetStyleData(eStyleStruct_Color); - const nsStylePosition* position = (const nsStylePosition*) - mStyleContext->GetStyleData(eStyleStruct_Position); - nsMargin borderPadding; - spacing->CalcBorderPaddingFor(this, borderPadding); - nscoord x0 = borderPadding.left; - nscoord y0 = borderPadding.top; - nscoord width = mRect.width - - (borderPadding.left + borderPadding.right); - nscoord height = mRect.height - - (borderPadding.top + borderPadding.bottom); - - nscoord newWidth = width; - if (position->mWidth.GetUnit() == eStyleUnit_Coord) { - newWidth = position->mWidth.GetCoordValue(); - } - else if (position->mWidth.GetUnit() == eStyleUnit_Percent) { - // Width is (mostly) interpreted at rendering time - float pct = position->mWidth.GetPercentValue(); - newWidth = nscoord(pct * mRect.width); - } - if (newWidth < width) { - // center or right align rule within the extra space - const nsStyleText* text = - (const nsStyleText*) mStyleContext->GetStyleData(eStyleStruct_Text); - switch (text->mTextAlign) { - case NS_STYLE_TEXT_ALIGN_RIGHT: - x0 += width - newWidth; - break; - - case NS_STYLE_TEXT_ALIGN_LEFT: - break; - - default: - case NS_STYLE_TEXT_ALIGN_CENTER: - x0 += (width - newWidth) / 2; - break; - } - } - width = newWidth; - - // Center hrule vertically within the available space - y0 += (height - thickness) / 2; - height = thickness; - - // To shade or not to shade, that is the question. Begin by collecting the - // three decision criteria: rendering to the printer or the display, is the - // "Beveled Lines" checkbox set in the page setup dialog, and does the tag - // have the NOSHADE attribute set. - PRBool printing = nsGlobalVariables::Instance()->GetPrinting(&aPresContext); - - PRBool bevel = nsGlobalVariables::Instance()->GetBeveledLines(); - - PRBool noShadeAttribute = PRBool(((HRulePart*)mContent)->GetNoShade()); - - // Now that we have the data to make the shading criteria, we next - // collect the decision criteria for rending in solid black: - // printing (which we already have) and the "Black Lines" setting in - // the page setup dialog - - PRBool blackLines = nsGlobalVariables::Instance()->GetBlackLines(); - nscolor colors[2]; - // Get the background color that applies to this HR - if (printing && blackLines) - { - colors[0] = NS_RGB(0,0,0); - colors[1] = colors[0]; - } - else - { - // XXX Get correct color by finding the first parent that actually - // specifies a color. - nsCSSRendering::Get3DColors(colors, color->mBackgroundColor); - } - - // Draw a "shadowed" box around the rule area - if (!noShadeAttribute && ((printing && bevel) || !printing)) { - // Lines render inclusively on the both the starting and ending - // coordinate, so reduce the end coordinates by one pixel. - nscoord x1 = nscoord(x0 + width - p2t); - nscoord y1 = nscoord(y0 + height - p2t); - - // Draw bottom and right lines - aRenderingContext.SetColor (colors[1]); - aRenderingContext.DrawLine (x1, y0, x1, y1); - aRenderingContext.DrawLine (x1, y1, x0, y1); - - // Draw top and left lines - aRenderingContext.SetColor (colors[0]); - aRenderingContext.DrawLine (x0, y1, x0, y0); - aRenderingContext.DrawLine (x0, y0, x1, y0); - } else { - // When a rule is not shaded, then we use a uniform color and - // draw half-circles on the end points. - aRenderingContext.SetColor (colors[0]); - nscoord diameter = height; - if ((diameter > width) || (diameter < nscoord(p2t * 3))) { - // The half-circles on the ends of the rule aren't going to - // look right so don't bother drawing them. - aRenderingContext.FillRect(x0, y0, width, height); - } else { - aRenderingContext.FillArc(x0, y0, diameter, diameter, 90.0f, 270.0f); - aRenderingContext.FillArc(x0 + width - diameter, y0, - diameter, diameter, 270.0f, 180.0f); - aRenderingContext.FillRect(x0 + diameter/2, y0, - width - diameter, height); - } - } - return NS_OK; -} - -NS_IMETHODIMP -HRuleFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - NS_PRECONDITION(mState & NS_FRAME_IN_REFLOW, "frame is not in reflow"); - - // XXX add in code to check for width/height being set via css - // and if set use them instead of calling GetDesiredSize. - - - GetDesiredSize(aPresContext, aReflowState, aDesiredSize); - AddBordersAndPadding(aPresContext, aDesiredSize); - - // HR's do not impact the max-element-size, otherwise tables behave - // badly. This makes sense they are springy. - if (nsnull != aDesiredSize.maxElementSize) { - nscoord onePixel = nscoord(aPresContext->GetPixelsToTwips()); - aDesiredSize.maxElementSize->width = onePixel; - aDesiredSize.maxElementSize->height = onePixel; - } - - aStatus = NS_FRAME_COMPLETE; - return NS_OK; -} - -void -HRuleFrame::GetDesiredSize(nsIPresContext* aPresContext, - const nsReflowState& aReflowState, - nsReflowMetrics& aDesiredSize) -{ - const nsStylePosition* position = (const nsStylePosition*) - mStyleContext->GetStyleData(eStyleStruct_Position); - if (position->mWidth.GetUnit() == eStyleUnit_Coord) { - aDesiredSize.width = position->mWidth.GetCoordValue(); - } - else if (position->mWidth.GetUnit() == eStyleUnit_Percent) { - float pct = position->mWidth.GetPercentValue(); - if (aReflowState.maxSize.width == NS_UNCONSTRAINEDSIZE) { - aDesiredSize.width = 1; - } - else { - aDesiredSize.width = nscoord(pct * aReflowState.maxSize.width); - } - } - else { - if (aReflowState.maxSize.width == NS_UNCONSTRAINEDSIZE) { - aDesiredSize.width = 1; - } - else { - aDesiredSize.width = aReflowState.maxSize.width; - } - } - if (aReflowState.maxSize.width != NS_UNCONSTRAINEDSIZE) { - if (aDesiredSize.width < aReflowState.maxSize.width) { - aDesiredSize.width = aReflowState.maxSize.width; - } - } - - // XXX should we interpret css's height property as thickness? or as - // line-height? In the meantime, ignore it... - nscoord lineHeight; - - // Get the thickness of the rule (this is not css's height property) - float p2t = aPresContext->GetPixelsToTwips(); - nscoord thickness = nscoord(p2t * ((HRulePart*)mContent)->GetThickness()); - - // Compute height of "line" that hrule will layout within. Use the - // default font to do this. - lineHeight = thickness + nscoord(p2t * 2); - const nsFont& defaultFont = aPresContext->GetDefaultFont(); - nsIFontMetrics* fm = aPresContext->GetMetricsFor(defaultFont); - nscoord defaultLineHeight = fm->GetHeight(); - NS_RELEASE(fm); - if (lineHeight < defaultLineHeight) { - lineHeight = defaultLineHeight; - } - - aDesiredSize.height = lineHeight; - aDesiredSize.ascent = lineHeight; - aDesiredSize.descent = 0; -} - -//---------------------------------------------------------------------- - -HRulePart::HRulePart(nsIAtom* aTag) - : nsHTMLTagContent(aTag) -{ -} - -HRulePart::~HRulePart() -{ -} - -#ifdef DEBUG_HR_REFCNT -nsrefcnt HRulePart::AddRef(void) -{ - return ++mRefCnt; -} - -nsrefcnt HRulePart::Release(void) -{ - NS_PRECONDITION(mRefCnt != 0, "too many release's"); - if (--mRefCnt == 0) { - if (mInHeap) { - delete this; - } - } - return mRefCnt; -} -#endif - -PRInt32 -HRulePart::GetThickness() -{ - PRInt32 result = DEFAULT_THICKNESS; - nsHTMLValue value; - if (eContentAttr_HasValue == GetAttribute(nsHTMLAtoms::size, value)) { - if (value.GetUnit() == eHTMLUnit_Pixel) { - PRInt32 pixels = value.GetPixelValue(); - switch (pixels) { - case 0: - case 1: - result = 1; - break; - default: - result = pixels + 1; - break; - } - } - } - return result; -} - -PRBool -HRulePart::GetNoShade() -{ - PRBool result = PR_FALSE; - nsHTMLValue value; - if (eContentAttr_HasValue == GetAttribute(nsHTMLAtoms::noshade, value)) { - if (value.GetUnit() == eHTMLUnit_Empty) { - result = PR_TRUE; - } - } - return result; -} - -static nsHTMLTagContent::EnumTable kAlignTable[] = { - { "left", NS_STYLE_TEXT_ALIGN_LEFT }, - { "right", NS_STYLE_TEXT_ALIGN_RIGHT }, - { "center", NS_STYLE_TEXT_ALIGN_CENTER }, - { 0 } -}; - -void -HRulePart::SetAttribute(nsIAtom* aAttribute, const nsString& aValue) -{ - nsHTMLValue val; - if (aAttribute == nsHTMLAtoms::width) { - ParseValueOrPercent(aValue, val, eHTMLUnit_Pixel); - nsHTMLTagContent::SetAttribute(aAttribute, val); - } - else if (aAttribute == nsHTMLAtoms::size) { - ParseValue(aValue, 1, 100, val, eHTMLUnit_Pixel); - nsHTMLTagContent::SetAttribute(aAttribute, val); - } - else if (aAttribute == nsHTMLAtoms::noshade) { - val.SetEmptyValue(); - nsHTMLTagContent::SetAttribute(aAttribute, val); - } - else if (aAttribute == nsHTMLAtoms::align) { - if (ParseEnumValue(aValue, kAlignTable, val)) { - nsHTMLTagContent::SetAttribute(aAttribute, val); - } - } - else { - // Use default attribute catching code - nsHTMLTagContent::SetAttribute(aAttribute, aValue); - } -} - -void -HRulePart::MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext) -{ - if (nsnull != mAttributes) { - nsHTMLValue value; - // align: enum - GetAttribute(nsHTMLAtoms::align, value); - if (value.GetUnit() == eHTMLUnit_Enumerated) { - nsStyleText* text = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text); - text->mTextAlign = value.GetIntValue(); - } - - // width: pixel, percent - float p2t = aPresContext->GetPixelsToTwips(); - nsStylePosition* pos = (nsStylePosition*) - aContext->GetMutableStyleData(eStyleStruct_Position); - GetAttribute(nsHTMLAtoms::width, value); - if (value.GetUnit() == eHTMLUnit_Pixel) { - nscoord twips = nscoord(p2t * value.GetPixelValue()); - pos->mWidth.SetCoordValue(twips); - } - else if (value.GetUnit() == eHTMLUnit_Percent) { - pos->mWidth.SetPercentValue(value.GetPercentValue()); - } - } -} - -nsContentAttr -HRulePart::AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const -{ - nsContentAttr ca = eContentAttr_NotThere; - if (aAttribute == nsHTMLAtoms::align) { - if (eHTMLUnit_Enumerated == aValue.GetUnit()) { - EnumValueToString(aValue, kAlignTable, aResult); - ca = eContentAttr_HasValue; - } - } - return ca; -} - -//---------------------------------------------------------------------- - -nsresult -HRulePart::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame = new HRuleFrame(this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -nsresult -NS_NewHRulePart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* body = new HRulePart(aTag); - if (nsnull == body) { - return NS_ERROR_OUT_OF_MEMORY; - } - return body->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/html/base/src/nsHTMLAtoms.cpp b/mozilla/layout/html/base/src/nsHTMLAtoms.cpp deleted file mode 100644 index a5b8b7ff86d..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLAtoms.cpp +++ /dev/null @@ -1,406 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLAtoms.h" - -nsIAtom* nsHTMLAtoms::a; -nsIAtom* nsHTMLAtoms::above; -nsIAtom* nsHTMLAtoms::action; -nsIAtom* nsHTMLAtoms::active; -nsIAtom* nsHTMLAtoms::align; -nsIAtom* nsHTMLAtoms::alink; -nsIAtom* nsHTMLAtoms::alt; -nsIAtom* nsHTMLAtoms::archive; -nsIAtom* nsHTMLAtoms::background; -nsIAtom* nsHTMLAtoms::below; -nsIAtom* nsHTMLAtoms::bgcolor; -nsIAtom* nsHTMLAtoms::body; -nsIAtom* nsHTMLAtoms::border; -nsIAtom* nsHTMLAtoms::bordercolor; -nsIAtom* nsHTMLAtoms::bottompadding; -nsIAtom* nsHTMLAtoms::br; -nsIAtom* nsHTMLAtoms::cellpadding; -nsIAtom* nsHTMLAtoms::cellspacing; -nsIAtom* nsHTMLAtoms::checked; -nsIAtom* nsHTMLAtoms::kClass; -nsIAtom* nsHTMLAtoms::classid; -nsIAtom* nsHTMLAtoms::clear; -nsIAtom* nsHTMLAtoms::clip; -nsIAtom* nsHTMLAtoms::code; -nsIAtom* nsHTMLAtoms::codebase; -nsIAtom* nsHTMLAtoms::color; -nsIAtom* nsHTMLAtoms::cols; -nsIAtom* nsHTMLAtoms::colspan; -nsIAtom* nsHTMLAtoms::columnPseudo; -nsIAtom* nsHTMLAtoms::compact; -nsIAtom* nsHTMLAtoms::coords; -nsIAtom* nsHTMLAtoms::data; -nsIAtom* nsHTMLAtoms::dir; -nsIAtom* nsHTMLAtoms::disabled; -nsIAtom* nsHTMLAtoms::div; -nsIAtom* nsHTMLAtoms::dl; -nsIAtom* nsHTMLAtoms::encoding; -nsIAtom* nsHTMLAtoms::face; -nsIAtom* nsHTMLAtoms::font; -nsIAtom* nsHTMLAtoms::fontWeight; -nsIAtom* nsHTMLAtoms::frameborder; -nsIAtom* nsHTMLAtoms::gutter; -nsIAtom* nsHTMLAtoms::h1; -nsIAtom* nsHTMLAtoms::h2; -nsIAtom* nsHTMLAtoms::h3; -nsIAtom* nsHTMLAtoms::h4; -nsIAtom* nsHTMLAtoms::h5; -nsIAtom* nsHTMLAtoms::h6; -nsIAtom* nsHTMLAtoms::height; -nsIAtom* nsHTMLAtoms::hidden; -nsIAtom* nsHTMLAtoms::hover; -nsIAtom* nsHTMLAtoms::href; -nsIAtom* nsHTMLAtoms::hspace; -nsIAtom* nsHTMLAtoms::httpEquiv; -nsIAtom* nsHTMLAtoms::id; -nsIAtom* nsHTMLAtoms::ismap; -nsIAtom* nsHTMLAtoms::lang; -nsIAtom* nsHTMLAtoms::li; -nsIAtom* nsHTMLAtoms::link; -nsIAtom* nsHTMLAtoms::left; -nsIAtom* nsHTMLAtoms::leftpadding; -nsIAtom* nsHTMLAtoms::lowsrc; -nsIAtom* nsHTMLAtoms::marginheight; -nsIAtom* nsHTMLAtoms::marginwidth; -nsIAtom* nsHTMLAtoms::maxlength; -nsIAtom* nsHTMLAtoms::mayscript; -nsIAtom* nsHTMLAtoms::menu; -nsIAtom* nsHTMLAtoms::method; -nsIAtom* nsHTMLAtoms::multicol; -nsIAtom* nsHTMLAtoms::multiple; -nsIAtom* nsHTMLAtoms::name; -nsIAtom* nsHTMLAtoms::noresize; -nsIAtom* nsHTMLAtoms::noshade; -nsIAtom* nsHTMLAtoms::nowrap; -nsIAtom* nsHTMLAtoms::ol; -nsIAtom* nsHTMLAtoms::onblur; -nsIAtom* nsHTMLAtoms::onfocus; -nsIAtom* nsHTMLAtoms::onload; -nsIAtom* nsHTMLAtoms::onunload; -nsIAtom* nsHTMLAtoms::outOfDate; -nsIAtom* nsHTMLAtoms::overflow; -nsIAtom* nsHTMLAtoms::p; -nsIAtom* nsHTMLAtoms::pagex; -nsIAtom* nsHTMLAtoms::pagey; -nsIAtom* nsHTMLAtoms::pointSize; -nsIAtom* nsHTMLAtoms::pre; -nsIAtom* nsHTMLAtoms::prompt; -nsIAtom* nsHTMLAtoms::readonly; -nsIAtom* nsHTMLAtoms::rel; -nsIAtom* nsHTMLAtoms::repeat; -nsIAtom* nsHTMLAtoms::rightpadding; -nsIAtom* nsHTMLAtoms::rootContentPseudo; -nsIAtom* nsHTMLAtoms::rows; -nsIAtom* nsHTMLAtoms::rowspan; -nsIAtom* nsHTMLAtoms::scrolling; -nsIAtom* nsHTMLAtoms::selected; -nsIAtom* nsHTMLAtoms::shape; -nsIAtom* nsHTMLAtoms::size; -nsIAtom* nsHTMLAtoms::span; -nsIAtom* nsHTMLAtoms::src; -nsIAtom* nsHTMLAtoms::start; -nsIAtom* nsHTMLAtoms::style; -nsIAtom* nsHTMLAtoms::summary; -nsIAtom* nsHTMLAtoms::suppress; -nsIAtom* nsHTMLAtoms::table; -nsIAtom* nsHTMLAtoms::tabstop; -nsIAtom* nsHTMLAtoms::target; -nsIAtom* nsHTMLAtoms::text; -nsIAtom* nsHTMLAtoms::top; -nsIAtom* nsHTMLAtoms::toppadding; -nsIAtom* nsHTMLAtoms::type; -nsIAtom* nsHTMLAtoms::ul; -nsIAtom* nsHTMLAtoms::usemap; -nsIAtom* nsHTMLAtoms::valign; -nsIAtom* nsHTMLAtoms::value; -nsIAtom* nsHTMLAtoms::variable; -nsIAtom* nsHTMLAtoms::visibility; -nsIAtom* nsHTMLAtoms::visited; -nsIAtom* nsHTMLAtoms::vlink; -nsIAtom* nsHTMLAtoms::vspace; -nsIAtom* nsHTMLAtoms::width; -nsIAtom* nsHTMLAtoms::wrap; -nsIAtom* nsHTMLAtoms::zindex; - - -static nsrefcnt gRefCnt; - -void nsHTMLAtoms::AddrefAtoms() -{ - if (0 == gRefCnt) { - a = NS_NewAtom("A"); - above = NS_NewAtom("ABOVE"); - action = NS_NewAtom("ACTION"); - active = NS_NewAtom("ACTIVE"); - align = NS_NewAtom("ALIGN"); - alink = NS_NewAtom("ALINK"); - alt = NS_NewAtom("ALT"); - archive = NS_NewAtom("ARCHIVE"); - background = NS_NewAtom("BACKGROUND"); - below = NS_NewAtom("BELOW"); - bgcolor = NS_NewAtom("BGCOLOR"); - body = NS_NewAtom("BODY"); - border = NS_NewAtom("BORDER"); - bordercolor = NS_NewAtom("BORDERCOLOR"); - bottompadding = NS_NewAtom("BOTTOMPADDING"); - br = NS_NewAtom("BR"); - cellpadding = NS_NewAtom("CELLPADDING"); - cellspacing = NS_NewAtom("CELLSPACING"); - checked = NS_NewAtom("CHECKED"); - kClass = NS_NewAtom("CLASS"); - classid = NS_NewAtom("CLASSID"); - clear = NS_NewAtom("CLEAR"); - clip = NS_NewAtom("CLIP"); - code = NS_NewAtom("CODE"); - codebase = NS_NewAtom("CODEBASE"); - color = NS_NewAtom("COLOR"); - cols = NS_NewAtom("COLS"); - colspan = NS_NewAtom("COLSPAN"); - columnPseudo = NS_NewAtom(":BODY-COLUMN"); - compact = NS_NewAtom("COMPACT"); - coords = NS_NewAtom("COORDS"); - dir = NS_NewAtom("DIR"); - div = NS_NewAtom("DIV"); - disabled = NS_NewAtom("DISABLED"); - dl = NS_NewAtom("DL"); - data = NS_NewAtom("DATA"); - encoding = NS_NewAtom("ENCODING"); - face = NS_NewAtom("FACE"); - font = NS_NewAtom("FONT"); - fontWeight = NS_NewAtom("FONT-WEIGHT"); - frameborder = NS_NewAtom("FRAMEBORDER"); - gutter = NS_NewAtom("GUTTER"); - h1 = NS_NewAtom("H1"); - h2 = NS_NewAtom("H2"); - h3 = NS_NewAtom("H3"); - h4 = NS_NewAtom("H4"); - h5 = NS_NewAtom("H5"); - h6 = NS_NewAtom("H6"); - height = NS_NewAtom("HEIGHT"); - hidden = NS_NewAtom("HIDDEN"); - hover = NS_NewAtom("HOVER"); - href = NS_NewAtom("HREF"); - hspace = NS_NewAtom("HSPACE"); - httpEquiv = NS_NewAtom("HTTP-EQUIV"); - id = NS_NewAtom("ID"); - ismap = NS_NewAtom("ISMAP"); - lang = NS_NewAtom("LANG"); - li = NS_NewAtom("LI"); - link = NS_NewAtom("LINK"); - left = NS_NewAtom("LEFT"); - leftpadding = NS_NewAtom("LEFTPADDING"); - lowsrc = NS_NewAtom("LOWSRC"); - marginheight = NS_NewAtom("MARGINHEIGHT"); - marginwidth = NS_NewAtom("MARGINWIDTH"); - maxlength = NS_NewAtom("MAXLENGTH"); - mayscript = NS_NewAtom("MAYSCRIPT"); - menu = NS_NewAtom("MENU"); - method = NS_NewAtom("METHOD"); - multicol = NS_NewAtom("MULTICOL"); - multiple = NS_NewAtom("MULTIPLE"); - name = NS_NewAtom("NAME"); - noresize = NS_NewAtom("NORESIZE"); - noshade = NS_NewAtom("NOSHADE"); - nowrap = NS_NewAtom("NOWRAP"); - ol = NS_NewAtom("OL"); - onblur = NS_NewAtom("ONBLUR"); - onfocus = NS_NewAtom("ONFOCUS"); - onload = NS_NewAtom("ONLOAD"); - onunload = NS_NewAtom("ONUNLOAD"); - outOfDate = NS_NewAtom("OUT-OF-DATE"); - overflow = NS_NewAtom("OVERFLOW"); - p = NS_NewAtom("P"); - pagex = NS_NewAtom("PAGEX"); - pagey = NS_NewAtom("PAGEY"); - pointSize = NS_NewAtom("POINT-SIZE"); - pre = NS_NewAtom("PRE"); - prompt = NS_NewAtom("PROMPT"); - readonly = NS_NewAtom("READONLY"); - rel = NS_NewAtom("REL"); - repeat = NS_NewAtom("REPEAT"); - rightpadding = NS_NewAtom("RIGHTPADDING"); - rootContentPseudo = NS_NewAtom(":ROOT-CONTENT"); - rows = NS_NewAtom("ROWS"); - rowspan = NS_NewAtom("ROWSPAN"); - scrolling = NS_NewAtom("SCROLLING"); - selected = NS_NewAtom("SELECTED"); - shape = NS_NewAtom("SHAPE"); - size = NS_NewAtom("SIZE"); - span = NS_NewAtom("SPAN"); - src = NS_NewAtom("SRC"); - start = NS_NewAtom("START"); - style = NS_NewAtom("STYLE"); - summary = NS_NewAtom("SUMMARY"); - suppress = NS_NewAtom("SUPPRESS"); - table = NS_NewAtom("TABLE"); - tabstop = NS_NewAtom("TABSTOP"); - target = NS_NewAtom("TARGET"); - text = NS_NewAtom("TEXT"); - top = NS_NewAtom("TOP"); - toppadding = NS_NewAtom("TOPPADDING"); - type = NS_NewAtom("TYPE"); - ul = NS_NewAtom("UL"); - usemap = NS_NewAtom("USEMAP"); - valign = NS_NewAtom("VALIGN"); - value = NS_NewAtom("VALUE"); - variable = NS_NewAtom("VARIABLE"); - visibility = NS_NewAtom("VISIBILITY"); - visited = NS_NewAtom("VISITED"); - vlink = NS_NewAtom("VLINK"); - vspace = NS_NewAtom("VSPACE"); - width = NS_NewAtom("WIDTH"); - wrap = NS_NewAtom("WRAP"); - zindex = NS_NewAtom("ZINDEX"); - } - ++gRefCnt; -} - -void nsHTMLAtoms::ReleaseAtoms() -{ - NS_PRECONDITION(gRefCnt != 0, "bad release atoms"); - if (--gRefCnt == 0) { - NS_RELEASE(a); - NS_RELEASE(above); - NS_RELEASE(action); - NS_RELEASE(active); - NS_RELEASE(align); - NS_RELEASE(alink); - NS_RELEASE(alt); - NS_RELEASE(archive); - NS_RELEASE(background); - NS_RELEASE(below); - NS_RELEASE(bgcolor); - NS_RELEASE(body); - NS_RELEASE(border); - NS_RELEASE(bordercolor); - NS_RELEASE(bottompadding); - NS_RELEASE(br); - NS_RELEASE(cellpadding); - NS_RELEASE(cellspacing); - NS_RELEASE(checked); - NS_RELEASE(kClass); - NS_RELEASE(classid); - NS_RELEASE(clear); - NS_RELEASE(clip); - NS_RELEASE(code); - NS_RELEASE(codebase); - NS_RELEASE(color); - NS_RELEASE(cols); - NS_RELEASE(colspan); - NS_RELEASE(columnPseudo); - NS_RELEASE(compact); - NS_RELEASE(coords); - NS_RELEASE(dir); - NS_RELEASE(disabled); - NS_RELEASE(div); - NS_RELEASE(dl); - NS_RELEASE(data); - NS_RELEASE(encoding); - NS_RELEASE(face); - NS_RELEASE(font); - NS_RELEASE(fontWeight); - NS_RELEASE(frameborder); - NS_RELEASE(gutter); - NS_RELEASE(h1); - NS_RELEASE(h2); - NS_RELEASE(h3); - NS_RELEASE(h4); - NS_RELEASE(h5); - NS_RELEASE(h6); - NS_RELEASE(height); - NS_RELEASE(hidden); - NS_RELEASE(hover); - NS_RELEASE(href); - NS_RELEASE(hspace); - NS_RELEASE(httpEquiv); - NS_RELEASE(id); - NS_RELEASE(ismap); - NS_RELEASE(lang); - NS_RELEASE(li); - NS_RELEASE(link); - NS_RELEASE(left); - NS_RELEASE(leftpadding); - NS_RELEASE(lowsrc); - NS_RELEASE(marginheight); - NS_RELEASE(marginwidth); - NS_RELEASE(maxlength); - NS_RELEASE(mayscript); - NS_RELEASE(menu); - NS_RELEASE(method); - NS_RELEASE(multicol); - NS_RELEASE(multiple); - NS_RELEASE(name); - NS_RELEASE(noresize); - NS_RELEASE(noshade); - NS_RELEASE(nowrap); - NS_RELEASE(ol); - NS_RELEASE(onblur); - NS_RELEASE(onfocus); - NS_RELEASE(onload); - NS_RELEASE(onunload); - NS_RELEASE(outOfDate); - NS_RELEASE(overflow); - NS_RELEASE(p); - NS_RELEASE(pagex); - NS_RELEASE(pagey); - NS_RELEASE(pointSize); - NS_RELEASE(pre); - NS_RELEASE(prompt); - NS_RELEASE(readonly); - NS_RELEASE(rel); - NS_RELEASE(repeat); - NS_RELEASE(rightpadding); - NS_RELEASE(rootContentPseudo); - NS_RELEASE(rows); - NS_RELEASE(rowspan); - NS_RELEASE(scrolling); - NS_RELEASE(selected); - NS_RELEASE(shape); - NS_RELEASE(size); - NS_RELEASE(span); - NS_RELEASE(src); - NS_RELEASE(start); - NS_RELEASE(style); - NS_RELEASE(summary); - NS_RELEASE(suppress); - NS_RELEASE(table); - NS_RELEASE(tabstop); - NS_RELEASE(target); - NS_RELEASE(text); - NS_RELEASE(top); - NS_RELEASE(toppadding); - NS_RELEASE(type); - NS_RELEASE(ul); - NS_RELEASE(usemap); - NS_RELEASE(valign); - NS_RELEASE(value); - NS_RELEASE(variable); - NS_RELEASE(visibility); - NS_RELEASE(visited); - NS_RELEASE(vlink); - NS_RELEASE(vspace); - NS_RELEASE(width); - NS_RELEASE(wrap); - NS_RELEASE(zindex); - } -} - diff --git a/mozilla/layout/html/base/src/nsHTMLAtoms.h b/mozilla/layout/html/base/src/nsHTMLAtoms.h deleted file mode 100644 index e7a1eed624a..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLAtoms.h +++ /dev/null @@ -1,181 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLAtoms_h___ -#define nsHTMLAtoms_h___ - -#include "nsIAtom.h" - -/** - * This class wraps up the creation (and destruction) of the standard - * set of html atoms used during normal html handling. This objects - * are created when the first html content object is created and they - * are destroyed when the last html content object is destroyed. - */ -class nsHTMLAtoms { -public: - - static void AddrefAtoms(); - static void ReleaseAtoms(); - - // Alphabetical list of html attribute atoms - static nsIAtom* a; - static nsIAtom* above; - static nsIAtom* action; - static nsIAtom* active; - static nsIAtom* align; - static nsIAtom* alink; - static nsIAtom* alt; - static nsIAtom* archive; - - static nsIAtom* background; - static nsIAtom* below; - static nsIAtom* bgcolor; - static nsIAtom* body; - static nsIAtom* border; - static nsIAtom* bordercolor; - static nsIAtom* bottompadding; - static nsIAtom* br; - - static nsIAtom* cellpadding; - static nsIAtom* cellspacing; - static nsIAtom* checked; - static nsIAtom* kClass; - static nsIAtom* classid; - static nsIAtom* clear; - static nsIAtom* clip; - static nsIAtom* code; - static nsIAtom* codebase; - static nsIAtom* color; - static nsIAtom* cols; - static nsIAtom* colspan; - static nsIAtom* columnPseudo; - static nsIAtom* compact; - static nsIAtom* coords; - - static nsIAtom* data; - static nsIAtom* dir; - static nsIAtom* disabled; - static nsIAtom* div; - static nsIAtom* dl; - - static nsIAtom* encoding; - - static nsIAtom* face; - static nsIAtom* font; - static nsIAtom* fontWeight; - static nsIAtom* frameborder; - - static nsIAtom* gutter; - - static nsIAtom* h1; - static nsIAtom* h2; - static nsIAtom* h3; - static nsIAtom* h4; - static nsIAtom* h5; - static nsIAtom* h6; - static nsIAtom* height; - static nsIAtom* hidden; - static nsIAtom* hover; - static nsIAtom* href; - static nsIAtom* hspace; - static nsIAtom* httpEquiv; - - static nsIAtom* id; - static nsIAtom* ismap; - - static nsIAtom* lang; - static nsIAtom* li; - static nsIAtom* link; - static nsIAtom* left; - static nsIAtom* leftpadding; - static nsIAtom* lowsrc; - - static nsIAtom* marginheight; - static nsIAtom* marginwidth; - static nsIAtom* maxlength; - static nsIAtom* mayscript; - static nsIAtom* menu; - static nsIAtom* method; - static nsIAtom* multicol; - static nsIAtom* multiple; - - static nsIAtom* name; - static nsIAtom* noresize; - static nsIAtom* noshade; - static nsIAtom* nowrap; - - static nsIAtom* ol; - static nsIAtom* onblur; - static nsIAtom* onfocus; - static nsIAtom* onload; - static nsIAtom* onunload; - static nsIAtom* outOfDate; - static nsIAtom* overflow; - - static nsIAtom* p; - static nsIAtom* pagex; - static nsIAtom* pagey; - static nsIAtom* pointSize; - static nsIAtom* pre; - static nsIAtom* prompt; - - static nsIAtom* readonly; - static nsIAtom* rel; - static nsIAtom* repeat; - static nsIAtom* rightpadding; - static nsIAtom* rootContentPseudo; - static nsIAtom* rows; - static nsIAtom* rowspan; - - static nsIAtom* scrolling; - static nsIAtom* selected; - static nsIAtom* shape; - static nsIAtom* size; - static nsIAtom* span; - static nsIAtom* src; - static nsIAtom* start; - static nsIAtom* style; - static nsIAtom* summary; - static nsIAtom* suppress; - - static nsIAtom* table; - static nsIAtom* tabstop; - static nsIAtom* target; - static nsIAtom* text; - static nsIAtom* top; - static nsIAtom* toppadding; - static nsIAtom* type; - - static nsIAtom* ul; - static nsIAtom* usemap; - - static nsIAtom* valign; - static nsIAtom* value; - static nsIAtom* variable; - static nsIAtom* visibility; - static nsIAtom* visited; - static nsIAtom* vlink; - static nsIAtom* vspace; - - static nsIAtom* width; - static nsIAtom* wrap; - - static nsIAtom* zindex; -}; - -#endif /* nsHTMLAtoms_h___ */ diff --git a/mozilla/layout/html/base/src/nsHTMLBase.cpp b/mozilla/layout/html/base/src/nsHTMLBase.cpp deleted file mode 100644 index 6eb01431080..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLBase.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsAbsoluteFrame.h" -#include "nsFrame.h" -#include "nsHTMLBase.h" -#include "nsPlaceholderFrame.h" -#include "nsScrollFrame.h" -#include "nsStyleConsts.h" -#include "nsViewsCID.h" - -#include "nsIContentDelegate.h" -#include "nsIPresContext.h" -#include "nsIStyleContext.h" -#include "nsIView.h" -#include "nsIViewManager.h" - -nsresult -nsHTMLBase::CreateViewForFrame(nsIPresContext* aPresContext, - nsIFrame* aFrame, - nsIStyleContext* aStyleContext, - PRBool aForce) -{ - nsIView* view; - aFrame->GetView(view); - if (nsnull == view) { - // We don't yet have a view; see if we need a view - - PRBool scrollView = PR_FALSE; - - // See if the opacity is not the same as the geometric parent - // frames opacity. - if (!aForce) { - nsIFrame* parent; - aFrame->GetGeometricParent(parent); - if (nsnull != parent) { - // Get my nsStyleColor - const nsStyleColor* myColor = (const nsStyleColor*) - aStyleContext->GetStyleData(eStyleStruct_Color); - - // Get parent's nsStyleColor - const nsStyleColor* parentColor; - parent->GetStyleData(eStyleStruct_Color, (const nsStyleStruct*&)parentColor); - - // If the opacities are different then I need a view - if (myColor->mOpacity != parentColor->mOpacity) { - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("nsHTMLBase::CreateViewForFrame: frame=%p opacity=%g parentOpacity=%g", - aFrame, myColor->mOpacity, parentColor->mOpacity)); - aForce = PR_TRUE; - } - } - } - - // See if the frame is being relatively positioned - if (!aForce) { - const nsStylePosition* position = (const nsStylePosition*) - aStyleContext->GetStyleData(eStyleStruct_Position); - if (NS_STYLE_POSITION_RELATIVE == position->mPosition) { - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("nsHTMLBase::CreateViewForFrame: frame=%p relatively positioned", - aFrame)); - aForce = PR_TRUE; - } - } - - if (aForce) { - // Create a view - nsIFrame* parent; - nsIView* view; - - aFrame->GetParentWithView(parent); - NS_ASSERTION(parent, "GetParentWithView failed"); - nsIView* parView; - - parent->GetView(parView); - NS_ASSERTION(parView, "no parent with view"); - - // Create a view - static NS_DEFINE_IID(kViewCID, NS_VIEW_CID); - static NS_DEFINE_IID(kIViewIID, NS_IVIEW_IID); - - nsresult result = NSRepository::CreateInstance(kViewCID, - nsnull, - kIViewIID, - (void **)&view); - if (NS_OK == result) { - nsIView* rootView = parView; - nsIViewManager* viewManager = rootView->GetViewManager(); - - // Initialize the view - NS_ASSERTION(nsnull != viewManager, "null view manager"); - - nsRect bounds; - aFrame->GetRect(bounds); - view->Init(viewManager, bounds, rootView); - viewManager->InsertChild(rootView, view, 0); - - NS_RELEASE(viewManager); - } - - // Remember our view - aFrame->SetView(view); - NS_RELEASE(view); - NS_RELEASE(parView); - - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("nsHTMLBase::CreateViewForFrame: frame=%p view=%p", - aFrame)); - return result; - } - } - return NS_OK; -} - -nsresult -nsHTMLBase::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIContent* aKid, - nsIFrame* aKidPrevInFlow, - nsIFrame*& aResult) -{ - nsIStyleContext* kidSC = - aPresContext->ResolveStyleContextFor(aKid, aParentFrame); - if (nsnull == kidSC) { - return NS_ERROR_OUT_OF_MEMORY; - } - const nsStylePosition* kidPosition = (const nsStylePosition*) - kidSC->GetStyleData(eStyleStruct_Position); - const nsStyleDisplay* kidDisplay = (const nsStyleDisplay*) - kidSC->GetStyleData(eStyleStruct_Display); - - // Check whether it wants to floated or absolutely positioned - nsIFrame* kidFrame = nsnull; - nsresult rv; - if (NS_STYLE_POSITION_ABSOLUTE == kidPosition->mPosition) { - rv = nsAbsoluteFrame::NewFrame(&kidFrame, aKid, aParentFrame); - if (NS_OK == rv) { - kidFrame->SetStyleContext(aPresContext, kidSC); - } - } - else if (NS_STYLE_FLOAT_NONE != kidDisplay->mFloats) { - rv = nsPlaceholderFrame::NewFrame(&kidFrame, aKid, aParentFrame); - if (NS_OK == rv) { - kidFrame->SetStyleContext(aPresContext, kidSC); - } - } - else if ((NS_STYLE_OVERFLOW_SCROLL == kidDisplay->mOverflow) || - (NS_STYLE_OVERFLOW_AUTO == kidDisplay->mOverflow)) { - rv = NS_NewScrollFrame(&kidFrame, aKid, aParentFrame); - if (NS_OK == rv) { - kidFrame->SetStyleContext(aPresContext, kidSC); - } - } - else if (nsnull == aKidPrevInFlow) { - // Create initial frame for the child - nsIContentDelegate* kidDel; - switch (kidDisplay->mDisplay) { - case NS_STYLE_DISPLAY_NONE: - rv = nsFrame::NewFrame(&kidFrame, aKid, aParentFrame); - if (NS_OK == rv) { - kidFrame->SetStyleContext(aPresContext, kidSC); - } - break; - - default: - kidDel = aKid->GetDelegate(aPresContext); - rv = kidDel->CreateFrame(aPresContext, aKid, aParentFrame, - kidSC, kidFrame); - NS_RELEASE(kidDel); - break; - } - } else { - // Since kid has a prev-in-flow, use that to create the next - // frame. - rv = aKidPrevInFlow->CreateContinuingFrame(aPresContext, aParentFrame, - kidSC, kidFrame); - } - - if (NS_OK == rv) { - // Wrap the frame in a view if necessary - rv = CreateViewForFrame(aPresContext, kidFrame, kidSC, PR_FALSE); - } - - aResult = kidFrame; - NS_RELEASE(kidSC); - return rv; -} diff --git a/mozilla/layout/html/base/src/nsHTMLBase.h b/mozilla/layout/html/base/src/nsHTMLBase.h deleted file mode 100644 index c4cdc6df679..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLBase.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLBase_h___ -#define nsHTMLBase_h___ - -#include "nsIFrame.h" - -// This is a class whose purpose is to provide shared code that is -// common to all html frames, including containers and leaf frames. -class nsHTMLBase { -public: - /** - * Create a view for a frame if it needs one. A frame needs a view - * if it requires a scrollbar, is relatively positioned or has a - * non opaque opacity. - */ - static nsresult CreateViewForFrame(nsIPresContext* aPresContext, - nsIFrame* aFrame, - nsIStyleContext* aStyleContext, - PRBool aForce); - - /** - * Create a frame for a given piece of content using the style - * as a guide for determining which frame to create. - */ - static nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIContent* aKid, - nsIFrame* aKidPrevInFlow, - nsIFrame*& aResult); -}; - -#endif /* nsHTMLBase_h___ */ diff --git a/mozilla/layout/html/base/src/nsHTMLBullet.cpp b/mozilla/layout/html/base/src/nsHTMLBullet.cpp deleted file mode 100644 index 7d0cf4e7ea9..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLBullet.cpp +++ /dev/null @@ -1,632 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLTagContent.h" -#include "nsLeafFrame.h" -#include "nsCSSBlockFrame.h" -#include "nsIInlineReflow.h" -#include "nsCSSLineLayout.h" -#include "nsIPresContext.h" -#include "nsIPresShell.h" -#include "nsIRenderingContext.h" -#include "nsIFontMetrics.h" -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" -#include "nsHTMLAtoms.h" -#include "nsHTMLIIDs.h" -#include "nsHTMLImage.h" -#include "prprf.h" -#include "nsHTMLBase.h" -#include "nsIView.h" - -// XXX eliminate the bullet numbering hackery: - -// 1) use a dependency graph of some sort that is updated when LI's -// come and go in the content model (how do we invalidate it when a -// content change occurs?): maybe for block's that are display: -// list-item, they keep a side data structure that is the ordinal data -// for it's children LI's? - -// 2) Alternatively, have the LI's number themselves automatically and -// use a GetAttribute on the content to discover the correct number (N^2) - -// XXX Also eliminate the way that we find the -// nsCSSBlockReflowState!!! It's bogus beyond belief! An ISA -// QueryInterface on the reflow-state should do the trick. - -class Bullet : public nsHTMLTagContent { -public: - Bullet(); - - NS_IMETHOD IsSynthetic(PRBool& aResult); - - void MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext); - - void List(FILE* out, PRInt32 aIndent) const; - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); -}; - -class BulletFrame : public nsFrame, private nsIInlineReflow { -public: - BulletFrame(nsIContent* aContent, nsIFrame* aParentFrame); - virtual ~BulletFrame(); - - // nsISupports - NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr); - - // nsIFrame - NS_IMETHOD DeleteFrame(); - NS_IMETHOD Paint(nsIPresContext &aCX, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - NS_IMETHOD List(FILE* out, PRInt32 aIndent) const; - - // nsIInlineReflow - NS_IMETHOD FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand); - NS_IMETHOD InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState); - -protected: - void GetDesiredSize(nsIPresContext* aPresContext, - nsCSSBlockReflowState* aBlockState, - const nsReflowState& aReflowState, - nsReflowMetrics& aMetrics); - - PRInt32 GetListItemOrdinal(nsIPresContext* aCX, - nsCSSBlockReflowState* aBlockState, - const nsStyleList& aMol); - - void GetListItemText(nsIPresContext* aCX, - nsCSSBlockReflowState* aBlockState, - const nsStyleList& aMol, - nsString& aResult); - - nsCSSBlockReflowState* - GetListContainerReflowState(nsIPresContext* aCX, - const nsReflowState& aReflowState); - - PRPackedBool mOrdinalValid; - PRInt32 mOrdinal; - nsMargin mPadding; - nsHTMLImageLoader mImageLoader; -}; - -//---------------------------------------------------------------------- - -Bullet::Bullet() -{ -} - -void -Bullet::MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext) -{ - // Force display to be inline (bullet's are not block level) - nsStyleDisplay* display = (nsStyleDisplay*) - aContext->GetMutableStyleData(eStyleStruct_Display); - display->mDisplay = NS_STYLE_DISPLAY_INLINE; -} - -NS_METHOD -Bullet::IsSynthetic(PRBool& aResult) -{ - aResult = PR_TRUE; - return NS_OK; -} - -void -Bullet::List(FILE* out, PRInt32 aIndent) const -{ - for (PRInt32 i = aIndent; --i >= 0; ) fputs(" ", out); - fprintf(out, "Bullet RefCnt=%d<>\n", mRefCnt); -} - -nsresult -Bullet::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - BulletFrame* frame = new BulletFrame(this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - aResult = frame; - frame->SetStyleContext(aPresContext, aStyleContext); - return NS_OK; -} - -nsresult -NS_NewHTMLBullet(nsIHTMLContent** aInstancePtrResult) -{ - Bullet* it = new Bullet(); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void**) aInstancePtrResult); -} - -//---------------------------------------------------------------------- - -BulletFrame::BulletFrame(nsIContent* aContent, nsIFrame* aParentFrame) - : nsFrame(aContent, aParentFrame) -{ -} - -BulletFrame::~BulletFrame() -{ -} - -NS_IMETHODIMP -BulletFrame::QueryInterface(REFNSIID aIID, void** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIInlineReflowIID)) { - *aInstancePtrResult = (void*) ((nsIInlineReflow*)this); - return NS_OK; - } - return nsFrame::QueryInterface(aIID, aInstancePtrResult); -} - -NS_METHOD -BulletFrame::DeleteFrame() -{ - // Release image loader first so that it's refcnt can go to zero - mImageLoader.DestroyLoader(); - return nsFrame::DeleteFrame(); -} - -NS_METHOD -BulletFrame::List(FILE* out, PRInt32 aIndent) const -{ - PRInt32 i; - for (i = aIndent; --i >= 0; ) fputs(" ", out); - PRInt32 contentIndex; - GetContentIndex(contentIndex); - fprintf(out, "Bullet(%d)@%p ", - contentIndex, this); - nsIView* view; - GetView(view); - if (nsnull != view) { - fprintf(out, " [view=%p]", view); - NS_RELEASE(view); - } - - out << mRect; - if (0 != mState) { - fprintf(out, " [state=%08x]", mState); - } - fputs("<>\n", out); - return NS_OK; -} - -NS_METHOD -BulletFrame::Paint(nsIPresContext& aCX, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - - if (disp->mVisible) { - const nsStyleList* myList = - (const nsStyleList*)mStyleContext->GetStyleData(eStyleStruct_List); - - if (myList->mListStyleImage.Length() > 0) { - nsIImage* image = mImageLoader.GetImage(); - if (nsnull == image) { - if (!mImageLoader.GetLoadImageFailed()) { - // No image yet - return NS_OK; - } - } - else { - nsRect innerArea(mPadding.left, mPadding.top, - mRect.width - (mPadding.left + mPadding.right), - mRect.height - (mPadding.top + mPadding.bottom)); - aRenderingContext.DrawImage(image, innerArea); - return NS_OK; - } - } - - const nsStyleFont* myFont = - (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); - const nsStyleColor* myColor = - (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - nsIFontMetrics* fm; - aRenderingContext.SetColor(myColor->mColor); - - nsAutoString text; - switch (myList->mListStyleType) { - case NS_STYLE_LIST_STYLE_NONE: - break; - - default: - case NS_STYLE_LIST_STYLE_BASIC: - case NS_STYLE_LIST_STYLE_DISC: - aRenderingContext.FillEllipse(mPadding.left, mPadding.top, - mRect.width - (mPadding.left + mPadding.right), - mRect.height - (mPadding.top + mPadding.bottom)); - break; - - case NS_STYLE_LIST_STYLE_CIRCLE: - aRenderingContext.DrawEllipse(mPadding.left, mPadding.top, - mRect.width - (mPadding.left + mPadding.right), - mRect.height - (mPadding.top + mPadding.bottom)); - break; - - case NS_STYLE_LIST_STYLE_SQUARE: - aRenderingContext.FillRect(mPadding.left, mPadding.top, - mRect.width - (mPadding.left + mPadding.right), - mRect.height - (mPadding.top + mPadding.bottom)); - break; - - case NS_STYLE_LIST_STYLE_DECIMAL: - case NS_STYLE_LIST_STYLE_LOWER_ROMAN: - case NS_STYLE_LIST_STYLE_UPPER_ROMAN: - case NS_STYLE_LIST_STYLE_LOWER_ALPHA: - case NS_STYLE_LIST_STYLE_UPPER_ALPHA: - fm = aCX.GetMetricsFor(myFont->mFont); - GetListItemText(&aCX, nsnull, *myList, text); - aRenderingContext.SetFont(myFont->mFont); - aRenderingContext.DrawString(text, mPadding.left, mPadding.top, - fm->GetWidth(text)); - NS_RELEASE(fm); - break; - } - } - return NS_OK; -} - -// XXX This is a hack to discover the block container that is keeping -// track of our list item ordinal value - -// Return the reflow state for the list container that contains this -// list item frame. There may be no list container (a dangling LI) -// therefore this may return nsnull. -nsCSSBlockReflowState* -BulletFrame::GetListContainerReflowState(nsIPresContext* aCX, - const nsReflowState& aReflowState) -{ - const nsReflowState* rs = aReflowState.parentReflowState; - while (nsnull != rs) { - nsIContent* content; - rs->frame->GetContent(content); - nsIAtom* tag = content->GetTag(); - NS_RELEASE(content); - if ((tag == nsHTMLAtoms::ul) || (tag == nsHTMLAtoms::ol) || - (tag == nsHTMLAtoms::menu) || (tag == nsHTMLAtoms::dir)) { - NS_RELEASE(tag); - return (nsCSSBlockReflowState*) rs; - } - NS_RELEASE(tag); - rs = rs->parentReflowState; - } - return nsnull; -} - -PRInt32 -BulletFrame::GetListItemOrdinal(nsIPresContext* aCX, - nsCSSBlockReflowState* aReflowState, - const nsStyleList& aListStyle) -{ - if (mOrdinalValid) { - return mOrdinal; - } - - PRInt32 ordinal = 0; - - // Try to get value directly from the list-item, if it specifies a - // value attribute. We do this with our parent's content. - nsHTMLValue value; - nsIContent* parentContent; - mContentParent->GetContent(parentContent); - nsIHTMLContent* html = (nsIHTMLContent*) parentContent; - if (eContentAttr_HasValue == html->GetAttribute(nsHTMLAtoms::value, value)) { - if (eHTMLUnit_Integer == value.GetUnit()) { - ordinal = value.GetIntValue(); - if (nsnull != aReflowState) { - aReflowState->mNextListOrdinal = ordinal + 1; - } - NS_RELEASE(html); - goto done; - } - } - NS_RELEASE(html); - - // Get ordinal from block reflow state - if (nsnull != aReflowState) { - ordinal = aReflowState->mNextListOrdinal; - if (ordinal < 0) { - // This is the first list item and the list container doesn't - // have a "start" attribute. Get the starting ordinal value - // correctly set. - switch (aListStyle.mListStyleType) { - case NS_STYLE_LIST_STYLE_DECIMAL: - case NS_STYLE_LIST_STYLE_LOWER_ROMAN: - case NS_STYLE_LIST_STYLE_UPPER_ROMAN: - ordinal = 1; - break; - default: - ordinal = 0; - break; - } - } - aReflowState->mNextListOrdinal = ordinal + 1; - } - - done: - mOrdinal = ordinal; - mOrdinalValid = PR_TRUE; - return ordinal; -} - -static const char* gLowerRomanCharsA = "ixcm"; -static const char* gUpperRomanCharsA = "IXCM"; -static const char* gLowerRomanCharsB = "vld?"; -static const char* gUpperRomanCharsB = "VLD?"; -static const char* gLowerAlphaChars = "abcdefghijklmnopqrstuvwxyz"; -static const char* gUpperAlphaChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - -// XXX change roman/alpha to use unsigned math so that maxint and -// maxnegint will work -void -BulletFrame::GetListItemText(nsIPresContext* aCX, - nsCSSBlockReflowState* aReflowState, - const nsStyleList& aListStyle, - nsString& result) -{ - PRInt32 ordinal = GetListItemOrdinal(aCX, aReflowState, aListStyle); - char cbuf[40]; - switch (aListStyle.mListStyleType) { - case NS_STYLE_LIST_STYLE_DECIMAL: - PR_snprintf(cbuf, sizeof(cbuf), "%ld", ordinal); - result.Append(cbuf); - break; - - case NS_STYLE_LIST_STYLE_LOWER_ROMAN: - case NS_STYLE_LIST_STYLE_UPPER_ROMAN: - { - if (0 == ordinal) { - ordinal = 1; - } - nsAutoString addOn; - nsAutoString decStr; - decStr.Append(ordinal, 10); - const PRUnichar* dp = decStr.GetUnicode(); - const PRUnichar* end = dp + decStr.Length(); - - PRIntn len=decStr.Length(); - PRIntn romanPos=len; - PRIntn n; - PRBool negative=PRBool(ordinal<0); - - const char* achars; - const char* bchars; - if (aListStyle.mListStyleType == NS_STYLE_LIST_STYLE_LOWER_ROMAN) { - achars = gLowerRomanCharsA; - bchars = gLowerRomanCharsB; - } else { - achars = gUpperRomanCharsA; - bchars = gUpperRomanCharsB; - } - ordinal=(ordinal < 0) ? -ordinal : ordinal; - if (ordinal < 0) { - // XXX max negative int - break; - } - for (; dp < end; dp++) - { - romanPos--; - addOn.SetLength(0); - switch(*dp) - { - case '3': addOn.Append(achars[romanPos]); - case '2': addOn.Append(achars[romanPos]); - case '1': addOn.Append(achars[romanPos]); - break; - - case '4': - addOn.Append(achars[romanPos]); - - case '5': case '6': - case '7': case '8': - addOn.Append(bchars[romanPos]); - for(n=0;n<(*dp-'5');n++) { - addOn.Append(achars[romanPos]); - } - break; - case '9': - addOn.Append(achars[romanPos]); - addOn.Append(achars[romanPos+1]); - break; - default: - break; - } - result.Append(addOn); - } - } - break; - - case NS_STYLE_LIST_STYLE_LOWER_ALPHA: - case NS_STYLE_LIST_STYLE_UPPER_ALPHA: - { - PRInt32 anOffset = -1; - PRInt32 aBase = 26; - PRInt32 ndex=0; - PRInt32 root=1; - PRInt32 next=aBase; - PRInt32 expn=1; - const char* chars = - (aListStyle.mListStyleType == NS_STYLE_LIST_STYLE_LOWER_ALPHA) - ? gLowerAlphaChars : gUpperAlphaChars; - - // must be positive here... - ordinal = (ordinal < 0) ? -ordinal : ordinal; - if (ordinal < 0) { - // XXX max negative int - break; - } - while (next<=ordinal) // scale up in baseN; exceed current value. - { - root=next; - next*=aBase; - expn++; - } - - while(0!=(expn--)) - { - ndex = ((root<=ordinal) && (0!=root)) ? (ordinal/root): 0; - ordinal %= root; - if (root>1) - result.Append(chars[ndex+anOffset]); - else - result.Append(chars[ndex]); - root /= aBase; - } - } - break; - } - result.Append("."); -} - -#define MIN_BULLET_SIZE 5 // from laytext.c - -void -BulletFrame::GetDesiredSize(nsIPresContext* aCX, - nsCSSBlockReflowState* aState, - const nsReflowState& aReflowState, - nsReflowMetrics& aMetrics) -{ - const nsStyleList* myList = - (const nsStyleList*)mStyleContext->GetStyleData(eStyleStruct_List); - if (myList->mListStyleImage.Length() > 0) { - mImageLoader.SetURL(myList->mListStyleImage); - mImageLoader.GetDesiredSize(aCX, aReflowState, aMetrics); - if (!mImageLoader.GetLoadImageFailed()) { - nsHTMLBase::CreateViewForFrame(aCX, this, mStyleContext, PR_FALSE); - aMetrics.ascent = aMetrics.height; - aMetrics.descent = 0; - return; - } - } - - const nsStyleFont* myFont = - (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); - nsIFontMetrics* fm = aCX->GetMetricsFor(myFont->mFont); - nscoord bulletSize; - float p2t; - float t2p; - - nsAutoString text; - switch (myList->mListStyleType) { - case NS_STYLE_LIST_STYLE_NONE: - aMetrics.width = 0; - aMetrics.height = 0; - aMetrics.ascent = 0; - aMetrics.descent = 0; - break; - - default: - case NS_STYLE_LIST_STYLE_DISC: - case NS_STYLE_LIST_STYLE_CIRCLE: - case NS_STYLE_LIST_STYLE_BASIC: - case NS_STYLE_LIST_STYLE_SQUARE: - t2p = aCX->GetTwipsToPixels(); - bulletSize = nscoord(t2p * fm->GetMaxAscent() / 2); - if (bulletSize < 1) { - bulletSize = MIN_BULLET_SIZE; - } - p2t = aCX->GetPixelsToTwips(); - bulletSize = nscoord(p2t * bulletSize); - mPadding.bottom = (fm->GetMaxAscent() / 8); - if (NS_STYLE_LIST_STYLE_POSITION_INSIDE == myList->mListStylePosition) { - mPadding.right = bulletSize / 2; - } - aMetrics.width = mPadding.right + bulletSize; - aMetrics.height = mPadding.bottom + bulletSize; - aMetrics.ascent = mPadding.bottom + bulletSize; - aMetrics.descent = 0; - break; - - case NS_STYLE_LIST_STYLE_DECIMAL: - case NS_STYLE_LIST_STYLE_LOWER_ROMAN: - case NS_STYLE_LIST_STYLE_UPPER_ROMAN: - case NS_STYLE_LIST_STYLE_LOWER_ALPHA: - case NS_STYLE_LIST_STYLE_UPPER_ALPHA: - GetListItemText(aCX, aState, *myList, text); - if (NS_STYLE_LIST_STYLE_POSITION_INSIDE == myList->mListStylePosition) { - // Inside bullets need some extra width to get the padding - // between the list item and the content that follows. - mPadding.right = fm->GetHeight() / 2; // From old layout engine - } - aMetrics.width = mPadding.right + fm->GetWidth(text); - aMetrics.height = fm->GetHeight(); - aMetrics.ascent = fm->GetMaxAscent(); - aMetrics.descent = fm->GetMaxDescent(); - break; - } - NS_RELEASE(fm); -} - -NS_IMETHODIMP -BulletFrame::InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState) -{ - nsCSSBlockReflowState* state = - GetListContainerReflowState(aLineLayout.mPresContext, aReflowState); - - // Get the base size - GetDesiredSize(aLineLayout.mPresContext, state, aReflowState, aMetrics); - - // Add in the border and padding; split the top/bottom between the - // ascent and descent to make things look nice - const nsStyleSpacing* space =(const nsStyleSpacing*) - mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsMargin borderPadding; - space->CalcBorderPaddingFor(this, borderPadding); - aMetrics.width += borderPadding.left + borderPadding.right; - aMetrics.height += borderPadding.top + borderPadding.bottom; - aMetrics.ascent += borderPadding.top; - aMetrics.descent += borderPadding.bottom; - - if (nsnull != aMetrics.maxElementSize) { - aMetrics.maxElementSize->width = aMetrics.width; - aMetrics.maxElementSize->height = aMetrics.height; - } - return NS_FRAME_COMPLETE; -} - -NS_IMETHODIMP -BulletFrame::FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand) -{ - aLineLayout.EndTextRun(); - return NS_OK; -} diff --git a/mozilla/layout/html/base/src/nsHTMLContainer.cpp b/mozilla/layout/html/base/src/nsHTMLContainer.cpp deleted file mode 100644 index ba524dc1f48..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLContainer.cpp +++ /dev/null @@ -1,972 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLContainer.h" -#include "nsIDocument.h" -#include "nsIAtom.h" -#include "nsIArena.h" -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" -#include "nsCSSBlockFrame.h" -#include "nsIPresContext.h" -#include "nsHTMLIIDs.h" -#include "nsHTMLAtoms.h" -#include "nsIHTMLAttributes.h" -#include "nsDOMIterator.h" -#include "nsUnitConversion.h" -#include "nsIURL.h" -#include "prprf.h" -#include "nsISizeOfHandler.h" - -#include "nsCSSInlineFrame.h" - -nsresult -NS_NewHTMLContainer(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag) -{ - nsHTMLContainer* it = new nsHTMLContainer(aTag); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} - -nsresult -NS_NewHTMLContainer(nsIHTMLContent** aInstancePtrResult, - nsIArena* aArena, nsIAtom* aTag) -{ - nsHTMLContainer* it = new(aArena) nsHTMLContainer(aTag); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} - -nsHTMLContainer::nsHTMLContainer() -{ -} - -nsHTMLContainer::nsHTMLContainer(nsIAtom* aTag) - : nsHTMLTagContent(aTag) -{ -} - -nsHTMLContainer::~nsHTMLContainer() -{ - PRInt32 n = mChildren.Count(); - for (PRInt32 i = 0; i < n; i++) { - nsIContent* kid = (nsIContent*) mChildren.ElementAt(i); - NS_RELEASE(kid); - } -} - -NS_IMETHODIMP -nsHTMLContainer::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - nsHTMLContainer::SizeOfWithoutThis(aHandler); - return NS_OK; -} - -void -nsHTMLContainer::SizeOfWithoutThis(nsISizeOfHandler* aHandler) const -{ - aHandler->Add((size_t) (- (PRInt32)sizeof(mChildren) ) ); - mChildren.SizeOf(aHandler); - - PRInt32 i, n = mChildren.Count(); - for (i = 0; i < n; i++) { - nsIContent* child = (nsIContent*) mChildren[i]; - if (!aHandler->HaveSeen(child)) { - child->SizeOf(aHandler); - } - } -} - -PRBool nsHTMLContainer::CanContainChildren() const -{ - return PR_TRUE; -} - -PRInt32 nsHTMLContainer::ChildCount() const -{ - return mChildren.Count(); -} - -nsIContent* nsHTMLContainer::ChildAt(PRInt32 aIndex) const -{ - nsIContent *child = (nsIContent*) mChildren.ElementAt(aIndex); - if (nsnull != child) { - NS_ADDREF(child); - } - return child; -} - -PRInt32 nsHTMLContainer::IndexOf(nsIContent* aPossibleChild) const -{ - NS_PRECONDITION(nsnull != aPossibleChild, "null ptr"); - return mChildren.IndexOf(aPossibleChild); -} - -NS_IMETHODIMP -nsHTMLContainer::InsertChildAt(nsIContent* aKid, PRInt32 aIndex, - PRBool aNotify) -{ - NS_PRECONDITION(nsnull != aKid, "null ptr"); - PRBool rv = mChildren.InsertElementAt(aKid, aIndex);/* XXX fix up void array api to use nsresult's*/ - if (rv) { - NS_ADDREF(aKid); - aKid->SetParent(this); - nsIDocument* doc = mDocument; - if (nsnull != doc) { - aKid->SetDocument(doc); - if (aNotify) { - doc->ContentInserted(this, aKid, aIndex); - } - } - } - return NS_OK; -} - -NS_IMETHODIMP -nsHTMLContainer::ReplaceChildAt(nsIContent* aKid, PRInt32 aIndex, - PRBool aNotify) -{ - NS_PRECONDITION(nsnull != aKid, "null ptr"); - nsIContent* oldKid = (nsIContent*) mChildren.ElementAt(aIndex); - PRBool rv = mChildren.ReplaceElementAt(aKid, aIndex); - if (rv) { - NS_ADDREF(aKid); - aKid->SetParent(this); - nsIDocument* doc = mDocument; - if (nsnull != doc) { - aKid->SetDocument(doc); - if (aNotify) { - doc->ContentReplaced(this, oldKid, aKid, aIndex); - } - } - oldKid->SetDocument(nsnull); - oldKid->SetParent(nsnull); - NS_RELEASE(oldKid); - } - return NS_OK; -} - -NS_IMETHODIMP -nsHTMLContainer::AppendChild(nsIContent* aKid, PRBool aNotify) -{ - NS_PRECONDITION((nsnull != aKid) && (aKid != this), "null ptr"); - PRBool rv = mChildren.AppendElement(aKid); - if (rv) { - NS_ADDREF(aKid); - aKid->SetParent(this); - nsIDocument* doc = mDocument; - if (nsnull != doc) { - aKid->SetDocument(doc); - if (aNotify) { - doc->ContentAppended(this); - } - } - } - return NS_OK; -} - -NS_IMETHODIMP -nsHTMLContainer::RemoveChildAt(PRInt32 aIndex, PRBool aNotify) -{ - nsIContent* oldKid = (nsIContent*) mChildren.ElementAt(aIndex); - if (nsnull != oldKid ) { - nsIDocument* doc = mDocument; - if (aNotify) { - if (nsnull != doc) { - doc->ContentWillBeRemoved(this, oldKid, aIndex); - } - } - PRBool rv = mChildren.RemoveElementAt(aIndex); - if (aNotify) { - if (nsnull != doc) { - doc->ContentHasBeenRemoved(this, oldKid, aIndex); - } - } - oldKid->SetDocument(nsnull); - oldKid->SetParent(nsnull); - NS_RELEASE(oldKid); - } - - return NS_OK; -} - -void nsHTMLContainer::Compact() -{ - //XXX I'll turn this on in a bit... mChildren.Compact(); -} - -nsresult -nsHTMLContainer::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - const nsStyleDisplay* styleDisplay = - (const nsStyleDisplay*) aStyleContext->GetStyleData(eStyleStruct_Display); - - // Use style to choose what kind of frame to create - nsIFrame* frame = nsnull; - nsresult rv; - switch (styleDisplay->mDisplay) { - case NS_STYLE_DISPLAY_BLOCK: - case NS_STYLE_DISPLAY_LIST_ITEM: - rv = NS_NewCSSBlockFrame(&frame, this, aParentFrame); - break; - - case NS_STYLE_DISPLAY_INLINE: - rv = NS_NewCSSInlineFrame(&frame, this, aParentFrame); - break; - - default: - // Create an empty frame for holding content that is not being - // reflowed. - rv = nsFrame::NewFrame(&frame, this, aParentFrame); - break; - } - if (NS_OK == rv) { - frame->SetStyleContext(aPresContext, aStyleContext); - } - aResult = frame; - return rv; -} - -//---------------------------------------------------------------------- - -static nsHTMLTagContent::EnumTable kListTypeTable[] = { - { "none", NS_STYLE_LIST_STYLE_NONE }, - { "disc", NS_STYLE_LIST_STYLE_DISC }, - { "circle", NS_STYLE_LIST_STYLE_CIRCLE }, - { "round", NS_STYLE_LIST_STYLE_CIRCLE }, - { "square", NS_STYLE_LIST_STYLE_SQUARE }, - { "decimal", NS_STYLE_LIST_STYLE_DECIMAL }, - { "lower-roman", NS_STYLE_LIST_STYLE_LOWER_ROMAN }, - { "upper-roman", NS_STYLE_LIST_STYLE_UPPER_ROMAN }, - { "lower-alpha", NS_STYLE_LIST_STYLE_LOWER_ALPHA }, - { "upper-alpha", NS_STYLE_LIST_STYLE_UPPER_ALPHA }, - { "A", NS_STYLE_LIST_STYLE_UPPER_ALPHA }, - { "a", NS_STYLE_LIST_STYLE_LOWER_ALPHA }, - { "I", NS_STYLE_LIST_STYLE_UPPER_ROMAN }, - { "i", NS_STYLE_LIST_STYLE_LOWER_ROMAN }, - { 0 } -}; - -static nsHTMLTagContent::EnumTable kListItemTypeTable[] = { - { "circle", NS_STYLE_LIST_STYLE_CIRCLE }, - { "round", NS_STYLE_LIST_STYLE_CIRCLE }, - { "square", NS_STYLE_LIST_STYLE_SQUARE }, - { "A", NS_STYLE_LIST_STYLE_UPPER_ALPHA }, - { "a", NS_STYLE_LIST_STYLE_LOWER_ALPHA }, - { "I", NS_STYLE_LIST_STYLE_UPPER_ROMAN }, - { "i", NS_STYLE_LIST_STYLE_LOWER_ROMAN }, - { 0 } -}; - -static nsHTMLTagContent::EnumTable kDirTable[] = { - { "ltr", NS_STYLE_DIRECTION_LTR }, - { "rtl", NS_STYLE_DIRECTION_RTL }, - { 0 } -}; - -void nsHTMLContainer::SetAttribute(nsIAtom* aAttribute, - const nsString& aValue) -{ - // Special handling code for various html container attributes; note - // that if an attribute doesn't require special handling then we - // fall through and use the default base class implementation. - nsHTMLValue val; - - // Check for attributes common to most html containers - if (aAttribute == nsHTMLAtoms::dir) { - if (ParseEnumValue(aValue, kDirTable, val)) { - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - return; - } - if (aAttribute == nsHTMLAtoms::lang) { - nsHTMLTagContent::SetAttribute(aAttribute, aValue); - return; - } - - if (mTag == nsHTMLAtoms::p) { - if ((aAttribute == nsHTMLAtoms::align) && - ParseDivAlignParam(aValue, val)) { - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - } - else if (mTag == nsHTMLAtoms::a) { - if (aAttribute == nsHTMLAtoms::href) { - nsAutoString href(aValue); - href.StripWhitespace(); - nsHTMLTagContent::SetAttribute(aAttribute, href); - return; - } - if (aAttribute == nsHTMLAtoms::suppress) { - if (aValue.EqualsIgnoreCase("true")) { - nsHTMLValue val; - val.SetEmptyValue(); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - } - // XXX PRE? - } - else if (mTag == nsHTMLAtoms::font) { - if ((aAttribute == nsHTMLAtoms::size) || - (aAttribute == nsHTMLAtoms::pointSize) || - (aAttribute == nsHTMLAtoms::fontWeight)) { - nsAutoString tmp(aValue); - PRInt32 ec, v = tmp.ToInteger(&ec); - tmp.CompressWhitespace(PR_TRUE, PR_FALSE); - PRUnichar ch = tmp.First(); - val.SetIntValue(v, ((ch == '+') || (ch == '-')) ? - eHTMLUnit_Integer : eHTMLUnit_Enumerated); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - if (aAttribute == nsHTMLAtoms::color) { - ParseColor(aValue, val); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - } - else if ((mTag == nsHTMLAtoms::div) || (mTag == nsHTMLAtoms::multicol)) { - if ((mTag == nsHTMLAtoms::div) && (aAttribute == nsHTMLAtoms::align) && - ParseDivAlignParam(aValue, val)) { - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - if (aAttribute == nsHTMLAtoms::cols) { - ParseValue(aValue, 0, val, eHTMLUnit_Integer); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - - // Note: These attributes only apply when cols > 1 - if (aAttribute == nsHTMLAtoms::gutter) { - ParseValue(aValue, 1, val, eHTMLUnit_Pixel); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - if (aAttribute == nsHTMLAtoms::width) { - ParseValueOrPercent(aValue, val, eHTMLUnit_Pixel); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - } - else if ((mTag == nsHTMLAtoms::h1) || (mTag == nsHTMLAtoms::h2) || - (mTag == nsHTMLAtoms::h3) || (mTag == nsHTMLAtoms::h4) || - (mTag == nsHTMLAtoms::h5) || (mTag == nsHTMLAtoms::h6)) { - if ((aAttribute == nsHTMLAtoms::align) && - ParseDivAlignParam(aValue, val)) { - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - } - else if (mTag == nsHTMLAtoms::pre) { - if ((aAttribute == nsHTMLAtoms::wrap) || - (aAttribute == nsHTMLAtoms::variable)) { - val.SetEmptyValue(); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - if (aAttribute == nsHTMLAtoms::cols) { - ParseValue(aValue, 0, val, eHTMLUnit_Integer); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - if (aAttribute == nsHTMLAtoms::tabstop) { - PRInt32 ec, tabstop = aValue.ToInteger(&ec); - if (tabstop <= 0) { - tabstop = 8; - } - val.SetIntValue(tabstop, eHTMLUnit_Integer); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - } - else if (mTag == nsHTMLAtoms::li) { - if (aAttribute == nsHTMLAtoms::type) { - if (ParseEnumValue(aValue, kListItemTypeTable, val)) { - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - // Illegal type values are left as is for the dom - } - if (aAttribute == nsHTMLAtoms::value) { - ParseValue(aValue, 1, val, eHTMLUnit_Integer); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - } - else if ((mTag == nsHTMLAtoms::ul) || (mTag == nsHTMLAtoms::ol) || - (mTag == nsHTMLAtoms::menu) || (mTag == nsHTMLAtoms::dir)) { - if (aAttribute == nsHTMLAtoms::type) { - if (!ParseEnumValue(aValue, kListTypeTable, val)) { - val.SetIntValue(NS_STYLE_LIST_STYLE_BASIC, eHTMLUnit_Enumerated); - } - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - if (aAttribute == nsHTMLAtoms::start) { - ParseValue(aValue, 1, val, eHTMLUnit_Integer); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - if (aAttribute == nsHTMLAtoms::compact) { - val.SetEmptyValue(); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - } - else if (mTag == nsHTMLAtoms::dl) { - if (aAttribute == nsHTMLAtoms::compact) { - val.SetEmptyValue(); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - } - else if (mTag == nsHTMLAtoms::body) { - if (aAttribute == nsHTMLAtoms::background) { - nsAutoString href(aValue); - href.StripWhitespace(); - nsHTMLTagContent::SetAttribute(aAttribute, href); - return; - } - if (aAttribute == nsHTMLAtoms::bgcolor) { - ParseColor(aValue, val); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - if (aAttribute == nsHTMLAtoms::text) { - ParseColor(aValue, val); - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - } - - // Use default attribute catching code - nsHTMLTagContent::SetAttribute(aAttribute, aValue); -} - -nsContentAttr nsHTMLContainer::AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const -{ - nsContentAttr ca = eContentAttr_NotThere; - if (aValue.GetUnit() == eHTMLUnit_Enumerated) { - if (aAttribute == nsHTMLAtoms::align) { - DivAlignParamToString(aValue, aResult); - ca = eContentAttr_HasValue; - } - else if (mTag == nsHTMLAtoms::li) { - if (aAttribute == nsHTMLAtoms::type) { - EnumValueToString(aValue, kListItemTypeTable, aResult); - ca = eContentAttr_HasValue; - } - } - else if ((mTag == nsHTMLAtoms::ul) || (mTag == nsHTMLAtoms::ol) || - (mTag == nsHTMLAtoms::menu) || (mTag == nsHTMLAtoms::dir)) { - if (aAttribute == nsHTMLAtoms::type) { - EnumValueToString(aValue, kListTypeTable, aResult); - ca = eContentAttr_HasValue; - } - } - else if (mTag == nsHTMLAtoms::font) { - if ((aAttribute == nsHTMLAtoms::size) || - (aAttribute == nsHTMLAtoms::pointSize) || - (aAttribute == nsHTMLAtoms::fontWeight)) { - aResult.Truncate(); - aResult.Append(aValue.GetIntValue(), 10); - ca = eContentAttr_HasValue; - } - } - } - else if (aValue.GetUnit() == eHTMLUnit_Integer) { - if (mTag == nsHTMLAtoms::font) { - if ((aAttribute == nsHTMLAtoms::size) || - (aAttribute == nsHTMLAtoms::pointSize) || - (aAttribute == nsHTMLAtoms::fontWeight)) { - aResult.Truncate(); - PRInt32 value = aValue.GetIntValue(); - if (value >= 0) { - aResult.Append('+'); - } - aResult.Append(value, 10); - ca = eContentAttr_HasValue; - } - } - } - else { - ca = nsHTMLTagContent::AttributeToString(aAttribute, aValue, aResult); - } - return ca; -} - -void nsHTMLContainer::MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext) -{ - if (nsnull != mAttributes) { - nsHTMLValue value; - - // Check for attributes common to most html containers - GetAttribute(nsHTMLAtoms::dir, value); - if (value.GetUnit() == eHTMLUnit_Enumerated) { - nsStyleDisplay* display = (nsStyleDisplay*) - aContext->GetMutableStyleData(eStyleStruct_Display); - display->mDirection = value.GetIntValue(); - } - - if (mTag == nsHTMLAtoms::p) { - // align: enum - GetAttribute(nsHTMLAtoms::align, value); - if (value.GetUnit() == eHTMLUnit_Enumerated) { - nsStyleText* text = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text); - text->mTextAlign = value.GetIntValue(); - } - } - else if (mTag == nsHTMLAtoms::a) { - // suppress: bool (absolute) - GetAttribute(nsHTMLAtoms::suppress, value); - if (value.GetUnit() == eHTMLUnit_Empty) { - // XXX set suppress - } - } - else if (mTag == nsHTMLAtoms::font) { - nsStyleFont* font = (nsStyleFont*)aContext->GetMutableStyleData(eStyleStruct_Font); - const nsStyleFont* parentFont = font; - nsIStyleContext* parentContext = aContext->GetParent(); - if (nsnull != parentContext) { - parentFont = (const nsStyleFont*)parentContext->GetStyleData(eStyleStruct_Font); - } - - // face: string list - GetAttribute(nsHTMLAtoms::face, value); - if (value.GetUnit() == eHTMLUnit_String) { - nsAutoString familyList; - value.GetStringValue(familyList); - // XXX needs font support to determine usable fonts - // parse up the string & remove the quotes - // XXX only does first until we can tell what are installed fonts - nsAutoString family; - PRInt32 index = familyList.Find(PRUnichar(',')); - if (-1 < index) { - familyList.Left(family, index); - } - else { - family.Append(familyList); - } - family.StripChars("\""); - family.StripWhitespace(); - - font->mFont.name = family; - } - - // pointSize: int, enum - GetAttribute(nsHTMLAtoms::pointSize, value); - if (value.GetUnit() == eHTMLUnit_Integer) { - // XXX should probably sanitize value - font->mFont.size = parentFont->mFont.size + NS_POINTS_TO_TWIPS_INT(value.GetIntValue()); - } - else if (value.GetUnit() == eHTMLUnit_Enumerated) { - font->mFont.size = NS_POINTS_TO_TWIPS_INT(value.GetIntValue()); - } - else { - // size: int, enum - GetAttribute(nsHTMLAtoms::size, value); - if ((value.GetUnit() == eHTMLUnit_Integer) || (value.GetUnit() == eHTMLUnit_Enumerated)) { - static float kFontScale[7] = { - 0.7f, - 0.8f, - 1.0f, - 1.2f, - 1.5f, - 2.0f, - 3.0f - }; - PRInt32 size = value.GetIntValue(); - - const nsFont& normal = aPresContext->GetDefaultFont(); // XXX should be BASEFONT - - if (value.GetUnit() == eHTMLUnit_Enumerated) { - size = ((0 < size) ? ((size < 8) ? size : 7) : 0); - font->mFont.size = (nscoord)((float)normal.size * kFontScale[size - 1]); - } - else { // int (+/-) - if ((0 < size) && (size <= 7)) { // + - PRInt32 index; - for (index = 0; index < 6; index++) - if (parentFont->mFont.size < (nscoord)((float)normal.size * kFontScale[index])) - break; - size = ((index - 1) + size); - if (size < 0) size = 0; - if (size > 6) size = 6; - font->mFont.size = (nscoord)((float)normal.size * kFontScale[size]); - } - else if ((-7 <= size) && (size < 0)) { - PRInt32 index; - for (index = 6; index > 0; index--) - if (parentFont->mFont.size > (nscoord)((float)normal.size * kFontScale[index])) - break; - size = ((index + 1) + size); - if (size < 0) size = 0; - if (size > 6) size = 6; - font->mFont.size = (nscoord)((float)normal.size * kFontScale[size]); - } - else if (0 == size) { - font->mFont.size = parentFont->mFont.size; - } - } - } - } - - // fontWeight: int, enum - GetAttribute(nsHTMLAtoms::fontWeight, value); - if (value.GetUnit() == eHTMLUnit_Integer) { // +/- - PRInt32 weight = parentFont->mFont.weight + value.GetIntValue(); - font->mFont.weight = ((100 < weight) ? ((weight < 700) ? weight : 700) : 100); - } - else if (value.GetUnit() == eHTMLUnit_Enumerated) { - PRInt32 weight = value.GetIntValue(); - weight = ((100 < weight) ? ((weight < 700) ? weight : 700) : 100); - font->mFont.weight = weight; - } - - // color: color - GetAttribute(nsHTMLAtoms::color, value); - if (value.GetUnit() == eHTMLUnit_Color) { - nsStyleColor* color = (nsStyleColor*)aContext->GetMutableStyleData(eStyleStruct_Color); - color->mColor = value.GetColorValue(); - } - else if (value.GetUnit() == eHTMLUnit_String) { - nsAutoString buffer; - value.GetStringValue(buffer); - char cbuf[40]; - buffer.ToCString(cbuf, sizeof(cbuf)); - - nsStyleColor* color = (nsStyleColor*)aContext->GetMutableStyleData(eStyleStruct_Color); - NS_ColorNameToRGB(cbuf, &(color->mColor)); - } - - NS_IF_RELEASE(parentContext); - } - else if ((mTag == nsHTMLAtoms::div) || (mTag == nsHTMLAtoms::multicol)) { - if (mTag == nsHTMLAtoms::div) { - // align: enum - GetAttribute(nsHTMLAtoms::align, value); - if (value.GetUnit() == eHTMLUnit_Enumerated) { - // XXX set align - } - } - - PRInt32 numCols = 1; - // cols: int - GetAttribute(nsHTMLAtoms::cols, value); - if (value.GetUnit() == eHTMLUnit_Integer) { - numCols = value.GetIntValue(); - // XXX - } - - // Note: These attributes only apply when cols > 1 - if (1 < numCols) { - // gutter: int - GetAttribute(nsHTMLAtoms::gutter, value); - if (value.GetUnit() == eHTMLUnit_Pixel) { - // XXX set - } - - // width: pixel, % - GetAttribute(nsHTMLAtoms::width, value); - if (value.GetUnit() == eHTMLUnit_Pixel) { - // XXX set - } - else if (value.GetUnit() == eHTMLUnit_Percent) { - // XXX set - } - } - } - else if ((mTag == nsHTMLAtoms::h1) || (mTag == nsHTMLAtoms::h2) || - (mTag == nsHTMLAtoms::h3) || (mTag == nsHTMLAtoms::h4) || - (mTag == nsHTMLAtoms::h5) || (mTag == nsHTMLAtoms::h6)) { - // align: enum - GetAttribute(nsHTMLAtoms::align, value); - if (value.GetUnit() == eHTMLUnit_Enumerated) { - // XXX set - } - } - else if (mTag == nsHTMLAtoms::pre) { - // wrap: empty - GetAttribute(nsHTMLAtoms::wrap, value); - if (value.GetUnit() == eHTMLUnit_Empty) { - // XXX set - } - - // variable: empty - GetAttribute(nsHTMLAtoms::variable, value); - if (value.GetUnit() == eHTMLUnit_Empty) { - nsStyleFont* font = (nsStyleFont*) - aContext->GetMutableStyleData(eStyleStruct_Font); - font->mFont.name = "serif"; - } - - // cols: int - GetAttribute(nsHTMLAtoms::cols, value); - if (value.GetUnit() == eHTMLUnit_Integer) { - // XXX set - } - - // tabstop: int - if (value.GetUnit() == eHTMLUnit_Integer) { - // XXX set - } - } - else if (mTag == nsHTMLAtoms::li) { - nsStyleList* list = (nsStyleList*)aContext->GetMutableStyleData(eStyleStruct_List); - - // type: enum - GetAttribute(nsHTMLAtoms::type, value); - if (value.GetUnit() == eHTMLUnit_Enumerated) { - list->mListStyleType = value.GetIntValue(); - } - } - else if ((mTag == nsHTMLAtoms::ul) || (mTag == nsHTMLAtoms::ol) || - (mTag == nsHTMLAtoms::menu) || (mTag == nsHTMLAtoms::dir)) { - nsStyleList* list = (nsStyleList*)aContext->GetMutableStyleData(eStyleStruct_List); - - // type: enum - GetAttribute(nsHTMLAtoms::type, value); - if (value.GetUnit() == eHTMLUnit_Enumerated) { - list->mListStyleType = value.GetIntValue(); - } - - // compact: empty - GetAttribute(nsHTMLAtoms::compact, value); - if (value.GetUnit() == eHTMLUnit_Empty) { - // XXX set - } - } - else if (mTag == nsHTMLAtoms::dl) { - // compact: flag - GetAttribute(nsHTMLAtoms::compact, value); - if (value.GetUnit() == eHTMLUnit_Empty) { - // XXX set - } - } - else if (mTag == nsHTMLAtoms::body) { - MapBackgroundAttributesInto(aContext, aPresContext); - GetAttribute(nsHTMLAtoms::text, value); - if (eHTMLUnit_Color == value.GetUnit()) { - nsStyleColor* color = (nsStyleColor*) - aContext->GetMutableStyleData(eStyleStruct_Color); - color->mColor = value.GetColorValue(); - } - } - } -} - - -void -nsHTMLContainer::MapBackgroundAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext) -{ - nsHTMLValue value; - - // background - if (eContentAttr_HasValue == GetAttribute(nsHTMLAtoms::background, value)) { - if (eHTMLUnit_String == value.GetUnit()) { - // Resolve url to an absolute url - nsIURL* docURL = nsnull; - nsIDocument* doc = mDocument; - if (nsnull != doc) { - docURL = doc->GetDocumentURL(); - } - - nsAutoString absURLSpec; - nsAutoString spec; - value.GetStringValue(spec); - nsresult rv = NS_MakeAbsoluteURL(docURL, "", spec, absURLSpec); - if (nsnull != docURL) { - NS_RELEASE(docURL); - } - nsStyleColor* color = (nsStyleColor*)aContext->GetMutableStyleData(eStyleStruct_Color); - color->mBackgroundImage = absURLSpec; - color->mBackgroundFlags &= ~NS_STYLE_BG_IMAGE_NONE; - color->mBackgroundRepeat = NS_STYLE_BG_REPEAT_XY; - } - } - - // bgcolor - if (eContentAttr_HasValue == GetAttribute(nsHTMLAtoms::bgcolor, value)) { - if (eHTMLUnit_Color == value.GetUnit()) { - nsStyleColor* color = (nsStyleColor*)aContext->GetMutableStyleData(eStyleStruct_Color); - color->mBackgroundColor = value.GetColorValue(); - color->mBackgroundFlags &= ~NS_STYLE_BG_COLOR_TRANSPARENT; - } - else if (eHTMLUnit_String == value.GetUnit()) { - nsAutoString buffer; - value.GetStringValue(buffer); - char cbuf[40]; - buffer.ToCString(cbuf, sizeof(cbuf)); - - nsStyleColor* color = (nsStyleColor*)aContext->GetMutableStyleData(eStyleStruct_Color); - NS_ColorNameToRGB(cbuf, &(color->mBackgroundColor)); - color->mBackgroundFlags &= ~NS_STYLE_BG_COLOR_TRANSPARENT; - } - } -} - - -// nsIDOMNode interface -static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID); -static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID); - -nsresult nsHTMLContainer::GetChildNodes(nsIDOMNodeIterator **aIterator) -{ - NS_PRECONDITION(nsnull != aIterator, "null pointer"); - *aIterator = new nsDOMIterator(*this); - return NS_OK; -} - -nsresult nsHTMLContainer::HasChildNodes(PRBool *aReturn) -{ - if (0 != mChildren.Count()) { - *aReturn = PR_TRUE; - } - else { - *aReturn = PR_FALSE; - } - return NS_OK; -} - -nsresult nsHTMLContainer::GetFirstChild(nsIDOMNode **aNode) -{ - nsIContent *child = (nsIContent*) mChildren.ElementAt(0); - if (nsnull != child) { - nsresult res = child->QueryInterface(kIDOMNodeIID, (void**)aNode); - NS_ASSERTION(NS_OK == res, "Must be a DOM Node"); // must be a DOM Node - - return res; - } - else { - aNode = nsnull; - return NS_OK; - } -} - -static void -SetDocumentInChildrenOf(nsIContent* aContent, nsIDocument* aDocument) -{ - PRInt32 i, n; - n = aContent->ChildCount(); - for (i = 0; i < n; i++) { - nsIContent* child = aContent->ChildAt(i); - if (nsnull != child) { - child->SetDocument(aDocument); - SetDocumentInChildrenOf(child, aDocument); - } - } -} - -// XXX It's possible that newChild has already been inserted in the -// tree; if this is the case then we need to remove it from where it -// was before placing it in it's new home - -nsresult -nsHTMLContainer::InsertBefore(nsIDOMNode* newChild, nsIDOMNode* refChild) -{ - if (nsnull == newChild) { - return NS_OK;/* XXX wrong error value */ - } - - // Get the nsIContent interface for the new content - nsIContent* newContent = nsnull; - nsresult res = newChild->QueryInterface(kIContentIID, (void**)&newContent); - NS_ASSERTION(NS_OK == res, "New child must be an nsIContent"); - if (NS_OK == res) { - if (nsnull == refChild) { - // Append the new child to the end - SetDocumentInChildrenOf(newContent, mDocument); - res = AppendChild(newContent, PR_TRUE); - } - else { - // Get the index of where to insert the new child - nsIContent* refContent = nsnull; - res = refChild->QueryInterface(kIContentIID, (void**)&refContent); - NS_ASSERTION(NS_OK == res, "Ref child must be an nsIContent"); - if (NS_OK == res) { - PRInt32 pos = IndexOf(refContent); - if (pos >= 0) { - SetDocumentInChildrenOf(newContent, mDocument); - res = InsertChildAt(newContent, pos, PR_TRUE); - } - NS_RELEASE(refContent); - } - } - NS_RELEASE(newContent); - } - - return res; -} - -nsresult -nsHTMLContainer::ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild) -{ - nsIContent* content = nsnull; - nsresult res = oldChild->QueryInterface(kIContentIID, (void**)&content); - NS_ASSERTION(NS_OK == res, "Must be an nsIContent"); - if (NS_OK == res) { - PRInt32 pos = IndexOf(content); - if (pos >= 0) { - nsIContent* newContent = nsnull; - nsresult res = newChild->QueryInterface(kIContentIID, (void**)&newContent); - NS_ASSERTION(NS_OK == res, "Must be an nsIContent"); - if (NS_OK == res) { - res = ReplaceChildAt(newContent, pos, PR_TRUE); - NS_RELEASE(newContent); - } - } - NS_RELEASE(content); - } - - return res; -} - -nsresult -nsHTMLContainer::RemoveChild(nsIDOMNode *oldChild) -{ - nsIContent* content = nsnull; - nsresult res = oldChild->QueryInterface(kIContentIID, (void**)&content); - NS_ASSERTION(NS_OK == res, "Must be an nsIContent"); - if (NS_OK == res) { - PRInt32 pos = IndexOf(content); - if (pos >= 0) { - res = RemoveChildAt(pos, PR_TRUE); - } - NS_RELEASE(content); - } - - return res; -} - diff --git a/mozilla/layout/html/base/src/nsHTMLContainer.h b/mozilla/layout/html/base/src/nsHTMLContainer.h deleted file mode 100644 index 34611f312b0..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLContainer.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLContainer_h___ -#define nsHTMLContainer_h___ - -#include "nsHTMLTagContent.h" -#include "nsVoidArray.h" - -// Generic HTML container class. This code manages an array of -// children nodes that can be any kind of nsIContent -class nsHTMLContainer : public nsHTMLTagContent { -public: - nsHTMLContainer(nsIAtom* aTag); - - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - virtual PRBool CanContainChildren() const; - virtual PRInt32 ChildCount() const; - virtual nsIContent* ChildAt(PRInt32 aIndex) const; - virtual PRInt32 IndexOf(nsIContent* aPossibleChild) const; - - NS_IMETHOD InsertChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify); - NS_IMETHOD ReplaceChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify); - NS_IMETHOD AppendChild(nsIContent* aKid, PRBool aNotify); - NS_IMETHOD RemoveChildAt(PRInt32 aIndex, PRBool aNotify); - - virtual void Compact(); - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - - virtual void SetAttribute(nsIAtom* aAttribute, const nsString& aValue); - virtual void MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext); - - NS_IMETHOD GetChildNodes(nsIDOMNodeIterator **aIterator); - NS_IMETHOD HasChildNodes(PRBool *aReturn); - NS_IMETHOD GetFirstChild(nsIDOMNode **aNode); - NS_IMETHOD InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild); - NS_IMETHOD ReplaceChild(nsIDOMNode *newChild, - nsIDOMNode *oldChild); - NS_IMETHOD RemoveChild(nsIDOMNode *oldChild); - -protected: - nsHTMLContainer(); - virtual ~nsHTMLContainer(); - void SizeOfWithoutThis(nsISizeOfHandler* aHandler) const; - - virtual nsContentAttr AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const; - - /** - * Helper method that maps "background" and "bgcolor" into - * the style context. - */ - void MapBackgroundAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext); - - nsVoidArray mChildren; -}; - -#endif /* nsHTMLContainer_h___ */ diff --git a/mozilla/layout/html/base/src/nsHTMLContainerFrame.cpp b/mozilla/layout/html/base/src/nsHTMLContainerFrame.cpp deleted file mode 100644 index 9e3a244557b..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLContainerFrame.cpp +++ /dev/null @@ -1,385 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLContainerFrame.h" -#include "nsIRenderingContext.h" -#include "nsIPresContext.h" -#include "nsIPresShell.h" -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" -#include "nsCSSRendering.h" -#include "nsIContent.h" -#include "nsHTMLAtoms.h" -#include "nsIWidget.h" -#include "nsILinkHandler.h" -#include "nsHTMLValue.h" -#include "nsGUIEvent.h" -#include "nsIDocument.h" -#include "nsIURL.h" -#include "nsIPtr.h" -#include "nsAbsoluteFrame.h" -#include "nsPlaceholderFrame.h" -#include "nsIContentDelegate.h" -#include "nsIHTMLContent.h" -#include "nsHTMLParts.h" -#include "nsHTMLBase.h" -#include "nsScrollFrame.h" -#include "nsIView.h" -#include "nsIReflowCommand.h" - -NS_DEF_PTR(nsIStyleContext); - -nsHTMLContainerFrame::nsHTMLContainerFrame(nsIContent* aContent, nsIFrame* aParent) - : nsContainerFrame(aContent, aParent) -{ -} - -nsHTMLContainerFrame::~nsHTMLContainerFrame() -{ -} - -NS_METHOD nsHTMLContainerFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - // Paint our background and border - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - - if (disp->mVisible && mRect.width && mRect.height) { - PRIntn skipSides = GetSkipSides(); - const nsStyleColor* color = - (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - const nsStyleSpacing* spacing = - (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, - aDirtyRect, mRect, *color); - nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this, - aDirtyRect, mRect, *spacing, skipSides); - } - - PaintChildren(aPresContext, aRenderingContext, aDirtyRect); - - if (nsIFrame::GetShowFrameBorders()) { - nsIView* view; - GetView(view); - if (nsnull != view) { - aRenderingContext.SetColor(NS_RGB(0,0,255)); - NS_RELEASE(view); - } - else { - aRenderingContext.SetColor(NS_RGB(255,0,0)); - } - aRenderingContext.DrawRect(0, 0, mRect.width, mRect.height); - } - return NS_OK; -} - -NS_METHOD nsHTMLContainerFrame::HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus) -{ - return nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus); -} - -NS_METHOD nsHTMLContainerFrame::GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor) -{ - // Get my cursor - const nsStyleColor* styleColor = (const nsStyleColor*) - mStyleContext->GetStyleData(eStyleStruct_Color); - PRInt32 myCursor = styleColor->mCursor; - - // Get child's cursor, if any - nsresult rv = nsContainerFrame::GetCursorAt(aPresContext, aPoint, aFrame, - aCursor); - if (NS_OK != rv) return rv; - if (aCursor != NS_STYLE_CURSOR_INHERIT) { - nsIAtom* tag = mContent->GetTag(); - if (nsHTMLAtoms::a == tag) { - // Anchor tags override their child cursors in some cases. - if ((NS_STYLE_CURSOR_IBEAM == aCursor) && - (NS_STYLE_CURSOR_INHERIT != myCursor)) { - aCursor = myCursor; - } - } - NS_RELEASE(tag); - return rv; - } - - if (NS_STYLE_CURSOR_INHERIT != myCursor) { - // If this container has a particular cursor, use it, otherwise - // let the child decide. - *aFrame = this; - aCursor = myCursor; - return NS_OK; - } - - // No specific cursor for us - aCursor = NS_STYLE_CURSOR_INHERIT; - return NS_OK; -} - -NS_METHOD nsHTMLContainerFrame::ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) -{ - // Get the last-in-flow - nsHTMLContainerFrame* lastInFlow = (nsHTMLContainerFrame*)GetLastInFlow(); - - // Generate a reflow command for the frame - nsIReflowCommand* cmd; - nsresult result; - - result = NS_NewHTMLReflowCommand(&cmd, lastInFlow, nsIReflowCommand::FrameAppended); - if (NS_OK == result) { - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - } - - return NS_OK; -} - -NS_IMETHODIMP -nsHTMLContainerFrame::ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(!IsPseudoFrame(), "pseudos not supported here"); - - // Find the frame that precedes the insertion point - nsIFrame* prevSibling = nsnull; - if (aIndexInParent > 0) { - nsIContent* precedingContent = aContainer->ChildAt(aIndexInParent - 1); - prevSibling = aShell->FindFrameWithContent(precedingContent); - NS_RELEASE(precedingContent); - - // The frame may have a next-in-flow. Get the last-in-flow - nsIFrame* nextInFlow; - do { - prevSibling->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - prevSibling = nextInFlow; - } - } while (nsnull != nextInFlow); - } - - // Get the geometric parent for the prevSibling. We expect it to be - // this frame or one of its next-in-flow(s). - nsHTMLContainerFrame* flow = this; - if (nsnull != prevSibling) { - prevSibling->GetGeometricParent((nsIFrame*&)flow); - } - - // Create the new frame as a child of the same parent as prevSibling - nsIFrame* newFrame; - nsresult rv = nsHTMLBase::CreateFrame(aPresContext, flow, aChild, nsnull, - newFrame); - if (NS_OK != rv) { - return rv; - } - flow->mChildCount++; - - // Place the new frame into the parents sibling list - if (nsnull == prevSibling) { - newFrame->SetNextSibling(flow->mFirstChild); - flow->mFirstChild = newFrame; - } - else { - nsIFrame* nextSibling; - prevSibling->GetNextSibling(nextSibling); - newFrame->SetNextSibling(nextSibling); - prevSibling->SetNextSibling(newFrame); - if (nsnull == nextSibling) { - // newFrame ended up being flow's last child - flow->mLastContentIsComplete = PR_TRUE; - } - } - flow->mLastContentOffset++; - - // Generate a reflow command - nsIReflowCommand* cmd; - rv = NS_NewHTMLReflowCommand(&cmd, flow, - nsIReflowCommand::FrameInserted, - newFrame); - if (NS_OK != rv) { - return rv; - } - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - - // Fix up the next-in-flows of parent now that it has a new child - flow = (nsHTMLContainerFrame*) flow->mNextInFlow; - while (nsnull != flow) { - flow->mFirstContentOffset++; - flow->mLastContentOffset++; - } - return rv; -} - -NS_IMETHODIMP -nsHTMLContainerFrame::ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(!IsPseudoFrame(), "pseudos not supported here"); - - // Find the frame that precedes the deletion point - nsHTMLContainerFrame* flow; - nsIFrame* deadFrame; - nsIFrame* prevSibling; - if (aIndexInParent > 0) { - nsIContent* precedingContent = aContainer->ChildAt(aIndexInParent - 1); - prevSibling = aShell->FindFrameWithContent(precedingContent); - NS_RELEASE(precedingContent); - - // The frame may have a next-in-flow. Get the last-in-flow - nsIFrame* nextInFlow; - do { - prevSibling->GetNextInFlow(nextInFlow); - if (nsnull != nextInFlow) { - prevSibling = nextInFlow; - } - } while (nsnull != nextInFlow); - - // Get the dead frame (maybe) - prevSibling->GetGeometricParent((nsIFrame*&)flow); - prevSibling->GetNextSibling(deadFrame); - if (nsnull == deadFrame) { - // The deadFrame must be prevSibling's parent's next-in-flows - // first frame. Therefore it doesn't have a prevSibling. - flow = (nsHTMLContainerFrame*) flow->mNextInFlow; - if (nsnull != flow) { - deadFrame = flow->mFirstChild; - } - prevSibling = nsnull; - } - } - else { - prevSibling = nsnull; - flow = this; - deadFrame = flow->mFirstChild; - } - NS_ASSERTION(nsnull != deadFrame, "yikes! couldn't find frame"); - if (nsnull == deadFrame) { - return NS_OK; - } - - // Generate a reflow command - nsIReflowCommand* cmd; - nsresult rv = NS_NewHTMLReflowCommand(&cmd, flow, - nsIReflowCommand::FrameDeleted); - if (NS_OK != rv) { - return rv; - } - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - - // Take the frame away; Note that we also have to take away any - // continuations so we loop here until deadFrame is nsnull. - while (nsnull != deadFrame) { - // If the last frame for the flow is the frame we are deleting - // then the flow will become complete. - if (!flow->mLastContentIsComplete) { - nsIFrame* lastFrame; - flow->LastChild(lastFrame); - if (lastFrame == deadFrame) { - flow->mLastContentIsComplete = PR_TRUE; - } - } - - // Remove frame from sibling list - nsIFrame* nextSib; - deadFrame->GetNextSibling(nextSib); - if (nsnull != prevSibling) { - prevSibling->SetNextSibling(nextSib); - } - else { - flow->mFirstChild = nextSib; - } - - // Update flows child count and last-content-offset. Note that - // only the last content needs updating when a deadFrame is - // removed from flow (because only the children that follow the - // deletion need renumbering). - flow->mChildCount--; - flow->mLastContentOffset--; - - // Break frame out of its flow and then destroy it - nsIFrame* nextInFlow; - deadFrame->GetNextInFlow(nextInFlow); - deadFrame->BreakFromNextFlow(); - deadFrame->DeleteFrame(); - deadFrame = nextInFlow; - - if (nsnull != deadFrame) { - // Get the parent of deadFrame's continuation - deadFrame->GetGeometricParent((nsIFrame*&) flow); - - // When we move to a next-in-flow then the deadFrame will be the - // first child of the new parent. Therefore we know that - // prevSibling will be null. - prevSibling = nsnull; - } - } - - // Repair any remaining next-in-flows content offsets; these are the - // next-in-flows the follow the last flow container that contained - // one of the deadFrame's. Therefore both content offsets need - // updating (because all the children are following the deletion). - flow = (nsHTMLContainerFrame*) flow->mNextInFlow; - while (nsnull != flow) { - flow->mFirstContentOffset--; - flow->mLastContentOffset--; - flow = (nsHTMLContainerFrame*) flow->mNextInFlow; - } - - return rv; -} - -nsresult -nsHTMLContainerFrame::ProcessInitialReflow(nsIPresContext* aPresContext) -{ - if (nsnull == mPrevInFlow) { - const nsStyleDisplay* display = (const nsStyleDisplay*) - mStyleContext->GetStyleData(eStyleStruct_Display); - NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, - ("nsHTMLContainerFrame::ProcessInitialReflow: display=%d", - display->mDisplay)); - if (NS_STYLE_DISPLAY_LIST_ITEM == display->mDisplay) { - // This container is a list-item container. Therefore it needs a - // bullet content object. - nsIHTMLContent* bullet; - nsresult rv = NS_NewHTMLBullet(&bullet); - if (NS_OK != rv) { - return rv; - } - - // Insert the bullet. Do not allow an incremental reflow operation - // to occur. - mContent->InsertChildAt(bullet, 0, PR_FALSE); - } - } - - return NS_OK; -} diff --git a/mozilla/layout/html/base/src/nsHTMLContainerFrame.h b/mozilla/layout/html/base/src/nsHTMLContainerFrame.h deleted file mode 100644 index 52d886fb856..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLContainerFrame.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLContainerFrame_h___ -#define nsHTMLContainerFrame_h___ - -#include "nsContainerFrame.h" -class nsString; - -// Base class for html container frames that provides common -// functionality. -class nsHTMLContainerFrame : public nsContainerFrame { -public: - nsHTMLContainerFrame(nsIContent* aContent, - nsIFrame* aParent); - - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - NS_IMETHOD HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus); - NS_IMETHOD GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor); - NS_IMETHOD ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer); - NS_IMETHOD ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - -protected: - virtual ~nsHTMLContainerFrame(); - - virtual PRIntn GetSkipSides() const = 0; - - nsresult ProcessInitialReflow(nsIPresContext* aPresContext); -}; - -#endif /* nsHTMLContainerFrame_h___ */ - diff --git a/mozilla/layout/html/base/src/nsHTMLContent.cpp b/mozilla/layout/html/base/src/nsHTMLContent.cpp deleted file mode 100644 index d47e62b4f30..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLContent.cpp +++ /dev/null @@ -1,643 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLContent.h" -#include "nsString.h" -#include "nsIArena.h" -#include "nsIAtom.h" -#include "nsIHTMLAttributes.h" -#include "nsIContentDelegate.h" -#include "nsFrame.h" -#include "nsHTMLIIDs.h" -#include "nsISupportsArray.h" -#include "nsCRT.h" -#include "nsIDocument.h" -#include "nsIEventListenerManager.h" -#include "nsEventListenerManager.h" -#include "nsISizeOfHandler.h" - -static NS_DEFINE_IID(kIContentDelegateIID, NS_ICONTENTDELEGATE_IID); -static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID); -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID); -static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID); -static NS_DEFINE_IID(kIEventListenerManagerIID, NS_IEVENTLISTENERMANAGER_IID); -static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID); - -static nsIContentDelegate* gContentDelegate; - -/** - * THE html content delegate. There is exactly one instance of this - * class and it's used for all html content. It just turns around - * and asks the content object to create the frame. - */ -class ContentDelegate : public nsIContentDelegate { -public: - ContentDelegate(); - NS_DECL_ISUPPORTS - NS_IMETHOD CreateFrame(nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); -protected: - ~ContentDelegate(); -}; - -ContentDelegate::ContentDelegate() -{ - NS_INIT_REFCNT(); -} - -NS_IMPL_ISUPPORTS(ContentDelegate, kIContentDelegateIID); - -ContentDelegate::~ContentDelegate() -{ -} - -NS_METHOD -ContentDelegate::CreateFrame(nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - NS_PRECONDITION(nsnull != aContent, "null ptr"); - - // Make sure the content is html content - nsIHTMLContent* hc; - nsIFrame* frame = nsnull; - nsresult rv = aContent->QueryInterface(kIHTMLContentIID, (void**) &hc); - if (NS_OK != rv) { - // This means that *somehow* somebody which is not an html - // content object got ahold of this delegate and tried to - // create a frame with it. Give them back an nsFrame. - rv = nsFrame::NewFrame(&frame, aContent, aParentFrame); - if (NS_OK == rv) { - frame->SetStyleContext(aPresContext, aStyleContext); - } - } - else { - // Ask the content object to create the frame - rv = hc->CreateFrame(aPresContext, aParentFrame, aStyleContext, frame); - NS_RELEASE(hc); - } - aResult = frame; - return rv; -} - -//---------------------------------------------------------------------- - -void* nsHTMLContent::operator new(size_t size) -{ - nsHTMLContent* rv = (nsHTMLContent*) ::operator new(size); - nsCRT::zero(rv, size); - rv->mInHeap = 1; - return (void*) rv; -} - -void* nsHTMLContent::operator new(size_t size, nsIArena* aArena) -{ - nsHTMLContent* rv = (nsHTMLContent*) aArena->Alloc(PRInt32(size)); - nsCRT::zero(rv, size); - return (void*) rv; -} - -void nsHTMLContent::operator delete(void* ptr) -{ - NS_PRECONDITION(nsnull != ptr, "null ptr"); - nsHTMLContent* hc = (nsHTMLContent*) ptr; - if (nsnull != hc) { - if (hc->mInHeap) { - ::delete ptr; - } - } -} - -nsHTMLContent::nsHTMLContent() -{ - // Create shared content delegate if this is the first html content - // object being created. - if (nsnull == gContentDelegate) { - gContentDelegate = new ContentDelegate(); - } - - mListenerManager = nsnull; - - // Add a reference to the shared content delegate object - NS_ADDREF(gContentDelegate); -} - -nsHTMLContent::~nsHTMLContent() -{ - NS_PRECONDITION(nsnull != gContentDelegate, "null content delegate"); - if (nsnull != gContentDelegate) { - // Remove our reference to the shared content delegate object. If - // the last reference just went away, null out gContentDelegate. - nsrefcnt rc = gContentDelegate->Release(); - if (0 == rc) { - gContentDelegate = nsnull; - } - } -} - -NS_IMPL_ADDREF(nsHTMLContent) -NS_IMPL_RELEASE(nsHTMLContent) - -nsresult nsHTMLContent::QueryInterface(const nsIID& aIID, - void** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIHTMLContentIID)) { - *aInstancePtrResult = (void*) ((nsIHTMLContent*)this); - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIContentIID)) { - *aInstancePtrResult = (void*) ((nsIContent*)this); - AddRef(); - return NS_OK; - } - if (aIID.Equals(kISupportsIID)) { - *aInstancePtrResult = (void*)(nsISupports*)(nsIContent*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIDOMNodeIID)) { - *aInstancePtrResult = (void*)(nsIDOMNode*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIScriptObjectOwnerIID)) { - *aInstancePtrResult = (void*)(nsIScriptObjectOwner*)this; - AddRef(); - return NS_OK; - } - if (aIID.Equals(kIDOMEventReceiverIID)) { - *aInstancePtrResult = (void*)(nsIDOMEventReceiver*)this; - AddRef(); - return NS_OK; - } - return NS_NOINTERFACE; -} - -NS_METHOD -nsHTMLContent::IsSynthetic(PRBool& aResult) -{ - aResult = PR_FALSE; - return NS_OK; -} - -void nsHTMLContent::Compact() -{ -} - -nsresult -nsHTMLContent::GetDocument(nsIDocument*& aResult) const -{ - aResult = mDocument; - NS_IF_ADDREF(mDocument); - return NS_OK; -} - -void nsHTMLContent::SetDocument(nsIDocument* aDocument) -{ - mDocument = aDocument; -} - -nsIContent* nsHTMLContent::GetParent() const -{ - NS_IF_ADDREF(mParent); - return mParent; -} - -void nsHTMLContent::SetParent(nsIContent* aParent) -{ - mParent = aParent; -} - -PRBool nsHTMLContent::CanContainChildren() const -{ - return PR_FALSE; -} - -PRInt32 nsHTMLContent::ChildCount() const -{ - return 0; -} - -nsIContent* nsHTMLContent::ChildAt(PRInt32 aIndex) const -{ - return nsnull; -} - -PRInt32 nsHTMLContent::IndexOf(nsIContent* aPossibleChild) const -{ - return -1; -} - -NS_IMETHODIMP -nsHTMLContent::InsertChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify) -{ - return NS_OK; -} - -NS_IMETHODIMP -nsHTMLContent::ReplaceChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify) -{ - return NS_OK; -} - -NS_IMETHODIMP -nsHTMLContent::AppendChild(nsIContent* aKid, PRBool aNotify) -{ - return NS_OK; -} - -NS_IMETHODIMP -nsHTMLContent::RemoveChildAt(PRInt32 aIndex, PRBool aNotify) -{ - return NS_OK; -} - -void nsHTMLContent::SetAttribute(const nsString& aName, const nsString& aValue) -{ -} - -nsContentAttr nsHTMLContent::GetAttribute(const nsString& aName, - nsString& aResult) const -{ - aResult.SetLength(0); - return eContentAttr_NotThere; -} - -void nsHTMLContent::SetAttribute(nsIAtom* aAttribute, const nsString& aValue) -{ -} - -void nsHTMLContent::SetAttribute(nsIAtom* aAttribute, const nsHTMLValue& aValue) -{ -} - -void nsHTMLContent::UnsetAttribute(nsIAtom* aAttribute) -{ -} - -nsContentAttr nsHTMLContent::GetAttribute(nsIAtom* aAttribute, - nsHTMLValue& aValue) const -{ - aValue.Reset(); - return eContentAttr_NotThere; -} - -PRInt32 nsHTMLContent::GetAllAttributeNames(nsISupportsArray* aArray) const -{ - return 0; -} - -PRInt32 nsHTMLContent::GetAttributeCount(void) const -{ - return 0; -} - -void nsHTMLContent::SetID(nsIAtom* aID) -{ -} - -nsIAtom* nsHTMLContent::GetID(void) const -{ - return nsnull; -} - -void nsHTMLContent::SetClass(nsIAtom* aClass) -{ -} - -nsIAtom* nsHTMLContent::GetClass(void) const -{ - return nsnull; -} - -nsIStyleRule* nsHTMLContent::GetStyleRule(void) -{ - return nsnull; -} - -void nsHTMLContent::MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext) -{ -} - - -void nsHTMLContent::ListAttributes(FILE* out) const -{ - nsISupportsArray* attrs; - if (NS_OK == NS_NewISupportsArray(&attrs)) { - GetAllAttributeNames(attrs); - PRInt32 count = attrs->Count(); - PRInt32 index; - for (index = 0; index < count; index++) { - // name - nsIAtom* attr = (nsIAtom*)attrs->ElementAt(index); - nsAutoString buffer; - attr->ToString(buffer); - - // value - nsAutoString value; - GetAttribute(buffer, value); - buffer.Append("="); - buffer.Append(value); - - fputs(" ", out); - fputs(buffer, out); - NS_RELEASE(attr); - } - NS_RELEASE(attrs); - } -} - -void nsHTMLContent::List(FILE* out, PRInt32 aIndent) const -{ - NS_PRECONDITION(nsnull != mDocument, "bad content"); - - PRInt32 index; - for (index = aIndent; --index >= 0; ) fputs(" ", out); - - nsIAtom* tag = GetTag(); - if (tag != nsnull) { - nsAutoString buf; - tag->ToString(buf); - fputs(buf, out); - NS_RELEASE(tag); - } - - ListAttributes(out); - - fprintf(out, " RefCount=%d<\n", mRefCnt); - - if (CanContainChildren()) { - PRInt32 kids = ChildCount(); - for (index = 0; index < kids; index++) { - nsIContent* kid = ChildAt(index); - kid->List(out, aIndent + 1); - NS_RELEASE(kid); - } - } - - for (index = aIndent; --index >= 0; ) fputs(" ", out); - fputs(">\n", out); -} - -NS_IMETHODIMP -nsHTMLContent::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - nsHTMLContent::SizeOfWithoutThis(aHandler); - return NS_OK; -} - -void -nsHTMLContent::SizeOfWithoutThis(nsISizeOfHandler* aHandler) const -{ - // XXX mScriptObject -} - -nsIAtom* nsHTMLContent::GetTag() const -{ - return nsnull; -} - -void nsHTMLContent::ToHTML(FILE* out) const -{ - nsAutoString tmp; - ToHTMLString(tmp); - fputs(tmp, out); -} - -nsIContentDelegate* nsHTMLContent::GetDelegate(nsIPresContext* aCX) -{ - gContentDelegate->AddRef(); - return gContentDelegate; -} - -void nsHTMLContent::NewGlobalAtom(const char* aString, nsIAtom** aAtomResult) -{ - if (nsnull == *aAtomResult) { - *aAtomResult = NS_NewAtom(aString); - } else { - NS_ADDREF(*aAtomResult); - } -} - -void nsHTMLContent::ReleaseGlobalAtom(nsIAtom** aAtomResult) -{ - nsIAtom* atom = *aAtomResult; - if (nsnull != atom) { - if (0 == atom->Release()) { - *aAtomResult = nsnull; - } - } -} - -nsresult nsHTMLContent::ResetScriptObject() -{ - mScriptObject = nsnull; - return NS_OK; -} - -// nsIDOMNode interface -nsresult nsHTMLContent::GetParentNode(nsIDOMNode **aNode) -{ - if (nsnull != mParent) { - nsresult res = mParent->QueryInterface(kIDOMNodeIID, (void**)aNode); - NS_ASSERTION(NS_OK == res, "Must be a DOM Node"); - return res; - } - else { - *aNode = nsnull; - } - - return NS_OK; -} - -nsresult nsHTMLContent::GetChildNodes(nsIDOMNodeIterator **aIterator) -{ - *aIterator = nsnull; - return NS_OK; -} - -nsresult nsHTMLContent::HasChildNodes(PRBool *aReturn) -{ - *aReturn = PR_FALSE; - return NS_OK; -} - -nsresult nsHTMLContent::GetFirstChild(nsIDOMNode **aNode) -{ - *aNode = nsnull; - return NS_OK; -} - -nsresult nsHTMLContent::GetPreviousSibling(nsIDOMNode **aNode) -{ - if (nsnull != mParent) { - PRInt32 pos = mParent->IndexOf(this); - if (pos > -1) { - nsIContent* prev = mParent->ChildAt(--pos); - if (nsnull != prev) { - nsresult res = prev->QueryInterface(kIDOMNodeIID, (void**)aNode); - NS_ASSERTION(NS_OK == res, "Must be a DOM Node"); - - NS_RELEASE(prev); // balance the AddRef in ChildAt() - - return res; - } - } - } - - return NS_ERROR_FAILURE; -} - -nsresult nsHTMLContent::GetNextSibling(nsIDOMNode **aNode) -{ - if (nsnull != mParent) { - PRInt32 pos = mParent->IndexOf(this); - if (pos > -1 ) { - nsIContent* prev = mParent->ChildAt(++pos); - if (nsnull != prev) { - nsresult res = prev->QueryInterface(kIDOMNodeIID, (void**)aNode); - NS_ASSERTION(NS_OK == res, "Must be a DOM Node"); - NS_RELEASE(prev); // balance the AddRef in ChildAt() - - return res; - } - } - } - - return NS_ERROR_FAILURE; -} - -nsresult nsHTMLContent::InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild) -{ - return NS_ERROR_FAILURE; -} - -nsresult nsHTMLContent::ReplaceChild(nsIDOMNode *newChild, - nsIDOMNode *oldChild) -{ - return NS_ERROR_FAILURE; -} - -nsresult nsHTMLContent::RemoveChild(nsIDOMNode *oldChild) -{ - return NS_ERROR_FAILURE; -} - -nsresult nsHTMLContent::GetListenerManager(nsIEventListenerManager **aInstancePtrResult) -{ - if (nsnull != mListenerManager) { - return mListenerManager->QueryInterface(kIEventListenerManagerIID, (void**) aInstancePtrResult);; - } - else { - nsIEventListenerManager* l = new nsEventListenerManager(); - - if (nsnull == l) { - return NS_ERROR_OUT_OF_MEMORY; - } - - - if (NS_OK == l->QueryInterface(kIEventListenerManagerIID, (void**) aInstancePtrResult)) { - mListenerManager = l; - return NS_OK; - } - - return NS_ERROR_FAILURE; - } -} - -nsresult nsHTMLContent::AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID) -{ - nsIEventListenerManager *manager; - - if (NS_OK == GetListenerManager(&manager)) { - manager->AddEventListener(aListener, aIID); - return NS_OK; - } - return NS_ERROR_FAILURE; -} - -nsresult nsHTMLContent::RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID) -{ - nsIEventListenerManager *manager; - - if (NS_OK == GetListenerManager(&manager)) { - manager->RemoveEventListener(aListener, aIID); - return NS_OK; - } - return NS_ERROR_FAILURE; -} - -nsresult nsHTMLContent::HandleDOMEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus) -{ - //Capturing stage - - //Local handling stage - if (nsnull != mListenerManager) { - mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent, aEventStatus); - } - - //Bubbling stage - if (mParent != nsnull) { - return mParent->HandleDOMEvent(aPresContext, aEvent, aDOMEvent, aEventStatus); - } - - return NS_OK; -} - -// XXX i18n: this is wrong (?) because we need to know the outgoing -// character set (I think) -void -nsHTMLContent::QuoteForHTML(const nsString& aValue, nsString& aResult) -{ - aResult.Truncate(); - const PRUnichar* cp = aValue.GetUnicode(); - const PRUnichar* end = aValue.GetUnicode() + aValue.Length(); - aResult.Append('"'); - while (cp < end) { - PRUnichar ch = *cp++; - if ((ch >= 0x20) && (ch <= 0x7f)) { - if (ch == '\"') { - aResult.Append("""); - } - else { - aResult.Append(ch); - } - } - else { - aResult.Append("&#"); - aResult.Append((PRInt32) ch, 10); - aResult.Append(';'); - } - } - aResult.Append('"'); -} diff --git a/mozilla/layout/html/base/src/nsHTMLContent.h b/mozilla/layout/html/base/src/nsHTMLContent.h deleted file mode 100644 index afc0ee324ad..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLContent.h +++ /dev/null @@ -1,158 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLContent_h___ -#define nsHTMLContent_h___ - -#include "nsIHTMLContent.h" -#include "nsIDOMNode.h" -#include "nsIScriptObjectOwner.h" -#include "nsIDOMEventReceiver.h" -#include "nsGUIEvent.h" -class nsIEventListenerManager; -class nsIArena; -class nsIAtom; - -/** - * Abstract base class for un-tagged html content objects. Supports - * allocation from the malloc heap as well as from an arena. Note - * that instances of this object are created with zero'd memory. - */ -class nsHTMLContent : public nsIHTMLContent, public nsIDOMNode, public nsIScriptObjectOwner, public nsIDOMEventReceiver { -public: - /** - * This new method allocates memory from the standard malloc heap - * and zeros out the content object. - */ - void* operator new(size_t size); - - /** - * This new method allocates memory from the given arena and - * and zeros out the content object. - */ - void* operator new(size_t size, nsIArena* aArena); - - /** - * Release the memory associated with the content object. If the - * object was allocated from an arena then nothing happens. - */ - void operator delete(void* ptr); - - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr); - NS_IMETHOD_(nsrefcnt) AddRef(); - NS_IMETHOD_(nsrefcnt) Release(); - - NS_IMETHOD GetDocument(nsIDocument*& aResult) const; - virtual void SetDocument(nsIDocument* aDocument); - - virtual nsIContent* GetParent() const; - virtual void SetParent(nsIContent* aParent); - - virtual PRBool CanContainChildren() const; - virtual PRInt32 ChildCount() const; - virtual nsIContent* ChildAt(PRInt32 aIndex) const; - virtual PRInt32 IndexOf(nsIContent* aPossibleChild) const; - - NS_IMETHOD InsertChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify); - NS_IMETHOD ReplaceChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify); - NS_IMETHOD AppendChild(nsIContent* aKid, PRBool aNotify); - NS_IMETHOD RemoveChildAt(PRInt32 aIndex, PRBool aNotify); - - NS_IMETHOD IsSynthetic(PRBool& aResult); - - virtual void Compact(); - - virtual void SetAttribute(const nsString& aName, const nsString& aValue); - virtual nsContentAttr GetAttribute(const nsString& aName, - nsString& aResult) const; - - virtual void SetAttribute(nsIAtom* aAttribute, const nsString& aValue); - virtual void SetAttribute(nsIAtom* aAttribute, - const nsHTMLValue& aValue = nsHTMLValue::kNull); - virtual void UnsetAttribute(nsIAtom* aAttribute); - virtual nsContentAttr GetAttribute(nsIAtom* aAttribute, - nsHTMLValue& aValue) const; - virtual PRInt32 GetAllAttributeNames(nsISupportsArray* aArray) const; - virtual PRInt32 GetAttributeCount(void) const; - - virtual void SetID(nsIAtom* aID); - virtual nsIAtom* GetID(void) const; - virtual void SetClass(nsIAtom* aClass); // XXX this will have to change for CSS2 - virtual nsIAtom* GetClass(void) const; // XXX this will have to change for CSS2 - - virtual nsIStyleRule* GetStyleRule(void); - - virtual void MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext); - - virtual void List(FILE* out, PRInt32 aIndent) const; - - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - - virtual nsIAtom* GetTag() const; - - virtual void ToHTML(FILE* out) const; - - virtual nsIContentDelegate* GetDelegate(nsIPresContext* aCX); - - static void NewGlobalAtom(const char* aString, nsIAtom** aAtomResult); - - static void ReleaseGlobalAtom(nsIAtom** aAtomResult); - - static void QuoteForHTML(const nsString& aValue, nsString& aResult); - -public: - NS_IMETHOD ResetScriptObject(); - - // nsIDOMNode interface - NS_IMETHOD GetParentNode(nsIDOMNode **aNode); - NS_IMETHOD GetChildNodes(nsIDOMNodeIterator **aIterator); - NS_IMETHOD HasChildNodes(PRBool *aReturn); - NS_IMETHOD GetFirstChild(nsIDOMNode **aNode); - NS_IMETHOD GetPreviousSibling(nsIDOMNode **aNode); - NS_IMETHOD GetNextSibling(nsIDOMNode **aNode); - NS_IMETHOD InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild); - NS_IMETHOD ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild); - NS_IMETHOD RemoveChild(nsIDOMNode *oldChild); - - // nsIDOMEventReceiver interface - NS_IMETHOD AddEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); - NS_IMETHOD RemoveEventListener(nsIDOMEventListener *aListener, const nsIID& aIID); - - NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus); - -protected: - nsHTMLContent(); - virtual ~nsHTMLContent(); - virtual void ListAttributes(FILE* out) const; - void SizeOfWithoutThis(nsISizeOfHandler* aHandler) const; - - PRUint32 mInHeap : 1; - PRUint32 mRefCnt : 31; - nsIDocument* mDocument; - nsIContent* mParent; - void* mScriptObject; - - nsresult GetListenerManager(nsIEventListenerManager** aInstancePtrResult); - - nsIEventListenerManager* mListenerManager; -}; - -#endif /* nsHTMLContent_h___ */ diff --git a/mozilla/layout/html/base/src/nsHTMLHead.cpp b/mozilla/layout/html/base/src/nsHTMLHead.cpp deleted file mode 100644 index 1b3bcf3ab3c..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLHead.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLContainer.h" -#include "nsFrame.h" -#include "nsHTMLIIDs.h" - -class nsHTMLHead : public nsHTMLContainer { -public: - nsHTMLHead(nsIAtom* aTag); - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - -protected: - virtual ~nsHTMLHead(); -}; - -nsHTMLHead::nsHTMLHead(nsIAtom* aTag) - : nsHTMLContainer(aTag) -{ -} - -nsHTMLHead::~nsHTMLHead() -{ -} - -nsresult -nsHTMLHead::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame; - nsFrame::NewFrame(&frame, this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -nsresult -NS_NewHTMLHead(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* it = new nsHTMLHead(aTag); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/html/base/src/nsHTMLIIDs.cpp b/mozilla/layout/html/base/src/nsHTMLIIDs.cpp deleted file mode 100644 index 050b18aa6a2..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLIIDs.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLIIDs.h" -#include "nsIHTMLContent.h" -#include "nsIAbsoluteItems.h" -#include "nsIAnchoredItems.h" -#include "nsIFloaterContainer.h" -#include "nsIRunaround.h" -#include "nsIInlineReflow.h" -#include "nsCSSBlockFrame.h" - -const nsIID kIAbsoluteItemsIID = NS_IABSOLUTE_ITEMS_IID; -const nsIID kIAnchoredItemsIID = NS_IANCHORED_ITEMS_IID; -const nsIID kIFloaterContainerIID = NS_IFLOATER_CONTAINER_IID; -const nsIID kIHTMLContentIID = NS_IHTMLCONTENT_IID; -const nsIID kIInlineReflowIID = NS_IINLINE_REFLOW_IID; -const nsIID kIRunaroundIID = NS_IRUNAROUND_IID; -const nsIID kBlockFrameCID = NS_BLOCK_FRAME_CID; diff --git a/mozilla/layout/html/base/src/nsHTMLIIDs.h b/mozilla/layout/html/base/src/nsHTMLIIDs.h deleted file mode 100644 index 7fcac1261d4..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLIIDs.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLIIDs_h___ -#define nsHTMLIIDs_h___ - -#include "nsISupports.h" - -extern const nsIID kBlockFrameCID; // XXX temporary - -extern const nsIID kIAbsoluteItemsIID; -extern const nsIID kIAnchoredItemsIID; -extern const nsIID kIFloaterContainerIID; -extern const nsIID kIHTMLContentIID; -extern const nsIID kIInlineReflowIID; -extern const nsIID kIRunaroundIID; - -#endif /* nsHTMLIIDs_h___ */ diff --git a/mozilla/layout/html/base/src/nsHTMLImage.cpp b/mozilla/layout/html/base/src/nsHTMLImage.cpp deleted file mode 100644 index 772f8ee1ab1..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLImage.cpp +++ /dev/null @@ -1,880 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLImage.h" -#include "nsHTMLTagContent.h" -#include "nsString.h" -#include "nsLeafFrame.h" -#include "nsIPresContext.h" -#include "nsIRenderingContext.h" -#include "nsIFrameImageLoader.h" -#include "nsIPresShell.h" -#include "nsHTMLIIDs.h" -#include "nsIImage.h" -#include "nsIWidget.h" -#include "nsHTMLAtoms.h" -#include "nsIHTMLAttributes.h" -#include "nsIDocument.h" -#include "nsIHTMLDocument.h" -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" -#include "nsIImageMap.h" -#include "nsILinkHandler.h" -#include "nsIURL.h" -#include "nsCSSLayout.h" -#include "nsHTMLBase.h" -#include "prprf.h" -#include "nsISizeOfHandler.h" - -#define BROKEN_IMAGE_URL "resource:/res/html/broken-image.gif" - -// XXX image frame layout can be 100% decoupled from the content -// object; all it needs are attributes to work properly - -static NS_DEFINE_IID(kIHTMLDocumentIID, NS_IHTMLDOCUMENT_IID); - -#define nsHTMLImageSuper nsHTMLTagContent -class nsHTMLImage : public nsHTMLImageSuper { -public: - nsHTMLImage(nsIAtom* aTag); - - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - - virtual void SetAttribute(nsIAtom* aAttribute, const nsString& aValue); - virtual nsContentAttr GetAttribute(nsIAtom* aAttribute, - nsHTMLValue& aResult) const; - virtual void UnsetAttribute(nsIAtom* aAttribute); - - virtual void MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext); - - PRBool IsMap() { - return mIsMap; - } - - PRBool GetSuppress() { - return mSuppress; - } - - PRPackedBool mIsMap; - PRUint8 mSuppress; - PRUint8 mAlign; - nsString* mAltText; - nsString* mSrc; - nsString* mLowSrc; - nsString* mUseMap; - -protected: - virtual ~nsHTMLImage(); - void SizeOfWithoutThis(nsISizeOfHandler* aHandler) const; - - virtual nsContentAttr AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const; -}; - -#define ImageFrameSuper nsLeafFrame -class ImageFrame : public ImageFrameSuper { -public: - ImageFrame(nsIContent* aContent, nsIFrame* aParentFrame); - - NS_IMETHOD DeleteFrame(); - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - NS_METHOD HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus); - NS_IMETHOD GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor); - - PRBool IsServerImageMap() { - return ((nsHTMLImage*)mContent)->IsMap(); - } - -protected: - virtual ~ImageFrame(); - void SizeOfWithoutThis(nsISizeOfHandler* aHandler) const; - - virtual void GetDesiredSize(nsIPresContext* aPresContext, - const nsReflowState& aReflowState, - nsReflowMetrics& aDesiredSize); - - nsIImageMap* GetImageMap(); - - nsHTMLImageLoader mImageLoader; - nsIImageMap* mImageMap; - - void TriggerLink(nsIPresContext& aPresContext, - const nsString& aURLSpec, - const nsString& aTargetSpec, - PRBool aClick); -}; - -// Value's for mSuppress -#define SUPPRESS_UNSET 0 -#define DONT_SUPPRESS 1 -#define SUPPRESS 2 -#define DEFAULT_SUPPRESS 3 - -// Default alignment value (so we can tell an unset value from a set value) -#define ALIGN_UNSET PRUint8(-1) - -//---------------------------------------------------------------------- - -nsHTMLImageLoader::nsHTMLImageLoader() -{ - mImageLoader = nsnull; - mLoadImageFailed = PR_FALSE; - mLoadBrokenImageFailed = PR_FALSE; - mURLSpec = nsnull; -} - -nsHTMLImageLoader::~nsHTMLImageLoader() -{ - NS_IF_RELEASE(mImageLoader); - if (nsnull != mURLSpec) { - delete mURLSpec; - } -} - -void -nsHTMLImageLoader::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - if (!aHandler->HaveSeen(mURLSpec)) { - mURLSpec->SizeOf(aHandler); - } - if (!aHandler->HaveSeen(mImageLoader)) { - mImageLoader->SizeOf(aHandler); - } -} - -nsIImage* -nsHTMLImageLoader::GetImage() -{ - nsIImage* image = nsnull; - if (nsnull != mImageLoader) { - mImageLoader->GetImage(image); - } - return image; -} - -nsresult -nsHTMLImageLoader::SetURL(const nsString& aURLSpec) -{ - if (nsnull != mURLSpec) { - delete mURLSpec; - } - mURLSpec = new nsString(aURLSpec); - if (nsnull == mURLSpec) { - return NS_ERROR_OUT_OF_MEMORY; - } - return NS_OK; -} - -nsresult -nsHTMLImageLoader::LoadImage(nsIPresContext* aPresContext, - nsIFrame* aForFrame, - PRBool aNeedSizeUpdate, - PRIntn& aLoadStatus) -{ - aLoadStatus = NS_IMAGE_LOAD_STATUS_NONE; - - // Get absolute url the first time through - nsresult rv; - nsAutoString src; - if (mLoadImageFailed || (nsnull == mURLSpec)) { - src.Append(BROKEN_IMAGE_URL); - } else { - nsAutoString baseURL; - - // Get documentURL - nsIPresShell* shell; - shell = aPresContext->GetShell(); - nsIDocument* doc = shell->GetDocument(); - nsIURL* docURL = doc->GetDocumentURL(); - - // Create an absolute URL - nsresult rv = NS_MakeAbsoluteURL(docURL, baseURL, *mURLSpec, src); - - // Release references - NS_RELEASE(shell); - NS_RELEASE(docURL); - NS_RELEASE(doc); - if (NS_OK != rv) { - return rv; - } - } - - if (nsnull == mImageLoader) { - // Start image loading - rv = aPresContext->LoadImage(src, aForFrame, aNeedSizeUpdate, - mImageLoader); - if (NS_OK != rv) { - return rv; - } - } - - // Examine current image load status - mImageLoader->GetImageLoadStatus(aLoadStatus); - if (0 != (aLoadStatus & NS_IMAGE_LOAD_STATUS_ERROR)) { - NS_RELEASE(mImageLoader); - if (mLoadImageFailed) { - // We are doomed. Loading the broken image has just failed. - mLoadBrokenImageFailed = PR_TRUE; - } - else { - // Try again, this time using the broke-image url - mLoadImageFailed = PR_TRUE; - return LoadImage(aPresContext, aForFrame, aNeedSizeUpdate, aLoadStatus); - } - } - return NS_OK; -} - -void -nsHTMLImageLoader::GetDesiredSize(nsIPresContext* aPresContext, - const nsReflowState& aReflowState, - nsReflowMetrics& aDesiredSize) -{ - nsSize styleSize; - PRIntn ss = nsCSSLayout::GetStyleSize(aPresContext, aReflowState, styleSize); - PRIntn loadStatus; - if (0 != ss) { - if (NS_SIZE_HAS_BOTH == ss) { - LoadImage(aPresContext, aReflowState.frame, PR_FALSE, loadStatus); - aDesiredSize.width = styleSize.width; - aDesiredSize.height = styleSize.height; - } - else { - // Preserve aspect ratio of image with unbound dimension. - LoadImage(aPresContext, aReflowState.frame, PR_TRUE, loadStatus); - if ((0 == (loadStatus & NS_IMAGE_LOAD_STATUS_SIZE_AVAILABLE)) || - (nsnull == mImageLoader)) { - // Provide a dummy size for now; later on when the image size - // shows up we will reflow to the new size. - aDesiredSize.width = 1; - aDesiredSize.height = 1; - } - else { - float p2t = aPresContext->GetPixelsToTwips(); - nsSize imageSize; - mImageLoader->GetSize(imageSize); - float imageWidth = imageSize.width * p2t; - float imageHeight = imageSize.height * p2t; - if (0.0f != imageHeight) { - if (0 != (ss & NS_SIZE_HAS_WIDTH)) { - // We have a width, and an auto height. Compute height - // from width. - aDesiredSize.width = styleSize.width; - aDesiredSize.height = - nscoord(styleSize.width * imageHeight / imageWidth); - } - else { - // We have a height and an auto width. Compute width from - // height. - aDesiredSize.height = styleSize.height; - aDesiredSize.width = - nscoord(styleSize.height * imageWidth / imageHeight); - } - } - else { - // Screwy image - aDesiredSize.width = 1; - aDesiredSize.height = 1; - } - } - } - } - else { - LoadImage(aPresContext, aReflowState.frame, PR_TRUE, loadStatus); - if ((0 == (loadStatus & NS_IMAGE_LOAD_STATUS_SIZE_AVAILABLE)) || - (nsnull == mImageLoader)) { - // Provide a dummy size for now; later on when the image size - // shows up we will reflow to the new size. - aDesiredSize.width = 1; - aDesiredSize.height = 1; - } else { - float p2t = aPresContext->GetPixelsToTwips(); - nsSize imageSize; - mImageLoader->GetSize(imageSize); - aDesiredSize.width = nscoord(imageSize.width * p2t); - aDesiredSize.height = nscoord(imageSize.height * p2t); - } - } -} - -//---------------------------------------------------------------------- - -ImageFrame::ImageFrame(nsIContent* aContent, nsIFrame* aParentFrame) - : nsLeafFrame(aContent, aParentFrame) -{ -} - -ImageFrame::~ImageFrame() -{ -} - -NS_METHOD -ImageFrame::DeleteFrame() -{ - NS_IF_RELEASE(mImageMap); - - // Release image loader first so that it's refcnt can go to zero - mImageLoader.DestroyLoader(); - - return nsLeafFrame::DeleteFrame(); -} - -NS_IMETHODIMP -ImageFrame::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - ImageFrame::SizeOfWithoutThis(aHandler); - return NS_OK; -} - -void -ImageFrame::SizeOfWithoutThis(nsISizeOfHandler* aHandler) const -{ - ImageFrameSuper::SizeOfWithoutThis(aHandler); - mImageLoader.SizeOf(aHandler); - if (!aHandler->HaveSeen(mImageMap)) { - mImageMap->SizeOf(aHandler); - } -} - -void -ImageFrame::GetDesiredSize(nsIPresContext* aPresContext, - const nsReflowState& aReflowState, - nsReflowMetrics& aDesiredSize) -{ - nsHTMLBase::CreateViewForFrame(aPresContext, this, mStyleContext, PR_TRUE); - - // Setup url before starting the image load - nsAutoString src; - if (eContentAttr_HasValue == mContent->GetAttribute("SRC", src)) { - mImageLoader.SetURL(src); - } - mImageLoader.GetDesiredSize(aPresContext, aReflowState, aDesiredSize); -} - -NS_METHOD -ImageFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - if ((0 == mRect.width) || (0 == mRect.height)) { - // Do not render when given a zero area. This avoids some useless - // scaling work while we wait for our image dimensions to arrive - // asynchronously. - return NS_OK; - } - - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - - if (disp->mVisible) { - // First paint background and borders - nsLeafFrame::Paint(aPresContext, aRenderingContext, aDirtyRect); - - // XXX when we don't have the image, draw the we-don't-have-an-image look - - nsIImage* image = mImageLoader.GetImage(); - if (nsnull == image) { - // No image yet - return NS_OK; - } - - // Now render the image into our inner area (the area without the - // borders and padding) - nsRect inner; - GetInnerArea(&aPresContext, inner); - if (mImageLoader.GetLoadImageFailed()) { - float p2t = aPresContext.GetPixelsToTwips(); - inner.width = nscoord(p2t * image->GetWidth()); - inner.height = nscoord(p2t * image->GetHeight()); - } - aRenderingContext.DrawImage(image, inner); - } - - if (GetShowFrameBorders()) { - nsIImageMap* map = GetImageMap(); - if (nsnull != map) { - aRenderingContext.SetColor(NS_RGB(0, 0, 0)); - map->Draw(aPresContext, aRenderingContext); - } - } - - return NS_OK; -} - -nsIImageMap* -ImageFrame::GetImageMap() -{ - if (nsnull == mImageMap) { - nsHTMLImage* part = (nsHTMLImage*)mContent; - if (nsnull == part->mUseMap) { - return nsnull; - } - - nsIDocument* doc = nsnull; - mContent->GetDocument(doc); - if (nsnull == doc) { - return nsnull; - } - - nsAutoString mapName(*part->mUseMap); - if (mapName.First() == '#') { - mapName.Cut(0, 1); - } - nsIHTMLDocument* hdoc; - nsresult rv = doc->QueryInterface(kIHTMLDocumentIID, (void**)&hdoc); - NS_RELEASE(doc); - if (NS_OK == rv) { - nsIImageMap* map; - rv = hdoc->GetImageMap(mapName, &map); - NS_RELEASE(hdoc); - if (NS_OK == rv) { - mImageMap = map; - } - } - } - NS_IF_ADDREF(mImageMap); - return mImageMap; -} - -void -ImageFrame::TriggerLink(nsIPresContext& aPresContext, - const nsString& aURLSpec, - const nsString& aTargetSpec, - PRBool aClick) -{ - nsILinkHandler* handler; - if (NS_OK == aPresContext.GetLinkHandler(&handler)) { - if (aClick) { - handler->OnLinkClick(this, aURLSpec, aTargetSpec); - } - else { - handler->OnOverLink(this, aURLSpec, aTargetSpec); - } - } -} - -// XXX what should clicks on transparent pixels do? -NS_METHOD -ImageFrame::HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus) -{ - nsIImageMap* map; - aEventStatus = nsEventStatus_eIgnore; - - switch (aEvent->message) { - case NS_MOUSE_LEFT_BUTTON_UP: - case NS_MOUSE_MOVE: - map = GetImageMap(); - if ((nsnull != map) || IsServerImageMap()) { - nsIURL* docURL = nsnull; - nsIDocument* doc = nsnull; - mContent->GetDocument(doc); - if (nsnull != doc) { - docURL = doc->GetDocumentURL(); - NS_RELEASE(doc); - } - - // Translate coordinates to pixels - float t2p = aPresContext.GetTwipsToPixels(); - nscoord x = nscoord(t2p * aEvent->point.x); - nscoord y = nscoord(t2p * aEvent->point.y); - - // Ask map if the x,y coordinates are in a clickable area - nsAutoString absURL, target, altText; - PRBool suppress; - if (nsnull != map) { - nsresult r = map->IsInside(x, y, docURL, absURL, target, altText, - &suppress); - NS_IF_RELEASE(docURL); - NS_RELEASE(map); - if (NS_OK == r) { - // We hit a clickable area. Time to go somewhere... - TriggerLink(aPresContext, absURL, target, - aEvent->message == NS_MOUSE_LEFT_BUTTON_UP); - aEventStatus = nsEventStatus_eConsumeNoDefault; - } - } - else { - suppress = ((nsHTMLImage*)mContent)->GetSuppress(); - nsAutoString baseURL;/* XXX */ - nsAutoString src; - nsString* srcp = ((nsHTMLImage*)mContent)->mSrc; - if (nsnull != srcp) { - src.Append(*srcp); - } - NS_MakeAbsoluteURL(docURL, baseURL, src, absURL); - char cbuf[50]; - PR_snprintf(cbuf, sizeof(cbuf), "?%d,%d", x, y); - absURL.Append(cbuf); - TriggerLink(aPresContext, absURL, target, - aEvent->message == NS_MOUSE_LEFT_BUTTON_UP); - aEventStatus = nsEventStatus_eConsumeNoDefault; - } - break; - } - // FALL THROUGH - - default: - // Let default event handler deal with it - return nsLeafFrame::HandleEvent(aPresContext, aEvent, aEventStatus); - } - return NS_OK; -} - -NS_METHOD -ImageFrame::GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor) -{ - // The default cursor is to have no cursor - aCursor = NS_STYLE_CURSOR_INHERIT; - - const nsStyleColor* styleColor = (const nsStyleColor*) - mStyleContext->GetStyleData(eStyleStruct_Color); - if (styleColor->mCursor != NS_STYLE_CURSOR_INHERIT) { - // If we have a particular cursor, use it - *aFrame = this; - aCursor = (PRInt32) styleColor->mCursor; - } - - nsIImageMap* map = GetImageMap(); - if (nsnull != map) { - aCursor = NS_STYLE_CURSOR_DEFAULT; - float t2p = aPresContext.GetTwipsToPixels(); - nscoord x = nscoord(t2p * aPoint.x); - nscoord y = nscoord(t2p * aPoint.y); - if (NS_OK == map->IsInside(x, y)) { - aCursor = NS_STYLE_CURSOR_HAND; - } - NS_RELEASE(map); - } - - return NS_OK; -} - -//---------------------------------------------------------------------- - -nsHTMLImage::nsHTMLImage(nsIAtom* aTag) - : nsHTMLTagContent(aTag) -{ - mAlign = ALIGN_UNSET; - mSuppress = SUPPRESS_UNSET; -} - -nsHTMLImage::~nsHTMLImage() -{ - if (nsnull != mAltText) delete mAltText; - if (nsnull != mSrc) delete mSrc; - if (nsnull != mLowSrc) delete mLowSrc; - if (nsnull != mUseMap) delete mUseMap; -} - -NS_IMETHODIMP -nsHTMLImage::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - nsHTMLImage::SizeOfWithoutThis(aHandler); - return NS_OK; -} - -void -nsHTMLImage::SizeOfWithoutThis(nsISizeOfHandler* aHandler) const -{ -} - -void nsHTMLImage::SetAttribute(nsIAtom* aAttribute, const nsString& aString) -{ - if (aAttribute == nsHTMLAtoms::ismap) { - mIsMap = PR_TRUE; - return; - } - if (aAttribute == nsHTMLAtoms::usemap) { - nsAutoString src(aString); - src.StripWhitespace(); - if (nsnull == mUseMap) { - mUseMap = new nsString(src); - } else { - *mUseMap = src; - } - return; - } - if (aAttribute == nsHTMLAtoms::align) { - nsHTMLValue val; - if (ParseAlignParam(aString, val)) { - mAlign = val.GetIntValue(); - // Reflect the attribute into the syle system - nsHTMLTagContent::SetAttribute(aAttribute, val); - } else { - mAlign = ALIGN_UNSET; - } - return; - } - if (aAttribute == nsHTMLAtoms::src) { - nsAutoString src(aString); - src.StripWhitespace(); - if (nsnull == mSrc) { - mSrc = new nsString(src); - } else { - *mSrc = src; - } - return; - } - if (aAttribute == nsHTMLAtoms::lowsrc) { - nsAutoString src(aString); - src.StripWhitespace(); - if (nsnull == mLowSrc) { - mLowSrc = new nsString(src); - } else { - *mLowSrc = src; - } - return; - } - if (aAttribute == nsHTMLAtoms::alt) { - if (nsnull == mAltText) { - mAltText = new nsString(aString); - } else { - *mAltText = aString; - } - return; - } - if (aAttribute == nsHTMLAtoms::suppress) { - if (aString.EqualsIgnoreCase("true")) { - mSuppress = SUPPRESS; - } else if (aString.EqualsIgnoreCase("false")) { - mSuppress = DONT_SUPPRESS; - } else { - mSuppress = DEFAULT_SUPPRESS; - } - return; - } - - // Try other attributes - nsHTMLValue val; - if (ParseImageProperty(aAttribute, aString, val)) { - nsHTMLTagContent::SetAttribute(aAttribute, val); - return; - } - - // Use default attribute catching code - nsHTMLTagContent::SetAttribute(aAttribute, aString); -} - -nsContentAttr nsHTMLImage::GetAttribute(nsIAtom* aAttribute, - nsHTMLValue& aResult) const -{ - nsContentAttr ca = eContentAttr_NotThere; - aResult.Reset(); - if (aAttribute == nsHTMLAtoms::ismap) { - if (mIsMap) { - ca = eContentAttr_HasValue; - } - } - else if (aAttribute == nsHTMLAtoms::usemap) { - if (nsnull != mUseMap) { - aResult.SetStringValue(*mUseMap); - ca = eContentAttr_HasValue; - } - } - else if (aAttribute == nsHTMLAtoms::align) { - if (ALIGN_UNSET != mAlign) { - aResult.SetIntValue(mAlign, eHTMLUnit_Enumerated); - ca = eContentAttr_HasValue; - } - } - else if (aAttribute == nsHTMLAtoms::src) { - if (nsnull != mSrc) { - aResult.SetStringValue(*mSrc); - ca = eContentAttr_HasValue; - } - } - else if (aAttribute == nsHTMLAtoms::lowsrc) { - if (nsnull != mLowSrc) { - aResult.SetStringValue(*mLowSrc); - ca = eContentAttr_HasValue; - } - } - else if (aAttribute == nsHTMLAtoms::alt) { - if (nsnull != mAltText) { - aResult.SetStringValue(*mAltText); - ca = eContentAttr_HasValue; - } - } - else if (aAttribute == nsHTMLAtoms::suppress) { - if (SUPPRESS_UNSET != mSuppress) { - switch (mSuppress) { - case SUPPRESS: aResult.SetIntValue(1, eHTMLUnit_Integer); break; - case DONT_SUPPRESS: aResult.SetIntValue(0, eHTMLUnit_Integer); break; - case DEFAULT_SUPPRESS: aResult.SetEmptyValue(); break; - } - ca = eContentAttr_HasValue; - } - } - else { - ca = nsHTMLTagContent::GetAttribute(aAttribute, aResult); - } - return ca; -} - -void nsHTMLImage::UnsetAttribute(nsIAtom* aAttribute) -{ - if (aAttribute == nsHTMLAtoms::ismap) { - mIsMap = PR_FALSE; - } - else if (aAttribute == nsHTMLAtoms::usemap) { - if (nsnull != mUseMap) { - delete mUseMap; - mUseMap = nsnull; - } - } - else if (aAttribute == nsHTMLAtoms::align) { - mAlign = ALIGN_UNSET; - } - else if (aAttribute == nsHTMLAtoms::src) { - if (nsnull != mSrc) { - delete mSrc; - mSrc = nsnull; - } - } - else if (aAttribute == nsHTMLAtoms::lowsrc) { - if (nsnull != mLowSrc) { - delete mLowSrc; - mSrc = nsnull; - } - } - else if (aAttribute == nsHTMLAtoms::alt) { - if (nsnull != mAltText) { - delete mAltText; - mAltText = nsnull; - } - } - else if (aAttribute == nsHTMLAtoms::suppress) { - mSuppress = SUPPRESS_UNSET; - } - else { - nsHTMLTagContent::UnsetAttribute(aAttribute); - } -} - -nsContentAttr nsHTMLImage::AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const -{ - nsContentAttr ca = eContentAttr_NotThere; - if (aAttribute == nsHTMLAtoms::align) { - if ((eHTMLUnit_Enumerated == aValue.GetUnit()) && - (ALIGN_UNSET != aValue.GetIntValue())) { - AlignParamToString(aValue, aResult); - ca = eContentAttr_HasValue; - } - } - else if (aAttribute == nsHTMLAtoms::suppress) { - if (SUPPRESS_UNSET != mSuppress) { - aResult.Truncate(); - switch (mSuppress) { - case SUPPRESS: aResult.Append("true"); break; - case DONT_SUPPRESS: aResult.Append("false"); break; - case DEFAULT_SUPPRESS: break; - } - ca = eContentAttr_HasValue; - } - } - else if (ImagePropertyToString(aAttribute, aValue, aResult)) { - ca = eContentAttr_HasValue; - } - return ca; -} - -void nsHTMLImage::MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext) -{ - if (ALIGN_UNSET != mAlign) { - nsStyleDisplay* display = (nsStyleDisplay*) - aContext->GetMutableStyleData(eStyleStruct_Display); - nsStyleText* text = (nsStyleText*) - aContext->GetMutableStyleData(eStyleStruct_Text); - nsStyleSpacing* spacing = (nsStyleSpacing*) - aContext->GetMutableStyleData(eStyleStruct_Spacing); - float p2t = aPresContext->GetPixelsToTwips(); - nsStyleCoord three(nscoord(p2t*3)); - switch (mAlign) { - case NS_STYLE_TEXT_ALIGN_LEFT: - display->mFloats = NS_STYLE_FLOAT_LEFT; - spacing->mMargin.SetLeft(three); - spacing->mMargin.SetRight(three); - break; - case NS_STYLE_TEXT_ALIGN_RIGHT: - display->mFloats = NS_STYLE_FLOAT_RIGHT; - spacing->mMargin.SetLeft(three); - spacing->mMargin.SetRight(three); - break; - default: - text->mVerticalAlign.SetIntValue(mAlign, eStyleUnit_Enumerated); - break; - } - } - MapImagePropertiesInto(aContext, aPresContext); - MapImageBorderInto(aContext, aPresContext, nsnull); -} - -nsresult -nsHTMLImage::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - ImageFrame* frame = new ImageFrame(this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - aResult = frame; - frame->SetStyleContext(aPresContext, aStyleContext); - return NS_OK; -} - -nsresult -NS_NewHTMLImage(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* img = new nsHTMLImage(aTag); - if (nsnull == img) { - return NS_ERROR_OUT_OF_MEMORY; - } - return img->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/html/base/src/nsHTMLImage.h b/mozilla/layout/html/base/src/nsHTMLImage.h deleted file mode 100644 index 1700c10c0be..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLImage.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLImage_h___ -#define nsHTMLImage_h___ - -#include "nslayout.h" -#include "nsIFrameImageLoader.h" -class nsIFrame; -class nsIFrameImageLoader; -class nsIPresContext; -class nsISizeOfHandler; -struct nsReflowState; -struct nsReflowMetrics; -struct nsSize; - -/** - * HTML image loader. This is designed to encapsulate the loading - * and sizing process of html images (basically so that the logic - * can be reused in the image button form control code and the html - * image layout code). - */ -class nsHTMLImageLoader { -public: - nsHTMLImageLoader(); - ~nsHTMLImageLoader(); - - void DestroyLoader() { - NS_IF_RELEASE(mImageLoader); - } - - nsIImage* GetImage(); - - nsresult SetURL(const nsString& aURLSpec); - - nsresult LoadImage(nsIPresContext* aPresContext, - nsIFrame* aForFrame, - PRBool aNeedSizeUpdate, - PRIntn& aLoadStatus); - - void GetDesiredSize(nsIPresContext* aPresContext, - const nsReflowState& aReflowState, - nsReflowMetrics& aDesiredSize); - - PRBool GetLoadImageFailed() { - return mLoadImageFailed; - } - - void SizeOf(nsISizeOfHandler* aHandler) const; - -protected: - nsIFrameImageLoader* mImageLoader; - PRPackedBool mLoadImageFailed; - PRPackedBool mLoadBrokenImageFailed; - nsString* mURLSpec; -}; - -#endif /* nsHTMLImage_h___ */ diff --git a/mozilla/layout/html/base/src/nsHTMLParts.h b/mozilla/layout/html/base/src/nsHTMLParts.h deleted file mode 100644 index a348495dedc..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLParts.h +++ /dev/null @@ -1,172 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLParts_h___ -#define nsHTMLParts_h___ - -#include "nscore.h" -#include "nsISupports.h" -#include "nsIReflowCommand.h" -class nsIArena; -class nsIAtom; -class nsIContent; -class nsIDocument; -class nsIHTMLContent; -class nsIHTMLContentSink; -class nsITextContent; -class nsIURL; -class nsString; -class nsIWebWidget; - -// XXX naming consistency puhleeze! - -extern nsresult NS_NewHTMLContentSink(nsIHTMLContentSink** aInstancePtrResult, - nsIDocument* aDoc, - nsIURL* aURL, - nsIWebWidget* aWebWidget); - -/** - * Create a new content object for the given tag. - * Returns NS_ERROR_NOT_AVAILABLE for an unknown/unhandled tag. - * Returns some other error on error. - * Returns NS_OK on success - */ -extern nsresult NS_CreateHTMLElement(nsIHTMLContent** aInstancePtrResult, - const nsString& aTag); - -// Create an html root part -extern nsresult - NS_NewRootPart(nsIHTMLContent** aInstancePtrResult, - nsIDocument* aDocument); -extern nsresult - NS_NewHTMLComment(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag, - const nsString& aComment); - -// Head parts -extern nsresult - NS_NewHTMLHead(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); -extern nsresult - NS_NewHTMLMeta(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); -extern nsresult - NS_NewHTMLTitle(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag, - const nsString& aTitle); - -// Create an html body part -extern nsresult - NS_NewBodyPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -// Create a new generic html container (e.g. P, DIV, SPAN, B, I, etc). -// Not used for tables or framesets (see below). -extern nsresult - NS_NewHTMLContainer(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); -extern nsresult - NS_NewHTMLContainer(nsIHTMLContent** aInstancePtrResult, - nsIArena* aArena, nsIAtom* aTag); - -extern nsresult - NS_NewHTMLBreak(nsIHTMLContent** aInstancePtrResult, nsIAtom* aTag); - -extern nsresult - NS_NewHTMLWordBreak(nsIHTMLContent** aInstancePtrResult, nsIAtom* aTag); - -extern nsresult - NS_NewHTMLSpacer(nsIHTMLContent** aInstancePtrResult, nsIAtom* aTag); - -extern nsresult - NS_NewHTMLBullet(nsIHTMLContent** aInstancePtrResult); - -// Create a new text content object. The memory for the unicode string -// will be allocated from the heap. The object returned will support -// the nsIHTMLContent interface as well as the nsITextContent -// interface -extern nsresult - NS_NewHTMLText(nsIHTMLContent** aInstancePtrResult, - const PRUnichar* us, PRInt32 uslen = 0); -extern nsresult - NS_NewHTMLText(nsIHTMLContent** aInstancePtrResult, - nsIArena* aArena, const PRUnichar* us, PRInt32 uslen = 0); - -// Create a new text content object. The memory for the unicode string -// is allocated by the caller. The caller is responsible for -// deallocating the memory (e.g. use an nsIArena). The object returned -// will support the nsIHTMLContent interface as well as the -// nsITextContent interface -extern nsresult - NS_NewSharedHTMLText(nsIHTMLContent** aInstancePtrResult, - PRUnichar* us, PRInt32 uslen = 0); -extern nsresult - NS_NewSharedHTMLText(nsIHTMLContent** aInstancePtrResult, - nsIArena* aArena, PRUnichar* us, PRInt32 uslen = 0); - -/** Create a new horizontal rule content object (e.g
    .) */ -extern nsresult -NS_NewHRulePart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table content object */ -extern nsresult -NS_NewTablePart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table row group object */ -extern nsresult -NS_NewTableRowGroupPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table row content object */ -extern nsresult -NS_NewTableRowPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table column group content object */ -extern nsresult -NS_NewTableColGroupPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table column content object */ -extern nsresult -NS_NewTableColPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table cell content object '; - $rev_time = $revision_ctime{$revision}; -# $rev_time =~ s/(19\d\d) (.\d:\d\d)/$1
    $2<\/FONT>/; - - # jwz: print the date the way "ls" does. - # - # What ls does is actually: print "Mmm DD HH:MM" unless the file is - # more than six months old, or more than 1 hour in the future, in - # which case, print "Mmm DD YYYY". - # - # What the following does is: "Mmm DD HH:MM" unless the year is not - # the current year; else print "Mmm DD YYYY". - # - # If we had $rev_time as an actual time_t instead of as a string, - # it would be easy to do the "ls" thing (see the code I wrote for - # this in "lxr/source"). -jwz, 15-Jun-98. - # - { - my $current_time = time; - my @t = gmtime($current_time); - my ($csec, $cmin, $chour, $cmday, $cmon, $cyear) = @t; - $cyear += 1900; - - $_ = $rev_time; - my ($rday, $rmon, $ryear, $rhour, $rmin) = - m/([0-9]+) ([A-Z][a-z]+) ([0-9][0-9]+) +([0-9]+):([0-9]+)/; - $rmon =~ s/^(...).*$/$1/; - - if (!$rday) { - # parse error -- be annoying so somebody complains. - $rev_time = "\"$rev_time\""; - } elsif ($cyear ne $ryear) { - $rev_time = sprintf("%s %2d %04d", $rmon, $rday, $ryear); - } else { - $rev_time = sprintf("%s %2d %02d:%02d", - $rmon, $rday, $rhour, $rmin); - } - - $rev_time = "$rev_time"; - } - - $output .= ""; - $output .= ""; - - $output .= "\n"; - - print $output; -} -print "
    */ -extern nsresult -NS_NewTableCellPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new table caption content object
    */ -extern nsresult -NS_NewTableCaptionPart(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -extern nsresult -NS_NewHTMLImage(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag); - -/** Create a new HTML reflow command */ -extern nsresult -NS_NewHTMLReflowCommand(nsIReflowCommand** aInstancePtrResult, - nsIFrame* aTargetFrame, - nsIReflowCommand::ReflowType aReflowType, - nsIFrame* aChildFrame = nsnull); - -#endif /* nsHTMLParts_h___ */ diff --git a/mozilla/layout/html/base/src/nsHTMLReflowCommand.cpp b/mozilla/layout/html/base/src/nsHTMLReflowCommand.cpp deleted file mode 100644 index 8a5218b0dbe..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLReflowCommand.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLReflowCommand.h" -#include "nsIFrame.h" -#include "nsIPresContext.h" -#include "nsIPresShell.h" -#include "nsIContent.h" -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" -#include "nsIFloaterContainer.h" -#include "nsHTMLIIDs.h" - -static NS_DEFINE_IID(kIReflowCommandIID, NS_IREFLOWCOMMAND_IID); - -nsresult -NS_NewHTMLReflowCommand(nsIReflowCommand** aInstancePtrResult, - nsIFrame* aTargetFrame, - nsIReflowCommand::ReflowType aReflowType, - nsIFrame* aChildFrame) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsHTMLReflowCommand* cmd = new nsHTMLReflowCommand(aTargetFrame, aReflowType, aChildFrame); - if (nsnull == cmd) { - return NS_ERROR_OUT_OF_MEMORY; - } - - return cmd->QueryInterface(kIReflowCommandIID, (void**)aInstancePtrResult); -} - - -// Construct a reflow command given a target frame, reflow command type, -// and optional child frame -nsHTMLReflowCommand::nsHTMLReflowCommand(nsIFrame* aTargetFrame, - ReflowType aReflowType, - nsIFrame* aChildFrame) - : mType(aReflowType), mTargetFrame(aTargetFrame), mChildFrame(aChildFrame) -{ - NS_PRECONDITION(mTargetFrame != nsnull, "null target frame"); - NS_INIT_REFCNT(); -} - -nsHTMLReflowCommand::~nsHTMLReflowCommand() -{ -} - -NS_IMPL_ISUPPORTS(nsHTMLReflowCommand, kIReflowCommandIID); - -nsIFrame* nsHTMLReflowCommand::GetContainingBlock(nsIFrame* aFloater) -{ - nsIFrame* containingBlock = nsnull; - nsIFloaterContainer* container = nsnull; - - for (aFloater->GetContentParent(containingBlock); - nsnull != containingBlock; - containingBlock->GetContentParent(containingBlock)) - { - if (NS_OK == containingBlock->QueryInterface(kIFloaterContainerIID, (void**)&container)) { - break; - } - } - - return containingBlock; -} - -void nsHTMLReflowCommand::BuildPath() -{ - mPath.Clear(); - - // Floating frames are handled differently. The path goes from the target - // frame to the containing block, and then up the hierarchy - nsStyleDisplay* display; - mTargetFrame->GetStyleData(eStyleStruct_Display, (nsStyleStruct*&)display); - if (NS_STYLE_FLOAT_NONE != display->mFloats) { - mPath.AppendElement((void*)mTargetFrame); - - for (nsIFrame* f = GetContainingBlock(mTargetFrame); - nsnull != f; - f->GetGeometricParent(f)) { - mPath.AppendElement((void*)f); - } - - } else { - for (nsIFrame* f = mTargetFrame; nsnull != f; f->GetGeometricParent(f)) { - mPath.AppendElement((void*)f); - } - } -} - -NS_IMETHODIMP nsHTMLReflowCommand::Dispatch(nsIPresContext& aPresContext, - nsReflowMetrics& aDesiredSize, - const nsSize& aMaxSize) -{ - // Build the path from the target frame (index 0) to the root frame - BuildPath(); - - // Send an incremental reflow notification to the root frame - nsIFrame* root = (nsIFrame*)mPath[mPath.Count() - 1]; - -#ifdef NS_DEBUG - nsIPresShell* shell = aPresContext.GetShell(); - if (nsnull != shell) { - NS_ASSERTION(shell->GetRootFrame() == root, "bad root frame"); - NS_RELEASE(shell); - } -#endif - - if (nsnull != root) { - mPath.RemoveElementAt(mPath.Count() - 1); - - nsReflowState reflowState(root, *this, aMaxSize); - nsReflowStatus status; - root->Reflow(&aPresContext, aDesiredSize, reflowState, status); - } - - return NS_OK; -} - -NS_IMETHODIMP nsHTMLReflowCommand::GetNext(nsIFrame*& aNextFrame) -{ - PRInt32 count = mPath.Count(); - - aNextFrame = nsnull; - if (count > 0) { - aNextFrame = (nsIFrame*)mPath[count - 1]; - mPath.RemoveElementAt(count - 1); - } - return NS_OK; -} - -NS_IMETHODIMP nsHTMLReflowCommand::GetTarget(nsIFrame*& aTargetFrame) const -{ - aTargetFrame = mTargetFrame; - return NS_OK; -} - -NS_IMETHODIMP nsHTMLReflowCommand::GetType(ReflowType& aReflowType) const -{ - aReflowType = mType; - return NS_OK; -} - -NS_IMETHODIMP nsHTMLReflowCommand::GetChildFrame(nsIFrame*& aChildFrame) const -{ - aChildFrame = mChildFrame; - return NS_OK; -} - diff --git a/mozilla/layout/html/base/src/nsHTMLReflowCommand.h b/mozilla/layout/html/base/src/nsHTMLReflowCommand.h deleted file mode 100644 index c1a3d41ac4b..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLReflowCommand.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLReflowCommand_h___ -#define nsHTMLReflowCommand_h___ - -#include "nsIReflowCommand.h" -#include "nsVoidArray.h" - -/** - * An HTML reflow command - */ -class nsHTMLReflowCommand : public nsIReflowCommand { -public: - /** - * Construct an HTML reflow command of type aReflowType and with target - * frame aTargetFrame. You can also specify an optional child frame, e.g. - * to indicate the inserted child frame - */ - nsHTMLReflowCommand(nsIFrame* aTargetFrame, - ReflowType aReflowType, - nsIFrame* aChildFrame = nsnull); - - virtual ~nsHTMLReflowCommand(); - - // nsISupports - NS_DECL_ISUPPORTS - - // nsIReflowCommand - NS_IMETHOD Dispatch(nsIPresContext& aPresContext, - nsReflowMetrics& aDesiredSize, - const nsSize& aMaxSize); - NS_IMETHOD GetNext(nsIFrame*& aNextFrame); - NS_IMETHOD GetTarget(nsIFrame*& aTargetFrame) const; - NS_IMETHOD GetType(ReflowType& aReflowType) const; - NS_IMETHOD GetChildFrame(nsIFrame*& aChildFrame) const; - -protected: - void BuildPath(); - nsIFrame* GetContainingBlock(nsIFrame* aFloater); - -private: - ReflowType mType; - nsIFrame* mTargetFrame; - nsIFrame* mChildFrame; - nsVoidArray mPath; -}; - -#endif /* nsHTMLReflowCommand_h___ */ diff --git a/mozilla/layout/html/base/src/nsHTMLTagContent.cpp b/mozilla/layout/html/base/src/nsHTMLTagContent.cpp deleted file mode 100644 index 1d66caaed16..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLTagContent.cpp +++ /dev/null @@ -1,1028 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLTagContent.h" -#include "nsIDocument.h" -#include "nsIHTMLAttributes.h" -#include "nsIStyleRule.h" -#include "nsIStyleContext.h" -#include "nsIPresContext.h" -#include "nsHTMLAtoms.h" -#include "nsStyleConsts.h" -#include "nsString.h" -#include "prprf.h" -#include "nsDOMAttributes.h" -#include "nsILinkHandler.h" -#include "nsIPresContext.h" -#include "nsIURL.h" -#include "nsICSSParser.h" -#include "nsISupportsArray.h" -#include "nsISizeOfHandler.h" - -static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID); -static NS_DEFINE_IID(kIDOMElementIID, NS_IDOMELEMENT_IID); -static NS_DEFINE_IID(kIScriptObjectOwner, NS_ISCRIPTOBJECTOWNER_IID); - -nsHTMLTagContent::nsHTMLTagContent() -{ -} - -nsHTMLTagContent::nsHTMLTagContent(nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aTag, "null ptr"); - mTag = aTag; - NS_IF_ADDREF(mTag); -} - -nsHTMLTagContent::~nsHTMLTagContent() -{ - NS_IF_RELEASE(mTag); - NS_IF_RELEASE(mAttributes); -} - -nsresult nsHTMLTagContent::QueryInterface(REFNSIID aIID, void** aInstancePtr) -{ - nsresult res = nsHTMLContent::QueryInterface(aIID, aInstancePtr); - if (NS_NOINTERFACE == res) { - if (aIID.Equals(kIDOMElementIID)) { - *aInstancePtr = (void*)(nsIDOMElement*)this; - AddRef(); - return NS_OK; - } - } - - return res; -} - -nsrefcnt nsHTMLTagContent::AddRef(void) -{ - return nsHTMLContent::AddRef(); -} - -nsrefcnt nsHTMLTagContent::Release(void) -{ - return nsHTMLContent::Release(); -} - -nsIAtom* nsHTMLTagContent::GetTag() const -{ - NS_IF_ADDREF(mTag); - return mTag; -} - -NS_IMETHODIMP -nsHTMLTagContent::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - nsHTMLTagContent::SizeOfWithoutThis(aHandler); - return NS_OK; -} - -void -nsHTMLTagContent::SizeOfWithoutThis(nsISizeOfHandler* aHandler) const -{ - if (!aHandler->HaveSeen(mTag)) { - mTag->SizeOf(aHandler); - } - if (!aHandler->HaveSeen(mAttributes)) { - mAttributes->SizeOf(aHandler); - } -} - -void nsHTMLTagContent::ToHTMLString(nsString& aBuf) const -{ - aBuf.Truncate(0); - aBuf.Append('<'); - - nsIAtom* tag = GetTag(); - if (nsnull != tag) { - nsAutoString tmp; - tag->ToString(tmp); - aBuf.Append(tmp); - } else { - aBuf.Append("?NULL"); - } - - if (nsnull != mAttributes) { - nsISupportsArray* attrs; - nsresult rv = NS_NewISupportsArray(&attrs); - if (NS_OK == rv) { - mAttributes->GetAllAttributeNames(attrs); - PRInt32 i, n = attrs->Count(); - nsAutoString name, value, quotedValue; - for (i = 0; i < n; i++) { - nsIAtom* atom = (nsIAtom*) attrs->ElementAt(i); - atom->ToString(name); - aBuf.Append(' '); - aBuf.Append(name); - value.Truncate(); - GetAttribute(name, value); - if (value.Length() > 0) { - aBuf.Append('='); - QuoteForHTML(value, quotedValue); - aBuf.Append(quotedValue); - } - } - NS_RELEASE(attrs); - } - } - - aBuf.Append('>'); -} - -void nsHTMLTagContent::SetAttribute(const nsString& aName, - const nsString& aValue) -{ - nsAutoString upper; - aName.ToUpperCase(upper); - nsIAtom* attr = NS_NewAtom(upper); - SetAttribute(attr, aValue); - NS_RELEASE(attr); -} - -nsContentAttr nsHTMLTagContent::GetAttribute(const nsString& aName, - nsString& aResult) const -{ - nsAutoString upper; - aName.ToUpperCase(upper); - nsIAtom* attr = NS_NewAtom(upper); - - nsHTMLValue value; - nsContentAttr result = GetAttribute(attr, value); - - char cbuf[20]; - nscolor color; - if (eContentAttr_HasValue == result) { - // Try subclass conversion routine first - if (eContentAttr_HasValue == AttributeToString(attr, value, aResult)) { - return result; - } - - // Provide default conversions for most everything - switch (value.GetUnit()) { - case eHTMLUnit_Empty: - aResult.Truncate(); - break; - - case eHTMLUnit_String: - case eHTMLUnit_Null: - value.GetStringValue(aResult); - break; - - case eHTMLUnit_Integer: - aResult.Truncate(); - aResult.Append(value.GetIntValue(), 10); - break; - - case eHTMLUnit_Pixel: - aResult.Truncate(); - aResult.Append(value.GetPixelValue(), 10); - break; - - case eHTMLUnit_Percent: - aResult.Truncate(0); - aResult.Append(PRInt32(value.GetPercentValue() * 100.0f), 10); - aResult.Append('%'); - break; - - case eHTMLUnit_Color: - color = nscolor(value.GetColorValue()); - PR_snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x", - NS_GET_R(color), NS_GET_G(color), NS_GET_B(color)); - aResult.Truncate(0); - aResult.Append(cbuf); - break; - - default: - case eHTMLUnit_Enumerated: - NS_NOTREACHED("no default enumerated value to string conversion"); - result = eContentAttr_NotThere; - break; - } - } - - NS_RELEASE(attr); - return result; -} - -nsContentAttr -nsHTMLTagContent::AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const -{ - if (nsHTMLAtoms::style == aAttribute) { - if (eHTMLUnit_ISupports == aValue.GetUnit()) { - nsIStyleRule* rule = (nsIStyleRule*) aValue.GetISupportsValue(); - // rule->ToString(str); - aResult = "XXX style rule ToString goes here"; - return eContentAttr_HasValue; - } - } - aResult.Truncate(); - return eContentAttr_NotThere; -} - -// Note: Subclasses should override to parse the value string; in -// addition, when they see an unknown attribute they should call this -// so that global attributes are handled (like CLASS, ID, STYLE, etc.) -void -nsHTMLTagContent::SetAttribute(nsIAtom* aAttribute, - const nsString& aValue) -{ - if (nsnull == mAttributes) { - NS_NewHTMLAttributes(&mAttributes, this); - } - if (nsnull != mAttributes) { - if (nsHTMLAtoms::style == aAttribute) { - // XXX the style sheet language is a document property that - // should be used to lookup the style sheet parser to parse the - // attribute. - nsICSSParser* css; - nsresult rv = NS_NewCSSParser(&css); - if (NS_OK != rv) { - return; - } - nsIStyleRule* rule; - rv = css->ParseDeclarations(aValue, nsnull, rule); - if ((NS_OK == rv) && (nsnull != rule)) { - mAttributes->SetAttribute(aAttribute, nsHTMLValue(rule)); - NS_RELEASE(rule); - } - NS_RELEASE(css); - } - else { - mAttributes->SetAttribute(aAttribute, aValue); - } - } -} - -void nsHTMLTagContent::SetAttribute(nsIAtom* aAttribute, - const nsHTMLValue& aValue) -{ - if (nsnull == mAttributes) { - NS_NewHTMLAttributes(&mAttributes, this); - } - if (nsnull != mAttributes) { - mAttributes->SetAttribute(aAttribute, aValue); - } -} - -void nsHTMLTagContent::UnsetAttribute(nsIAtom* aAttribute) -{ - if (nsnull != mAttributes) { - PRInt32 count = mAttributes->UnsetAttribute(aAttribute); - if (0 == count) { - NS_RELEASE(mAttributes); - } - } -} - -nsContentAttr nsHTMLTagContent::GetAttribute(nsIAtom* aAttribute, - nsHTMLValue& aValue) const -{ - if (nsnull != mAttributes) { - return mAttributes->GetAttribute(aAttribute, aValue); - } - aValue.Reset(); - return eContentAttr_NotThere; -} - -PRInt32 nsHTMLTagContent::GetAllAttributeNames(nsISupportsArray* aArray) const -{ - if (nsnull != mAttributes) { - return mAttributes->GetAllAttributeNames(aArray); - } - return 0; -} - -PRInt32 nsHTMLTagContent::GetAttributeCount(void) const -{ - if (nsnull != mAttributes) { - return mAttributes->Count(); - } - return 0; -} - -void nsHTMLTagContent::SetID(nsIAtom* aID) -{ - if (nsnull != aID) { - if (nsnull == mAttributes) { - NS_NewHTMLAttributes(&mAttributes, this); - } - if (nsnull != mAttributes) { - mAttributes->SetID(aID); - } - } - else { - if (nsnull != mAttributes) { - PRInt32 count = mAttributes->SetID(nsnull); - if (0 == count) { - NS_RELEASE(mAttributes); - } - } - } -} - -nsIAtom* nsHTMLTagContent::GetID(void) const -{ - if (nsnull != mAttributes) { - return mAttributes->GetID(); - } - return nsnull; -} - -void nsHTMLTagContent::SetClass(nsIAtom* aClass) -{ - if (nsnull != aClass) { - if (nsnull == mAttributes) { - NS_NewHTMLAttributes(&mAttributes, this); - } - if (nsnull != mAttributes) { - mAttributes->SetClass(aClass); - } - } - else { - if (nsnull != mAttributes) { - PRInt32 count = mAttributes->SetClass(nsnull); - if (0 == count) { - NS_RELEASE(mAttributes); - } - } - } -} - -nsIAtom* nsHTMLTagContent::GetClass(void) const -{ - if (nsnull != mAttributes) { - return mAttributes->GetClass(); - } - return nsnull; -} - - -nsIStyleRule* nsHTMLTagContent::GetStyleRule(void) -{ - nsIStyleRule* result = nsnull; - - if (nsnull != mAttributes) { - mAttributes->QueryInterface(kIStyleRuleIID, (void**)&result); - } - return result; -} - -nsresult nsHTMLTagContent::GetScriptObject(nsIScriptContext *aContext, void** aScriptObject) -{ - nsresult res = NS_OK; - if (nsnull == mScriptObject) { - res = NS_NewScriptElement(aContext, this, mParent, (void**)&mScriptObject); - } - *aScriptObject = mScriptObject; - return res; -} - -nsresult nsHTMLTagContent::GetNodeType(PRInt32 *aType) -{ - *aType = nsHTMLContent::ELEMENT; - return NS_OK; -} - -nsresult nsHTMLTagContent::GetParentNode(nsIDOMNode **aNode) -{ - return nsHTMLContent::GetParentNode(aNode); -} - -nsresult nsHTMLTagContent::GetChildNodes(nsIDOMNodeIterator **aIterator) -{ - return nsHTMLContent::GetChildNodes(aIterator); -} - -nsresult nsHTMLTagContent::HasChildNodes(PRBool *aReturn) -{ - return nsHTMLContent::HasChildNodes(aReturn); -} - -nsresult nsHTMLTagContent::GetFirstChild(nsIDOMNode **aNode) -{ - return nsHTMLContent::GetFirstChild(aNode); -} - -nsresult nsHTMLTagContent::GetPreviousSibling(nsIDOMNode **aNode) -{ - return nsHTMLContent::GetPreviousSibling(aNode); -} - -nsresult nsHTMLTagContent::GetNextSibling(nsIDOMNode **aNode) -{ - return nsHTMLContent::GetNextSibling(aNode); -} - -nsresult nsHTMLTagContent::InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild) -{ - return nsHTMLContent::InsertBefore(newChild, refChild); -} - -nsresult nsHTMLTagContent::ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild) -{ - return nsHTMLContent::ReplaceChild(newChild, oldChild); -} - -nsresult nsHTMLTagContent::RemoveChild(nsIDOMNode *oldChild) -{ - return nsHTMLContent::RemoveChild(oldChild); -} - -nsresult nsHTMLTagContent::GetTagName(nsString &aName) -{ - if (nsnull != mTag) { - mTag->ToString(aName); - } - return NS_OK; -} - -nsresult nsHTMLTagContent::GetAttributes(nsIDOMAttributeList **aAttributeList) -{ - NS_PRECONDITION(nsnull != aAttributeList, "null pointer argument"); - if (nsnull != mAttributes) { - *aAttributeList = new nsDOMAttributeList(*this); - } - else { - *aAttributeList = nsnull; - } - return NS_OK; -} - -nsresult nsHTMLTagContent::GetDOMAttribute(nsString &aName, nsString &aValue) -{ - GetAttribute(aName, aValue); - return NS_OK; -} - -nsresult nsHTMLTagContent::SetDOMAttribute(nsString &aName, nsString &aValue) -{ - SetAttribute(aName, aValue); - return NS_OK; -} - -nsresult nsHTMLTagContent::RemoveAttribute(nsString &aName) -{ - nsAutoString upper; - aName.ToUpperCase(upper); - nsIAtom* attr = NS_NewAtom(upper); - UnsetAttribute(attr); - return NS_OK; -} - -nsresult nsHTMLTagContent::GetAttributeNode(nsString &aName, nsIDOMAttribute **aAttribute) -{ - nsAutoString value; - if(eContentAttr_NotThere != GetAttribute(aName, value)) { - *aAttribute = new nsDOMAttribute(aName, value); - } - - return NS_OK; -} - -nsresult nsHTMLTagContent::SetAttributeNode(nsIDOMAttribute *aAttribute) -{ - NS_PRECONDITION(nsnull != aAttribute, "null attribute"); - - nsresult res = NS_ERROR_FAILURE; - - if (nsnull != aAttribute) { - nsString name, value; - res = aAttribute->GetName(name); - if (NS_OK == res) { - res = aAttribute->GetValue(value); - if (NS_OK == res) { - SetAttribute(name, value); - } - } - } - - return res; -} - -nsresult nsHTMLTagContent::RemoveAttributeNode(nsIDOMAttribute *aAttribute) -{ - NS_PRECONDITION(nsnull != aAttribute, "null attribute"); - - nsresult res = NS_ERROR_FAILURE; - - if (nsnull != aAttribute) { - nsAutoString name; - res = aAttribute->GetName(name); - if (NS_OK == res) { - nsAutoString upper; - name.ToUpperCase(upper); - nsIAtom* attr = NS_NewAtom(upper); - UnsetAttribute(attr); - } - } - - return res; -} - -nsresult nsHTMLTagContent::Normalize() -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult nsHTMLTagContent::GetElementsByTagName(nsString &aName,nsIDOMNodeIterator **aIterator) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -void nsHTMLTagContent::TriggerLink(nsIPresContext& aPresContext, - const nsString& aBase, - const nsString& aURLSpec, - const nsString& aTargetSpec, - PRBool aClick) -{ - nsILinkHandler* handler; - if (NS_OK == aPresContext.GetLinkHandler(&handler) && (nsnull != handler)) { - // Resolve url to an absolute url - nsIURL* docURL = nsnull; - nsIDocument* doc; - if (NS_OK == GetDocument(doc)) { - docURL = doc->GetDocumentURL(); - NS_RELEASE(doc); - } - - nsAutoString absURLSpec; - nsresult rv = NS_MakeAbsoluteURL(docURL, aBase, aURLSpec, absURLSpec); - if (nsnull != docURL) { - NS_RELEASE(docURL); - } - - // Now pass on absolute url to the click handler - if (aClick) { - handler->OnLinkClick(nsnull, absURLSpec, aTargetSpec); - } - else { - handler->OnOverLink(nsnull, absURLSpec, aTargetSpec); - } - } -} - -nsresult nsHTMLTagContent::HandleDOMEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus) -{ - nsresult ret = NS_OK; - - ret = nsHTMLContent::HandleDOMEvent(aPresContext, aEvent, aDOMEvent, aEventStatus); - - if (NS_OK == ret && nsEventStatus_eIgnore == aEventStatus) { - switch (aEvent->message) { - case NS_MOUSE_LEFT_BUTTON_UP: - if (mTag == nsHTMLAtoms::a) { - nsAutoString base, href, target; - GetAttribute(nsString("href"), href); - GetAttribute(nsString("target"), target); - TriggerLink(aPresContext, base, href, target, PR_TRUE); - aEventStatus = nsEventStatus_eConsumeNoDefault; - } - break; - - case NS_MOUSE_RIGHT_BUTTON_DOWN: - // XXX Bring up a contextual menu provided by the application - break; - - case NS_MOUSE_MOVE: - if (mTag == nsHTMLAtoms::a) { - nsAutoString base, href, target; - GetAttribute(nsString("href"), href); - GetAttribute(nsString("target"), target); - TriggerLink(aPresContext, base, href, target, PR_FALSE); - aEventStatus = nsEventStatus_eConsumeNoDefault; - } - break; - - // XXX this doesn't seem to do anything yet - case NS_MOUSE_EXIT: - if (mTag == nsHTMLAtoms::a) { - nsAutoString empty; - TriggerLink(aPresContext, empty, empty, empty, PR_FALSE); - aEventStatus = nsEventStatus_eConsumeNoDefault; - } - break; - - default: - break; - } - } - return ret; -} - -//---------------------------------------------------------------------- - -// Attribute parsing utility methods - -PRBool nsHTMLTagContent::ParseEnumValue(const nsString& aValue, - EnumTable* aTable, - nsHTMLValue& aResult) -{ - while (nsnull != aTable->tag) { - if (aValue.EqualsIgnoreCase(aTable->tag)) { - aResult.SetIntValue(aTable->value, eHTMLUnit_Enumerated); - return PR_TRUE; - } - aTable++; - } - return PR_FALSE; -} - -PRBool nsHTMLTagContent::EnumValueToString(const nsHTMLValue& aValue, - EnumTable* aTable, - nsString& aResult) -{ - aResult.Truncate(0); - if (aValue.GetUnit() == eHTMLUnit_Enumerated) { - PRInt32 v = aValue.GetIntValue(); - while (nsnull != aTable->tag) { - if (aTable->value == v) { - aResult.Append(aTable->tag); - return PR_TRUE; - } - aTable++; - } - } - return PR_FALSE; -} - -// XXX check all mappings against ebina's usage -static nsHTMLTagContent::EnumTable kAlignTable[] = { - { "left", NS_STYLE_TEXT_ALIGN_LEFT }, - { "right", NS_STYLE_TEXT_ALIGN_RIGHT }, - { "texttop", NS_STYLE_VERTICAL_ALIGN_TEXT_TOP }, - { "baseline", NS_STYLE_VERTICAL_ALIGN_BASELINE }, - { "center", NS_STYLE_TEXT_ALIGN_CENTER }, - { "bottom", NS_STYLE_VERTICAL_ALIGN_BOTTOM }, - { "top", NS_STYLE_VERTICAL_ALIGN_TOP }, - { "middle", NS_STYLE_VERTICAL_ALIGN_MIDDLE }, - { "absbottom", NS_STYLE_VERTICAL_ALIGN_BOTTOM }, - { "abscenter", NS_STYLE_VERTICAL_ALIGN_MIDDLE }, - { "absmiddle", NS_STYLE_VERTICAL_ALIGN_MIDDLE }, - { 0 } -}; - -PRBool nsHTMLTagContent::ParseAlignParam(const nsString& aString, - nsHTMLValue& aResult) -{ - return ParseEnumValue(aString, kAlignTable, aResult); -} - -PRBool nsHTMLTagContent::AlignParamToString(const nsHTMLValue& aValue, - nsString& aResult) -{ - return EnumValueToString(aValue, kAlignTable, aResult); -} - -static nsHTMLTagContent::EnumTable kDivAlignTable[] = { - { "left", NS_STYLE_TEXT_ALIGN_LEFT }, - { "right", NS_STYLE_TEXT_ALIGN_RIGHT }, - { "center", NS_STYLE_TEXT_ALIGN_CENTER }, - { "justify", NS_STYLE_TEXT_ALIGN_JUSTIFY }, - { 0 } -}; - -PRBool nsHTMLTagContent::ParseDivAlignParam(const nsString& aString, - nsHTMLValue& aResult) -{ - return ParseEnumValue(aString, kDivAlignTable, aResult); -} - -PRBool nsHTMLTagContent::DivAlignParamToString(const nsHTMLValue& aValue, - nsString& aResult) -{ - return EnumValueToString(aValue, kDivAlignTable, aResult); -} - -/* ----- table specific attribute code ----- */ - -static nsHTMLTagContent::EnumTable kTableAlignTable[] = { - { "left", NS_STYLE_TEXT_ALIGN_LEFT }, - { "right", NS_STYLE_TEXT_ALIGN_RIGHT }, - { "center", NS_STYLE_TEXT_ALIGN_CENTER }, - { 0 } -}; - -PRBool nsHTMLTagContent::ParseTableAlignParam(const nsString& aString, - nsHTMLValue& aResult) -{ - return ParseEnumValue(aString, kTableAlignTable, aResult); -} - -PRBool nsHTMLTagContent::TableAlignParamToString(const nsHTMLValue& aValue, - nsString& aResult) -{ - return EnumValueToString(aValue, kTableAlignTable, aResult); -} - - -static nsHTMLTagContent::EnumTable kTableCaptionAlignTable[] = { - { "left", NS_STYLE_TEXT_ALIGN_LEFT }, - { "right", NS_STYLE_TEXT_ALIGN_RIGHT }, - { "top", NS_STYLE_VERTICAL_ALIGN_TOP}, - { "bottom",NS_STYLE_VERTICAL_ALIGN_BOTTOM}, - { 0 } -}; - -PRBool nsHTMLTagContent::ParseTableCaptionAlignParam(const nsString& aString, - nsHTMLValue& aResult) -{ - return ParseEnumValue(aString, kTableCaptionAlignTable, aResult); -} - -PRBool nsHTMLTagContent::TableCaptionAlignParamToString(const nsHTMLValue& aValue, - nsString& aResult) -{ - return EnumValueToString(aValue, kTableCaptionAlignTable, aResult); -} - -/* ----- end table specific attribute code ----- */ - - -void -nsHTMLTagContent::ParseValueOrPercent(const nsString& aString, - nsHTMLValue& aResult, - nsHTMLUnit aValueUnit) -{ // XXX should vave min/max values? - nsAutoString tmp(aString); - tmp.CompressWhitespace(PR_TRUE, PR_TRUE); - PRInt32 ec, val = tmp.ToInteger(&ec); - if (tmp.Last() == '%') {/* XXX not 100% compatible with ebina's code */ - if (val < 0) val = 0; - if (val > 100) val = 100; - aResult.SetPercentValue(float(val)/100.0f); - } else { - if (eHTMLUnit_Pixel == aValueUnit) { - aResult.SetPixelValue(val); - } - else { - aResult.SetIntValue(val, aValueUnit); - } - } -} - -/* used to parse attribute values that could be either: - * integer (n), - * percent (n%), - * or proportional (n*) - */ -void -nsHTMLTagContent::ParseValueOrPercentOrProportional(const nsString& aString, - nsHTMLValue& aResult, - nsHTMLUnit aValueUnit) -{ // XXX should have min/max values? - nsAutoString tmp(aString); - tmp.CompressWhitespace(PR_TRUE, PR_TRUE); - PRInt32 ec, val = tmp.ToInteger(&ec); - if (tmp.Last() == '%') {/* XXX not 100% compatible with ebina's code */ - if (val < 0) val = 0; - if (val > 100) val = 100; - aResult.SetPercentValue(float(val)/100.0f); - } else if (tmp.Last() == '*') { - if (val < 0) val = 0; - aResult.SetIntValue(val, eHTMLUnit_Proportional); // proportional values are integers - } else { - if (eHTMLUnit_Pixel == aValueUnit) { - aResult.SetPixelValue(val); - } - else { - aResult.SetIntValue(val, aValueUnit); - } - } -} - -PRBool -nsHTMLTagContent::ValueOrPercentToString(const nsHTMLValue& aValue, - nsString& aResult) -{ - aResult.Truncate(0); - switch (aValue.GetUnit()) { - case eHTMLUnit_Integer: - aResult.Append(aValue.GetIntValue(), 10); - return PR_TRUE; - case eHTMLUnit_Pixel: - aResult.Append(aValue.GetPixelValue(), 10); - return PR_TRUE; - case eHTMLUnit_Percent: - aResult.Append(PRInt32(aValue.GetPercentValue() * 100.0f), 10); - aResult.Append('%'); - return PR_TRUE; - } - return PR_FALSE; -} - -void -nsHTMLTagContent::ParseValue(const nsString& aString, PRInt32 aMin, - nsHTMLValue& aResult, nsHTMLUnit aValueUnit) -{ - PRInt32 ec, val = aString.ToInteger(&ec); - if (val < aMin) val = aMin; - if (eHTMLUnit_Pixel == aValueUnit) { - aResult.SetPixelValue(val); - } - else { - aResult.SetIntValue(val, aValueUnit); - } -} - -void nsHTMLTagContent::ParseValue(const nsString& aString, PRInt32 aMin, - PRInt32 aMax, - nsHTMLValue& aResult, nsHTMLUnit aValueUnit) -{ - PRInt32 ec, val = aString.ToInteger(&ec); - if (val < aMin) val = aMin; - if (val > aMax) val = aMax; - if (eHTMLUnit_Pixel == aValueUnit) { - aResult.SetPixelValue(val); - } - else { - aResult.SetIntValue(val, aValueUnit); - } -} - -PRBool nsHTMLTagContent::ParseImageProperty(nsIAtom* aAttribute, - const nsString& aString, - nsHTMLValue& aResult) -{ - if ((aAttribute == nsHTMLAtoms::width) || - (aAttribute == nsHTMLAtoms::height)) { - ParseValueOrPercent(aString, aResult, eHTMLUnit_Pixel); - return PR_TRUE; - } - else if ((aAttribute == nsHTMLAtoms::hspace) || - (aAttribute == nsHTMLAtoms::vspace) || - (aAttribute == nsHTMLAtoms::border)) { - ParseValue(aString, 0, aResult, eHTMLUnit_Pixel); - return PR_TRUE; - } - return PR_FALSE; -} - -PRBool nsHTMLTagContent::ImagePropertyToString(nsIAtom* aAttribute, - const nsHTMLValue& aValue, - nsString& aResult) -{ - if ((aAttribute == nsHTMLAtoms::width) || - (aAttribute == nsHTMLAtoms::height) || - (aAttribute == nsHTMLAtoms::border) || - (aAttribute == nsHTMLAtoms::hspace) || - (aAttribute == nsHTMLAtoms::vspace)) { - return ValueOrPercentToString(aValue, aResult); - } - return PR_FALSE; -} - -void -nsHTMLTagContent::MapImagePropertiesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext) -{ - if (nsnull != mAttributes) { - nsHTMLValue value; - - float p2t = aPresContext->GetPixelsToTwips(); - nsStylePosition* pos = (nsStylePosition*) - aContext->GetMutableStyleData(eStyleStruct_Position); - - // width: value - GetAttribute(nsHTMLAtoms::width, value); - if (value.GetUnit() == eHTMLUnit_Pixel) { - nscoord twips = nscoord(p2t * value.GetPixelValue()); - pos->mWidth.SetCoordValue(twips); - } - else if (value.GetUnit() == eHTMLUnit_Percent) { - pos->mWidth.SetPercentValue(value.GetPercentValue()); - } - - // height: value - GetAttribute(nsHTMLAtoms::height, value); - if (value.GetUnit() == eHTMLUnit_Pixel) { - nscoord twips = nscoord(p2t * value.GetPixelValue()); - pos->mHeight.SetCoordValue(twips); - } - else if (value.GetUnit() == eHTMLUnit_Percent) { - pos->mHeight.SetPercentValue(value.GetPercentValue()); - } - } -} - -void -nsHTMLTagContent::MapImageBorderInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext, - nscolor aBorderColors[4]) -{ - if (nsnull != mAttributes) { - nsHTMLValue value; - - // border: pixels - GetAttribute(nsHTMLAtoms::border, value); - if (value.GetUnit() != eHTMLUnit_Pixel) { - if (nsnull == aBorderColors) { - return; - } - // If no border is defined and we are forcing a border, force - // the size to 2 pixels. - value.SetPixelValue(2); - } - - float p2t = aPresContext->GetPixelsToTwips(); - nscoord twips = nscoord(p2t * value.GetPixelValue()); - - // Fixup border-padding sums: subtract out the old size and then - // add in the new size. - nsStyleSpacing* spacing = (nsStyleSpacing*) - aContext->GetMutableStyleData(eStyleStruct_Spacing); - nsStyleCoord coord; - coord.SetCoordValue(twips); - spacing->mBorder.SetTop(coord); - spacing->mBorder.SetRight(coord); - spacing->mBorder.SetBottom(coord); - spacing->mBorder.SetLeft(coord); - spacing->mBorderStyle[0] = NS_STYLE_BORDER_STYLE_SOLID; - spacing->mBorderStyle[1] = NS_STYLE_BORDER_STYLE_SOLID; - spacing->mBorderStyle[2] = NS_STYLE_BORDER_STYLE_SOLID; - spacing->mBorderStyle[3] = NS_STYLE_BORDER_STYLE_SOLID; - - // Use supplied colors if provided, otherwise use color for border - // color - if (nsnull != aBorderColors) { - spacing->mBorderColor[0] = aBorderColors[0]; - spacing->mBorderColor[1] = aBorderColors[1]; - spacing->mBorderColor[2] = aBorderColors[2]; - spacing->mBorderColor[3] = aBorderColors[3]; - } - else { - // Color is inherited from "color" - const nsStyleColor* styleColor = (const nsStyleColor*) - aContext->GetStyleData(eStyleStruct_Color); - nscolor color = styleColor->mColor; - spacing->mBorderColor[0] = color; - spacing->mBorderColor[1] = color; - spacing->mBorderColor[2] = color; - spacing->mBorderColor[3] = color; - } - } -} - -PRBool nsHTMLTagContent::ParseColor(const nsString& aString, - nsHTMLValue& aResult) -{ - char cbuf[40]; - aString.ToCString(cbuf, sizeof(cbuf)); - if (aString.Length() > 0) { - nscolor color; - if (NS_ColorNameToRGB(cbuf, &color)) { - aResult.SetStringValue(aString); - return PR_TRUE; - } - if (NS_HexToRGB(cbuf, &color)) { - aResult.SetColorValue(color); - return PR_TRUE; - } - } - - // Illegal values are mapped to empty - aResult.SetEmptyValue(); - return PR_FALSE; -} - -PRBool nsHTMLTagContent::ColorToString(const nsHTMLValue& aValue, - nsString& aResult) -{ - if (aValue.GetUnit() == eHTMLUnit_Color) { - nscolor v = aValue.GetColorValue(); - char buf[10]; - PR_snprintf(buf, sizeof(buf), "#%02x%02x%02x", - NS_GET_R(v), NS_GET_G(v), NS_GET_B(v)); - aResult.Truncate(0); - aResult.Append(buf); - return PR_TRUE; - } - if (aValue.GetUnit() == eHTMLUnit_String) { - aValue.GetStringValue(aResult); - return PR_TRUE; - } - if (aValue.GetUnit() == eHTMLUnit_Empty) { // was illegal - aResult.Truncate(); - return PR_TRUE; - } - return PR_FALSE; -} diff --git a/mozilla/layout/html/base/src/nsHTMLTagContent.h b/mozilla/layout/html/base/src/nsHTMLTagContent.h deleted file mode 100644 index 0c52507ee8c..00000000000 --- a/mozilla/layout/html/base/src/nsHTMLTagContent.h +++ /dev/null @@ -1,234 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsHTMLTagContent_h___ -#define nsHTMLTagContent_h___ - -#include "nsHTMLContent.h" -#include "nsHTMLValue.h" -#include "nsIDOMElement.h" - -class nsIHTMLAttributes; -class nsIPresContext; -class nsIStyleContext; - -/** - * Base class for tagged html content objects, holds attributes. - */ -class nsHTMLTagContent : public nsHTMLContent, public nsIDOMElement { -public: - - // nsIContent - virtual nsIAtom* GetTag() const; - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - - // nsIHTMLContent - /** - * Translate the content object into it's source html format - */ - virtual void ToHTMLString(nsString& out) const; - - /** - * Generic implementation of SetAttribute that translates aName into - * an uppercase'd atom and invokes SetAttribute(atom, aValue). - */ - virtual void SetAttribute(const nsString& aName, const nsString& aValue); - - /** - * Generic implementation of GetAttribute that knows how to map - * nsHTMLValue's to string's. Note that it cannot map enumerated - * values directly, but will use AttributeToString to supply a - * conversion. Subclasses must override AttributeToString to map - * enumerates to strings and return eContentAttr_HasValue when a - * conversion is succesful. Subclasses should also override this - * method if the default string conversions used don't apply - * correctly to the given attribute. - */ - virtual nsContentAttr GetAttribute(const nsString& aName, - nsString& aResult) const; - - virtual void SetAttribute(nsIAtom* aAttribute, const nsString& aValue); - - virtual void SetAttribute(nsIAtom* aAttribute, const nsHTMLValue& aValue); - virtual void UnsetAttribute(nsIAtom* aAttribute); - - /** - * Subclasses must override to fill the value object for values that - * are not stored in mAttributes. If the returned value is of an - * enumerated type then the subclass must also override the - * AttributeToString method (see the comment on the other GetAttribute - * method) - */ - virtual nsContentAttr GetAttribute(nsIAtom* aAttribute, - nsHTMLValue& aValue) const; - - virtual PRInt32 GetAllAttributeNames(nsISupportsArray* aArray) const; - virtual PRInt32 GetAttributeCount(void) const; - - virtual void SetID(nsIAtom* aID); - virtual nsIAtom* GetID(void) const; - virtual void SetClass(nsIAtom* aClass); // XXX this will have to change for CSS2 - virtual nsIAtom* GetClass(void) const; // XXX this will have to change for CSS2 - - virtual nsIStyleRule* GetStyleRule(void); - - // nsIScriptObjectOwner interface - NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject); - - // nsIDOMElement interface - NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr); - NS_IMETHOD_(nsrefcnt) AddRef(void); - NS_IMETHOD_(nsrefcnt) Release(void); - NS_IMETHOD GetNodeType(PRInt32 *aType); - NS_IMETHOD GetParentNode(nsIDOMNode **aNode); - NS_IMETHOD GetChildNodes(nsIDOMNodeIterator **aIterator); - NS_IMETHOD HasChildNodes(PRBool *aReturn); - NS_IMETHOD GetFirstChild(nsIDOMNode **aNode); - NS_IMETHOD GetPreviousSibling(nsIDOMNode **aNode); - NS_IMETHOD GetNextSibling(nsIDOMNode **aNode); - NS_IMETHOD InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild); - NS_IMETHOD ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild); - NS_IMETHOD RemoveChild(nsIDOMNode *oldChild); - NS_IMETHOD GetTagName(nsString &aName); - NS_IMETHOD GetAttributes(nsIDOMAttributeList **aAttributeList); - NS_IMETHOD GetDOMAttribute(nsString &aName, nsString &aValue); - NS_IMETHOD SetDOMAttribute(nsString &aName, nsString &aValue); - NS_IMETHOD RemoveAttribute(nsString &aName); - NS_IMETHOD GetAttributeNode(nsString &aName, nsIDOMAttribute **aAttribute); - NS_IMETHOD SetAttributeNode(nsIDOMAttribute *aAttribute); - NS_IMETHOD RemoveAttributeNode(nsIDOMAttribute *aAttribute); - NS_IMETHOD GetElementsByTagName(nsString &aName,nsIDOMNodeIterator **aIterator); - NS_IMETHOD Normalize(); - - NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus); - - // Utility routines for making attribute parsing easier - - struct EnumTable { - const char* tag; - PRInt32 value; - }; - - static PRBool ParseEnumValue(const nsString& aValue, - EnumTable* aTable, - nsHTMLValue& aResult); - - static PRBool EnumValueToString(const nsHTMLValue& aValue, - EnumTable* aTable, - nsString& aResult); - - static void ParseValueOrPercent(const nsString& aString, - nsHTMLValue& aResult, nsHTMLUnit aValueUnit); - - /** used to parser attribute values that could be either: - * integer (n), - * percent (n%), - * or proportional (n*) - */ - static void ParseValueOrPercentOrProportional(const nsString& aString, - nsHTMLValue& aResult, - nsHTMLUnit aValueUnit); - - static PRBool ValueOrPercentToString(const nsHTMLValue& aValue, - nsString& aResult); - - static void ParseValue(const nsString& aString, PRInt32 aMin, - nsHTMLValue& aResult, nsHTMLUnit aValueUnit); - - static void ParseValue(const nsString& aString, PRInt32 aMin, PRInt32 aMax, - nsHTMLValue& aResult, nsHTMLUnit aValueUnit); - - static PRBool ParseColor(const nsString& aString, nsHTMLValue& aResult); - - static PRBool ColorToString(const nsHTMLValue& aValue, - nsString& aResult); - - /** - * Parse width, height, border, hspace, vspace. Returns PR_TRUE if - * the aAttribute is one of the listed attributes. - */ - static PRBool ParseImageProperty(nsIAtom* aAttribute, - const nsString& aString, - nsHTMLValue& aResult); - - static PRBool ImagePropertyToString(nsIAtom* aAttribute, - const nsHTMLValue& aValue, - nsString& aResult); - - void MapImagePropertiesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext); - - void MapImageBorderInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext, - nscolor aBorderColors[4]); - - static PRBool ParseAlignParam(const nsString& aString, nsHTMLValue& aResult); - - static PRBool AlignParamToString(const nsHTMLValue& aValue, - nsString& aResult); - - static PRBool ParseDivAlignParam(const nsString& aString, nsHTMLValue& aRes); - - static PRBool DivAlignParamToString(const nsHTMLValue& aValue, - nsString& aResult); - - /** HTML4 table align attributes - */ - static PRBool ParseTableAlignParam(const nsString& aString, nsHTMLValue& aRes); - - /** HTML4 table align attributes - */ - static PRBool TableAlignParamToString(const nsHTMLValue& aValue, - nsString& aResult); - - /** HTML4 table caption align attributes - */ - static PRBool ParseTableCaptionAlignParam(const nsString& aString, nsHTMLValue& aRes); - - /** HTML4 table caption align attributes - */ - static PRBool TableCaptionAlignParamToString(const nsHTMLValue& aValue, - nsString& aResult); - -protected: - nsHTMLTagContent(); - nsHTMLTagContent(nsIAtom* aTag); - virtual ~nsHTMLTagContent(); - void SizeOfWithoutThis(nsISizeOfHandler* aHandler) const; - - /** - * Helper method used by GetAttribute to map an attribute - * to a string value. - */ - virtual nsContentAttr AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const; - - void TriggerLink(nsIPresContext& aPresContext, - const nsString& aBase, - const nsString& aURLSpec, - const nsString& aTargetSpec, - PRBool aClick); - - nsIAtom* mTag; - nsIHTMLAttributes* mAttributes; -}; - -#endif /* nsHTMLTagContent_h___ */ diff --git a/mozilla/layout/html/base/src/nsIAbsoluteItems.h b/mozilla/layout/html/base/src/nsIAbsoluteItems.h deleted file mode 100644 index 7db30558e4d..00000000000 --- a/mozilla/layout/html/base/src/nsIAbsoluteItems.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is Netscape Communications - * Corporation. Portions created by Netscape are Copyright (C) 1998 - * Netscape Communications Corporation. All Rights Reserved. - */ -#ifndef nsIAbsoluteItems_h___ -#define nsIAbsoluteItems_h___ - -class nsAbsoluteFrame; - -// IID for the nsIAbsoluteItems interface {28E68A10-0BD4-11d2-85DD-00A02468FAB6} -#define NS_IABSOLUTE_ITEMS_IID \ -{ 0x28e68a10, 0xbd4, 0x11d2, \ - {0x85, 0xdd, 0x0, 0xa0, 0x24, 0x68, 0xfa, 0xb6}} - -/** - * An interface for managing absolutely positioned items. Note that this interface - * is not an nsISupports interface, and therefore you cannot QueryInterface() back - */ -class nsIAbsoluteItems -{ -public: - /** - * Request to add an absolutely positioned item. The anchor for the - * absolutely positioned item is passed as an argument - * - * @see nsAbsoluteFrame::GetAbsoluteFrame() - */ - NS_IMETHOD AddAbsoluteItem(nsAbsoluteFrame* aAnchorFrame) = 0; - - /** - * Called to remove an absolutely positioned item, most likely because the - * associated piece of content has been removed. - **/ - NS_IMETHOD RemoveAbsoluteItem(nsAbsoluteFrame* aAnchorFrame) = 0; -}; - -#endif /* nsIAbsoluteItems_h___ */ diff --git a/mozilla/layout/html/base/src/nsIAnchoredItems.h b/mozilla/layout/html/base/src/nsIAnchoredItems.h deleted file mode 100644 index 8c1651b764f..00000000000 --- a/mozilla/layout/html/base/src/nsIAnchoredItems.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIAnchoredItems_h___ -#define nsIAnchoredItems_h___ - -#include "nsIFrame.h" - -// 7327a0a0-bc8d-11d1-8539-00a02468fab6 -#define NS_IANCHORED_ITEMS_IID \ - { 0x7327a0a0, 0xbc8d, 0x11d1, {0x85, 0x39, 0x0, 0xa0, 0x24, 0x68, 0xfa, 0xb6}} - -/** - * An interface for managing anchored items. Note that this interface is not - * an nsISupports interface, and therefore you cannot QueryInterface() back - */ -class nsIAnchoredItems -{ -public: - enum AnchoringPosition {anHTMLFloater}; - - /** - * Request to add an anchored item to this geometric parent. This - * is for handling anchored items that are not displayed inline (at - * the current point). - */ - virtual void AddAnchoredItem(nsIFrame* aAnchoredItem, - AnchoringPosition aPosition, - nsIFrame* aContainer) = 0; - - /** - * Called to remove an anchored item, most likely because the associated - * piece of content has been removed. - */ - virtual void RemoveAnchoredItem(nsIFrame* aAnchoredItem) = 0; -}; - -#endif /* nsIAnchoredItems_h___ */ diff --git a/mozilla/layout/html/base/src/nsIFloaterContainer.h b/mozilla/layout/html/base/src/nsIFloaterContainer.h deleted file mode 100644 index 46d5d2aade8..00000000000 --- a/mozilla/layout/html/base/src/nsIFloaterContainer.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIFloaterContainer_h___ -#define nsIFloaterContainer_h___ - -#include "nsIFrame.h" -class nsPlaceholderFrame; -class nsIPresContext; - -// 5a305ee0-cb55-11d1-8556-00a02468fab6 -#define NS_IFLOATER_CONTAINER_IID \ - { 0x5a305ee0, 0xcb55, 0x11d1, {0x85, 0x56, 0x0, 0xa0, 0x24, 0x68, 0xfa, 0xb6}} - -/** - * An interface for communicating with the enclosing block-level container - * about floating elements. Note that this interface is not an nsISupports - * interface, and therefore you cannot QueryInterface() back - */ -class nsIFloaterContainer -{ -public: - /** - * Notification of a newly created floating element. - * - * @param aFloater the floating element - * @param aPlaceholder the placeholder frame associated with the floating - * element. - */ - virtual PRBool AddFloater(nsIPresContext* aPresContext, - const nsReflowState& aPlaceholderReflowState, - nsIFrame* aFloater, - nsPlaceholderFrame* aPlaceholder) = 0; -}; - -#endif /* nsIFloaterContainer_h___ */ diff --git a/mozilla/layout/html/base/src/nsIHTMLContent.h b/mozilla/layout/html/base/src/nsIHTMLContent.h deleted file mode 100644 index 51af9faef63..00000000000 --- a/mozilla/layout/html/base/src/nsIHTMLContent.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIHTMLContent_h___ -#define nsIHTMLContent_h___ - -#include "nsIContent.h" -#include "nsHTMLValue.h" -class nsString; -class nsIFrame; -class nsISupportsArray; -class nsIStyleRule; -class nsIStyleContext; -class nsIPresContext; - -// IID for the nsIHTMLContent class -#define NS_IHTMLCONTENT_IID \ -{ 0xb9e110b0, 0x94d6, 0x11d1, \ - {0x89, 0x5c, 0x00, 0x60, 0x08, 0x91, 0x1b, 0x81} } - -// Abstract interface for all html content -class nsIHTMLContent : public nsIContent { -public: - /** - * If this html content is a container, then compact asks it to minimize - * it's storage usage. - */ - virtual void Compact() = 0; - - virtual void SetAttribute(const nsString& aName, const nsString& aValue) = 0; - virtual void SetAttribute(nsIAtom* aAttribute, const nsString& aValue) = 0; - virtual void SetAttribute(nsIAtom* aAttribute, - const nsHTMLValue& aValue=nsHTMLValue::kNull) = 0; - - virtual void UnsetAttribute(nsIAtom* aAttribute) = 0; - - virtual nsContentAttr GetAttribute(const nsString& aName, - nsString& aResult) const = 0; - virtual nsContentAttr GetAttribute(nsIAtom* aAttribute, - nsHTMLValue& aValue) const = 0; - virtual PRInt32 GetAllAttributeNames(nsISupportsArray* aArray) const = 0; - virtual PRInt32 GetAttributeCount(void) const = 0; - - virtual void SetID(nsIAtom* aID) = 0; - virtual nsIAtom* GetID(void) const = 0; - virtual void SetClass(nsIAtom* aClass) = 0; // XXX this will have to change for CSS2 - virtual nsIAtom* GetClass(void) const = 0; // XXX this will have to change for CSS2 - - virtual nsIStyleRule* GetStyleRule(void) = 0; - - virtual void MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext) = 0; - - /** - * Translate this piece of content to html. Note that this only - * translates this content object, not any children it might - * have. The caller is responsible for recursing down the - * hierarchy. - */ - // XXX add in output character set information so that we know how - // to encode non 7 bit characters - virtual void ToHTMLString(nsString& aResult) const = 0; - - virtual void ToHTML(FILE* out) const = 0; - - /** - * Used by the html content's delegate to create a frame - * for the content. - */ - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) = 0; -}; - -#endif /* nsIHTMLContent_h___ */ diff --git a/mozilla/layout/html/base/src/nsIImageMap.h b/mozilla/layout/html/base/src/nsIImageMap.h deleted file mode 100644 index 5864a487265..00000000000 --- a/mozilla/layout/html/base/src/nsIImageMap.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIImageMap_h___ -#define nsIImageMap_h___ - -#include "nslayout.h" -#include "nsISupports.h" -#include "nsCoord.h" -class nsIAtom; -class nsIPresContext; -class nsIRenderingContext; -class nsISizeOfHandler; -class nsIURL; -class nsString; - -/* db6ca200-d0a6-11d1-89b1-006008911b81 */ -#define NS_IIMAGEMAP_IID \ -{0xdb6ca200, 0xd0a6, 0x11d1, {0x89, 0xb1, 0x00, 0x60, 0x08, 0x91, 0x1b, 0x81}} - -class nsIImageMap : public nsISupports { -public: - NS_IMETHOD SetName(const nsString& aMapName) = 0; - - NS_IMETHOD GetName(nsString& aResult) = 0; - - NS_IMETHOD AddArea(const nsString& aBaseURL, - const nsString& aShape, - const nsString& aCoords, - const nsString& aHREF, - const nsString& aTarget, - const nsString& aAltText, - PRBool aSuppress) = 0; - - /** - * See if the given aX,aY pixel coordinates are in the image - * map. If they are then NS_OK is returned and aAbsURL, aTarget, - * aAltText, aSuppress are filled in with the values from the - * underlying area tag. If the coordinates are not in the map - * then NS_NOT_INSIDE is returned. - */ - NS_IMETHOD IsInside(nscoord aX, nscoord aY, - nsIURL* aDocURL, - nsString& aAbsURL, - nsString& aTarget, - nsString& aAltText, - PRBool* aSuppress) = 0; - - /** - * See if the given aX,aY pixel coordinates are in the image - * map. If they are then NS_OK is returned otherwise NS_NOT_INSIDE - * is returned. - */ - NS_IMETHOD IsInside(nscoord aX, nscoord aY) = 0; - - NS_IMETHOD Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) = 0; - - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const = 0; -}; - -// XXX get an error space to alloc from -#define NS_NOT_INSIDE 1 - -extern NS_HTML nsresult NS_NewImageMap(nsIImageMap** aInstancePtrResult, - nsIAtom* aAtom); - -#endif /* nsIImageMap_h___ */ diff --git a/mozilla/layout/html/base/src/nsImageMap.cpp b/mozilla/layout/html/base/src/nsImageMap.cpp deleted file mode 100644 index db80818da81..00000000000 --- a/mozilla/layout/html/base/src/nsImageMap.cpp +++ /dev/null @@ -1,750 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIImageMap.h" -#include "nsString.h" -#include "nsVoidArray.h" -#include "nsCoord.h" -#include "nsIRenderingContext.h" -#include "nsIPresContext.h" -#include "nsIURL.h" -#include "nsISizeOfHandler.h" - -#undef SCALE -#define SCALE(a,b) nscoord((a) * (b)) - -class Area { -public: - Area(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress); - virtual ~Area(); - - void ParseCoords(const nsString& aSpec); - - virtual PRBool IsInside(nscoord x, nscoord y) = 0; - virtual void Draw(nsIPresContext& aCX, - nsIRenderingContext& aRC) = 0; - virtual void GetShapeName(nsString& aResult) = 0; - - void ToHTML(nsString& aResult); - - const nsString& GetBase() const { return mBase; } - const nsString& GetHREF() const { return mHREF; } - const nsString& GetTarget() const { return mTarget; } - const nsString& GetAltText() const { return mAltText; } - PRBool GetSuppress() const { return mSuppressFeedback; } - - virtual void SizeOf(nsISizeOfHandler* aHandler) const; - - nsString mBase; - nsString mHREF; - nsString mTarget; - nsString mAltText; - nscoord* mCoords; - PRInt32 mNumCoords; - PRBool mSuppressFeedback; -}; - -Area::Area(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress) - : mBase(aBaseURL), mHREF(aHREF), mTarget(aTarget), mAltText(aAltText), - mSuppressFeedback(aSuppress) -{ - mCoords = nsnull; - mNumCoords = 0; -} - -Area::~Area() -{ - delete [] mCoords; -} - -void -Area::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - aHandler->Add((size_t) (- ((PRInt32)sizeof(nsString) * 4) ) ); - mBase.SizeOf(aHandler); - mHREF.SizeOf(aHandler); - mTarget.SizeOf(aHandler); - mAltText.SizeOf(aHandler); - aHandler->Add(mNumCoords * sizeof(nscoord)); -} - -// XXX move into nsCRT -#define XP_IS_SPACE(_ch) \ - (((_ch) == ' ') || ((_ch) == '\t') || ((_ch) == '\r') || ((_ch) == '\n')) - -#include -#define XP_ATOI(_s) ::atoi(_s) - -// XXX straight copy from laymap.c -static nscoord* lo_parse_coord_list(char *str, PRInt32* value_cnt) -{ - char *tptr; - char *n_str; - PRInt32 i, cnt; - PRInt32 *value_list; - - /* - * Nothing in an empty list - */ - *value_cnt = 0; - if ((str == NULL)||(*str == '\0')) - { - return((PRInt32 *)NULL); - } - - /* - * Skip beginning whitespace, all whitespace is empty list. - */ - n_str = str; - while (XP_IS_SPACE(*n_str)) - { - n_str++; - } - if (*n_str == '\0') - { - return((PRInt32 *)NULL); - } - - /* - * Make a pass where any two numbers separated by just whitespace - * are given a comma separator. Count entries while passing. - */ - cnt = 0; - while (*n_str != '\0') - { - PRBool has_comma; - - /* - * Skip to a separator - */ - tptr = n_str; - while ((!XP_IS_SPACE(*tptr))&&(*tptr != ',')&&(*tptr != '\0')) - { - tptr++; - } - n_str = tptr; - - /* - * If no more entries, break out here - */ - if (*n_str == '\0') - { - break; - } - - /* - * Skip to the end of the separator, noting if we have a - * comma. - */ - has_comma = PR_FALSE; - while ((XP_IS_SPACE(*tptr))||(*tptr == ',')) - { - if (*tptr == ',') - { - if (has_comma == PR_FALSE) - { - has_comma = PR_TRUE; - } - else - { - break; - } - } - tptr++; - } - /* - * If this was trailing whitespace we skipped, we are done. - */ - if ((*tptr == '\0')&&(has_comma == PR_FALSE)) - { - break; - } - /* - * Else if the separator is all whitespace, and this is not the - * end of the string, add a comma to the separator. - */ - else if (has_comma == PR_FALSE) - { - *n_str = ','; - } - - /* - * count the entry skipped. - */ - cnt++; - - n_str = tptr; - } - /* - * count the last entry in the list. - */ - cnt++; - - *value_cnt = cnt; - - /* - * Allocate space for the coordinate array. - */ - value_list = new nscoord[cnt]; - if (value_list == NULL) - { - return((PRInt32 *)NULL); - } - - /* - * Second pass to copy integer values into list. - */ - tptr = str; - for (i=0; i'); -} - -//---------------------------------------------------------------------- - -class DefaultArea : public Area { -public: - DefaultArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress); - ~DefaultArea(); - - virtual PRBool IsInside(nscoord x, nscoord y); - virtual void Draw(nsIPresContext& aCX, - nsIRenderingContext& aRC); - virtual void GetShapeName(nsString& aResult); -}; - -DefaultArea::DefaultArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress) - : Area(aBaseURL, aHREF, aTarget, aAltText, aSuppress) -{ -} - -DefaultArea::~DefaultArea() -{ -} - -PRBool DefaultArea::IsInside(nscoord x, nscoord y) -{ - return PR_TRUE; -} - -void DefaultArea::Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) -{ -} - -void DefaultArea::GetShapeName(nsString& aResult) -{ - aResult.Append("default"); -} - -//---------------------------------------------------------------------- - -class RectArea : public Area { -public: - RectArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress); - ~RectArea(); - - virtual PRBool IsInside(nscoord x, nscoord y); - virtual void Draw(nsIPresContext& aCX, - nsIRenderingContext& aRC); - virtual void GetShapeName(nsString& aResult); -}; - -RectArea::RectArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress) - : Area(aBaseURL, aHREF, aTarget, aAltText, aSuppress) -{ -} - -RectArea::~RectArea() -{ -} - -PRBool RectArea::IsInside(nscoord x, nscoord y) -{ - if (mNumCoords >= 4) { // Note: > is for nav compatabilty - nscoord x1 = mCoords[0]; - nscoord y1 = mCoords[1]; - nscoord x2 = mCoords[2]; - nscoord y2 = mCoords[3]; - if ((x1 > x2)|| (y1 > y2)) { - // Can't be inside a screwed up rect - return PR_FALSE; - } - if ((x >= x1) && (x <= x2) && (y >= y1) && (y <= y2)) { - return PR_TRUE; - } - } - return PR_FALSE; -} - -void RectArea::Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) -{ - if (mNumCoords >= 4) { - float p2t = aCX.GetPixelsToTwips(); - nscoord x1 = SCALE(p2t, mCoords[0]); - nscoord y1 = SCALE(p2t, mCoords[1]); - nscoord x2 = SCALE(p2t, mCoords[2]); - nscoord y2 = SCALE(p2t, mCoords[3]); - if ((x1 > x2)|| (y1 > y2)) { - return; - } - aRC.DrawRect(x1, y1, x2 - x1, y2 - y1); - } -} - -void RectArea::GetShapeName(nsString& aResult) -{ - aResult.Append("rect"); -} - -//---------------------------------------------------------------------- - -class PolyArea : public Area { -public: - PolyArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress); - ~PolyArea(); - - virtual PRBool IsInside(nscoord x, nscoord y); - virtual void Draw(nsIPresContext& aCX, - nsIRenderingContext& aRC); - virtual void GetShapeName(nsString& aResult); -}; - -PolyArea::PolyArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress) - : Area(aBaseURL, aHREF, aTarget, aAltText, aSuppress) -{ -} - -PolyArea::~PolyArea() -{ -} - -PRBool PolyArea::IsInside(nscoord x, nscoord y) -{ - if (mNumCoords >= 6) { - PRInt32 intersects = 0; - nscoord wherex = x; - nscoord wherey = y; - PRInt32 totalv = mNumCoords / 2; - PRInt32 totalc = totalv * 2; - nscoord xval = mCoords[totalc - 2]; - nscoord yval = mCoords[totalc - 1]; - PRInt32 end = totalc; - PRInt32 pointer = 1; - - if ((yval >= wherey) != (mCoords[pointer] >= wherey)) - if ((xval >= wherex) == (mCoords[0] >= wherex)) - intersects += (xval >= wherex) ? 1 : 0; - else - intersects += ((xval - (yval - wherey) * - (mCoords[0] - xval) / - (mCoords[pointer] - yval)) >= wherex) ? 1 : 0; - - // XXX I wonder what this is doing; this is a translation of ptinpoly.c - while (pointer < end) { - yval = mCoords[pointer]; - pointer += 2; - if (yval >= wherey) { - while((pointer < end) && (mCoords[pointer] >= wherey)) - pointer+=2; - if (pointer >= end) - break; - if ((mCoords[pointer-3] >= wherex) == - (mCoords[pointer-1] >= wherex)) { - intersects += (mCoords[pointer-3] >= wherex) ? 1 : 0; - } else { - intersects += - ((mCoords[pointer-3] - (mCoords[pointer-2] - wherey) * - (mCoords[pointer-1] - mCoords[pointer-3]) / - (mCoords[pointer] - mCoords[pointer - 2])) >= wherex) ? 1:0; - } - } else { - while((pointer < end) && (mCoords[pointer] < wherey)) - pointer+=2; - if (pointer >= end) - break; - if ((mCoords[pointer-3] >= wherex) == - (mCoords[pointer-1] >= wherex)) { - intersects += (mCoords[pointer-3] >= wherex) ? 1:0; - } else { - intersects += - ((mCoords[pointer-3] - (mCoords[pointer-2] - wherey) * - (mCoords[pointer-1] - mCoords[pointer-3]) / - (mCoords[pointer] - mCoords[pointer - 2])) >= wherex) ? 1:0; - } - } - } - if ((intersects & 1) != 0) { - return PR_TRUE; - } - } - return PR_FALSE; -} - -void PolyArea::Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) -{ - if (mNumCoords >= 6) { - float p2t = aCX.GetPixelsToTwips(); - nscoord x0 = SCALE(p2t, mCoords[0]); - nscoord y0 = SCALE(p2t, mCoords[1]); - for (PRInt32 i = 2; i < mNumCoords; i += 2) { - nscoord x1 = SCALE(p2t, mCoords[i]); - nscoord y1 = SCALE(p2t, mCoords[i+1]); - aRC.DrawLine(x0, y0, x1, y1); - x0 = x1; - y0 = y1; - } - aRC.DrawLine(x0, y0, mCoords[0], mCoords[1]); - } -} - -void PolyArea::GetShapeName(nsString& aResult) -{ - aResult.Append("polygon"); -} - -//---------------------------------------------------------------------- - -class CircleArea : public Area { -public: - CircleArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress); - ~CircleArea(); - - virtual PRBool IsInside(nscoord x, nscoord y); - virtual void Draw(nsIPresContext& aCX, - nsIRenderingContext& aRC); - virtual void GetShapeName(nsString& aResult); -}; - -CircleArea::CircleArea(const nsString& aBaseURL, const nsString& aHREF, - const nsString& aTarget, const nsString& aAltText, - PRBool aSuppress) - : Area(aBaseURL, aHREF, aTarget, aAltText, aSuppress) -{ -} - -CircleArea::~CircleArea() -{ -} - -PRBool CircleArea::IsInside(nscoord x, nscoord y) -{ - // Note: > is for nav compatabilty - if (mNumCoords >= 3) { - nscoord x1 = mCoords[0]; - nscoord y1 = mCoords[1]; - nscoord radius = mCoords[2]; - if (radius < 0) { - return PR_FALSE; - } - nscoord dx = x1 - x; - nscoord dy = y1 - y; - nscoord dist = (dx * dx) + (dy * dy); - if (dist <= (radius * radius)) { - return PR_TRUE; - } - } - return PR_FALSE; -} - -void CircleArea::Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) -{ - if (mNumCoords >= 3) { - float p2t = aCX.GetPixelsToTwips(); - nscoord x1 = SCALE(p2t, mCoords[0]); - nscoord y1 = SCALE(p2t, mCoords[1]); - nscoord radius = SCALE(p2t, mCoords[2]); - if (radius < 0) { - return; - } - nscoord x = x1 - radius / 2; - nscoord y = y1 - radius / 2; - nscoord w = 2 * radius; - aRC.DrawEllipse(x, y, w, w); - } -} - -void CircleArea::GetShapeName(nsString& aResult) -{ - aResult.Append("circle"); -} - -//---------------------------------------------------------------------- - -static NS_DEFINE_IID(kIImageMapIID, NS_IIMAGEMAP_IID); - -class ImageMapImpl : public nsIImageMap { -public: - ImageMapImpl(nsIAtom* aTag); - ~ImageMapImpl(); - - NS_DECL_ISUPPORTS - - NS_IMETHOD SetName(const nsString& aMapName); - - NS_IMETHOD GetName(nsString& aResult); - - NS_IMETHOD AddArea(const nsString& aBaseURL, - const nsString& aShape, - const nsString& aCoords, - const nsString& aHREF, - const nsString& aTarget, - const nsString& aAltText, - PRBool aSuppress); - - NS_IMETHOD IsInside(nscoord aX, nscoord aY, - nsIURL* aDocURL, - nsString& aAbsURL, - nsString& aTarget, - nsString& aAltText, - PRBool* aSuppress); - - NS_IMETHOD IsInside(nscoord aX, nscoord aY); - - NS_IMETHOD Draw(nsIPresContext& aCX, nsIRenderingContext& aRC); - - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - - nsString mName; - nsIAtom* mTag; - nsVoidArray mAreas; -}; - -ImageMapImpl::ImageMapImpl(nsIAtom* aTag) -{ - mTag = aTag; - NS_IF_ADDREF(aTag); -} - -ImageMapImpl::~ImageMapImpl() -{ - NS_IF_RELEASE(mTag); - PRInt32 i, n = mAreas.Count(); - for (i = 0; i < n; i++) { - Area* area = (Area*) mAreas.ElementAt(i); - delete area; - } -} - -NS_IMPL_ISUPPORTS(ImageMapImpl, kIImageMapIID); - -NS_IMETHODIMP ImageMapImpl::SetName(const nsString& aMapName) -{ - mName = aMapName; - return NS_OK; -} - -NS_IMETHODIMP ImageMapImpl::GetName(nsString& aResult) -{ - aResult = mName; - return NS_OK; -} - -NS_IMETHODIMP ImageMapImpl::AddArea(const nsString& aBaseURL, - const nsString& aShape, - const nsString& aCoords, - const nsString& aHREF, - const nsString& aTarget, - const nsString& aAltText, - PRBool aSuppress) -{ - Area* area; - if ((0 == aShape.Length()) || aShape.EqualsIgnoreCase("rect")) { - area = new RectArea(aBaseURL, aHREF, aTarget, aAltText, aSuppress); - } else if (aShape.EqualsIgnoreCase("poly") || - aShape.EqualsIgnoreCase("polygon")) { - area = new PolyArea(aBaseURL, aHREF, aTarget, aAltText, aSuppress); - } else if (aShape.EqualsIgnoreCase("circle")) { - area = new CircleArea(aBaseURL, aHREF, aTarget, aAltText, aSuppress); - } - else { - area = new DefaultArea(aBaseURL, aHREF, aTarget, aAltText, aSuppress); - } - area->ParseCoords(aCoords); - mAreas.AppendElement(area); - return NS_OK; -} - -NS_IMETHODIMP ImageMapImpl::IsInside(nscoord aX, nscoord aY, - nsIURL* aDocURL, - nsString& aAbsURL, - nsString& aTarget, - nsString& aAltText, - PRBool* aSuppress) -{ - PRInt32 i, n = mAreas.Count(); - for (i = 0; i < n; i++) { - Area* area = (Area*) mAreas.ElementAt(i); - if (area->IsInside(aX, aY)) { - NS_MakeAbsoluteURL(aDocURL, area->mBase, area->mHREF, aAbsURL); - aTarget = area->mTarget; - aAltText = area->mAltText; - *aSuppress = area->mSuppressFeedback; - return NS_OK; - } - } - return NS_NOT_INSIDE; -} - -NS_IMETHODIMP ImageMapImpl::IsInside(nscoord aX, nscoord aY) -{ - PRInt32 i, n = mAreas.Count(); - for (i = 0; i < n; i++) { - Area* area = (Area*) mAreas.ElementAt(i); - if (area->IsInside(aX, aY)) { - return NS_OK; - } - } - return NS_NOT_INSIDE; -} - -NS_IMETHODIMP ImageMapImpl::Draw(nsIPresContext& aCX, nsIRenderingContext& aRC) -{ - PRInt32 i, n = mAreas.Count(); - for (i = 0; i < n; i++) { - Area* area = (Area*) mAreas.ElementAt(i); - area->Draw(aCX, aRC); - } - return NS_OK; -} - -NS_IMETHODIMP -ImageMapImpl::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this)); - - aHandler->Add((size_t) (- ((PRInt32) sizeof(mName)))); - mName.SizeOf(aHandler); - - if (!aHandler->HaveSeen(mTag)) { - mTag->SizeOf(aHandler); - } - - aHandler->Add((size_t) (- ((PRInt32) sizeof(mAreas)))); - mAreas.SizeOf(aHandler); - - PRInt32 i, n = mAreas.Count(); - for (i = 0; i < n; i++) { - Area* area = (Area*) mAreas[i]; - area->SizeOf(aHandler); - } - return NS_OK; -} - -NS_HTML nsresult NS_NewImageMap(nsIImageMap** aInstancePtrResult, - nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - ImageMapImpl* it = new ImageMapImpl(aTag); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIImageMapIID, (void**) aInstancePtrResult); -} diff --git a/mozilla/layout/html/base/src/nsLeafFrame.cpp b/mozilla/layout/html/base/src/nsLeafFrame.cpp deleted file mode 100644 index 601c890906d..00000000000 --- a/mozilla/layout/html/base/src/nsLeafFrame.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsLeafFrame.h" -#include "nsIStyleContext.h" -#include "nsCSSRendering.h" -#include "nsHTMLParts.h" -#include "nsIPresShell.h" - -nsLeafFrame::nsLeafFrame(nsIContent* aContent, nsIFrame* aParentFrame) - : nsFrame(aContent, aParentFrame) -{ -} - -nsLeafFrame::~nsLeafFrame() -{ -} - -NS_METHOD nsLeafFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - - if (disp->mVisible) { - const nsStyleColor* myColor = - (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - const nsStyleSpacing* mySpacing = - (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, - aDirtyRect, mRect, *myColor); - nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this, - aDirtyRect, mRect, *mySpacing, 0); - } - return NS_OK; -} - -NS_METHOD nsLeafFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - NS_PRECONDITION(mState & NS_FRAME_IN_REFLOW, "frame is not in reflow"); - - // XXX add in code to check for width/height being set via css - // and if set use them instead of calling GetDesiredSize. - - - GetDesiredSize(aPresContext, aReflowState, aDesiredSize); - AddBordersAndPadding(aPresContext, aDesiredSize); - if (nsnull != aDesiredSize.maxElementSize) { - aDesiredSize.maxElementSize->width = aDesiredSize.width; - aDesiredSize.maxElementSize->height = aDesiredSize.height; - } - aStatus = NS_FRAME_COMPLETE; - return NS_OK; -} - -// XXX how should border&padding effect baseline alignment? -// => descent = borderPadding.bottom for example -void nsLeafFrame::AddBordersAndPadding(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize) -{ - const nsStyleSpacing* space = - (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsMargin borderPadding; - space->CalcBorderPaddingFor(this, borderPadding); - aDesiredSize.width += borderPadding.left + borderPadding.right; - aDesiredSize.height += borderPadding.top + borderPadding.bottom; - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; -} - -void nsLeafFrame::GetInnerArea(nsIPresContext* aPresContext, - nsRect& aInnerArea) const -{ - const nsStyleSpacing* space = - (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsMargin borderPadding; - space->CalcBorderPaddingFor(this, borderPadding); - aInnerArea.x = borderPadding.left; - aInnerArea.y = borderPadding.top; - aInnerArea.width = mRect.width - - (borderPadding.left + borderPadding.right); - aInnerArea.height = mRect.height - - (borderPadding.top + borderPadding.bottom); -} - -NS_METHOD nsLeafFrame::ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent) -{ - // Generate a reflow command with this frame as the target frame - nsIReflowCommand* cmd; - nsresult result; - - result = NS_NewHTMLReflowCommand(&cmd, this, nsIReflowCommand::ContentChanged); - if (NS_OK == result) { - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - } - - return result; -} - diff --git a/mozilla/layout/html/base/src/nsLeafFrame.h b/mozilla/layout/html/base/src/nsLeafFrame.h deleted file mode 100644 index 53fc23f6636..00000000000 --- a/mozilla/layout/html/base/src/nsLeafFrame.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsLeafFrame_h___ -#define nsLeafFrame_h___ - -#include "nsFrame.h" - -/** - * Abstract class that provides simple fixed-size layout for leaf objects - * (e.g. images, form elements, etc.). Deriviations provide the implementation - * of the GetDesiredSize method. The rendering method knows how to render - * borders and backgrounds. - */ -class nsLeafFrame : public nsFrame { -public: - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent); - -protected: - nsLeafFrame(nsIContent* aContent, nsIFrame* aParentFrame); - virtual ~nsLeafFrame(); - - /** - * Return the desired size of the frame's content area. Note that this - * method doesn't need to deal with padding or borders (the caller will - * deal with it). In addition, the ascent will be set to the height - * and the descent will be set to zero. - */ - virtual void GetDesiredSize(nsIPresContext* aPresContext, - const nsReflowState& aReflowState, - nsReflowMetrics& aDesiredSize) = 0; - - /** - * Get the inner rect of this frame. This takes the outer size (mRect) - * and subtracts off the borders and padding. - */ - void GetInnerArea(nsIPresContext* aPresContext, nsRect& aInnerArea) const; - - /** - * Subroutine to add in borders and padding - */ - void AddBordersAndPadding(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize); -}; - -#endif /* nsLeafFrame_h___ */ diff --git a/mozilla/layout/html/base/src/nsPageFrame.cpp b/mozilla/layout/html/base/src/nsPageFrame.cpp deleted file mode 100644 index ab07ac7ddaf..00000000000 --- a/mozilla/layout/html/base/src/nsPageFrame.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsPageFrame.h" -#include "nsIContent.h" -#include "nsIContentDelegate.h" -#include "nsIPresContext.h" -#include "nsIStyleContext.h" -#include "nsIReflowCommand.h" -#include "nsIRenderingContext.h" -#include "nsHTMLAtoms.h" - -nsPageFrame::nsPageFrame(nsIContent* aContent, nsIFrame* aParent) - : nsContainerFrame(aContent, aParent) -{ -} - -void nsPageFrame::CreateFirstChild(nsIPresContext* aPresContext) -{ - // XXX this is a copy of the root-content-frame's version - - // Create a frame for the body child - PRInt32 i, n; - n = mContent->ChildCount(); - for (i = 0; i < n; i++) { - nsIContent* child = mContent->ChildAt(i); - if (nsnull != child) { - nsIAtom* tag; - tag = child->GetTag(); - if (nsHTMLAtoms::body == tag) { - // Create a frame - nsIContentDelegate* cd = child->GetDelegate(aPresContext); - if (nsnull != cd) { - nsIStyleContext* kidStyleContext = - aPresContext->ResolveStyleContextFor(child, this); - nsresult rv = cd->CreateFrame(aPresContext, child, this, - kidStyleContext, mFirstChild); - NS_RELEASE(kidStyleContext); - if (NS_OK == rv) { - mChildCount = 1; - mFirstContentOffset = i; - mLastContentOffset = i; - } - NS_RELEASE(cd); - } - } - NS_IF_RELEASE(tag); - NS_RELEASE(child); - } - } -} - -NS_METHOD nsPageFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ -#ifdef NS_DEBUG - PreReflowCheck(); -#endif - aStatus = NS_FRAME_COMPLETE; // initialize out parameter - - // XXX Do something sensible in page mode... - if (eReflowReason_Incremental == aReflowState.reason) { - // We don't expect the target of the reflow command to be page frame -#ifdef NS_DEUG - NS_ASSERTION(nsnull != aReflowState.reflowCommand, "null reflow command"); - - nsIFrame* target; - aReflowState.reflowCommand->GetTarget(target); - NS_ASSERTION(target != this, "page frame is reflow command target"); -#endif - - // Verify the next reflow command frame is our one and only child frame - nsIFrame* next; - aReflowState.reflowCommand->GetNext(next); - NS_ASSERTION(next == mFirstChild, "bad reflow frame"); - - // Dispatch the reflow command to our content child. Allow it to be as high - // as it wants - nsSize maxSize(aReflowState.maxSize.width, NS_UNCONSTRAINEDSIZE); - nsReflowState kidReflowState(mFirstChild, aReflowState, maxSize); - - aStatus = ReflowChild(mFirstChild, aPresContext, aDesiredSize, kidReflowState); - - // Place and size the child. Make sure the child is at least as - // tall as our max size (the containing window) - if (aDesiredSize.height < aReflowState.maxSize.height) { - aDesiredSize.height = aReflowState.maxSize.height; - } - - nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height); - mFirstChild->SetRect(rect); - - } else { - // Do we have any children? - if (nsnull == mFirstChild) { - if (nsnull == mPrevInFlow) { - // Create the first child frame - CreateFirstChild(aPresContext); - } else { - nsPageFrame* prevPage = (nsPageFrame*)mPrevInFlow; - - NS_ASSERTION(!prevPage->mLastContentIsComplete, "bad continuing page"); - nsIFrame* prevLastChild; - prevPage->LastChild(prevLastChild); - - // Create a continuing child of the previous page's last child - nsIStyleContext* kidSC; - prevLastChild->GetStyleContext(aPresContext, kidSC); - nsresult rv = prevLastChild->CreateContinuingFrame(aPresContext, this, - kidSC, mFirstChild); - NS_RELEASE(kidSC); - - mChildCount = 1; - mLastContentOffset = mFirstContentOffset; - } - } - - // Resize our frame allowing it only to be as big as we are - // XXX Pay attention to the page's border and padding... - if (nsnull != mFirstChild) { - nsReflowState kidReflowState(mFirstChild, aReflowState, aReflowState.maxSize); - - // Get the child's desired size - mFirstChild->WillReflow(*aPresContext); - aStatus = ReflowChild(mFirstChild, aPresContext, aDesiredSize, kidReflowState); - mLastContentIsComplete = NS_FRAME_IS_COMPLETE(aStatus); - - // Make sure the child is at least as tall as our max size (the containing window) - if (aDesiredSize.height < aReflowState.maxSize.height) { - aDesiredSize.height = aReflowState.maxSize.height; - } - - // Place and size the child - nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height); - mFirstChild->SetRect(rect); - mFirstChild->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - - // Is the frame complete? - if (NS_FRAME_IS_COMPLETE(aStatus)) { - nsIFrame* childNextInFlow; - - mFirstChild->GetNextInFlow(childNextInFlow); - NS_ASSERTION(nsnull == childNextInFlow, "bad child flow list"); - } - } - - // Return our desired size - aDesiredSize.width = aReflowState.maxSize.width; - aDesiredSize.height = aReflowState.maxSize.height; - } - - // We are always a pseudo-frame; make sure our content offset is - // properly pushed upwards - nsContainerFrame* parent = (nsContainerFrame*) mGeometricParent; - parent->PropagateContentOffsets(this, mFirstContentOffset, - mLastContentOffset, mLastContentIsComplete); - -#ifdef NS_DEBUG - PostReflowCheck(aStatus); -#endif - return NS_OK; -} - -NS_METHOD -nsPageFrame::CreateContinuingFrame(nsIPresContext* aPresContext, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame) -{ - nsPageFrame* cf = new nsPageFrame(mContent, aParent); - if (nsnull == cf) { - return NS_ERROR_OUT_OF_MEMORY; - } - PrepareContinuingFrame(aPresContext, aParent, aStyleContext, cf); - aContinuingFrame = cf; - return NS_OK; -} - -NS_METHOD nsPageFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - nsContainerFrame::Paint(aPresContext, aRenderingContext, aDirtyRect); - - // For the time being paint a border around the page so we know - // where each page begins and ends - aRenderingContext.SetColor(NS_RGB(0, 0, 0)); - aRenderingContext.DrawRect(0, 0, mRect.width, mRect.height); - return NS_OK; -} - -NS_METHOD nsPageFrame::ListTag(FILE* out) const -{ - fprintf(out, "*PAGE@%p", this); - return NS_OK; -} - diff --git a/mozilla/layout/html/base/src/nsPageFrame.h b/mozilla/layout/html/base/src/nsPageFrame.h deleted file mode 100644 index 4e2913e3b9d..00000000000 --- a/mozilla/layout/html/base/src/nsPageFrame.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsPageFrame_h___ -#define nsPageFrame_h___ - -#include "nsHTMLContainerFrame.h" - -// Pseudo frame created by the root content frame -class nsPageFrame : public nsContainerFrame { -public: - nsPageFrame(nsIContent* aContent, nsIFrame* aParent); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aMaxSize, - nsReflowStatus& aStatus); - - NS_IMETHOD CreateContinuingFrame(nsIPresContext* aCX, - nsIFrame* aParent, - nsIStyleContext* aStyleContext, - nsIFrame*& aContinuingFrame); - - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - - // Debugging - NS_IMETHOD ListTag(FILE* out = stdout) const; - -protected: - void CreateFirstChild(nsIPresContext* aPresContext); -}; - -#endif /* nsPageFrame_h___ */ - diff --git a/mozilla/layout/html/base/src/nsPlaceholderFrame.cpp b/mozilla/layout/html/base/src/nsPlaceholderFrame.cpp deleted file mode 100644 index 8e492acffb3..00000000000 --- a/mozilla/layout/html/base/src/nsPlaceholderFrame.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsPlaceholderFrame.h" -#include "nsIContent.h" -#include "nsIContentDelegate.h" -#include "nsIFloaterContainer.h" -#include "nsBodyFrame.h" -#include "nsIStyleContext.h" -#include "nsCSSLayout.h" -#include "nsIView.h" -#include "nsHTMLIIDs.h" - -nsresult -nsPlaceholderFrame::NewFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIFrame* it = new nsPlaceholderFrame(aContent, aParent); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - *aInstancePtrResult = it; - return NS_OK; -} - -nsPlaceholderFrame::nsPlaceholderFrame(nsIContent* aContent, nsIFrame* aParent) - : nsFrame(aContent, aParent) -{ -} - -nsPlaceholderFrame::~nsPlaceholderFrame() -{ -} - -NS_IMETHODIMP -nsPlaceholderFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - // Get the floater container in which we're inserted - nsIFrame* containingBlock; - nsIFloaterContainer* container = nsnull; - - for (containingBlock = mGeometricParent; - nsnull != containingBlock; - containingBlock->GetGeometricParent(containingBlock)) - { - if (NS_OK == containingBlock->QueryInterface(kIFloaterContainerIID, (void**)&container)) { - break; - } - } - NS_ASSERTION(nsnull != container, "no floater container"); - - // Have we created the anchored item yet? - if (nsnull == mAnchoredItem) { - // If the content object is a container then wrap it in a body pseudo-frame - - // XXX begin hack - // XXX More hack. We don't want to blindly wrap a body pseudo-frame around - // a table content object, because the body pseudo-frame will map the table's - // content children rather than create a table frame and let it map the - // children... - PRBool select = PR_FALSE; - nsIAtom* atom = mContent->GetTag(); - nsAutoString tmp; - if (nsnull != atom) { - atom->ToString(tmp); - if (tmp.EqualsIgnoreCase("select") || - tmp.EqualsIgnoreCase("table")) { - select = PR_TRUE; - } - NS_RELEASE(atom); - } - // XXX end hack - - if (mContent->CanContainChildren() && !select) { - nsBodyFrame::NewFrame(&mAnchoredItem, mContent, this); - - // Use our style context for the pseudo-frame - mAnchoredItem->SetStyleContext(aPresContext, mStyleContext); - } else { - // Create the anchored item - nsIContentDelegate* delegate = mContent->GetDelegate(aPresContext); - nsresult rv = delegate->CreateFrame(aPresContext, mContent, - mGeometricParent, mStyleContext, - mAnchoredItem); - NS_RELEASE(delegate); - if (NS_OK != rv) { - return rv; - } - } - - // Notify our containing block that there's a new floater - container->AddFloater(aPresContext, aReflowState, mAnchoredItem, this); - - } else { - // XXX This causes anchored-items sizes to get fixed up; this is - // not quite right because this class should be implementing one - // of the incremental reflow methods and propagating things down - // properly to the contained frame. - nsReflowMetrics desiredSize(nsnull); - nsReflowState reflowState(mAnchoredItem, aReflowState, aReflowState.maxSize, - eReflowReason_Resize); - mAnchoredItem->WillReflow(*aPresContext); - mAnchoredItem->Reflow(aPresContext, desiredSize, reflowState, aStatus); - mAnchoredItem->SizeTo(desiredSize.width, desiredSize.height); - -//XXXdeprecated container->PlaceFloater(aPresContext, mAnchoredItem, this); - mAnchoredItem->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - } - - return nsFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); -} - -NS_IMETHODIMP nsPlaceholderFrame::ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer) -{ - NS_ASSERTION(mContent == aContainer, "bad content-appended target"); - - // Forward the notification to the floater - if (nsnull != mAnchoredItem) { - return mAnchoredItem->ContentAppended(aShell, aPresContext, aContainer); - } - - return NS_OK; -} - -NS_IMETHODIMP nsPlaceholderFrame::ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-inserted target"); - - // Forward the notification to the floater - if (nsnull != mAnchoredItem) { - return mAnchoredItem->ContentInserted(aShell, aPresContext, aContainer, - aChild, aIndexInParent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsPlaceholderFrame::ContentReplaced(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-replaced target"); - - // Forward the notification to the floater - if (nsnull != mAnchoredItem) { - return mAnchoredItem->ContentReplaced(aShell, aPresContext, aContainer, - aOldChild, aNewChild, aIndexInParent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsPlaceholderFrame::ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent) -{ - NS_ASSERTION(mContent == aContainer, "bad content-deleted target"); - - // Forward the notification to the floater - if (nsnull != mAnchoredItem) { - return mAnchoredItem->ContentDeleted(aShell, aPresContext, aContainer, - aChild, aIndexInParent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsPlaceholderFrame::ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent) -{ - NS_ASSERTION(mContent == aChild, "bad content-changed target"); - - // Forward the notification to the floater - if (nsnull != mAnchoredItem) { - return mAnchoredItem->ContentChanged(aShell, aPresContext, aChild, aSubContent); - } - - return NS_OK; -} - -NS_IMETHODIMP nsPlaceholderFrame::ListTag(FILE* out) const -{ - fputs("*placeholder", out); - PRInt32 contentIndex; - GetContentIndex(contentIndex); - fprintf(out, "(%d)@%p", contentIndex, this); - return NS_OK; -} diff --git a/mozilla/layout/html/base/src/nsPlaceholderFrame.h b/mozilla/layout/html/base/src/nsPlaceholderFrame.h deleted file mode 100644 index 82378033c32..00000000000 --- a/mozilla/layout/html/base/src/nsPlaceholderFrame.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsPlaceholderFrame_h___ -#define nsPlaceholderFrame_h___ - -#include "nsFrame.h" - -// Implementation of a frame that's used as a placeholder for an anchored item -class nsPlaceholderFrame : public nsFrame { -public: - /** - * Create a new placeholder frame - */ - static nsresult NewFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent); - - // Returns the associated anchored item - nsIFrame* GetAnchoredItem() const {return mAnchoredItem;} - - // nsIFrame overrides - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD ContentAppended(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer); - NS_IMETHOD ContentInserted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentReplaced(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aOldChild, - nsIContent* aNewChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentDeleted(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aContainer, - nsIContent* aChild, - PRInt32 aIndexInParent); - NS_IMETHOD ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent); - - NS_IMETHOD ListTag(FILE* out = stdout) const; - -protected: - nsIFrame* mAnchoredItem; - - // Constructor. Takes as arguments the content object and the Frame for - // the content parent - nsPlaceholderFrame(nsIContent* aContent, nsIFrame* aParent); - virtual ~nsPlaceholderFrame(); -}; - -#endif /* nsPlaceholderFrame_h___ */ diff --git a/mozilla/layout/html/base/src/nsRootPart.cpp b/mozilla/layout/html/base/src/nsRootPart.cpp deleted file mode 100644 index 7e8413741b5..00000000000 --- a/mozilla/layout/html/base/src/nsRootPart.cpp +++ /dev/null @@ -1,573 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLContainer.h" -#include "nsContainerFrame.h" -#include "nsIDocument.h" -#include "nsIReflowCommand.h" -#include "nsIPresContext.h" -#include "nsIStyleContext.h" -#include "nsViewsCID.h" -#include "nsIView.h" -#include "nsIViewManager.h" -#include "nsIContentDelegate.h" -#include "nsIWidget.h" -#include "nsHTMLIIDs.h" -#include "nsPageFrame.h" -#include "nsIRenderingContext.h" -#include "nsIDeviceContext.h" -#include "nsGUIEvent.h" -#include "nsStyleConsts.h" -#include "nsIViewManager.h" -#include "nsHTMLAtoms.h" -#include "nsIEventStateManager.h" - -class RootFrame : public nsContainerFrame { -public: - RootFrame(nsIContent* aContent); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus); -}; - -// Pseudo frame created by the root frame -class RootContentFrame : public nsContainerFrame { -public: - RootContentFrame(nsIContent* aContent, nsIFrame* aParent); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - -protected: - void CreateFirstChild(nsIPresContext* aPresContext); -}; - -//---------------------------------------------------------------------- - -RootFrame::RootFrame(nsIContent* aContent) - : nsContainerFrame(aContent, nsnull) -{ -} - -NS_METHOD RootFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - NS_FRAME_TRACE_REFLOW_IN("RootFrame::Reflow"); - -#ifdef NS_DEBUG - PreReflowCheck(); -#endif - - aStatus = NS_FRAME_COMPLETE; - - if (eReflowReason_Incremental == aReflowState.reason) { - // We don't expect the target of the reflow command to be the root frame -#ifdef NS_DEBUG - NS_ASSERTION(nsnull != aReflowState.reflowCommand, "no reflow command"); - - nsIFrame* target; - aReflowState.reflowCommand->GetTarget(target); - NS_ASSERTION(target != this, "root frame is reflow command target"); -#endif - - // Verify that the next frame in the reflow chain is our pseudo frame - nsIFrame* next; - aReflowState.reflowCommand->GetNext(next); - NS_ASSERTION(next == mFirstChild, "unexpected next reflow command frame"); - - } else { - // Do we have any children? - if (nsnull == mFirstChild) { - // No. Create a pseudo frame - NS_ASSERTION(eReflowReason_Initial == aReflowState.reason, "unexpected reflow reason"); - mFirstChild = new RootContentFrame(mContent, this); - mChildCount = 1; - nsIStyleContext* style = aPresContext->ResolvePseudoStyleContextFor(nsHTMLAtoms::rootContentPseudo, this); - mFirstChild->SetStyleContext(aPresContext,style); - NS_RELEASE(style); - } - } - - // Reflow our pseudo frame. It will choose whetever height its child frame - // wants - if (nsnull != mFirstChild) { - nsReflowMetrics desiredSize(nsnull); - nsReflowState kidReflowState(mFirstChild, aReflowState, aReflowState.maxSize); - - mFirstChild->WillReflow(*aPresContext); - aStatus = ReflowChild(mFirstChild, aPresContext, desiredSize, kidReflowState); - - // Place and size the child - nsRect rect(0, 0, desiredSize.width, desiredSize.height); - mFirstChild->SetRect(rect); - mFirstChild->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - - mLastContentOffset = ((RootContentFrame*)mFirstChild)->GetLastContentOffset(); - } - - // Return the max size as our desired size - aDesiredSize.width = aReflowState.maxSize.width; - aDesiredSize.height = aReflowState.maxSize.height; - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; - -#ifdef NS_DEBUG - PostReflowCheck(aStatus); -#endif - NS_FRAME_TRACE_REFLOW_OUT("RootFrame::Reflow", aStatus); - return NS_OK; -} - -NS_METHOD RootFrame::HandleEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsEventStatus& aEventStatus) -{ - nsIEventStateManager *mManager; - - if (NS_OK == aPresContext.GetEventStateManager(&mManager)) { - mManager->SetEventTarget((nsISupports*)mContent); - NS_RELEASE(mManager); - } - mContent->HandleDOMEvent(aPresContext, aEvent, nsnull, aEventStatus); - - if (aEventStatus != nsEventStatus_eConsumeNoDefault) { - switch (aEvent->message) { - case NS_MOUSE_MOVE: - case NS_MOUSE_ENTER: - { - nsIFrame* target = this; - PRInt32 cursor; - - GetCursorAt(aPresContext, aEvent->point, &target, cursor); - if (cursor == NS_STYLE_CURSOR_INHERIT) { - cursor = NS_STYLE_CURSOR_DEFAULT; - } - nsCursor c; - switch (cursor) { - default: - case NS_STYLE_CURSOR_DEFAULT: - c = eCursor_standard; - break; - case NS_STYLE_CURSOR_HAND: - c = eCursor_hyperlink; - break; - case NS_STYLE_CURSOR_IBEAM: - c = eCursor_select; - break; - } - nsIWidget* window; - target->GetWindow(window); - window->SetCursor(c); - NS_RELEASE(window); - } - break; - } - } - - return NS_OK; -} - -//---------------------------------------------------------------------- - -RootContentFrame::RootContentFrame(nsIContent* aContent, nsIFrame* aParent) - : nsContainerFrame(aContent, aParent) -{ - // Create a view - nsIFrame* parent; - nsIView* view; - - GetParentWithView(parent); - NS_ASSERTION(parent, "GetParentWithView failed"); - nsIView* parView; - - parent->GetView(parView); - NS_ASSERTION(parView, "no parent with view"); - - // Create a view - static NS_DEFINE_IID(kViewCID, NS_VIEW_CID); - static NS_DEFINE_IID(kIViewIID, NS_IVIEW_IID); - - nsresult result = NSRepository::CreateInstance(kViewCID, - nsnull, - kIViewIID, - (void **)&view); - if (NS_OK == result) { - nsIView* rootView = parView; - nsIViewManager* viewManager = rootView->GetViewManager(); - - // Initialize the view - NS_ASSERTION(nsnull != viewManager, "null view manager"); - - view->Init(viewManager, mRect, rootView); - viewManager->InsertChild(rootView, view, 0); - - NS_RELEASE(viewManager); - - // Remember our view - SetView(view); - NS_RELEASE(view); - } - NS_RELEASE(parView); -} - -void RootContentFrame::CreateFirstChild(nsIPresContext* aPresContext) -{ - // Are we paginated? - if (aPresContext->IsPaginated()) { - // Yes. Create the first page frame - mFirstChild = new nsPageFrame(mContent, this); - mChildCount = 1; - mLastContentOffset = mFirstContentOffset; - - } else { - // Create a frame for the body child - PRInt32 i, n; - n = mContent->ChildCount(); - for (i = 0; i < n; i++) { - nsIContent* child = mContent->ChildAt(i); - if (nsnull != child) { - nsIAtom* tag; - tag = child->GetTag(); - if (nsHTMLAtoms::body == tag) { - // Create a frame - nsIContentDelegate* cd = child->GetDelegate(aPresContext); - if (nsnull != cd) { - nsIStyleContext* kidStyleContext = - aPresContext->ResolveStyleContextFor(child, this); - nsresult rv = cd->CreateFrame(aPresContext, child, this, - kidStyleContext, mFirstChild); - NS_RELEASE(kidStyleContext); - if (NS_OK == rv) { - mChildCount = 1; - mFirstContentOffset = i; - mLastContentOffset = i; - } - NS_RELEASE(cd); - } - } - NS_IF_RELEASE(tag); - NS_RELEASE(child); - } - } - } -} - -// XXX Hack -#define PAGE_SPACING_TWIPS 100 - -NS_METHOD RootContentFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - NS_FRAME_TRACE_REFLOW_IN("RootContentFrame::Reflow"); -#ifdef NS_DEBUG - PreReflowCheck(); -#endif - - aStatus = NS_FRAME_COMPLETE; - - // XXX Incremental reflow code doesn't handle page mode at all... - if (eReflowReason_Incremental == aReflowState.reason) { - // We don't expect the target of the reflow command to be the root - // content frame -#ifdef NS_DEBUG - nsIFrame* target; - aReflowState.reflowCommand->GetTarget(target); - NS_ASSERTION(target != this, "root content frame is reflow command target"); -#endif - - // Verify the next frame in the reflow chain is our child frame - nsIFrame* next; - aReflowState.reflowCommand->GetNext(next); - NS_ASSERTION(next == mFirstChild, "unexpected next reflow command frame"); - - nsSize maxSize(aReflowState.maxSize.width, NS_UNCONSTRAINEDSIZE); - nsReflowState kidReflowState(next, aReflowState, maxSize); - - // Dispatch the reflow command to our child frame. Allow it to be as high - // as it wants - mFirstChild->WillReflow(*aPresContext); - aStatus = ReflowChild(mFirstChild, aPresContext, aDesiredSize, kidReflowState); - - // Place and size the child. Make sure the child is at least as - // tall as our max size (the containing window) - if (aDesiredSize.height < aReflowState.maxSize.height) { - aDesiredSize.height = aReflowState.maxSize.height; - } - - nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height); - mFirstChild->SetRect(rect); - mFirstChild->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - - } else { - nsReflowReason reflowReason = aReflowState.reason; - - // Do we have any children? - if (nsnull == mFirstChild) { - // No, create the first child frame - reflowReason = eReflowReason_Initial; - CreateFirstChild(aPresContext); - } - - // Resize our frames - if (nsnull != mFirstChild) { - if (aPresContext->IsPaginated()) { - nscoord y = PAGE_SPACING_TWIPS; - nsReflowMetrics kidSize(aDesiredSize.maxElementSize); - - // Compute the size of each page and the x coordinate within - // ourselves that the pages will be placed at. - nsSize pageSize(aPresContext->GetPageWidth(), - aPresContext->GetPageHeight()); - nsIDeviceContext *dx = aPresContext->GetDeviceContext(); - PRInt32 extra = aReflowState.maxSize.width - PAGE_SPACING_TWIPS*2 - - pageSize.width - NS_TO_INT_ROUND(dx->GetScrollBarWidth()); - NS_RELEASE(dx); - - // Note: nscoord is an unsigned type so don't combine these - // two statements or the extra will be promoted to unsigned - // and the >0 won't work! - nscoord x = PAGE_SPACING_TWIPS; - if (extra > 0) { - x += extra / 2; - } - - // Tile the pages vertically - for (nsIFrame* kidFrame = mFirstChild; nsnull != kidFrame; ) { - // Reflow the page - nsReflowState kidReflowState(kidFrame, aReflowState, pageSize, - reflowReason); - nsReflowStatus status; - - // Place and size the page. If the page is narrower than our - // max width then center it horizontally - kidFrame->WillReflow(*aPresContext); - kidFrame->MoveTo(x, y); - status = ReflowChild(kidFrame, aPresContext, kidSize, - kidReflowState); - kidFrame->SetRect(nsRect(x, y, kidSize.width, kidSize.height)); - kidFrame->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - y += kidSize.height; - - // Leave a slight gap between the pages - y += PAGE_SPACING_TWIPS; - - // Is the page complete? - nsIFrame* kidNextInFlow; - - kidFrame->GetNextInFlow(kidNextInFlow); - if (NS_FRAME_IS_COMPLETE(status)) { - NS_ASSERTION(nsnull == kidNextInFlow, "bad child flow list"); - } else if (nsnull == kidNextInFlow) { - // The page isn't complete and it doesn't have a next-in-flow so - // create a continuing page - nsIStyleContext* kidSC; - kidFrame->GetStyleContext(aPresContext, kidSC); - nsIFrame* continuingPage; - nsresult rv = kidFrame->CreateContinuingFrame(aPresContext, this, - kidSC, continuingPage); - NS_RELEASE(kidSC); - reflowReason = eReflowReason_Initial; - - // Add it to our child list -#ifdef NS_DEBUG - nsIFrame* kidNextSibling; - kidFrame->GetNextSibling(kidNextSibling); - NS_ASSERTION(nsnull == kidNextSibling, "unexpected sibling"); -#endif - kidFrame->SetNextSibling(continuingPage); - mChildCount++; - } - - // Get the next page - kidFrame->GetNextSibling(kidFrame); - } - - // Return our desired size - aDesiredSize.height = y; - if (aDesiredSize.height < aReflowState.maxSize.height) { - aDesiredSize.height = aReflowState.maxSize.height; - } - aDesiredSize.width = PAGE_SPACING_TWIPS*2 + pageSize.width; - if (aDesiredSize.width < aReflowState.maxSize.width) { - aDesiredSize.width = aReflowState.maxSize.width; - } - - } else { - // Allow the frame to be as wide as our max width, and as high - // as it wants to be. - nsSize maxSize(aReflowState.maxSize.width, NS_UNCONSTRAINEDSIZE); - nsReflowState kidReflowState(mFirstChild, aReflowState, maxSize, reflowReason); - - // Get the child's desired size. Our child's desired height is our - // desired size - mFirstChild->WillReflow(*aPresContext); - aStatus = ReflowChild(mFirstChild, aPresContext, aDesiredSize, kidReflowState); - NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status"); - - // Place and size the child. Make sure the child is at least as - // tall as our max size (the containing window) - if (aDesiredSize.height < aReflowState.maxSize.height) { - aDesiredSize.height = aReflowState.maxSize.height; - } - - // Place and size the child - nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height); - mFirstChild->SetRect(rect); - mFirstChild->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - } - } - else { - aDesiredSize.width = aReflowState.maxSize.width; - aDesiredSize.height = aReflowState.maxSize.height; - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; - if (nsnull != aDesiredSize.maxElementSize) { - aDesiredSize.maxElementSize->width = 0; - aDesiredSize.maxElementSize->height = 0; - } - } - } - - // We are always a pseudo-frame; make sure our content offset is - // properly pushed upwards - nsContainerFrame* parent = (nsContainerFrame*) mGeometricParent; - parent->PropagateContentOffsets(this, mFirstContentOffset, - mLastContentOffset, mLastContentIsComplete); - -#ifdef NS_DEBUG - PostReflowCheck(aStatus); -#endif - NS_FRAME_TRACE_REFLOW_OUT("RootContentFrame::Reflow", aStatus); - return NS_OK; -} - -NS_METHOD RootContentFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - // If we're paginated then fill the dirty rect with white - if (aPresContext.IsPaginated()) { - // Cross hatching would be nicer... - aRenderingContext.SetColor(NS_RGB(255,255,255)); - aRenderingContext.FillRect(aDirtyRect); - } - - nsContainerFrame::Paint(aPresContext, aRenderingContext, aDirtyRect); - return NS_OK; -} - -//---------------------------------------------------------------------- - -class RootPart : public nsHTMLContainer { -public: - RootPart(nsIDocument* aDoc); - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - - NS_IMETHOD HandleDOMEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus); - - NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject); - -protected: - virtual ~RootPart(); -}; - -RootPart::RootPart(nsIDocument* aDoc) -{ - NS_PRECONDITION(nsnull != aDoc, "null ptr"); - mDocument = aDoc; - mTag = NS_NewAtom("HTML"); -} - -RootPart::~RootPart() -{ -} - -nsresult -RootPart::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - RootFrame* frame = new RootFrame(this); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -nsresult -RootPart::HandleDOMEvent(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - nsIDOMEvent* aDOMEvent, - nsEventStatus& aEventStatus) -{ - return mDocument->HandleDOMEvent(aPresContext, aEvent, aDOMEvent, aEventStatus); -} - -nsresult -RootPart::GetScriptObject(nsIScriptContext *aContext, - void** aScriptObject) -{ - nsresult res = NS_OK; - if (nsnull == mScriptObject) { - res = NS_NewScriptElement(aContext, this, mDocument, (void**)&mScriptObject); - } - *aScriptObject = mScriptObject; - return res; -} - -nsresult -NS_NewRootPart(nsIHTMLContent** aInstancePtrResult, - nsIDocument* aDocument) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* root = new RootPart(aDocument); - if (nsnull == root) { - return NS_ERROR_OUT_OF_MEMORY; - } - aDocument->SetRootContent(root); - return root->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/html/base/src/nsScrollFrame.cpp b/mozilla/layout/html/base/src/nsScrollFrame.cpp deleted file mode 100644 index 9d673b1d351..00000000000 --- a/mozilla/layout/html/base/src/nsScrollFrame.cpp +++ /dev/null @@ -1,572 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsScrollFrame.h" -#include "nsIPresContext.h" -#include "nsIContentDelegate.h" -#include "nsIStyleContext.h" -#include "nsIReflowCommand.h" -#include "nsIDeviceContext.h" -#include "nsPageFrame.h" -#include "nsViewsCID.h" -#include "nsIView.h" -#include "nsIViewManager.h" -#include "nsBodyFrame.h" -#include "nsHTMLBase.h" -#include "nsCSSLayout.h" - -#include "nsBodyFrame.h" - -class nsScrollBodyFrame : public nsContainerFrame { -public: - nsScrollBodyFrame(nsIContent* aContent, nsIFrame* aParent); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - - NS_IMETHOD ListTag(FILE* out = stdout) const; - -protected: - void CreateFirstChild(nsIPresContext* aPresContext); -}; - -nsScrollBodyFrame::nsScrollBodyFrame(nsIContent* aContent, nsIFrame* aParent) - : nsContainerFrame(aContent, aParent) -{ - nsHTMLBase::CreateViewForFrame(nsnull, this, nsnull, PR_TRUE); -} - -void -nsScrollBodyFrame::CreateFirstChild(nsIPresContext* aPresContext) -{ - // Are we paginated? - if (aPresContext->IsPaginated()) { - // Yes. Create the first page frame - mFirstChild = new nsPageFrame(mContent, this);/* XXX mContent won't work here */ - mChildCount = 1; - mLastContentOffset = mFirstContentOffset; - } else { - if (nsnull != mContent) { -#if 0 - // Create a frame for the child we are wrapping up - nsIContentDelegate* cd = mContent->GetDelegate(aPresContext); - if (nsnull != cd) { - nsIStyleContext* kidStyleContext = - aPresContext->ResolveStyleContextFor(mContent, this); - nsresult rv = cd->CreateFrame(aPresContext, mContent, this, - kidStyleContext, mFirstChild); - NS_RELEASE(kidStyleContext); - if (NS_OK == rv) { - mChildCount = 1; - mLastContentOffset = mFirstContentOffset; - } - NS_RELEASE(cd); - } -#else - nsBodyFrame::NewFrame(&mFirstChild, mContent, this); - mChildCount = 1; - mLastContentOffset = mFirstContentOffset; -#endif - } - } -} - -// XXX Hack -#define PAGE_SPACING 100 - -NS_IMETHODIMP -nsScrollBodyFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, - ("enter nsScrollBodyFrame::Reflow: maxSize=%d,%d", - aReflowState.maxSize.width, - aReflowState.maxSize.height)); - -#ifdef NS_DEBUG - PreReflowCheck(); -#endif - aStatus = NS_FRAME_COMPLETE; - - // XXX Incremental reflow code doesn't handle page mode at all... - if (eReflowReason_Incremental == aReflowState.reason) { - // We don't expect the target of the reflow command to be the root - // content frame -#ifdef NS_DEBUG - nsIFrame* target; - aReflowState.reflowCommand->GetTarget(target); - NS_ASSERTION(target != this, "root content frame is reflow command target"); -#endif - - // Verify the next frame in the reflow chain is our child frame - nsIFrame* next; - aReflowState.reflowCommand->GetNext(next); - NS_ASSERTION(next == mFirstChild, "unexpected next reflow command frame"); - - nsSize maxSize(aReflowState.maxSize.width, NS_UNCONSTRAINEDSIZE); - nsReflowState kidReflowState(next, aReflowState, maxSize); - - // Dispatch the reflow command to our child frame. Allow it to be as high - // as it wants - mFirstChild->WillReflow(*aPresContext); - aStatus = ReflowChild(mFirstChild, aPresContext, aDesiredSize, kidReflowState); - - // Place and size the child. Make sure the child is at least as - // tall as our max size (the containing window) - if (aDesiredSize.height < aReflowState.maxSize.height) { - aDesiredSize.height = aReflowState.maxSize.height; - } - - nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height); - mFirstChild->SetRect(rect); - mFirstChild->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - - } else { - // Do we have any children? - if (nsnull == mFirstChild) { - // No, create the first child frame - CreateFirstChild(aPresContext); - } - - // Resize our frames - if (nsnull != mFirstChild) { - if (aPresContext->IsPaginated()) { - nscoord y = PAGE_SPACING; - nsReflowMetrics kidSize(aDesiredSize.maxElementSize); - nsSize pageSize(aPresContext->GetPageWidth(), - aPresContext->GetPageHeight()); - - // Tile the pages vertically - for (nsIFrame* kidFrame = mFirstChild; nsnull != kidFrame; ) { - // Reflow the page - nsReflowState kidReflowState(kidFrame, aReflowState, pageSize); - nsReflowStatus status; - - // Place and size the page. If the page is narrower than our - // max width then center it horizontally - nsIDeviceContext *dx = aPresContext->GetDeviceContext(); - PRInt32 extra = aReflowState.maxSize.width - kidSize.width - - NS_TO_INT_ROUND(dx->GetScrollBarWidth()); - NS_RELEASE(dx); - nscoord x = extra > 0 ? extra / 2 : 0; - - kidFrame->WillReflow(*aPresContext); - kidFrame->MoveTo(x, y); - status = ReflowChild(kidFrame, aPresContext, kidSize, kidReflowState); - - kidFrame->SetRect(nsRect(x, y, kidSize.width, kidSize.height)); - kidFrame->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - y += kidSize.height; - - // Leave a slight gap between the pages - y += PAGE_SPACING; - - // Is the page complete? - nsIFrame* kidNextInFlow; - - kidFrame->GetNextInFlow(kidNextInFlow); - if (NS_FRAME_IS_COMPLETE(status)) { - NS_ASSERTION(nsnull == kidNextInFlow, "bad child flow list"); - } else if (nsnull == kidNextInFlow) { - // The page isn't complete and it doesn't have a next-in-flow so - // create a continuing page - nsIStyleContext* kidSC; - kidFrame->GetStyleContext(aPresContext, kidSC); - nsIFrame* continuingPage; - nsresult rv = kidFrame->CreateContinuingFrame(aPresContext, this, - kidSC, continuingPage); - NS_RELEASE(kidSC); - - // Add it to our child list - #ifdef NS_DEBUG - nsIFrame* kidNextSibling; - - kidFrame->GetNextSibling(kidNextSibling); - NS_ASSERTION(nsnull == kidNextSibling, "unexpected sibling"); - #endif - kidFrame->SetNextSibling(continuingPage); - mChildCount++; - } - - // Get the next page - kidFrame->GetNextSibling(kidFrame); - } - - // Return our desired size - aDesiredSize.width = aReflowState.maxSize.width; - aDesiredSize.height = y; - - } else { - // Allow the frame to be as wide as our max width, and as high - // as it wants to be. - nsSize maxSize(aReflowState.maxSize.width, NS_UNCONSTRAINEDSIZE); - nsReflowState kidReflowState(mFirstChild, aReflowState, maxSize); - - // Get the child's desired size. Our child's desired height is our - // desired size - mFirstChild->WillReflow(*aPresContext); - aStatus = ReflowChild(mFirstChild, aPresContext, aDesiredSize, kidReflowState); - NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status"); - -#if 0 - // Place and size the child. Make sure the child is at least as - // tall as our max size (the containing window) - if (aDesiredSize.height < aReflowState.maxSize.height) { - aDesiredSize.height = aReflowState.maxSize.height; - } -#endif - - // Place and size the child - nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height); - mFirstChild->SetRect(rect); - mFirstChild->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - } - } - else { - aDesiredSize.width = aReflowState.maxSize.width; - aDesiredSize.height = 1; - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; - if (nsnull != aDesiredSize.maxElementSize) { - aDesiredSize.maxElementSize->width = 0; - aDesiredSize.maxElementSize->height = 0; - } - } - } - -#ifdef NS_DEBUG - PostReflowCheck(aStatus); -#endif - - NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, - ("exit nsScrollBodyFrame::Reflow: status=%d width=%d height=%d", - aStatus, aDesiredSize.width, aDesiredSize.height)); - return NS_OK; -} - -NS_IMETHODIMP -nsScrollBodyFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - // If we're paginated then fill the dirty rect with white - if (aPresContext.IsPaginated()) { - // Cross hatching would be nicer... - aRenderingContext.SetColor(NS_RGB(255,255,255)); - aRenderingContext.FillRect(aDirtyRect); - } - - nsContainerFrame::Paint(aPresContext, aRenderingContext, aDirtyRect); - return NS_OK; -} - -NS_IMETHODIMP -nsScrollBodyFrame::ListTag(FILE* out) const -{ - fputs("*scrollbodyframe<", out); - nsIAtom* atom = mContent->GetTag(); - if (nsnull != atom) { - nsAutoString tmp; - atom->ToString(tmp); - fputs(tmp, out); - } - PRInt32 contentIndex; - GetContentIndex(contentIndex); - fprintf(out, ">(%d)@%p", contentIndex, this); - return NS_OK; -} - -//---------------------------------------------------------------------- - -class nsScrollInnerFrame : public nsContainerFrame { -public: - nsScrollInnerFrame(nsIContent* aContent, nsIFrame* aParent); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD ListTag(FILE* out = stdout) const; - -protected: -}; - -nsScrollInnerFrame::nsScrollInnerFrame(nsIContent* aContent, nsIFrame* aParent) - : nsContainerFrame(aContent, aParent) -{ -} - -NS_IMETHODIMP -nsScrollInnerFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, - ("enter nsScrollInnerFrame::Reflow: maxSize=%d,%d", - aReflowState.maxSize.width, - aReflowState.maxSize.height)); - - nsIView* view; - GetView(view); - if (nsnull == view) { - static NS_DEFINE_IID(kScrollingViewCID, NS_SCROLLING_VIEW_CID); - static NS_DEFINE_IID(kIViewIID, NS_IVIEW_IID); - - // Get parent view - nsIFrame* parent; - GetParentWithView(parent); - NS_ASSERTION(parent, "GetParentWithView failed"); - nsIView* parentView; - parent->GetView(parentView); - NS_ASSERTION(parentView, "GetParentWithView failed"); - - nsIViewManager* viewManager = parentView->GetViewManager(); - - nsresult rv = NSRepository::CreateInstance(kScrollingViewCID, - nsnull, - kIViewIID, - (void **)&view); - if ((NS_OK != rv) || (NS_OK != view->Init(viewManager, - mRect, - parentView))) { - NS_RELEASE(parentView); - NS_RELEASE(viewManager); - return rv; - } - - // Insert new view as a child of the parent view - viewManager->InsertChild(parentView, view, 0); - NS_RELEASE(viewManager); - - NS_RELEASE(parentView); - SetView(view); - } - if (nsnull == view) { - return NS_OK; - } - NS_RELEASE(view); - - if (nsnull == mFirstChild) { - mFirstChild = new nsScrollBodyFrame(mContent, this); - mChildCount = 1; - } - - // Allow the child frame to be as wide as our max width (minus a - // scroll bar width), and as high as it wants to be. - nsSize maxSize; - nsIDeviceContext* dc = aPresContext->GetDeviceContext(); - maxSize.width = aReflowState.maxSize.width - - NS_TO_INT_ROUND(dc->GetScrollBarWidth()); - NS_RELEASE(dc); - maxSize.height = NS_UNCONSTRAINEDSIZE; - - // Reflow the child - nsReflowMetrics kidMetrics(aDesiredSize.maxElementSize); - nsReflowState kidReflowState(mFirstChild, aReflowState, maxSize); - mFirstChild->WillReflow(*aPresContext); - aStatus = ReflowChild(mFirstChild, aPresContext, kidMetrics, - kidReflowState); - NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status"); - - // Place and size the child - nsRect rect(0, 0, kidMetrics.width, kidMetrics.height); - mFirstChild->SetRect(rect); - mFirstChild->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - - // Determine our size. Our width is our maxWidth and our height is - // either our child's height or our maxHeight if our maxHeight is - // constrained. - aDesiredSize.width = aReflowState.maxSize.width; - if (NS_UNCONSTRAINEDSIZE == aReflowState.maxSize.height) { - aDesiredSize.height = kidMetrics.height; - } - else { - aDesiredSize.height = aReflowState.maxSize.height; - } - - NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, - ("exit nsScrollInnerFrame::Reflow: status=%d width=%d height=%d", - aStatus, aDesiredSize.width, aDesiredSize.height)); - return NS_OK; -} - -NS_IMETHODIMP -nsScrollInnerFrame::ListTag(FILE* out) const -{ - fputs("*scrollinnerframe<", out); - nsIAtom* atom = mContent->GetTag(); - if (nsnull != atom) { - nsAutoString tmp; - atom->ToString(tmp); - fputs(tmp, out); - } - PRInt32 contentIndex; - GetContentIndex(contentIndex); - fprintf(out, ">(%d)@%p", contentIndex, this); - return NS_OK; -} - -//---------------------------------------------------------------------- - -class nsScrollOuterFrame : public nsHTMLContainerFrame { -public: - nsScrollOuterFrame(nsIContent* aContent, nsIFrame* aParent); - - NS_IMETHOD Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus); - - NS_IMETHOD ListTag(FILE* out = stdout) const; - -protected: - virtual PRIntn GetSkipSides() const; -}; - -nsScrollOuterFrame::nsScrollOuterFrame(nsIContent* aContent, nsIFrame* aParent) - : nsHTMLContainerFrame(aContent, aParent) -{ -} - -//XXX incremental reflow pass through -NS_IMETHODIMP -nsScrollOuterFrame::Reflow(nsIPresContext* aPresContext, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, - ("enter nsScrollOuterFrame::Reflow: maxSize=%d,%d", - aReflowState.maxSize.width, - aReflowState.maxSize.height)); - - if (nsnull == mFirstChild) { - mFirstChild = new nsScrollInnerFrame(mContent, this); - mChildCount = 1; - } - - const nsStyleSpacing* spacing = (const nsStyleSpacing*) - mStyleContext->GetStyleData(eStyleStruct_Spacing); - nsMargin borderPadding; - spacing->CalcBorderPaddingFor(this, borderPadding); - nscoord lr = borderPadding.left + borderPadding.right; - nscoord tb = borderPadding.top + borderPadding.bottom; - - // Get style size and determine how much area is available for the - // child (the scroll inner frame) to layout into. - nsSize maxSize, styleSize; - PRIntn sf = nsCSSLayout::GetStyleSize(aPresContext, aReflowState, - styleSize); - if (NS_SIZE_HAS_WIDTH & sf) { - maxSize.width = styleSize.width - lr; - } - else { - maxSize.width = aReflowState.maxSize.width; - } - if (NS_SIZE_HAS_HEIGHT & sf) { - maxSize.height = styleSize.height - tb; - } - else { - maxSize.height = NS_UNCONSTRAINEDSIZE; - } - - // Reflow the child and get its desired size - nsReflowState kidReflowState(mFirstChild, aReflowState, maxSize); - mFirstChild->WillReflow(*aPresContext); - aStatus = ReflowChild(mFirstChild, aPresContext, aDesiredSize, - kidReflowState); - NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status"); - - // Place and size the child - nsRect rect(borderPadding.left, borderPadding.top, - aDesiredSize.width, aDesiredSize.height); - mFirstChild->SetRect(rect); - mFirstChild->DidReflow(*aPresContext, NS_FRAME_REFLOW_FINISHED); - - // The scroll outer frame either shrink wraps around it's single - // child OR uses the style width/height. - if (NS_SIZE_HAS_WIDTH & sf) { - aDesiredSize.width = styleSize.width; - } - else { - aDesiredSize.width += lr; - } - if (NS_SIZE_HAS_HEIGHT & sf) { - aDesiredSize.height = styleSize.height; - } - else { - aDesiredSize.height += tb; - } - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; - - NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, - ("exit nsScrollOuterFrame::Reflow: status=%d width=%d height=%d", - aStatus, aDesiredSize.width, aDesiredSize.height)); - return NS_OK; -} - -NS_IMETHODIMP -nsScrollOuterFrame::ListTag(FILE* out) const -{ - fputs("*scrollouterframe<", out); - nsIAtom* atom = mContent->GetTag(); - if (nsnull != atom) { - nsAutoString tmp; - atom->ToString(tmp); - fputs(tmp, out); - } - PRInt32 contentIndex; - GetContentIndex(contentIndex); - fprintf(out, ">(%d)@%p", contentIndex, this); - return NS_OK; -} - -PRIntn -nsScrollOuterFrame::GetSkipSides() const -{ - return 0; -} - -//---------------------------------------------------------------------- - -nsresult -NS_NewScrollFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIFrame* it = new nsScrollOuterFrame(aContent, aParent); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - *aInstancePtrResult = it; - return NS_OK; -} diff --git a/mozilla/layout/html/base/src/nsScrollFrame.h b/mozilla/layout/html/base/src/nsScrollFrame.h deleted file mode 100644 index b866f4a85df..00000000000 --- a/mozilla/layout/html/base/src/nsScrollFrame.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsScrollFrame_h___ -#define nsScrollFrame_h___ - -#include "nsHTMLContainerFrame.h" - -extern nsresult NS_NewScrollFrame(nsIFrame** aInstancePtrResult, - nsIContent* aContent, - nsIFrame* aParent); - -#endif /* nsScrollFrame_h___ */ diff --git a/mozilla/layout/html/base/src/nsSpacerPart.cpp b/mozilla/layout/html/base/src/nsSpacerPart.cpp deleted file mode 100644 index e7f5cb8ef54..00000000000 --- a/mozilla/layout/html/base/src/nsSpacerPart.cpp +++ /dev/null @@ -1,322 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLTagContent.h" -#include "nsFrame.h" -#include "nsIInlineReflow.h" -#include "nsCSSLineLayout.h" -#include "nsHTMLIIDs.h" -#include "nsIPresContext.h" -#include "nsIPresShell.h" -#include "nsHTMLAtoms.h" -#include "nsUnitConversion.h" -#include "nsIStyleContext.h" -#include "nsStyleConsts.h" - -// Spacer type's -#define TYPE_WORD 0 // horizontal space -#define TYPE_LINE 1 // line-break + vertical space -#define TYPE_IMAGE 2 // acts like a sized image with nothing to see - -class SpacerFrame : public nsFrame, private nsIInlineReflow { -public: - SpacerFrame(nsIContent* aContent, nsIFrame* aParentFrame); - - // nsISupports - NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr); - - // nsIInlineReflow - NS_IMETHOD FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand); - NS_IMETHOD InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aDesiredSize, - const nsReflowState& aReflowState); - -protected: - virtual ~SpacerFrame(); -}; - -class SpacerPart : public nsHTMLTagContent { -public: - SpacerPart(nsIAtom* aTag); - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - virtual void SetAttribute(nsIAtom* aAttribute, const nsString& aValue); - virtual void MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext); - - PRUint8 GetType(); - -protected: - virtual ~SpacerPart(); - nsContentAttr AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const; -}; - -//---------------------------------------------------------------------- - -SpacerFrame::SpacerFrame(nsIContent* aContent, nsIFrame* aParentFrame) - : nsFrame(aContent, aParentFrame) -{ -} - -SpacerFrame::~SpacerFrame() -{ -} - -NS_IMETHODIMP -SpacerFrame::QueryInterface(REFNSIID aIID, void** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIInlineReflowIID)) { - *aInstancePtrResult = (void*) ((nsIInlineReflow*)this); - return NS_OK; - } - return nsFrame::QueryInterface(aIID, aInstancePtrResult); -} - -NS_IMETHODIMP -SpacerFrame::InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState) -{ - nsresult rv = NS_FRAME_COMPLETE; - - // By default, we have no area - aMetrics.width = 0; - aMetrics.height = 0; - aMetrics.ascent = 0; - aMetrics.descent = 0; - - nscoord width = 0; - nscoord height = 0; - SpacerPart* part = (SpacerPart*) mContent;/* XXX decouple */ - PRUint8 type = part->GetType(); - nsContentAttr ca; - if (type != TYPE_IMAGE) { - nsHTMLValue val; - ca = part->GetAttribute(nsHTMLAtoms::size, val); - if (eContentAttr_HasValue == ca) { - width = val.GetPixelValue(); - } - } else { - nsHTMLValue val; - ca = part->GetAttribute(nsHTMLAtoms::width, val); - if (eContentAttr_HasValue == ca) { - if (eHTMLUnit_Pixel == val.GetUnit()) { - width = val.GetPixelValue(); - } - } - ca = part->GetAttribute(nsHTMLAtoms::height, val); - if (eContentAttr_HasValue == ca) { - if (eHTMLUnit_Pixel == val.GetUnit()) { - height = val.GetPixelValue(); - } - } - } - - float p2t = aLineLayout.mPresContext->GetPixelsToTwips(); - switch (type) { - case TYPE_WORD: - if (0 != width) { - aMetrics.width = nscoord(width * p2t); - } - break; - - case TYPE_LINE: - if (0 != width) { - rv = NS_INLINE_LINE_BREAK_AFTER(0); - aMetrics.height = nscoord(width * p2t); - aMetrics.ascent = aMetrics.height; - } - break; - - case TYPE_IMAGE: - aMetrics.width = nscoord(width * p2t); - aMetrics.height = nscoord(height * p2t); - aMetrics.ascent = aMetrics.height; - break; - } - - if (nsnull != aMetrics.maxElementSize) { - aMetrics.maxElementSize->width = aMetrics.width; - aMetrics.maxElementSize->height = aMetrics.height; - } - - return rv; -} - -NS_IMETHODIMP -SpacerFrame::FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand) -{ - aLineLayout.EndTextRun(); - return NS_OK; -} - -//---------------------------------------------------------------------- - -SpacerPart::SpacerPart(nsIAtom* aTag) - : nsHTMLTagContent(aTag) -{ -} - -SpacerPart::~SpacerPart() -{ -} - -nsresult -SpacerPart::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame = new SpacerFrame(this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -PRUint8 -SpacerPart::GetType() -{ - PRUint8 type = TYPE_WORD; - nsHTMLValue value; - if (eContentAttr_HasValue == - nsHTMLTagContent::GetAttribute(nsHTMLAtoms::type, value)) { - if (eHTMLUnit_Enumerated == value.GetUnit()) { - type = value.GetIntValue(); - } - } - return type; -} - -static nsHTMLTagContent::EnumTable kTypeTable[] = { - { "line", TYPE_LINE }, - { "vert", TYPE_LINE }, - { "vertical", TYPE_LINE }, - { "block", TYPE_IMAGE }, - { 0 } -}; - -void -SpacerPart::SetAttribute(nsIAtom* aAttribute, const nsString& aValue) -{ - nsHTMLValue val; - if (aAttribute == nsHTMLAtoms::type) { - if (ParseEnumValue(aValue, kTypeTable, val)) { - nsHTMLTagContent::SetAttribute(aAttribute, val); - } - } - else if (aAttribute == nsHTMLAtoms::size) { - ParseValue(aValue, 0, val, eHTMLUnit_Pixel); - nsHTMLTagContent::SetAttribute(aAttribute, val); - } - else if (aAttribute == nsHTMLAtoms::align) { - ParseAlignParam(aValue, val); - nsHTMLTagContent::SetAttribute(aAttribute, val); - } - else if ((aAttribute == nsHTMLAtoms::width) || - (aAttribute == nsHTMLAtoms::height)) { - ParseValueOrPercent(aValue, val, eHTMLUnit_Pixel); - nsHTMLTagContent::SetAttribute(aAttribute, val); - } - else { - nsHTMLTagContent::SetAttribute(aAttribute, aValue); - } -} - -void -SpacerPart::MapAttributesInto(nsIStyleContext* aContext, - nsIPresContext* aPresContext) -{ - if (nsnull != mAttributes) { - nsHTMLValue value; - nsStyleDisplay* display = (nsStyleDisplay*) - aContext->GetMutableStyleData(eStyleStruct_Display); - GetAttribute(nsHTMLAtoms::align, value); - if (eHTMLUnit_Enumerated == value.GetUnit()) { - switch (value.GetIntValue()) { - case NS_STYLE_TEXT_ALIGN_LEFT: - display->mFloats = NS_STYLE_FLOAT_LEFT; - break; - case NS_STYLE_TEXT_ALIGN_RIGHT: - display->mFloats = NS_STYLE_FLOAT_RIGHT; - break; - default: - break; - } - } - PRUint8 type = GetType(); - switch (type) { - case TYPE_WORD: - case TYPE_IMAGE: - break; - - case TYPE_LINE: - // This is not strictly 100% compatible: if the spacer is given - // a width of zero then it is basically ignored. - display->mDisplay = NS_STYLE_DISPLAY_BLOCK; - break; - } - } -} - -nsContentAttr -SpacerPart::AttributeToString(nsIAtom* aAttribute, - nsHTMLValue& aValue, - nsString& aResult) const -{ - if (aAttribute == nsHTMLAtoms::align) { - if (eHTMLUnit_Enumerated == aValue.GetUnit()) { - EnumValueToString(aValue, kTypeTable, aResult); - return eContentAttr_HasValue; - } - } - else if (aAttribute == nsHTMLAtoms::type) { - if (eHTMLUnit_Enumerated == aValue.GetUnit()) { - AlignParamToString(aValue, aResult); - return eContentAttr_HasValue; - } - } - return eContentAttr_NotThere; -} - -nsresult -NS_NewHTMLSpacer(nsIHTMLContent** aInstancePtrResult, nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* it = new SpacerPart(aTag); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void**) aInstancePtrResult); -} diff --git a/mozilla/layout/html/base/src/nsTextContent.cpp b/mozilla/layout/html/base/src/nsTextContent.cpp deleted file mode 100644 index bd43223135d..00000000000 --- a/mozilla/layout/html/base/src/nsTextContent.cpp +++ /dev/null @@ -1,1705 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsCRT.h" -#include "nsSplittableFrame.h" -#include "nsIInlineReflow.h" -#include "nsCSSLineLayout.h" -#include "nsHTMLContent.h" -#include "nsString.h" -#include "nsIPresContext.h" -#include "nsStyleConsts.h" -#include "nsIStyleContext.h" -#include "nsCoord.h" -#include "nsIFontMetrics.h" -#include "nsIRenderingContext.h" -#include "nsHTMLIIDs.h" -#include "nsIPresShell.h" -#include "nsIView.h" -#include "nsIViewManager.h" -#include "nsITimerCallback.h" -#include "nsITimer.h" -#include "prtime.h" -#include "nsVoidArray.h" -#include "prprf.h" -#include "nsIDOMText.h" -#include "nsIDocument.h" - -// Selection includes -#include "nsISelection.h" -#include "nsSelectionRange.h" - -#define gCalcDebug 0 - -PRBool IsInRange(nsIContent * aStart, nsIContent * aEnd, nsIContent * aContent); - - -#ifdef NS_DEBUG -#undef NOISY -#undef NOISY_BLINK -#else -#undef NOISY -#undef NOISY_BLINK -#endif - -// XXX TODO: -// 0. re-implement justified text -// 1. add in a rendering method that can render justified text -// 2. text renderer should negotiate with rendering context/font -// metrics to see what it can handle; for example, if the renderer can -// automatically deal with underlining, strikethrough, justification, -// etc, then the text renderer should let the rc do the work; -// otherwise there should be XP fallback code here. - -// XXX TODO: -// implement nsIFrame::Reflow - -// XXX Speedup ideas -// 1. justified text can use word width information during resize reflows -// 2. when we are doing an unconstrained reflow we know we are going to -// get reflowed again; collect up the word widths we are computing as we -// do this and then save them in the mWords; later on when we get reflowed -// again we can destroy them -// 3. when pulling up text get word width information from next-in-flow - -// XXX temporary -#define XP_IS_SPACE(_ch) \ - (((_ch) == ' ') || ((_ch) == '\t') || ((_ch) == '\n')) - -// XXX need more of this in nsIFontMetrics.GetWidth -#define CH_NBSP 160 - -// XXX use a PreTextFrame for pre-formatted text? - -#if 0 -static NS_DEFINE_IID(kITextContentIID, NS_ITEXTCONTENT_IID); -#endif - -static NS_DEFINE_IID(kIScriptObjectOwner, NS_ISCRIPTOBJECTOWNER_IID); - -class TextFrame; - -class TextTimer : public nsITimerCallback { -public: - TextTimer(); - ~TextTimer(); - - NS_DECL_ISUPPORTS - - void AddFrame(TextFrame* aFrame); - - PRBool RemoveFrame(TextFrame* aFrame); - - PRInt32 FrameCount(); - - void Start(); - - void Stop(); - - virtual void Notify(nsITimer *timer); - - nsITimer* mTimer; - nsVoidArray mFrames; -}; - -class TextFrame : public nsSplittableFrame, private nsIInlineReflow { -public: - TextFrame(nsIContent* aContent, nsIFrame* aParentFrame); - - // nsISupports - NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr); - - // nsIFrame - NS_IMETHOD Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); - NS_IMETHOD GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor); - NS_IMETHOD ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent); - NS_IMETHOD List(FILE* out, PRInt32 aIndent) const; - NS_IMETHOD ListTag(FILE* out) const; - - // nsIInlineReflow - NS_IMETHOD FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand); - NS_IMETHOD InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState); - - // TextFrame methods - PRInt32 GetPosition(nsIPresContext& aCX, - nsGUIEvent* aEvent, - nsIFrame * aNewFrame); - - void CalcCursorPosition(nsIPresContext& aPresContext, - nsGUIEvent* aEvent, - TextFrame * aNewFrame, - PRInt32 & aOffset, - PRInt32 & aWidth); - - void CalcActualPosition(PRUint32 &aMsgType, - const PRUnichar* aCPStart, - const PRUnichar* aCP, - PRInt32 & aOffset, - PRInt32 & aWidth, - nsIFontMetrics * aFM); - - PRInt32 GetContentOffset() { return mContentOffset;} - PRInt32 GetContentLength() { return mContentLength;} - -protected: - virtual ~TextFrame(); - - void PaintRegularText(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect, - nscoord dx, nscoord dy); - - nsInlineReflowStatus ReflowPre(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState, - const nsStyleFont& aFont, - PRInt32 aStartingOffset); - - nsInlineReflowStatus ReflowNormal(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState, - const nsStyleFont& aFontStyle, - const nsStyleText& aTextStyle, - PRInt32 aStartingOffset); - -public: - PRInt32 mContentOffset; - PRInt32 mContentLength; - - // XXX need a better packing - PRUint32 mFlags; - PRUint32 mColumn; -}; - -// Flag information used by rendering code. This information is -// computed by the ResizeReflow code. Remaining bits are used by the -// tab count. -#define TEXT_SKIP_LEADING_WS 0x01 -#define TEXT_HAS_MULTIBYTE 0x02 -#define TEXT_IS_PRE 0x04 -#define TEXT_BLINK_ON 0x08 -#define TEXT_ENDS_IN_WHITESPACE 0x10 - -#define TEXT_GET_TAB_COUNT(_mf) ((_mf) >> 5) -#define TEXT_SET_TAB_COUNT(_mf,_tabs) (_mf) = (_mf) | ((_tabs)<< 5) - -#if XXX -// mWords bit definitions -#define WORD_IS_WORD 0x80000000L -#define WORD_IS_SPACE 0x00000000L -#define WORD_LENGTH_MASK 0x000000FFL -#define WORD_LENGTH_SHIFT 0 -#define WORD_WIDTH_MASK 0x7FFFFF00L -#define WORD_WIDTH_SHIFT 8 -#define MAX_WORD_LENGTH 256 -#define MAX_WORD_WIDTH 0x7FFFFFL - -#define GET_WORD_LENGTH(_wi) \ - ((PRIntn) (((_wi) & WORD_LENGTH_MASK)/* >> WORD_LENGTH_SHIFT*/)) -#define GET_WORD_WIDTH(_wi) \ - ((nscoord) ((PRUint32(_wi) & WORD_WIDTH_MASK) >> WORD_WIDTH_SHIFT)) -#endif - -class Text : public nsHTMLContent, public nsIDOMText { -public: - Text(const PRUnichar* aText, PRInt32 aLength); - - NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr); - NS_IMETHOD_(nsrefcnt) AddRef(void); - NS_IMETHOD_(nsrefcnt) Release(void); - -#if 0 - virtual PRInt32 GetLength(); - virtual void GetText(nsStringBuf* aBuf, PRInt32 aOffset, PRInt32 aCount); -#endif - - virtual void List(FILE* out, PRInt32 aIndent) const; - - virtual void ToHTMLString(nsString& aBuf) const; - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - - // nsIScriptObjectOwner interface - NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject); - - // nsIDOMText interface - NS_IMETHOD GetNodeType(PRInt32 *aType); - NS_IMETHOD GetParentNode(nsIDOMNode **aNode); - NS_IMETHOD GetChildNodes(nsIDOMNodeIterator **aIterator); - NS_IMETHOD HasChildNodes(PRBool *aReturn); - NS_IMETHOD GetFirstChild(nsIDOMNode **aNode); - NS_IMETHOD GetPreviousSibling(nsIDOMNode **aNode); - NS_IMETHOD GetNextSibling(nsIDOMNode **aNode); - NS_IMETHOD InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild); - NS_IMETHOD ReplaceChild(nsIDOMNode *newChild, - nsIDOMNode *oldChild); - NS_IMETHOD RemoveChild(nsIDOMNode *oldChild); - NS_IMETHOD GetData(nsString& aString); - NS_IMETHOD SetData(nsString& aString); - NS_IMETHOD Append(nsString& aData); - NS_IMETHOD Insert(PRInt32 offset, nsString& aData); - NS_IMETHOD Delete(PRInt32 offset, PRInt32 count); - NS_IMETHOD Replace(PRInt32 offset, PRInt32 count, nsString& aData); - NS_IMETHOD Splice(nsIDOMElement *element, PRInt32 offset, PRInt32 count); - - void ToCString(nsString& aBuf, PRInt32 aOffset, PRInt32 aLen) const; - - PRUnichar* mText; - PRInt32 mLength; - -protected: - Text(); - virtual ~Text(); -}; - -//---------------------------------------------------------------------- - -static PRBool gBlinkTextOff; -static TextTimer* gTextBlinker; -#ifdef NOISY_BLINK -static PRTime gLastTick; -#endif - -TextTimer::TextTimer() -{ - NS_INIT_REFCNT(); - mTimer = nsnull; -} - -TextTimer::~TextTimer() -{ - Stop(); -} - -void TextTimer::Start() -{ - nsresult rv = NS_NewTimer(&mTimer); - if (NS_OK == rv) { - mTimer->Init(this, 750); - } -} - -void TextTimer::Stop() -{ - NS_IF_RELEASE(mTimer); -} - -static NS_DEFINE_IID(kITimerCallbackIID, NS_ITIMERCALLBACK_IID); -NS_IMPL_ISUPPORTS(TextTimer, kITimerCallbackIID); - -void TextTimer::AddFrame(TextFrame* aFrame) { - mFrames.AppendElement(aFrame); - if (1 == mFrames.Count()) { - Start(); - } -printf("%d blinking frames [add %p]\n", mFrames.Count(), aFrame); -} - -PRBool TextTimer::RemoveFrame(TextFrame* aFrame) { - PRBool rv = mFrames.RemoveElement(aFrame); - if (0 == mFrames.Count()) { - Stop(); - } -printf("%d blinking frames [remove %p] [%s]\n", - mFrames.Count(), aFrame, rv ? "true" : "FALSE"); - return rv; -} - -PRInt32 TextTimer::FrameCount() { - return mFrames.Count(); -} - -void TextTimer::Notify(nsITimer *timer) -{ - // Toggle blink state bit so that text code knows whether or not to - // render. All text code shares the same flag so that they all blink - // in unison. - gBlinkTextOff = PRBool(!gBlinkTextOff); - - // XXX hack to get auto-repeating timers; restart before doing - // expensive work so that time between ticks is more even - Stop(); - Start(); - -#ifdef NOISY_BLINK - PRTime now = PR_Now(); - char buf[50]; - PRTime delta; - LL_SUB(delta, now, gLastTick); - gLastTick = now; - PR_snprintf(buf, sizeof(buf), "%lldusec", delta); - printf("%s\n", buf); -#endif - - PRInt32 i, n = mFrames.Count(); - for (i = 0; i < n; i++) { - TextFrame* text = (TextFrame*) mFrames.ElementAt(i); - - // Determine damaged area and tell view manager to redraw it - nsPoint offset; - nsRect bounds; - text->GetRect(bounds); - nsIView* view; - text->GetOffsetFromView(offset, view); - nsIViewManager* vm = view->GetViewManager(); - bounds.x = offset.x; - bounds.y = offset.y; - vm->UpdateView(view, bounds, 0); - NS_RELEASE(vm); - NS_RELEASE(view); - } -} - -//---------------------------------------------------------------------- - -TextFrame::TextFrame(nsIContent* aContent, nsIFrame* aParentFrame) - : nsSplittableFrame(aContent, aParentFrame) -{ - if (nsnull == gTextBlinker) { - // Create text timer the first time out - gTextBlinker = new TextTimer(); - } - NS_ADDREF(gTextBlinker); -} - -TextFrame::~TextFrame() -{ - if (0 != (mFlags & TEXT_BLINK_ON)) { - NS_ASSERTION(nsnull != gTextBlinker, "corrupted blinker"); - gTextBlinker->RemoveFrame(this); - } - if (0 == gTextBlinker->Release()) { - // Release text timer when the last text frame is gone - gTextBlinker = nsnull; - } -} - -NS_IMETHODIMP -TextFrame::QueryInterface(REFNSIID aIID, void** aInstancePtrResult) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - if (aIID.Equals(kIInlineReflowIID)) { - *aInstancePtrResult = (void*) ((nsIInlineReflow*)this); - return NS_OK; - } - return nsFrame::QueryInterface(aIID, aInstancePtrResult); -} - -NS_METHOD TextFrame::GetCursorAt(nsIPresContext& aPresContext, - const nsPoint& aPoint, - nsIFrame** aFrame, - PRInt32& aCursor) -{ - aCursor = NS_STYLE_CURSOR_IBEAM; - return NS_OK; -} - -NS_METHOD TextFrame::ContentChanged(nsIPresShell* aShell, - nsIPresContext* aPresContext, - nsIContent* aChild, - nsISupports* aSubContent) -{ - // Generate a reflow command with this frame as the target frame - nsIReflowCommand* cmd; - nsresult result; - - result = NS_NewHTMLReflowCommand(&cmd, this, nsIReflowCommand::ContentChanged); - if (NS_OK == result) { - aShell->AppendReflowCommand(cmd); - NS_RELEASE(cmd); - } - - return result; -} - -// XXX it would be nice to use a method pointer here, but I don't want -// to pay for the storage. - -NS_METHOD TextFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) -{ - if ((0 != (mFlags & TEXT_BLINK_ON)) && gBlinkTextOff) { - return NS_OK; - } - - const nsStyleDisplay* disp = - (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); - - if (disp->mVisible) { - // Get style data - const nsStyleColor* color = - (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - const nsStyleFont* font = - (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); - - // Set font and color - aRenderingContext.SetColor(color->mColor); - aRenderingContext.SetFont(font->mFont); - PaintRegularText(aPresContext, aRenderingContext, aDirtyRect, 0, 0); - -#if XXX - if (font->mThreeD) { - nscoord onePixel = nscoord(1.0f * aPresContext.GetPixelsToTwips()); - aRenderingContext.SetColor(color->mBackgroundColor); - PaintRegularText(aPresContext, aRenderingContext, aDirtyRect, onePixel, onePixel); - } -#endif - } - - return NS_OK; -} - -void -TextFrame::PaintRegularText(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect, - nscoord dx, nscoord dy) -{ - // Skip leading space if necessary - Text* txt = (Text*) mContent; - const PRUnichar* cp = txt->mText + mContentOffset; - const PRUnichar* end = cp + mContentLength; - if ((mFlags & TEXT_SKIP_LEADING_WS) != 0) { - while (cp < end) { - PRUnichar ch = *cp++; - if (!XP_IS_SPACE(ch)) { - cp--; - break; - } - } - } - - if ((mFlags & TEXT_IS_PRE) != 0) { - if ((mFlags & TEXT_HAS_MULTIBYTE) != 0) { - // XXX to be written - } else { - PRIntn tabs = TEXT_GET_TAB_COUNT(mFlags); - - // Make a copy of the text we are to render, translating tabs - // into whitespace. - char buf[100]; - char* s = buf; - char* s0 = s; - PRInt32 maxLen = (end - cp) + 8*tabs; - if (maxLen > sizeof(buf)) { - s0 = s = new char[maxLen]; - } - - // Translate tabs into whitespace; translate other whitespace into - // spaces. - PRIntn col = (PRIntn) mColumn; - while (cp < end) { - PRUint8 ch = (PRUint8) *cp++; - if (XP_IS_SPACE(ch)) { - if (ch == '\t') { - PRIntn spaces = 8 - (col & 7); - col += spaces; - while (--spaces >= 0) { - *s++ = ' '; - } - continue; - } else { - *s++ = ' '; - } - } else if (ch == CH_NBSP) { - *s++ = ' '; - } else { - *s++ = ch; - } - col++; - } - - // Get Selection Object - nsIPresShell * shell = aPresContext.GetShell(); - nsIDocument * doc = shell->GetDocument(); - nsISelection * selection = doc->GetSelection(); - nsSelectionRange * range = selection->GetRange(); - - NS_RELEASE(shell); - NS_RELEASE(doc); - NS_RELEASE(selection); - - - if (IsInRange(range->GetStartContent(), range->GetEndContent(), mContent)) { - nsRect rect; - GetRect(rect); - rect.width--; - rect.height--; - - nsIFontMetrics * fm = aRenderingContext.GetFontMetrics(); - - aRenderingContext.SetColor(NS_RGB(0,0,0)); - aRenderingContext.FillRect(rect); - - aRenderingContext.SetColor(NS_RGB(255,255,255)); - - // Render the text - aRenderingContext.DrawString(s0, s - s0, dx, dy, mRect.width); - const nsStyleColor* color = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - aRenderingContext.SetColor(color->mColor); - } else { - // Render the text - const nsStyleColor* color = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - aRenderingContext.SetColor(color->mColor); - aRenderingContext.DrawString(s0, s - s0, dx, dy, mRect.width); - } - - if (s0 != buf) { - delete[] s0; - } - } - } else { - if ((mFlags & TEXT_HAS_MULTIBYTE) != 0) { - // XXX to be written - } else { - // Make a copy of the text we are to render, compressing out - // whitespace; translating whitespace to literal spaces; - // eliminating trailing whitespace. - char buf[100]; - char* s = buf; - char* s0 = s; - PRInt32 maxLen = end - cp; - if (maxLen > sizeof(buf)) { - s0 = s = new char[maxLen]; - } - - // Compress down the whitespace - while (cp < end) { - PRUint8 ch = (PRUint8) *cp++; - if (XP_IS_SPACE(ch)) { - while (cp < end) { - ch = (PRUint8) *cp++; - if (!XP_IS_SPACE(ch)) { - cp--; - break; - } - } - *s++ = ' '; - } else { - *s++ = ch; - } - } - - // Get Selection Object - nsIPresShell * shell = aPresContext.GetShell(); - nsIDocument * doc = shell->GetDocument(); - nsISelection * selection = doc->GetSelection(); - nsSelectionRange * range = selection->GetRange(); - - NS_RELEASE(shell); - NS_RELEASE(doc); - NS_RELEASE(selection); - - if (IsInRange(range->GetStartContent(), range->GetEndContent(), mContent)) { - nsRect rect; - GetRect(rect); - rect.width--; - rect.height--; - - nsIFontMetrics * fm = aRenderingContext.GetFontMetrics(); - - aRenderingContext.SetColor(NS_RGB(0,0,0)); - aRenderingContext.FillRect(rect); - - aRenderingContext.SetColor(NS_RGB(255,255,255)); - - // Render the text - aRenderingContext.DrawString(s0, s - s0, dx, dy, mRect.width); - const nsStyleColor* color = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - aRenderingContext.SetColor(color->mColor); - } else { - // Render the text - const nsStyleColor* color = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); - aRenderingContext.SetColor(color->mColor); - aRenderingContext.DrawString(s0, s - s0, dx, dy, mRect.width); - } - - if (s0 != buf) { - delete[] s0; - } - } - } -} - -NS_IMETHODIMP -TextFrame::FindTextRuns(nsCSSLineLayout& aLineLayout, - nsIReflowCommand* aReflowCommand) -{ - if (nsnull == mPrevInFlow) { - aLineLayout.AddText(this); - } - return NS_OK; -} - -NS_IMETHODIMP -TextFrame::InlineReflow(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState) -{ - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("enter TextFrame::Reflow: aMaxSize=%d,%d", - aReflowState.maxSize.width, aReflowState.maxSize.height)); - - // Get starting offset into the content - PRInt32 startingOffset = 0; - if (nsnull != mPrevInFlow) { - TextFrame* prev = (TextFrame*) mPrevInFlow; - startingOffset = prev->mContentOffset + prev->mContentLength; - } - - const nsStyleFont* font = - (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font); - - // Initialize mFlags (without destroying the TEXT_BLINK_ON bit) bits - // that are filled in by the reflow routines. - mFlags &= TEXT_BLINK_ON; - if (font->mFont.decorations & NS_STYLE_TEXT_DECORATION_BLINK) { - if (0 == (mFlags & TEXT_BLINK_ON)) { - mFlags |= TEXT_BLINK_ON; - gTextBlinker->AddFrame(this); - } - } - - const nsStyleText* text = - (const nsStyleText*)mStyleContext->GetStyleData(eStyleStruct_Text); - - nsInlineReflowStatus rs; - if (NS_STYLE_WHITESPACE_PRE == text->mWhiteSpace) { - // Use a specialized routine for pre-formatted text - rs = ReflowPre(aLineLayout, aMetrics, aReflowState, - *font, startingOffset); - } else { - // Use normal wrapping routine for non-pre text (this includes - // text that is not wrapping) - rs = ReflowNormal(aLineLayout, aMetrics, aReflowState, - *font, *text, startingOffset); - } - - NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS, - ("exit TextFrame::Reflow: rv=%x width=%d", - rs, aMetrics.width)); - return rs; -} - -// Reflow normal text (stuff that doesn't have to deal with horizontal -// tabs). Normal text reflow may or may not wrap depending on the -// "whiteSpace" style property. -nsInlineReflowStatus -TextFrame::ReflowNormal(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState, - const nsStyleFont& aFont, - const nsStyleText& aTextStyle, - PRInt32 aStartingOffset) -{ - Text* txt = (Text*) mContent; - const PRUnichar* cp = txt->mText + aStartingOffset; - const PRUnichar* end = cp + txt->mLength - aStartingOffset; - const PRUnichar* cpStart = cp; - mContentOffset = aStartingOffset; - - nsIFontMetrics* fm = aLineLayout.mPresContext->GetMetricsFor(aFont.mFont); - PRInt32 spaceWidth = fm->GetWidth(' '); - PRBool wrapping = PR_TRUE; - if (NS_STYLE_WHITESPACE_NORMAL != aTextStyle.mWhiteSpace) { - wrapping = PR_FALSE; - } - - // Set whitespace skip flag - PRBool skipWhitespace = PR_FALSE; - if (aLineLayout.GetSkipLeadingWhiteSpace()) { - skipWhitespace = PR_TRUE; - mFlags |= TEXT_SKIP_LEADING_WS; - } - - // Try to fit as much of the text as possible. Note that if we are - // at the left margin then the first word always fits. In addition, - // we compute the size of the largest word that we contain. If we - // end up containing nothing (because there isn't enough space for - // the first word) then we still compute the size of that first - // non-fitting word. - - // XXX XP_IS_SPACE must not return true for the unicode   character - // XXX what about &zwj and it's cousins? - nscoord x = 0; - nscoord maxWidth = aReflowState.maxSize.width; - nscoord maxWordWidth = 0; - const PRUnichar* lastWordEnd = cpStart; - const PRUnichar* lastWordStart = cpStart; - PRBool hasMultibyte = PR_FALSE; - PRBool endsInWhitespace = PR_FALSE; - - while (cp < end) { - PRUnichar ch = *cp++; - PRBool isWhitespace; - nscoord width; - if (XP_IS_SPACE(ch)) { - // Compress whitespace down to a single whitespace - while (cp < end) { - ch = *cp; - if (XP_IS_SPACE(ch)) { - cp++; - continue; - } - break; - } - if (skipWhitespace) { -#if XXX_fix_me - aLineLayout->AtSpace(); -#endif - skipWhitespace = PR_FALSE; - continue; - } - width = spaceWidth; - isWhitespace = PR_TRUE; - } else { - // The character is not a space character. Find the end of the - // word and then measure it. - if (ch >= 256) { - hasMultibyte = PR_TRUE; - } - const PRUnichar* wordStart = cp - 1; - lastWordStart = wordStart; - while (cp < end) { - ch = *cp; - if (ch >= 256) { - hasMultibyte = PR_TRUE; - } - if (!XP_IS_SPACE(ch)) { - cp++; - continue; - } - break; - } - width = fm->GetWidth(wordStart, PRUint32(cp - wordStart)); - skipWhitespace = PR_FALSE; - isWhitespace = PR_FALSE; - } - - // Now that we have the end of the word or whitespace, see if it - // will fit. - if ((0 != x) && wrapping && (x + width > maxWidth)) { - // The word/whitespace will not fit. - cp = lastWordEnd; - break; - } - -#if XXX_fix_me - // Update break state in line reflow state - // XXX move this out of the loop! - if (isWhitespace) { - aLineLayout.AtSpace(); - } - else { - aLineLayout.AtWordStart(this, x); - } -#endif - - // The word fits. Add it to the run of text. - x += width; - if (width > maxWordWidth) { - maxWordWidth = width; - } - lastWordEnd = cp; - endsInWhitespace = isWhitespace; - } - - if (hasMultibyte) { - mFlags |= TEXT_HAS_MULTIBYTE; - } - if (endsInWhitespace) { - mFlags |= TEXT_ENDS_IN_WHITESPACE; - } - - if (0 == x) { - // Since we collapsed into nothingness (all our whitespace - // is ignored) leave the aState->mSkipLeadingWhiteSpace - // flag alone since it doesn't want leading whitespace - } - else { - aLineLayout.SetSkipLeadingWhiteSpace(endsInWhitespace); - } - - // XXX too much code here: some of it isn't needed - // Now we know our content length - mContentLength = lastWordEnd - cpStart; - if (0 == mContentLength) { - if (cp == end) { - // The entire chunk of text was whitespace that we skipped over. - aMetrics.width = 0; - aMetrics.height = 0; - aMetrics.ascent = 0; - aMetrics.descent = 0; - mContentLength = end - cpStart; - if (nsnull != aMetrics.maxElementSize) { - aMetrics.maxElementSize->width = 0; - aMetrics.maxElementSize->height = 0; - } - NS_RELEASE(fm); - return NS_FRAME_COMPLETE; - } - } - - // Set desired size to the computed size - aMetrics.width = x; - aMetrics.height = fm->GetHeight(); - aMetrics.ascent = fm->GetMaxAscent(); - aMetrics.descent = fm->GetMaxDescent(); - if (!wrapping) { - maxWordWidth = x; - } - if (nsnull != aMetrics.maxElementSize) { - aMetrics.maxElementSize->width = maxWordWidth; - aMetrics.maxElementSize->height = fm->GetHeight(); - } - NS_RELEASE(fm); - return (cp == end) ? NS_FRAME_COMPLETE : NS_FRAME_NOT_COMPLETE; -} - -nsInlineReflowStatus -TextFrame::ReflowPre(nsCSSLineLayout& aLineLayout, - nsReflowMetrics& aMetrics, - const nsReflowState& aReflowState, - const nsStyleFont& aFont, - PRInt32 aStartingOffset) -{ - nsInlineReflowStatus rs = NS_FRAME_COMPLETE; - - Text* txt = (Text*) mContent; - const PRUnichar* cp = txt->mText + aStartingOffset; - const PRUnichar* cpStart = cp; - const PRUnichar* end = cp + txt->mLength - aStartingOffset; - - mFlags |= TEXT_IS_PRE; - nsIFontMetrics* fm = aLineLayout.mPresContext->GetMetricsFor(aFont.mFont); - const PRInt32* widths = fm->GetWidths(); - PRInt32 width = 0; - PRBool hasMultibyte = PR_FALSE; - PRUint16 tabs = 0; - PRUint16 col = aLineLayout.GetColumn(); - mColumn = col; - nscoord spaceWidth = widths[' ']; - - while (cp < end) { - PRUnichar ch = *cp++; - if (ch == '\n') { - rs = (cp == end) - ? NS_INLINE_LINE_BREAK_AFTER(NS_FRAME_COMPLETE) - : NS_INLINE_LINE_BREAK_AFTER(NS_FRAME_NOT_COMPLETE); - break; - } - if (ch == '\t') { - // Advance to next tab stop - PRIntn spaces = 8 - (col & 7); - width += spaces * spaceWidth; - col += spaces; - tabs++; - continue; - } - if (ch == CH_NBSP) { - width += spaceWidth; - col++; - continue; - } - if (ch < 256) { - width += widths[ch]; - } else { - widths += fm->GetWidth(ch); - hasMultibyte = PR_TRUE; - } - col++; - } - aLineLayout.SetColumn(col); - if (hasMultibyte) { - mFlags |= TEXT_HAS_MULTIBYTE; - } - TEXT_SET_TAB_COUNT(mFlags, tabs); - - mContentOffset = aStartingOffset; - mContentLength = cp - cpStart; - aMetrics.width = width; - aMetrics.height = fm->GetHeight(); - aMetrics.ascent = fm->GetMaxAscent(); - aMetrics.descent = fm->GetMaxDescent(); - if (nsnull != aMetrics.maxElementSize) { - aMetrics.maxElementSize->width = aMetrics.width; - aMetrics.maxElementSize->height = aMetrics.height; - } - NS_RELEASE(fm); - - return rs; -} - -//-------------------------------------------------------------------------- -// CalcActualPosition -// This finds the actual interger offset into the text and the width of the -// offset in Twips -//-------------------------------------------------------------------------- -void TextFrame::CalcActualPosition(PRUint32 &aMsgType, - const PRUnichar* aCPStart, - const PRUnichar* aCP, - PRInt32 & aOffset, - PRInt32 & aWidth, - nsIFontMetrics * aFM) { - - //printf("**STOPPED! Offset is [%d][%d]\n", width, PRUint32(cp - cpStart)); - - if (aMsgType == NS_MOUSE_LEFT_BUTTON_UP || aMsgType == NS_MOUSE_MOVE) { - aOffset = PRUint32(aCP - aCPStart); - aWidth = aFM->GetWidth(aCPStart, aOffset-1); - } else if (aMsgType == NS_MOUSE_LEFT_BUTTON_DOWN) { - aOffset = PRUint32(aCP - aCPStart)-1; - if (aOffset == 0) { - aWidth = 0; - } else { - aWidth = aFM->GetWidth(aCPStart, aOffset); - } - } -} - -//-------------------------------------------------------------------------- -//-- GetPosition -//-------------------------------------------------------------------------- -PRInt32 TextFrame::GetPosition(nsIPresContext& aCX, - nsGUIEvent * aEvent, - nsIFrame * aNewFrame) { - - PRInt32 offset; - PRInt32 width; - CalcCursorPosition(aCX, aEvent, (TextFrame *)aNewFrame, offset, width); - offset += ((TextFrame *)aNewFrame)->GetContentOffset(); - - return offset; -} - - -//-------------------------------------------------------------------------- -//-- CalcCursorPosition -//-------------------------------------------------------------------------- -void TextFrame::CalcCursorPosition(nsIPresContext& aCX, - nsGUIEvent* aEvent, - TextFrame * aNewFrame, - PRInt32 & aOffset, - PRInt32 & aWidth) { - - - if (gCalcDebug) printf("Cursor Point [%d,%d]\n", aEvent->point.x, aEvent->point.y); - - // Get starting offset into the content - PRInt32 startingOffset = 0; - if (nsnull != aNewFrame->GetPrevInFlow()) { - TextFrame* prev = (TextFrame*) aNewFrame->GetPrevInFlow(); - startingOffset = prev->GetContentOffset() + prev->GetContentLength(); - } - -//XXX // Get cached state for containing block frame -// if (nsnull != aLineLayout) { -// aLineLayout->mReflowResult = NS_LINE_LAYOUT_REFLOW_RESULT_AWARE; -// } - - nsIContent * content; - GetContent(content); - - Text* txt = (Text*) content; - - const PRUnichar* cp = txt->mText + startingOffset; - const PRUnichar* end = cp + txt->mLength - startingOffset; - const PRUnichar* cpStart = cp; - //mContentOffset = startingOffset; - - nsIStyleContext * styleContext; - - aNewFrame->GetStyleContext(&aCX, styleContext); - const nsStyleFont *font = (const nsStyleFont*)styleContext->GetStyleData(eStyleStruct_Font); - const nsStyleText *styleText = (const nsStyleText*)styleContext->GetStyleData(eStyleStruct_Text); - NS_RELEASE(styleContext); - - nsIFontMetrics* fm = aCX.GetMetricsFor(font->mFont); - PRInt32 spaceWidth = fm->GetWidth(' '); - PRBool atLeftMargin = PR_TRUE; - PRBool wrapping = PR_TRUE; - if (NS_STYLE_WHITESPACE_NORMAL != styleText->mWhiteSpace) { - wrapping = PR_FALSE; - } - - // Set whitespace skip flag - PRBool skipWhitespace = PR_FALSE; -#if XXX_wont_work - if (nsnull != aLineLayout) { - if (aLineLayout->SkipLeadingWhiteSpace()) { - skipWhitespace = PR_TRUE; - mFlags |= TEXT_SKIP_LEADING_WS; - } - } -#endif - - // Try to fit as much of the text as possible. Note that if we are - // at the left margin then the first word always fits. In addition, - // we compute the size of the largest word that we contain. If we - // end up containing nothing (because there isn't enough space for - // the first word) then we still compute the size of that first - // non-fitting word. - - // XXX XP_IS_SPACE must not return PR_TRUE for the unicode   character - // XXX what about &zwj and it's cousins? - nscoord x = 0; - nscoord maxWidth = 100000;//aMaxSize.width; - nscoord width = 0; - nscoord maxWordWidth = 0; - - const PRUnichar* lastWordEnd = cpStart; - - int w = 0; - while (cp < end) { - width = fm->GetWidth(cpStart, PRUint32(cp - cpStart)); - - if (gCalcDebug) printf("Cursor %d ******>> Width %d Pos: %d end: %d \n", aEvent->point.x, - width, - PRUint32(cp - cpStart), - end-cpStart); - if (width >= aEvent->point.x) { - if (gCalcDebug) printf("*********************************\n*STOPPED**! Offset is [%d][%d]\n", width, PRUint32(cp - cpStart)); - if (gCalcDebug) printf("**********************************\n"); - CalcActualPosition(aEvent->message, cpStart, cp, aOffset, aWidth, fm); - - //--------- Major Debugging ---- - /*if (aEvent->message == NS_MOUSE_MOVE || - aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) { - int len = txt->mLength - startingOffset; - - //printf("Len %d\n", len); - PRUnichar buf0[256]; - PRUnichar buf1[256]; - PRUnichar buf2[256]; - const PRUnichar* start = txt->mText + startingOffset; - - printf("mStart %d mEnd %d len %d\n", mStartSelect, mEndSelect, len); - - for (PRUint32 i=0;i 4) { - int x = 0; - x++; - } - printf("\n%d>", mEndSelect-mStartSelect); - buf0[i] = 0; - for (i=0;i", len-mEndSelect); - buf1[i] = 0; - for (i=0;iGetWidth(cpStart, PRUint32(mStartSelect)); - int l1 = fm->GetWidth(cpStart+mStartSelect, PRUint32(mEndSelect-mStartSelect)); - int l2 = fm->GetWidth(cpStart+mEndSelect, PRUint32(len-mEndSelect)); - int l3 = fm->GetWidth(cpStart, PRUint32(mEndSelect)); - printf("%d %d %d/\n", mStartSelect, mEndSelect-mStartSelect, len-mEndSelect); - printf("%d %d %d %d %d\n", l0, l1, l2, l3, (l0+l1+l2)); - - printf("mStart %d,%d mEnd %d,%d whole width %d len %d\n", mStartSelect, mStartWidth, mEndSelect, mEndWidth, fm->GetWidth(cpStart, PRUint32(txt->mLength-startingOffset)), PRUint32(txt->mLength-startingOffset)); - if (mEndSelect-mStartSelect > 0) { - mSelectWidth = fm->GetWidth(cpStart+mStartSelect, PRUint32(mEndSelect-mStartSelect)); - } else { - mSelectWidth = 0; - } - }*/ - //------ - - //---- - NS_RELEASE(content); - return; - } - - PRUnichar ch = *cp++; - - //XXX PRBool isWhitespace; - if (XP_IS_SPACE(ch)) { - if (gCalcDebug) printf("Before 11111111111111111111111111111111\n"); - // Compress whitespace down to a single whitespace - while (cp < end) { - ch = *cp; - if (XP_IS_SPACE(ch)) { - cp++; - continue; - } - break; - } - if (skipWhitespace) { - skipWhitespace = PR_FALSE; - continue; - } - width = spaceWidth; - //XXX isWhitespace = PR_TRUE; - if (gCalcDebug) printf("After 11111111111111111111111111111111\n"); - } else { - if (gCalcDebug) printf("Before 2222222222222222222222222222222222222\n"); - // The character is not a space character. Find the end of the - // word and then measure it. - if (ch >= 256) { - //XXX hasMultibyte = PR_TRUE; - } - const PRUnichar* wordStart = cp - 1; - while (cp < end) { - width = fm->GetWidth(cpStart, PRUint32(cp - cpStart)); - - if (gCalcDebug) printf("-Cursor %d ******>> Width %d Pos: %d end: %d \n", aEvent->point.x, - width, - PRUint32(cp - cpStart), - end-cpStart); - if (width >= aEvent->point.x) { - if (gCalcDebug) printf("**********************************\nSTOPPED! Offset is [%d][%d]\n", width, PRUint32(cp - cpStart)); - if (gCalcDebug) printf("**********************************\n"); - CalcActualPosition(aEvent->message, cpStart, cp, aOffset, aWidth, fm); - NS_RELEASE(content); - return; - } - - ch = *cp; - if (ch >= 256) { - //XXX hasMultibyte = PR_TRUE; - } - if (!XP_IS_SPACE(ch)) { - cp++; - continue; - } - if (gCalcDebug) printf("At bottom...breaking..........................\n"); - break; - } - if (gCalcDebug) printf("After 2222222222222222222222222222222222222\n"); - } - - // Now that we have the end of the word or whitespace, see if it - // will fit. - if (!atLeftMargin && wrapping && (x + width > maxWidth)) { - // The word/whitespace will not fit. - cp = lastWordEnd; - if (x == 0) { - // Nothing fit at all. In this case, we still may want to know - // the maxWordWidth so compute it right now. - maxWordWidth = width; - } - if (gCalcDebug) printf(">>>>> Breaking\n"); - break; - } // if - - // The word fits. Add it to the run of text. - x += width; - if (width > maxWordWidth) { - maxWordWidth = width; - } - atLeftMargin = PR_FALSE; - lastWordEnd = cp; - width = 0; - //XXX endsInWhitespace = isWhitespace; - if (gCalcDebug) printf("Bottom--------------------------------\n"); - } // while - - NS_RELEASE(content); - -} - -NS_IMETHODIMP -TextFrame::ListTag(FILE* out) const -{ - PRInt32 contentIndex; - GetContentIndex(contentIndex); - fprintf(out, "Text(%d)@%p", contentIndex, this); - return NS_OK; -} - -NS_IMETHODIMP -TextFrame::List(FILE* out, PRInt32 aIndent) const -{ - PRInt32 i; - for (i = aIndent; --i >= 0; ) fputs(" ", out); - - // Output the tag - ListTag(out); - nsIView* view; - GetView(view); - if (nsnull != view) { - fprintf(out, " [view=%p]", view); - NS_RELEASE(view); - } - - // Output the first/last content offset and prev/next in flow info - PRBool isComplete = - mContentOffset + mContentLength == ((Text*)mContent)->mLength; - fprintf(out, "[%d,%d,%c] ", - mContentOffset, mContentOffset+mContentLength-1, - isComplete ? 'T':'F'); - if (nsnull != mPrevInFlow) { - fprintf(out, "prev-in-flow=%p ", mPrevInFlow); - } - if (nsnull != mNextInFlow) { - fprintf(out, "next-in-flow=%p ", mNextInFlow); - } - - // Output the rect and state - out << mRect; - if (0 != mState) { - fprintf(out, " [state=%08x]", mState); - } - - // Output the text - fputs("<\n", out); - aIndent++; - - for (i = aIndent; --i >= 0; ) fputs(" ", out); - Text* txt = (Text*) mContent; - nsAutoString tmp; - txt->ToCString(tmp, mContentOffset, mContentLength); - fputs("\"", out); - fputs(tmp, out); - fputs("\"\n", out); - - aIndent--; - for (i = aIndent; --i >= 0; ) fputs(" ", out); - fputs(">\n", out); - -#ifdef NOISY - if (nsnull != mWords) { - for (i = aIndent; --i >= 0; ) fputs(" ", out); - fputs(" @words ", out); - PRUint32* wp = mWords; - PRInt32 total = mContentLength; - while (total != 0) { - PRUint32 wordInfo = *wp++; - nscoord wordWidth = GET_WORD_WIDTH(wordInfo); - PRIntn wordLen = GET_WORD_LENGTH(wordInfo); - fprintf(out, "%c-%d-%d ", - ((wordInfo & WORD_IS_WORD) ? 'w' : 's'), - wordWidth, wordLen); - total -= wordLen; - NS_ASSERTION(total >= 0, "bad word data"); - } - fputs("\n", out); - } -#endif - return NS_OK; -} - -//---------------------------------------------------------------------- -static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID); -static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID); - - -Text::Text(const PRUnichar* aText, PRInt32 aLength) -{ - if (0 == aLength) { - aLength = nsCRT::strlen(aText); - } - mLength = aLength; - mText = new PRUnichar[aLength]; - nsCRT::memcpy(mText, aText, aLength * sizeof(PRUnichar)); -} - -Text::Text() -{ - mText = nsnull; - mLength = 0; -} - -Text::~Text() -{ - if (nsnull != mText) { - delete[] mText; - mText = nsnull; - } - mLength = 0; -} - -nsresult Text::QueryInterface(const nsIID& aIID, void** aInstancePtr) -{ - NS_PRECONDITION(nsnull != aInstancePtr, "null pointer"); - - if (nsnull == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - - if (aIID.Equals(kIDOMTextIID)) { - *aInstancePtr = (void*)(nsIDOMText*)this; - nsHTMLContent::AddRef(); - return NS_OK; - } - if (aIID.Equals(kIDOMNodeIID)) { - *aInstancePtr = (void*)(nsIDOMNode*)(nsIDOMText*)this; - nsHTMLContent::AddRef(); - return NS_OK; - } - - return nsHTMLContent::QueryInterface(aIID, aInstancePtr); -} - -nsrefcnt Text::AddRef(void) -{ - return nsHTMLContent::AddRef(); -} - -nsrefcnt Text::Release(void) -{ - return nsHTMLContent::Release(); -} - -void Text::List(FILE* out, PRInt32 aIndent) const -{ - for (PRInt32 i = aIndent; --i >= 0; ) fputs(" ", out); - fputs("Text", out); - ListAttributes(out); - fprintf(out, " RefCnt=%d<\"", mRefCnt); - - nsAutoString tmp; - ToCString(tmp, 0, mLength); - fputs(tmp, out); - - fputs("\">\n", out); -} - -void Text::ToHTMLString(nsString& aBuf) const -{ - aBuf.SetLength(0); - aBuf.Append(mText, mLength); -} - -void Text::ToCString(nsString& aBuf, PRInt32 aOffset, PRInt32 aLen) const -{ - PRUnichar* cp = mText + aOffset; - PRUnichar* end = cp + aLen; - while (cp < end) { - PRUnichar ch = *cp++; - if (ch == '\r') { - aBuf.Append("\\r"); - } else if (ch == '\n') { - aBuf.Append("\\n"); - } else if (ch == '\t') { - aBuf.Append("\\t"); - } else if ((ch < ' ') || (ch >= 127)) { - aBuf.Append("\\0"); - aBuf.Append((PRInt32)ch, 8); - } else { - aBuf.Append(ch); - } - } -} - -#if 0 -// From nsITextContent; might want this later -PRInt32 Text::GetLength() -{ - return mLength; -} - -void Text::GetText(nsString& aBuf, PRInt32 aOffset, PRInt32 aCount) -{ - aBuf.SetLength(0); - if ((PRUint32(aOffset) >= PRUint32(mLength)) || - (aCount <= 0)) { - return; - } - if (aOffset + aCount > mLength) { - aCount = mLength - aOffset; - } - aBuf.Append(mText + aOffset, aCount); -} -#endif - -nsresult -Text::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame = new TextFrame(this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -nsresult Text::GetScriptObject(nsIScriptContext *aContext, void** aScriptObject) -{ - nsresult res = NS_OK; - if (nsnull == mScriptObject) { - res = NS_NewScriptText(aContext, this, mParent, (void**)&mScriptObject); - } - *aScriptObject = mScriptObject; - return res; -} - -// -// nsIDOMText interface -// -nsresult Text::GetNodeType(PRInt32 *aType) -{ - *aType = nsHTMLContent::TEXT; - return NS_OK; -} - -nsresult Text::GetParentNode(nsIDOMNode **aNode) -{ - return nsHTMLContent::GetParentNode(aNode); -} - -nsresult Text::GetChildNodes(nsIDOMNodeIterator **aIterator) -{ - return nsHTMLContent::GetChildNodes(aIterator); -} - -nsresult Text::HasChildNodes(PRBool *aReturn) -{ - return nsHTMLContent::HasChildNodes(aReturn); -} - -nsresult Text::GetFirstChild(nsIDOMNode **aNode) -{ - return nsHTMLContent::GetFirstChild(aNode); -} - -nsresult Text::GetPreviousSibling(nsIDOMNode **aNode) -{ - return nsHTMLContent::GetPreviousSibling(aNode); -} - -nsresult Text::GetNextSibling(nsIDOMNode **aNode) -{ - return nsHTMLContent::GetNextSibling(aNode); -} - -nsresult Text::InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild) -{ - return nsHTMLContent::InsertBefore(newChild, refChild); -} - -nsresult Text::ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild) -{ - return nsHTMLContent::ReplaceChild(newChild, oldChild); -} - -nsresult Text::RemoveChild(nsIDOMNode *oldChild) -{ - return nsHTMLContent::RemoveChild(oldChild); -} - -nsresult -Text::GetData(nsString& aString) -{ - if (nsnull != mText) { - aString.SetString(mText, mLength); - } - return NS_OK; -} - -nsresult -Text::SetData(nsString& aString) -{ - if (mText) { - delete[] mText; - mText = nsnull; - } - - mLength = aString.Length(); - mText = aString.ToNewUnicode(); - - // Notify the document that the text changed - if (nsnull != mDocument) { - mDocument->ContentChanged(this, nsnull); - } - return NS_OK; -} - -nsresult -Text::Append(nsString& aData) -{ - return Replace(mLength, 0, aData); -} - -nsresult -Text::Insert(PRInt32 offset, nsString& aData) -{ - return Replace(offset, 0, aData); -} - -nsresult -Text::Delete(PRInt32 offset, PRInt32 count) -{ - nsAutoString empty; - return Replace(offset, count, empty); -} - -nsresult -Text::Replace(PRInt32 offset, PRInt32 count, nsString& aData) -{ - // sanitize arguments - if (offset < 0) { - offset = 0; - } - if (offset > mLength) { - offset = mLength; - } - if (count < 0) { - count = 0; - } - - // Allocate new buffer - PRInt32 endOffset = offset + count; - if (endOffset > mLength) { - count = mLength - offset; - endOffset = mLength; - } - PRInt32 dataLength = aData.Length(); - PRInt32 newLength = mLength - count + dataLength; - PRUnichar* to = new PRUnichar[newLength ? newLength : 1]; - if (nsnull == to) { - return NS_ERROR_OUT_OF_MEMORY; - } - - // Copy over appropriate data - if (0 != offset) { - nsCRT::memcpy(to, mText, sizeof(PRUnichar) * offset); - } - if (0 != dataLength) { - nsCRT::memcpy(to + offset, aData.GetUnicode(), - sizeof(PRUnichar) * dataLength); - } - if (endOffset != mLength) { - nsCRT::memcpy(to + offset + dataLength, mText + endOffset, - sizeof(PRUnichar) * (mLength - endOffset)); - } - - // Switch to new buffer - if (nsnull != mText) { - delete [] mText; - } - mText = to; - mLength = newLength; - - // Notify the document that the text changed - if (nsnull != mDocument) { - mDocument->ContentChanged(this, nsnull); - } - - return NS_OK; -} - -nsresult -Text::Splice(nsIDOMElement* element, PRInt32 offset, PRInt32 count) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult -NS_NewHTMLText(nsIHTMLContent** aInstancePtrResult, - const PRUnichar* us, PRInt32 uslen) -{ - nsIHTMLContent* it = new Text(us, uslen); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} - -nsresult -NS_NewHTMLText(nsIHTMLContent** aInstancePtrResult, - nsIArena* aArena, const PRUnichar* us, PRInt32 uslen) -{ - nsIHTMLContent* it = new(aArena) Text(us, uslen); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} - -//---------------------------------------------------------------------- - -class SharedText : public Text { -public: - SharedText(PRUnichar* aText, PRInt32 aLength); - -protected: - virtual ~SharedText(); -}; - -SharedText::SharedText(PRUnichar* aText, PRInt32 aLength) - : Text() -{ - if (0 == aLength) { - aLength = nsCRT::strlen(aText); - } - mText = aText; - mLength = aLength; -} - -SharedText::~SharedText() -{ - mText = nsnull; -} - -nsresult -NS_NewSharedHTMLText(nsIHTMLContent** aInstancePtrResult, - PRUnichar* us, PRInt32 uslen) -{ - nsIHTMLContent* it = new SharedText(us, uslen); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} - -nsresult -NS_NewSharedHTMLText(nsIHTMLContent** aInstancePtrResult, - nsIArena* aArena, PRUnichar* us, PRInt32 uslen) -{ - nsIHTMLContent* it = new(aArena) SharedText(us, uslen); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/html/base/src/nsWBRPart.cpp b/mozilla/layout/html/base/src/nsWBRPart.cpp deleted file mode 100644 index 0e19e67894f..00000000000 --- a/mozilla/layout/html/base/src/nsWBRPart.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLTagContent.h" -#include "nsFrame.h" -#include "nsHTMLIIDs.h" - -class WBRPart : public nsHTMLTagContent { -public: - WBRPart(nsIAtom* aTag); - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - -protected: - virtual ~WBRPart(); -}; - -WBRPart::WBRPart(nsIAtom* aTag) - : nsHTMLTagContent(aTag) -{ -} - -WBRPart::~WBRPart() -{ -} - -nsresult -WBRPart::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame = nsnull; - nsresult rv = nsFrame::NewFrame(&frame, this, aParentFrame); - if (NS_OK != rv) { - return rv; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -nsresult -NS_NewHTMLWordBreak(nsIHTMLContent** aInstancePtrResult, nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* it = new WBRPart(aTag); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void**) aInstancePtrResult); -} diff --git a/mozilla/layout/html/content/Makefile b/mozilla/layout/html/content/Makefile deleted file mode 100644 index b0ff7c06fd4..00000000000 --- a/mozilla/layout/html/content/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../../.. - -DIRS = src - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/html/content/makefile.win b/mozilla/layout/html/content/makefile.win deleted file mode 100644 index 5620ead1bde..00000000000 --- a/mozilla/layout/html/content/makefile.win +++ /dev/null @@ -1,22 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. - -DIRS=src - -include <$(DEPTH)\layout\config\rules.mak> diff --git a/mozilla/layout/html/content/src/Makefile b/mozilla/layout/html/content/src/Makefile deleted file mode 100644 index ed73f1dfe81..00000000000 --- a/mozilla/layout/html/content/src/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../../../.. - -LIBRARY_NAME = nglhtmlcon_s - -# Note the sophisticated alphabetical ordering :-| -CPPSRCS = \ - nsHTMLComment.cpp \ - nsHTMLHead.cpp \ - nsHTMLMeta.cpp \ - nsHTMLTitle.cpp \ - $(NULL) - -MODULE = raptor - -REQUIRES = xpcom raptor dom js - -include $(DEPTH)/config/config.mk - -LCFLAGS += -D_IMPL_NS_HTML - -INCLUDES += -I../../style/src -I../../../base/src -I../../../css/layout/src \ - -I../../base/src - -MKSLIB := - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/html/content/src/makefile.win b/mozilla/layout/html/content/src/makefile.win deleted file mode 100644 index 927a04fd9ca..00000000000 --- a/mozilla/layout/html/content/src/makefile.win +++ /dev/null @@ -1,55 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\..\.. - -LIBRARY_NAME = nglhtmlcon_s -MODULE=raptor -REQUIRES=xpcom raptor js -DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN - -CPPSRCS= \ - nsHTMLComment.cpp \ - nsHTMLHead.cpp \ - nsHTMLMeta.cpp \ - nsHTMLTitle.cpp \ - $(NULL) - -CPP_OBJS= \ - .\$(OBJDIR)\nsHTMLComment.obj \ - .\$(OBJDIR)\nsHTMLHead.obj \ - .\$(OBJDIR)\nsHTMLMeta.obj \ - .\$(OBJDIR)\nsHTMLTitle.obj \ - $(NULL) - -LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I$(PUBLIC)\js \ - -I$(PUBLIC)\dom -I$(PUBLIC)\netlib \ - -I..\..\style\src -I..\..\..\css\layout\src \ - -I..\..\..\base\src -I..\..\base\src - -LCFLAGS = \ - $(LCFLAGS) \ - $(DEFINES) \ - $(NULL) - -include <$(DEPTH)\layout\config\rules.mak> - -libs:: $(LIBRARY) - $(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib - -clobber:: - rm -f $(DIST)\lib\$(LIBRARY_NAME).lib diff --git a/mozilla/layout/html/content/src/nsHTMLComment.cpp b/mozilla/layout/html/content/src/nsHTMLComment.cpp deleted file mode 100644 index eb0f854c86f..00000000000 --- a/mozilla/layout/html/content/src/nsHTMLComment.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLContainer.h" -#include "nsFrame.h" -#include "nsHTMLIIDs.h" - -#define nsHTMLCommentSuper nsHTMLTagContent - -class nsHTMLComment : public nsHTMLCommentSuper { -public: - nsHTMLComment(nsIAtom* aTag, const nsString& aComment); - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - - virtual void List(FILE* out, PRInt32 aIndent) const; - -protected: - virtual ~nsHTMLComment(); - nsString mComment; -}; - -nsHTMLComment::nsHTMLComment(nsIAtom* aTag, const nsString& aComment) - : nsHTMLCommentSuper(aTag), - mComment(aComment) -{ -} - -nsHTMLComment::~nsHTMLComment() -{ -} - -nsresult -nsHTMLComment::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame; - nsFrame::NewFrame(&frame, this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -void -nsHTMLComment::List(FILE* out, PRInt32 aIndent) const -{ - NS_PRECONDITION(nsnull != mDocument, "bad content"); - - PRInt32 index; - for (index = aIndent; --index >= 0; ) fputs(" ", out); - - nsIAtom* tag = GetTag(); - if (tag != nsnull) { - nsAutoString buf; - tag->ToString(buf); - fputs(buf, out); - NS_RELEASE(tag); - } - - ListAttributes(out); - - fprintf(out, " RefCount=%d<", mRefCnt); - fputs(mComment, out); - fputs(">\n", out); -} - -nsresult -NS_NewHTMLComment(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag, const nsString& aComment) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* it = new nsHTMLComment(aTag, aComment); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/html/content/src/nsHTMLHead.cpp b/mozilla/layout/html/content/src/nsHTMLHead.cpp deleted file mode 100644 index 1b3bcf3ab3c..00000000000 --- a/mozilla/layout/html/content/src/nsHTMLHead.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLContainer.h" -#include "nsFrame.h" -#include "nsHTMLIIDs.h" - -class nsHTMLHead : public nsHTMLContainer { -public: - nsHTMLHead(nsIAtom* aTag); - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - -protected: - virtual ~nsHTMLHead(); -}; - -nsHTMLHead::nsHTMLHead(nsIAtom* aTag) - : nsHTMLContainer(aTag) -{ -} - -nsHTMLHead::~nsHTMLHead() -{ -} - -nsresult -nsHTMLHead::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame; - nsFrame::NewFrame(&frame, this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -nsresult -NS_NewHTMLHead(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* it = new nsHTMLHead(aTag); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/html/content/src/nsHTMLMeta.cpp b/mozilla/layout/html/content/src/nsHTMLMeta.cpp deleted file mode 100644 index 76e27fc2d42..00000000000 --- a/mozilla/layout/html/content/src/nsHTMLMeta.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLContainer.h" -#include "nsFrame.h" -#include "nsHTMLIIDs.h" - -#define nsHTMLMetaSuper nsHTMLTagContent - -class nsHTMLMeta : public nsHTMLMetaSuper { -public: - nsHTMLMeta(nsIAtom* aTag); - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - -protected: - virtual ~nsHTMLMeta(); -}; - -nsHTMLMeta::nsHTMLMeta(nsIAtom* aTag) - : nsHTMLMetaSuper(aTag) -{ -} - -nsHTMLMeta::~nsHTMLMeta() -{ -} - -nsresult -nsHTMLMeta::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame; - nsFrame::NewFrame(&frame, this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -nsresult -NS_NewHTMLMeta(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* it = new nsHTMLMeta(aTag); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/html/content/src/nsHTMLTitle.cpp b/mozilla/layout/html/content/src/nsHTMLTitle.cpp deleted file mode 100644 index 01cdbe3c449..00000000000 --- a/mozilla/layout/html/content/src/nsHTMLTitle.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsHTMLParts.h" -#include "nsHTMLContainer.h" -#include "nsFrame.h" -#include "nsHTMLIIDs.h" - -#define nsHTMLTitleSuper nsHTMLTagContent - -class nsHTMLTitle : public nsHTMLTitleSuper { -public: - nsHTMLTitle(nsIAtom* aTag, const nsString& aTitle); - - virtual nsresult CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult); - - virtual void List(FILE* out, PRInt32 aIndent) const; - -protected: - virtual ~nsHTMLTitle(); - nsString mTitle; -}; - -nsHTMLTitle::nsHTMLTitle(nsIAtom* aTag, const nsString& aTitle) - : nsHTMLTitleSuper(aTag), mTitle(aTitle) -{ -} - -nsHTMLTitle::~nsHTMLTitle() -{ -} - -nsresult -nsHTMLTitle::CreateFrame(nsIPresContext* aPresContext, - nsIFrame* aParentFrame, - nsIStyleContext* aStyleContext, - nsIFrame*& aResult) -{ - nsIFrame* frame; - nsFrame::NewFrame(&frame, this, aParentFrame); - if (nsnull == frame) { - return NS_ERROR_OUT_OF_MEMORY; - } - frame->SetStyleContext(aPresContext, aStyleContext); - aResult = frame; - return NS_OK; -} - -void -nsHTMLTitle::List(FILE* out, PRInt32 aIndent) const -{ - NS_PRECONDITION(nsnull != mDocument, "bad content"); - - PRInt32 index; - for (index = aIndent; --index >= 0; ) fputs(" ", out); - - nsIAtom* tag = GetTag(); - if (tag != nsnull) { - nsAutoString buf; - tag->ToString(buf); - fputs(buf, out); - NS_RELEASE(tag); - } - - ListAttributes(out); - - fprintf(out, " RefCount=%d<", mRefCnt); - fputs(mTitle, out); - fputs(">\n", out); -} - -nsresult -NS_NewHTMLTitle(nsIHTMLContent** aInstancePtrResult, - nsIAtom* aTag, const nsString& aTitle) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsIHTMLContent* it = new nsHTMLTitle(aTag, aTitle); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/layout/html/document/Makefile b/mozilla/layout/html/document/Makefile deleted file mode 100644 index c650dc9b7ab..00000000000 --- a/mozilla/layout/html/document/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../../.. - -DIRS = public src - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/layout/html/document/makefile.win b/mozilla/layout/html/document/makefile.win deleted file mode 100644 index f0ca52f8de3..00000000000 --- a/mozilla/layout/html/document/makefile.win +++ /dev/null @@ -1,22 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. - -DIRS=public src - -include <$(DEPTH)\layout\config\rules.mak> diff --git a/mozilla/layout/html/document/public/MANIFEST b/mozilla/layout/html/document/public/MANIFEST deleted file mode 100644 index 89bc8c7b689..00000000000 --- a/mozilla/layout/html/document/public/MANIFEST +++ /dev/null @@ -1,5 +0,0 @@ -# -# This is a list of local files which get copied to the mozilla:dist:layout directory -# - -nsIWebFrame.h diff --git a/mozilla/layout/html/document/public/makefile.win b/mozilla/layout/html/document/public/makefile.win deleted file mode 100644 index b9969ec59f9..00000000000 --- a/mozilla/layout/html/document/public/makefile.win +++ /dev/null @@ -1,25 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\..\.. - -EXPORTS=nsIWebFrame.h - -MODULE=raptor - -include <$(DEPTH)\layout\config\rules.mak> - diff --git a/mozilla/layout/html/document/public/nsIWebFrame.h b/mozilla/layout/html/document/public/nsIWebFrame.h deleted file mode 100644 index eb49a80819f..00000000000 --- a/mozilla/layout/html/document/public/nsIWebFrame.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIWebFrame_h___ -#define nsIWebFrame_h___ - -#include "nsCom.h" -#include "nsISupports.h" -#include "nsIWebWidget.h" - -// IID for the nsIWebFrame interface -#define NS_IWEBFRAME_IID \ -{ 0xecace1b0, 0x541, 0x11d2, \ - { 0x80, 0x34, 0x0, 0x60, 0x8, 0x15, 0xa7, 0x91 } } - -/** - * Interface used for distinguishing frames that have web widgets associated - * with them (i.e. -  - -
    -frame3 -
    - - - diff --git a/mozilla/webshell/tests/viewer/samples/test9a.html b/mozilla/webshell/tests/viewer/samples/test9a.html deleted file mode 100644 index 8735ae70027..00000000000 --- a/mozilla/webshell/tests/viewer/samples/test9a.html +++ /dev/null @@ -1,16 +0,0 @@ - - -Put test5.html in frame1, - frame2, - frame3, - frame3.1, - self, - parent, - top -
    -
    -frame3.1 -
    - - - diff --git a/mozilla/webshell/tests/viewer/samples/test_ed.html b/mozilla/webshell/tests/viewer/samples/test_ed.html deleted file mode 100644 index 628361be38a..00000000000 --- a/mozilla/webshell/tests/viewer/samples/test_ed.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/mozilla/webshell/tests/viewer/samples/test_form.html b/mozilla/webshell/tests/viewer/samples/test_form.html deleted file mode 100644 index aa42c64240b..00000000000 --- a/mozilla/webshell/tests/viewer/samples/test_form.html +++ /dev/null @@ -1,34 +0,0 @@ - - -
    - -A checkbox:
    - -Another checkbox:
    - -Yet another checkbox:
    - -One last checkbox:
    - -

    This is a simple form

    -

    This is a simple form

    -

    This is a simple form

    -

    This is a simple form

    -

    This is a simple form

    -

    -

    enter some text

    -

    -

    -

    -

    " " - -

    -

    This is a simple form

    -

    This is a simple form

    -

    This is a simple form

    -

    This is a simple form

    -

    This is a simple form

    -
    - - - diff --git a/mozilla/webshell/tests/viewer/viewer.rc b/mozilla/webshell/tests/viewer/viewer.rc deleted file mode 100644 index 7dd427ec5d5..00000000000 --- a/mozilla/webshell/tests/viewer/viewer.rc +++ /dev/null @@ -1,162 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "resources.h" -#include "jsconsres.h" -#include - - -VIEWER MENU DISCARDABLE -{ - POPUP "&File" - { - MENUITEM "&Open...", VIEWER_FILE_OPEN - POPUP "&Samples" - { - MENUITEM "demo #0", VIEWER_DEMO0 - MENUITEM "demo #1", VIEWER_DEMO1 - MENUITEM "demo #2", VIEWER_DEMO2 - MENUITEM "demo #3", VIEWER_DEMO3 - MENUITEM "demo #4", VIEWER_DEMO4 - MENUITEM "demo #5", VIEWER_DEMO5 - MENUITEM "demo #6", VIEWER_DEMO6 - MENUITEM "demo #7", VIEWER_DEMO7 - MENUITEM "demo #8", VIEWER_DEMO8 - MENUITEM "demo #9", VIEWER_DEMO9 - } - POPUP "Print &Preview" - { - MENUITEM "One Column", VIEWER_ONE_COLUMN - MENUITEM "Two Column", VIEWER_TWO_COLUMN - MENUITEM "Three Column", VIEWER_THREE_COLUMN - } - MENUITEM "&Exit", VIEWER_EXIT - } - POPUP "&Edit" - BEGIN - MENUITEM "Cu&t", VIEWER_EDIT_CUT, GRAYED - MENUITEM "&Copy", VIEWER_EDIT_COPY - MENUITEM "&Paste", VIEWER_EDIT_PASTE, GRAYED - MENUITEM SEPARATOR - MENUITEM "Select &All", VIEWER_EDIT_SELECTALL, HELP - MENUITEM SEPARATOR - MENUITEM "&Find in Page", VIEWER_EDIT_FINDINPAGE - , GRAYED - END - POPUP "&Debug" - { - MENUITEM "&Visual Debugging", VIEWER_VISUAL_DEBUGGING - MENUITEM "&Reflow Test", VIEWER_REFLOW_TEST - MENUITEM SEPARATOR - MENUITEM "Dump &Content", VIEWER_DUMP_CONTENT - MENUITEM "Dump &Frames", VIEWER_DUMP_FRAMES - MENUITEM "Dump &Views", VIEWER_DUMP_VIEWS - MENUITEM SEPARATOR - MENUITEM "Dump &Style Sheets", VIEWER_DUMP_STYLE_SHEETS - MENUITEM "Dump &Style Contexts", VIEWER_DUMP_STYLE_CONTEXTS - MENUITEM SEPARATOR - MENUITEM "Show Content Size", VIEWER_SHOW_CONTENT_SIZE - MENUITEM "Show Frame Size", VIEWER_SHOW_FRAME_SIZE - MENUITEM "Show Style Size", VIEWER_SHOW_STYLE_SIZE - MENUITEM SEPARATOR - MENUITEM "Debu&g Robot", VIEWER_DEBUGROBOT - MENUITEM SEPARATOR - MENUITEM "Show Content Quality", VIEWER_SHOW_CONTENT_QUALITY - } - POPUP "&Tools" - { - MENUITEM "&JavaScript Console", JS_CONSOLE - MENUITEM "&Editor Mode", EDITOR_MODE - } -} - -PRINTPREVIEW MENU DISCARDABLE -{ - POPUP "&File" - { - MENUITEM "&Close", PREVIEW_CLOSE - } - POPUP "&Debug" - { - MENUITEM "&Visual Debugging", VIEWER_VISUAL_DEBUGGING - MENUITEM SEPARATOR - MENUITEM "Dump &Content", VIEWER_DUMP_CONTENT - MENUITEM "Dump &Frames", VIEWER_DUMP_FRAMES - MENUITEM "Dump &Views", VIEWER_DUMP_VIEWS - MENUITEM SEPARATOR - MENUITEM "Dump &Style Sheets", VIEWER_DUMP_STYLE_SHEETS - MENUITEM "Dump &Style Contexts", VIEWER_DUMP_STYLE_CONTEXTS - } -} - -JSCONSOLE_MENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&New", ID_FILENEW - MENUITEM "&Open...", ID_FILEOPEN - MENUITEM "&Save", ID_FILESAVE - MENUITEM "Save &As...", ID_FILESAVEAS - MENUITEM SEPARATOR - MENUITEM "E&xit", ID_FILEEXIT - END - POPUP "&Edit" - BEGIN - MENUITEM "&Undo", ID_EDITUNDO - MENUITEM SEPARATOR - MENUITEM "Cu&t", ID_EDITCUT - MENUITEM "&Copy", ID_EDITCOPY - MENUITEM "&Paste", ID_EDITPASTE - MENUITEM "De&lete", ID_EDITDELETE - MENUITEM SEPARATOR - MENUITEM "Select &All", ID_EDITSELECTALL - END - POPUP "&Commands" - BEGIN - MENUITEM "&Evaluate All\tF5", ID_COMMANDSEVALALL - MENUITEM "Evaluate &Selection\tF10", ID_COMMANDSEVALSEL - MENUITEM SEPARATOR - MENUITEM "&Inspector", ID_COMMANDSINSPECTOR - END - POPUP "&Help" - BEGIN - MENUITEM "No Help Available", ID_NOHELP - END -END - -ACCELERATOR_TABLE ACCELERATORS -BEGIN - VK_F5, ID_COMMANDSEVALALL, VIRTKEY - VK_F10, ID_COMMANDSEVALSEL, VIRTKEY -END - -IDD_DEBUGROBOT DIALOG DISCARDABLE 0, 0, 246, 84 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Debug Robot Options" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "&Start",IDOK,67,57,50,14 - PUSHBUTTON "&Cancel",IDCANCEL,127,57,50,14 - CONTROL "&Update Display (Visual)",IDC_UPDATE_DISPLAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,7,98,10 - EDITTEXT IDC_VERIFICATION_DIRECTORY,77,19,159,14,ES_AUTOHSCROLL - EDITTEXT IDC_PAGE_LOADS,41,36,40,14,ES_AUTOHSCROLL - LTEXT "&Verification Directory",IDC_STATIC,7,21,70,8 - LTEXT "&Stop after",IDC_STATIC,7,38,32,8 - LTEXT "page loads",IDC_STATIC,84,38,36,8 -END - diff --git a/mozilla/webshell/tests/viewer/winmain.cpp b/mozilla/webshell/tests/viewer/winmain.cpp deleted file mode 100644 index 4fc747e34c7..00000000000 --- a/mozilla/webshell/tests/viewer/winmain.cpp +++ /dev/null @@ -1,371 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -// Win32 specific viewer driver - -#include -#include -#include "resources.h" -#include "jsconsres.h" -#include "JSConsole.h" -#include "nsViewer.h" -#include "nsGlobalVariables.h" -#include "nsIDocument.h" -#include "nsIURL.h" -#include "nsVoidArray.h" -#include "nsCRT.h" -#include "prenv.h" -#include "nsIScriptContext.h" -#include "nsIScriptContextOwner.h" -#include "nsITimer.h" - -// Debug Robot options -static int gDebugRobotLoads = 5000; -static char gVerifyDir[_MAX_PATH]; -static BOOL gVisualDebug = TRUE; - -static NS_DEFINE_IID(kIScriptContextOwnerIID, NS_ISCRIPTCONTEXTOWNER_IID); - -// DebugRobot call -extern "C" NS_EXPORT int DebugRobot( - nsVoidArray * workList, nsIWebWidget * ww, int imax, char * verify_dir, void (*yieldProc)(const char *)); - -// Temporary Netlib stuff... -/* XXX: Don't include net.h... */ -extern "C" { -extern int NET_PollSockets(); -}; - -#define DEBUG_EMPTY "(none)" - - -class nsWin32Viewer : public nsViewer { - // From nsViewer - public: - virtual void AddMenu(nsIWidget* aMainWindow, PRBool aForPrintPreview); - virtual void ShowConsole(WindowData* aWindata); - virtual void DoDebugRobot(WindowData* aWindata); - virtual void CopySelection(WindowData* aWindata); - virtual void Destroy(WindowData* wd); - virtual void CloseConsole(); - virtual void Stop(); - virtual void CrtSetDebug(PRUint32 aNewFlags); - // Utilities - virtual void CopyTextContent(WindowData* wd, HWND aHWnd); -}; - -static HANDLE gInstance, gPrevInstance; - -//----------------------------------------------------------------- -// JSConsole support -//----------------------------------------------------------------- - -// JSConsole window -JSConsole *gConsole = NULL; - -static char* class1Name = "Viewer"; -static char* class2Name = "PrintPreview"; - -void DestroyConsole() -{ - if (gConsole) { - gConsole->SetNotification(NULL); - delete gConsole; - gConsole = NULL; - } -} - -//----------------------------------------------------------------- -// CRT Debug -//----------------------------------------------------------------- - -void nsWin32Viewer::CrtSetDebug(PRUint32 aNewFlags) -{ -#ifndef MOZ_NO_DEBUG_RTL - int oldFlags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); - _CrtSetDbgFlag(aNewFlags); - printf("Note: crt flags: old=%x new=%x\n", oldFlags, aNewFlags); -#endif -} - - -//----------------------------------------------------------------- -// Debug Robot support -//----------------------------------------------------------------- - -void yieldProc(const char * str) -{ - // Process messages - MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { - GetMessage(&msg, NULL, 0, 0); - if (!JSConsole::sAccelTable || - !gConsole || - !gConsole->GetMainWindow() || - !TranslateAccelerator(gConsole->GetMainWindow(), JSConsole::sAccelTable, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - /* Pump Netlib... */ - NET_PollSockets(); - } - } -} - -/* Debug Robot Dialog options */ - -BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam,LPARAM lParam) -{ - BOOL translated = FALSE; - HWND hwnd; - switch (msg) - { - case WM_INITDIALOG: - { - SetDlgItemInt(hDlg,IDC_PAGE_LOADS,5000,FALSE); - char * text = PR_GetEnv("VERIFY_PARSER"); - SetDlgItemText(hDlg,IDC_VERIFICATION_DIRECTORY,text ? text : DEBUG_EMPTY); - hwnd = GetDlgItem(hDlg,IDC_UPDATE_DISPLAY); - SendMessage(hwnd,BM_SETCHECK,TRUE,0); - } - return FALSE; - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case IDOK: - gDebugRobotLoads = GetDlgItemInt(hDlg,IDC_PAGE_LOADS,&translated,FALSE); - GetDlgItemText(hDlg, IDC_VERIFICATION_DIRECTORY, gVerifyDir, sizeof(gVerifyDir)); - if (!strcmp(gVerifyDir,DEBUG_EMPTY)) - gVerifyDir[0] = '\0'; - hwnd = GetDlgItem(hDlg,IDC_UPDATE_DISPLAY); - gVisualDebug = (BOOL)SendMessage(hwnd,BM_GETCHECK,0,0); - EndDialog(hDlg,IDOK); - break; - case IDCANCEL: - EndDialog(hDlg,IDCANCEL); - break; - } - break; - default: - return FALSE; - } - return TRUE; -} - - -BOOL CreateRobotDialog(HWND hParent) -{ - BOOL result = (DialogBox(gInstance,MAKEINTRESOURCE(IDD_DEBUGROBOT),hParent,(DLGPROC)DlgProc) == IDOK); - return result; -} - - -void AddViewerMenu(HINSTANCE hInstance, nsIWidget* aWidget, LPCTSTR lpMenuName) -{ - HMENU menu = ::LoadMenu(hInstance,lpMenuName); - HWND hwnd = aWidget->GetNativeData(NS_NATIVE_WIDGET); - ::SetMenu(hwnd, menu); -} - -void nsWin32Viewer::AddMenu(nsIWidget* aMainWindow, PRBool aForPrintPreview) -{ - AddViewerMenu(gInstance, aMainWindow, - aForPrintPreview ? class2Name : class1Name); -} - -//----------------------------------------------------------------- -// nsWin32Viewer Implementation -//----------------------------------------------------------------- - -void nsWin32Viewer::ShowConsole(WindowData* aWinData) -{ - HWND hWnd = aWinData->windowWidget->GetNativeData(NS_NATIVE_WIDGET); - if (!gConsole) { - - // load the accelerator table for the console - if (!JSConsole::sAccelTable) { - JSConsole::sAccelTable = LoadAccelerators(gInstance, - MAKEINTRESOURCE(ACCELERATOR_TABLE)); - } - - nsIScriptContextOwner *owner = nsnull; - nsIScriptContext *context = nsnull; - if (NS_OK == aWinData->observer->QueryInterface(kIScriptContextOwnerIID, (void **)&owner)) { - if (NS_OK == owner->GetScriptContext(&context)) { - - // create the console - gConsole = JSConsole::CreateConsole(); - gConsole->SetContext(context); - // lifetime of the context is still unclear at this point. - // Anyway, as long as the web widget is alive the context is alive. - // Maybe the context shouldn't even be RefCounted - context->Release(); - gConsole->SetNotification(DestroyConsole); - } - - NS_RELEASE(owner); - } - else { - MessageBox(hWnd, "Unable to load JavaScript", "Viewer Error", MB_ICONSTOP); - } - } -} - -void nsWin32Viewer::CloseConsole() -{ - DestroyConsole(); -} - -void nsWin32Viewer::DoDebugRobot(WindowData* aWindata) -{ - if ((nsnull != aWindata) && (nsnull != aWindata->observer)) { - if (CreateRobotDialog(aWindata->windowWidget->GetNativeData(NS_NATIVE_WIDGET))) - { - nsIDocument* doc = aWindata->observer->mWebWidget->GetDocument(); - if (nsnull!=doc) { - const char * str = doc->GetDocumentURL()->GetSpec(); - nsVoidArray * gWorkList = new nsVoidArray(); - gWorkList->AppendElement(new nsString(str)); - DebugRobot( - gWorkList, - gVisualDebug ? aWindata->observer->mWebWidget : nsnull, - gDebugRobotLoads, - PL_strdup(gVerifyDir), - yieldProc); - } - } - } -} - - -// Selects all the Content -void nsWin32Viewer::CopyTextContent(WindowData* wd, HWND aHWnd) -{ - HGLOBAL hGlobalMemory; - PSTR pGlobalMemory; - - if (wd->observer != nsnull) { - nsIDocument* doc = wd->observer->mWebWidget->GetDocument(); - if (doc != nsnull) { - // Get Text from Selection - nsString text; - doc->GetSelectionText(text); - - // Copy text to Global Memory Area - hGlobalMemory = (HGLOBAL)GlobalAlloc(GHND, text.Length()+1); - if (hGlobalMemory != NULL) { - pGlobalMemory = (PSTR) GlobalLock(hGlobalMemory); - char * str = text.ToNewCString(); - char * s = str; - for (int i=0;iwindowWidget->GetNativeData(NS_NATIVE_WIDGET)); -} - -void nsWin32Viewer::Stop() -{ - PostQuitMessage(0); -} - -void nsWin32Viewer::Destroy(WindowData* wd) -{ - CloseConsole(); - nsViewer::Destroy(wd); -} - -static nsITimer* gNetTimer; - -static void -PollNet(nsITimer *aTimer, void *aClosure) -{ - NET_PollSockets(); - NS_IF_RELEASE(gNetTimer); - if (NS_OK == NS_NewTimer(&gNetTimer)) { - gNetTimer->Init(PollNet, nsnull, 1000 / 50); - } -} - -int PASCAL -RunViewer(HANDLE instance, HANDLE prevInstance, LPSTR cmdParam, int nCmdShow, nsWin32Viewer* aViewer) -{ - gInstance = instance; - gPrevInstance = prevInstance; - - SetViewer(aViewer); - - nsIWidget *mainWindow = nsnull; - nsDocLoader* dl = aViewer->SetupViewer(&mainWindow, 0, 0); - - // Process messages - MSG msg; - PollNet(0, 0); - while (::GetMessage(&msg, NULL, 0, 0)) { - if (!JSConsole::sAccelTable || - !gConsole || - !gConsole->GetMainWindow() || - !TranslateAccelerator(gConsole->GetMainWindow(), JSConsole::sAccelTable, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - NET_PollSockets(); - } - } - - aViewer->CleanupViewer(dl); - - return msg.wParam; -} - - -//------------------------------------------------------------------ -// Win32 Main -//------------------------------------------------------------------ - -void main(int argc, char **argv) -{ - nsWin32Viewer* viewer = new nsWin32Viewer(); - viewer->ProcessArguments(argc, argv); - RunViewer(GetModuleHandle(NULL), NULL, 0, SW_SHOW, viewer); -} - -int PASCAL -WinMain(HANDLE instance, HANDLE prevInstance, LPSTR cmdParam, int nCmdShow) -{ - nsWin32Viewer* viewer = new nsWin32Viewer(); - return(RunViewer(instance, prevInstance, cmdParam, nCmdShow, viewer)); -} - - - - diff --git a/mozilla/webtools/bonsai/CGI.tcl b/mozilla/webtools/bonsai/CGI.tcl deleted file mode 100755 index f4f5fd00547..00000000000 --- a/mozilla/webtools/bonsai/CGI.tcl +++ /dev/null @@ -1,128 +0,0 @@ -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source globals.tcl - -# Takes something that was quoted for a URL line (%20 for spaces and stuff), -# and returns back the intended string. -proc url_decode {buf} { - regsub -all {\\(.)} $buf {\1} buf ; regsub -all {\\} $buf {\\\\} buf ; - regsub -all { } $buf {\ } buf ; regsub -all {\+} $buf {\ } buf ; - regsub -all {\$} $buf {\$} buf ; regsub -all \n $buf {\n} buf ; - regsub -all {;} $buf {\;} buf ; regsub -all {\[} $buf {\[} buf ; - regsub -all \" $buf \\\" buf ; regsub ^\{ $buf \\\{ buf ; - regsub -all -nocase {%([a-fA-F0-9][a-fA-F0-9])} $buf {[format %c 0x\1]} buf - regsub -all "\r\n" $buf "\n" buf - regsub -all "\r" $buf "\n" buf - eval return \"$buf\" -} - -proc lookup { a key } { - global $a - set ref [format %s(%s) $a $key] - if { [ info exists $ref] } { - eval return \$$ref - } else { - return "" - } -} - -proc FormData { field } { - global FORM - return [join $FORM($field)] -} - -proc ProcessFormFields {buffer} { - global FORM treeid - catch {unset FORM} - foreach item [ split $buffer & ] { - set el [ split $item = ] - set value [url_decode [lindex $el 1]] - set name [lindex $el 0] - if { $value != "" } { - lappend FORM($name) $value - } else { - set isnull($name) 1 - } - } - if {[info exists isnull]} { - foreach name [array names isnull] { - if {![info exists FORM($name)]} { - set FORM($name) "" - } - } - } - if {[info exists FORM(treeid)]} { - set treeid $FORM(treeid) - } - if {[info exists FORM(batchid)]} { - global batchid readonly - source [DataDir]/batchid - if {$batchid != $FORM(batchid)} { - set batchid $FORM(batchid) - set readonly 1 - } - } -} - - -proc BatchIdPart {{initstr ""}} { - global treeid batchid readonly - set result "" - if {![cequal $treeid "default"] || $readonly} { - set result $initstr - } - if {![cequal $treeid "default"]} { - append result "&treeid=$treeid" - } - if {$readonly} { - append result "&batchid=$batchid" - } - return $result -} - - -if { [info exists env(REQUEST_METHOD) ] } { - if { $env(REQUEST_METHOD) == "GET" } { - set buffer [lookup env QUERY_STRING] - } else { set buffer [ read stdin $env(CONTENT_LENGTH) ] } - ProcessFormFields $buffer -} - -proc value_quote {var} { - regsub -all {&} "$var" {\&} var - regsub -all {"} "$var" {\"} var - regsub -all {<} "$var" {\<} var - regsub -all {>} "$var" {\>} var - return $var -} - -foreach pair [ split [lookup env HTTP_COOKIE] ";" ] { - set pair [string trim $pair] - set eq [string first = $pair ] - if {$eq == -1} { - set COOKIE($pair) "" - } else { - set COOKIE([string range $pair 0 [expr $eq - 1]]) [string range $pair [expr $eq + 1] end] - } -} - - -proc PutsTrailer {} { - puts "
    Back to the top of Bonsai" -} diff --git a/mozilla/webtools/bonsai/INSTALL b/mozilla/webtools/bonsai/INSTALL deleted file mode 100644 index 359be967aaf..00000000000 --- a/mozilla/webtools/bonsai/INSTALL +++ /dev/null @@ -1,424 +0,0 @@ -# -*- mode: indented-text -*- -# -# Author: Artem Belevich -# -# (Changes have been made to Artem's original doc, as things evolve.) -# -# - -********************************************************************** - -As it's said in README "This is not very well packaged code. It's -not packaged at all. Don't come here expecting something you plop in -a directory, twiddle a few things, and you're off and using it. Much -work has to be done to get there." - -This file is intended to make some things *easier* but not easy. You -are still required to make some changes on your own. There is no -guaranteed solution yet and it's unlikely that there will be one in -the nearest future. - -********************************************************************** - - -0. OVERVIEW - -Some time ago I've seen Linux Source Navigator (LSN) at -http://sunsite.unc.edu/linux-source. I was impressed. -It was and is a wanderful tool to explore Linux kernel source code. - -Then Mozilla.org came up with a more elaborate tool that includes -source browser with crossreferencing (LXR http://lxr.linux.no) and CVS -tree control (Bonsai - http://www.mozilla.org/bonsai.html). -While LXR formatting is not as pretty as LSN's one, it has a huge -advantage - it lets you see where the identifier is defined and used. -And Bonsai brings nice and easy (though sometimes incompatible with -browsers other but Netscape's own) intarface to the CVS history. This -includes getting list of changes, giffs between revisions, etc. - -All in all LXR+Bonsai+other stuff beneath is a useful tool capable -of handling huge projects. - -It's not that easy to make it work with other source tree but -Mozilla's own but it's possible. And there are a lot of things to -improve. Now I'm going to concentrate on the first goal - to make it -work. - - -1. GETTING IT UP - - First of all you have to get all the tools in mozilla's -mozilla/webtools CVS repository. This includes lxr,bonsai,registry -and tinderbox. You're likely will not need neither tinderbox nor -registry but get them just in case. - - To get the sources you have to follow instructions on -http://www.mozilla.org/bonsai.html. - - OK, now you've got the sources but don't rush to try it right -away. It's likely that you will not be able to even start most of -the scripts. There are more things you will have to get and install. -The short list of the things you will need: - - 1) MySQL database server. - 2) Tcl 7.6 - 3) TclX 7.6 - 4) mysqltcl program (hmm.. This was tricky.. Read on) - 5) Perl 5.004+ with Mysql module (included with MySQL). - 6) Date::Parse module for Perl - 7) Some kind of HTTP server so you could use CGI scripts - -1.1 Getting and setting up MySQL database - - Visit MySQL homepage at http://www.tcx.se and grab the latest -stable binary release of the server. Sure, you can get sources and -compile them yourself, but binaries are the easiest and the fastest -way to get it up and running. Follow instructions found in -manual. There is a section about installing binary-only -distributions. - - You should create database bonsai. It may be a good idea to make it -writable by all users on your machine and change access level -later. This would save you a lot of time trying to guess whether it's -permissions or a mistake in the script that make things fail. - -1.2-3 Getting and building Tcl & TclX 7.6 - - Tcl homepage is at http://www.scriptics.com. You may get sources -for UNIX from ftp://ftp.scriptics.com/pub/tcl/tcl7_6/tcl7.6p2.tar.gz. -TclX is an extension for Tcl that adds a lot of useful functions that -are heavily used in Bonsai tool. -TclX page is http://www.neosoft.com/tclx. Download sources from -ftp://ftp.neosoft.com/pub/tcl/TclX/tclX7.6.0.tar.gz. Watch out for the -case of the letters in URL. These guys are going to bring some fun -into your life by spelling their program name in various ways. - - Now you've probably got both Tcl and TclX 7.6. You may try to use -version 8.X but I'm not sure about results. Unfortunately I'm not an -expert in "Tcl&Co.". - - Build and install Tcl first. Then build and install TclX. This -should go without serious problems - -1.4 mysqltcl - the tricky part - - Grab msqltcl 1.50 (yes, "msqltcl" without 'y'. That's not a typo) from -MySQL site's contributed software area (http://www.tcx.se/Contrib/) or -from mSQL site (www.hughes.com.au). I've used version 1.50 and it -works for me, though you may try more recent version at your own -risk. You're risking anyway. - - Then grab mysqltcl.c-patch from MySQL's contrib area and apply this -patch to msqltcl.c file from msqltcl-1.50 distribution. - - Try to make msqltcl binary which is in fact mYsqltcl already. Very -likely that you will not be able to compile it without modifications. - - You can use the patch in APPENDIX 1 to see what changes I had to make -to compile mysqltcl. Your mileage may vary. - -1.5 Perl + Mysql - - Besides mysqltcl you will need Perl 5.004 with DB and Mysql -extensions. - - DB is required to use LXR browser and crossreferencer for storing -its database. Mysql is used by Bonsai. - - If you have Perl already installed, try to run genxref program from -LXR suite. If it complains that it misses DB terribly then you're -probably will have to get and install DB 1.86 distribution from one of the -CPAN (www.cpan.org) mirrors in src/misc directory. I personally got it -from http://www.cpan.org/src/misc/db.1.86.tar.gz. Having DB compiled -and installed you will also have to rebuild and reinstall Perl -itself so It would recognize and compile DB module in. This can be -tricky if you have DB installed in some strange place as I did. -I've got an error during linking phase - there was a function missing -in hash/ndbm.c file, so I just commented it out. It may potentially -cause troubles, but I think it does not matter in our case as this -was intended only for DBM compatibility - the feature we don't really -use. - - Now you hopefully have Perl + DB compiled installed and working. -Time to set up Mysql module. This one is easy. Just follow -instructions in MySQL manual. You have to read manuals sometimes.. -I think I'm getting older.. 8-) - - Next step is to get TimeDate module from one of the CPAN mirrors. -Go to CPAN search page -(http://theory.uwinnipeg.ca/search/cpan-search.html) and search for -the "TimeDate" module. Then get it and install. - -1.6 HTTP server - -You have a freedom of choice here - Apache, Netscape or any other -server on UNIX would do. The only thing - to make configuration easier -you'd better run HTTP daemon on the same machine that you run MySQL -server on. Make sure that you can access 'bonsai' database with user -id you're running the daemon with. - - -2. TWEAKING THE TOOLS - - Now you should have all necessary tools to be able to run LXR and -Bonsai scripts and see why the wouldn't work for you right now. - - First of all you have to change "#!/usr/bonsaitools" to wherever -you've installed your binaries in all executable scripts in LXR and -Bonsai directories. There is now a Makefile with a "make install" -command that can make this easier. See the Makefile for details. - - -2.1 LXR - - The first thing to set up is LXR tool. All it needs is the source -tree (not CVS tree). It's relatively easy and works almost right of -the box. Follow instructions in LXR README file. - - Having set LXR you will see that regardless what your source tree -contains you will see that everything refers to it as Mozilla. Mozilla -is a great thing and this tool was primarily tailored to mozilla tree -but you'd like to control your own tree. First step is to edit your - -Here is the short list of changes I had to make - - file: ident - 1) change "&root=/cvsroot" to tour CVSROOT path - 2) change "file=/mozilla/" to the directory under CVSROOT where - your sources are. In my case it is just "/" - - file: index.html - Nothing vital here but probably worth changing to reflect your own - environment - - file: lxr.conf - Changes to this file are described in LXR README file and are - quite simple. - - file: source - You may find it useful to uncomment "$img = "/icons/..." lines if - you yse Explorer as it does not have internal-gopher-* images - built in. Actually Bonsai contains a lot of netscapism that will - make your IE4 unhappy anyway. You'd better stick with Netscape if - you are going to use LXR/Bonsai - - file: template-* - Here you will probably want to watch closely at the places whare - you see the word 'mozilla' near '.cgi'. There are a lot of - mozilla-specific paths hardcoded - - cgange/get rid of banner that loads straight from mozilla.org that - may be very dangerous if you're working for micro$oft and your - boss comes by.. 8-) - -2.2 Bonsai - - This stuff sometimes gets very specific about your CVS repository -setup. You have to make a lot of changes until more portable -configuration mechanism is introduced. - - First of all, create data/ directory in your Bonsai dir. Then edit -data/configdata file as described in README file. Create -appropriate data/XXX directory for each tree XXX you've configured in -'configdata'. Compile trapdoor program and place binary in the data/ -dir ('make install' will do this for you.). -run 'trapdoor >data/passwd' it will set up -admin's password. At least it should. It worked for me with empty -password, but I still am unable to change it from the web. - - file: cvsblame.cgi - @line 120: you may add your own translation to help find - appropriate RCS file for the given source file. - TODO: We'd better get this information from CVS/Repository - file. It's more generic than hardcoded tweaks. - - file: cvslog.cgi - @line 90: the same tweaks to find RCS file for given source file - @ line 463: add translations to $lxr_path to help find source - file for given RCS file. - TODO: This should be done using information in - $CVSROOT/CVSROOT/modules file. Typical example is the - following line: 'mymodule -d mydir repositorydir' which - causes files for module mymodule from repositorydir to be - placed in mydir. This contains enough information about - backward translation mydir/file->repositorydir/file,v - - - file: cvsquery.cgi - @line 23: There are some cases when cvsrot is not passed as - parameter for cvsquery.cgi. You should better check for - empty CVS_ROOT and set it to your CVSROOT path. - - @line 71: Here we should try to make backward translation for - directory name similar to one @line 463 in cvslog.cgi. - - - @line 151: you will probably want to send email somewhere else - but people @netscape.com 8-) - - - file: dolog.pl - @line 42: change path to rlog program - - file: toplevel.cgi - @line 240: remove links that are not accessible to you anyway - - -That's basically it. With some luck and persistence you will have 90% -working system at this point. A lot of these things are just asking to be -fixed in near feature. And I hope they will be. - -3. Setting up database - - This is quite simple but time consuming operation. -First create database structure using maketable.sh csript. -Then go to Bonsai administration page and press "Rebuild CVS history" -button. Then you may go to the theater and watch a movie or two. It -will talke a lot of time. It takes several seconds to process one -file. The more revisions in file the more time it will take. My SUN -workstation with 2x200Mhz UltraSPARC processors run about an hour to -process about 4K files with 20K+ revisions. Your mileage may vary. - -4. Things to do - - a) There should be better way to track CVS tree changes. Now it's done -by making CVS send e-mail about each checkin. Then some cron job -process this mail and updates database. CVS history command provides -all necessary information to get list of files recently commited, so -there is no need to send/process email. Just set up a cron job that -will periodically look for CVS tree changes and update database. - - b) Better configuration. One should not hardcode CVS tree <-> Source -tree translations. Another thing to configure - banners. - - c) LXR could be improved in a number of ways. Using MySQL database -instead of DB would probably be a good idea. It's unclear what impact -it will have on performance though. Incremental database updates would -be nice. It might be also nice to borrow syntax highliting from LSN. - - -5. Conclusion. - - OK. This may or may not work for you. But I hope you had a great -time trying. Or just reading. - - Any suggestions/additions are welcome. - - -******************************************************* -APPENDIXES -******************************************************* - - -APPENDIX 1. Patch to build mysqltcl. --------------------------------------- - -diff -u -r msqltcl-1.50/Makefile mysqltcl-1.50/Makefile ---- msqltcl-1.50/Makefile Tue Jun 6 07:25:39 1995 -+++ mysqltcl-1.50/Makefile Tue Jun 23 18:20:07 1998 -@@ -38,11 +38,11 @@ - # - #----- Tcl/Tk libraries & such - # Path for Tcl include files. --TCLINCL = -I/usr/local/include -+TCLINCL = -I../include - # Path for Tk include files, if different from the above. - TKINCL = - # Libraries required to link plain Tcl. --TCLLIBS = -L/usr/local/lib -ltcl -lm -+TCLLIBS = -L../lib -ltclx7.6.0 -ltcl7.6 -lm -lnsl -lsocket - # Libraries required to link plain Tk. - TKLIBS = -L/usr/local/lib -ltk -ltcl -lX11 -lm - -@@ -66,11 +66,11 @@ - # - #----- Tcl/Tk libraries & such - # Path for Tcl include files. --NEWTCLINCL = -I/usr/local/new/include -+NEWTCLINCL = -I../include - # Path for Tk include files, if different from the above. - NEWTKINCL = - # Libraries required to link plain Tcl. --NEWTCLLIBS = -L/usr/local/new/lib -ltcl -lm -+NEWTCLLIBS = -L../lib -ltclx7.6.0 -ltcl7.6 -lm -lnsl -lsocket - # Libraries required to link plain Tk. - NEWTKLIBS = -L/usr/local/new/lib -ltk -ltcl -lX11 -lm - -@@ -82,7 +82,7 @@ - # Path for TclX/TkX include files, if different from plain Tcl. - NEWTCLXINCL = - # Extra libraries required to link TclX. --NEWTCLXLIBS = -L/usr/local/new/lib -ltclx -+NEWTCLXLIBS = -L../mysql/lib -ltclx - # Extra libraries required to link TkX. - NEWTKXLIBS = -L/usr/local/new/lib -ltkx -ltclx - # TclX/TkX 'AppInit' files (base names). -@@ -94,16 +94,16 @@ - # - #----- mSQL libraries & such - # Path for mSQL include files. --MSQLINCL = -I/usr/local2/src/Minerva/include -+MSQLINCL = -I../mysql/include - # Libraries required to link an mSQL application. --MSQLLIB = -L/usr/local2/src/Minerva/lib -lmsql -+MSQLLIB = -L../mysql/lib -lmysqlclient - - #===== END OF CONFIGURATION DEFINITIONS ===== - - INCL = -I. ${MSQLINCL} ${TCLINCL} ${TKINCL} - CFLAGS = ${OPTIM} -c - LDFLAGS = ${OPTIM} --PROGS = msqltcl msqlwish -+PROGS = msqltcl # msqlwish - TCLLINK = ${MSQLLIB} ${TCLLIBS} - TKLINK = ${MSQLLIB} ${TKLIBS} - -diff -u -r msqltcl-1.50/new-tclAppInit.c mysqltcl-1.50/new-tclAppInit.c ---- msqltcl-1.50/new-tclAppInit.c Tue Jun 6 07:25:38 1995 -+++ mysqltcl-1.50/new-tclAppInit.c Tue Jun 23 18:28:14 1998 -@@ -14,7 +14,7 @@ - static char sccsid[] = "@(#) tclAppInit.c 1.11 94/12/17 16:14:03"; - #endif /* not lint */ - --#include "tcl.h" -+#include "tclExtend.h" - - /* - * The following variable is a special hack that is needed in order for -@@ -48,7 +48,7 @@ - int argc; /* Number of command-line arguments. */ - char **argv; /* Values of command-line arguments. */ - { -- Tcl_Main(argc, argv); -+ TclX_Main(argc, argv, Tcl_AppInit); - return 0; /* Needed only to prevent compiler warning. */ - } - -@@ -79,6 +79,10 @@ - return TCL_ERROR; - } - -+ if (Tclx_Init(interp) == TCL_ERROR) { -+ return TCL_ERROR; -+ } -+ - /* - * Call the init procedures for included packages. Each call should - * look like this: -@@ -90,7 +94,7 @@ - * where "Mod" is the name of the module. - */ - -- if (Msqltcl_Init(interp) == TCL_ERROR) { -+ if (Mysqltcl_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - -@@ -106,6 +110,6 @@ - * then no user-specific startup file will be run under any conditions. - */ - -- tcl_RcFileName = "~/.tclshrc"; -+/* tcl_RcFileName = "~/.tclshrc"; */ - return TCL_OK; - } diff --git a/mozilla/webtools/bonsai/Makefile b/mozilla/webtools/bonsai/Makefile deleted file mode 100755 index 83454fe9fd2..00000000000 --- a/mozilla/webtools/bonsai/Makefile +++ /dev/null @@ -1,119 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -# This Makefile helps you install Bonsai. Define PERL and MYSQLTCL to -# the full pathnames of where you have these utilities. Define PREFIX -# to where you will install the running Bonsai. Then "make install" should -# copy things for you. - - -CFLAGS = -g -#LDFLAGS = -lcrypt -#PERL = /usr/bin/perl -#MYSQLTCL = /bonsai/bin/mysqltcl -#PREFIX = /home/httpd/html/bonsai - -FILES = CGI.tcl \ - SourceChecker.cgi \ - SourceChecker.pm \ - addcheckin.tcl \ - admin.cgi \ - adminfuncs.tcl \ - adminmail.tcl \ - branchspam.cgi \ - branchspammer.cgi \ - changebar.tcl \ - closemessage \ - contacthelp.html \ - countcheckins.cgi \ - createlegaldirs.tcl \ - cvsblame.cgi \ - cvsblame.pl \ - cvsguess.cgi \ - cvsindex.pl \ - cvslog.cgi \ - cvsmenu.pl \ - cvsquery.cgi \ - cvsquery.pl \ - cvsqueryform.cgi \ - cvsregexp.html \ - cvsview2.cgi \ - doadmin.cgi \ - doeditcheckin.cgi \ - doeditmessage.cgi \ - doeditprofile.cgi \ - doeditwhiteboard.cgi \ - dolog.pl \ - dotweak.cgi \ - editcheckin.cgi \ - editmessage.cgi \ - editprofile.cgi \ - editwhiteboard.cgi \ - globals.tcl \ - handleAdminMail.tcl \ - handleCheckinMail.tcl \ - header.pl \ - index.html \ - indextest.pl \ - lloydcgi.pl \ - localprofile.cgi \ - maketables.sh \ - moduleanalyse.cgi \ - modules.pl \ - multidiff.cgi \ - myglobrecur.tcl \ - openmessage \ - perlifyconfig.tcl \ - processqueue.pl \ - profile.cgi \ - rebuildcvshistory.cgi \ - rebuilddatabase.tcl \ - rebuildtaginfo.cgi \ - repophook.cgi \ - reposfiles.pl \ - rview.cgi \ - show2.cgi \ - showcheckins.cgi \ - switchtree.cgi \ - testlock.pl \ - toplevel.cgi \ - utils.pl \ - viewold.cgi - -trapdoor: trapdoor.o - cc -o trapdoor trapdoor.o $(LDFLAGS) - -install: trapdoor - mkdir -p $(PREFIX) && \ - for I in $(FILES); do \ - echo Installing $$I && \ - sed -e s#/usr/bonsaitools/bin/perl#$(PERL)#g \ - -e s#/usr/bonsaitools/bin/mysqltcl#$(MYSQLTCL)#g \ - $$I > $(PREFIX)/$$I && \ - chmod 755 $(PREFIX)$(I); done && \ - mkdir -p $(PREFIX)/data && \ - cp -f trapdoor $(PREFIX)/data && \ - chmod 755 $(PREFIX)/data && \ - cp -f bonsai.gif $(PREFIX) && \ - chmod 755 $(PREFIX)/bonsai.gif - -clean: - rm -f trapdoor trapdoor.o - - diff --git a/mozilla/webtools/bonsai/README b/mozilla/webtools/bonsai/README deleted file mode 100644 index 6d72f6a2b63..00000000000 --- a/mozilla/webtools/bonsai/README +++ /dev/null @@ -1,563 +0,0 @@ -This is Bonsai. See . - - - ========== - DISCLAIMER - ========== - -This is not very well packaged code. It's not packaged at all. Don't -come here expecting something you plop in a directory, twiddle a few -things, and you're off and using it. Much work has to be done to get -there. We'd like to get there, but it wasn't clear when that would be, -and so we decided to let people see it first. - -Don't believe for a minute that you can use this stuff without first -understanding most of the code. - -Check out the INSTALL file for some guidance on getting started. -Many, many thanks to Artem Belevich for -trailblazing his way through this and writing down all the problems he -had. - - - ============================ - Configuration files you need - ============================ - -Lots of configuration files need to be placed in the data subdir. -This is also where bonsai keeps its running state. These two things -ought to be split into different directories, but that hasn't happened -yet. - -Some of these files are: - -configdata: some TCL source that defines treelist, a list of trees you want - to track, and treedata, information about each of those trees. - A sample configdata: - - set treelist {default newlayout} - - set treeinfo(default,module) MozillaSource - set treeinfo(default,branch) {} - set treeinfo(default,repository) {/cvsroot} - set treeinfo(default,description) {Mozilla Source Code} - set treeinfo(default,shortdesc) {Mozilla} - - set treeinfo(newlayout,module) Raptor - set treeinfo(newlayout,branch) {} - set treeinfo(newlayout,repository) {/cvsroot} - set treeinfo(newlayout,description) {New Layout -- Main Line} - set treeinfo(newlayout,shortdesc) {New Layout} - - Also, you can specify where Bonsai will look for some utilities - on your system, and a couple other behaviors. You will - probably have to override many of these; the default values are - not that reasonable. - - The default values are: - - set cvscommand /tools/ns/bin/cvs - set rlogcommand /tools/ns/bin/rlog - set rcsdiffcommand /tools/ns/bin/rcsdiff - set cocommand /tools/ns/bin/co - set lxr_base http://cvs-mirror.mozilla.org/webtools/lxr/source - set mozilla_lxr_kludge TRUE - - - -hidelist: A list of regexps that define filenames that we don't want - to let people see via the bonsai pages. A common use is to - just have one line that says "CVSROOT". - - ================================= - What's What in the Bonsai sources: - ================================= - -This is a rough first pass at cataloging and documenting the Bonsai -sources. Many hands have been in this code over the years, and it has -accreted wildly. There is probably quite a lot of dead code in here. - - -CGI.tcl ??? - -Makefile: builds the "trapdoor" program. Also has a - "make install" that lets you specify where you store - perl and mysqltcl on your system. - -SourceChecker.cgi scc wrote to help sanitize code. DELETE - Called by: nobody - -SourceChecker.pm ??? - -addcheckin.tcl TCL. Add a checkin to a Bonsai hook. Determines - if the tree was open or closed at the time, shunts - checkin to proper tree. - -admin.cgi TCL. Select from various administrative tasks - (which require a password.) - - Called by: toplevel.cgi - - Calls: - doadmin.cgi password= treeid= - command=[open|close] - closetimestamp= - lastgood= - doclear= - - doadmin.cgi password= treeid= - command=tweaktimes - lastgood= - lastclose= - - doadmin.cgi password= treeid= - command=editmotd - origmotd= - motd= - - editmessage.cgi treeid= - msgname=[openmessage|closemessage| - treeopened|treeopenedsamehook| - treeclosed] - #### note: no password? - - repophook.cgi password= treeid= - command=repophook - startfrom= - - rebuildtaginfo.cgi password= - treeid= - command=rebuildtaginfo - - rebuildcvshistory.cgi password= - treeid= - command=rebuildcvs - startfrom= - firstfile= - subdir= - - doadmin.cgi password= treeid= - command=changepassword - password= - newpassword= - newpassword2= - doglobal= - -adminfuncs.tcl TCL. Collection of functions to administrate a Bonsai - hook. - -adminmail.tcl TCL. Set of routines for opening and closing the - Bonsai hook based on receipt of e-mail. - -bonsai.gif a bonsai tree. - -branchspam.cgi failed attempt to web-afy branch spam too DELETE - Called by: nobody - Calls: branchspammer.cgi - -branchspammer.cgi more garbage - Called by: branchspam.cgi - Calls: nobody - -changebar.tcl ??? - -closemessage HTML, text that gets sent to all people on the hook - when the tree is closed. - -configure/ ??? - -contacthelp.html ??? - -countcheckins.cgi TCL. Draws a graph of checkins for the various - Bonsai 'hooks'. - Called by: toplevel.cgi - Calls: nobody - -createlegaldirs.tcl ??? - -cvsblame.cgi Runs through a CVS file and tells you who changed what. - Calls: - rview.cgi dir= cvsroot= rev= - cvsblame.cgi file= rev= root= mark= - cvsblame.cgi set_line= (cookie magic?) - cvsblame.cgi root= file= rev= use_html= - Called by: - cvsguess.cgi - moduleanalyse.cgi - Used to be called by: - cvslog.cgi - -cvsblame.pl ??? - -cvsguess.cgi Given a file name, try to figure out what directory - it's in. then link to cvsblame.cgi. parameters are - the same. - - Seems to take an exact file name (sans directory), - then do a redirect to cvsblame.cgi. If there are - more than one file of that name, it presents a list. - This is (I think) redundant with LXR's file name - search. - - Calls: - cvsblame.cgi file= rev= mark= # - Called by: nobody - -cvsindex.pl ??? - -cvslog.cgi Web interface to "cvs log". - Calls: - rview.cgi dir= cvsroot= rev= - cvslog.cgi file= root= rev= - sort=[revision|date|author] - author= - cvsview2.cgi - command=DIFF_FRAMESET - diff_mode=context - whitespace_mode=show - root= subdir= file= - rev1= rev2= - cvsview2.cgi - command=DIRECTORY - subdir= files= root= branch= - - Used to call: - cvsblame.cgi file= rev= root= - -cvsmenu.pl ??? - -cvsquery.cgi Displays the results of a query entered in cvsqueryform - Called by: - cvsqueryform.cgi - Calls: - cvsqueryform.cgi - cvsview2 command=DIRECTORY - subdir= files= branch= root= - cvsview2.cgi command=DIFF_FRAMESET - diff_mode=context - whitespace_mode=show - subdir= file= rev1= rev2= root= - multidiff.cgi name=allchanges cvsroot= - cvsquery.cgi sortby= - ../registry/who.cgi email= - http://scopus.mcom.com/bugsplat/show_bug.cgi - -cvsquery.pl ??? - -cvsqueryform.cgi Main screen to let you query the CVS database. - Called by: - cvsblame.cgi - cvslog.cgi - cvsquery.cgi - toplevel.cgi - Calls: - cvsregexp.html - cvsquery.cgi - module=[all|allrepositories|?] - branch= - branchtype=[match|regexp] - directory= - file= - who= - whotype=[match|regexp] - sortby=[Date|Who|File|Change Size] - date=[hours|day|week|month|all| - explicit] - hours= - mindate= - maxdate= - cvsroot= - -cvsregexp.html ??? - -cvsview2.cgi Lets you view CVS diffs. - Called by: - cvsblame.cgi - cvslog.cgi - cvsquery.cgi - show2.cgi - showcheckins.cgi - Calls: - rview.cgi dir= cvsroot= rev= - cvsview2.cgi subdir= command=DIFF - root= file= rev1= rev2= - cvsview2.cgi subdir= command=DIFF_LINKS - root= file= rev1= rev2= - cvsview2.cgi subdir= command=DIFF - root= file= rev1= rev2= # - cvsview2.cgi subdir= command=DIFF_FRAMESET - root= file= rev1= rev2= - cvsview2.cgi subdir= command=DIRECTORY - root= files= branch= skip= - cvsview2.cgi subdir= command=LOG - root= file= rev= - -doadmin.cgi TCL. Executes admin things asked for in admin.cgi - Called by: - admin.cgi - Calls: - mailto:clienteng - -doeditcheckin.cgi TCL. Edits a checkin on the hook. - Called by: - editcheckin.cgi - Calls: - nobody - -doeditmessage.cgi TCL. Edits one of the email messages that bonsai sends - people. - Called by: - editmessage.cgi - Calls: - nobody - -doeditprofile.cgi TCL. Edit peoples contact info. Left-over code from - before we started getting this info from LDAP. - Called by: - editprofile.cgi - Calls: - nobody - -doeditwhiteboard.cgi TCL. Edits the free-for-all whiteboard. - Called by: - editwhiteboard.cgi - Calls: - nobody - -dolog.pl Perl. Magic file that causes CVS to send mail to - Bonsai whenever someone makes a change. Please read - the comments towards the beginning for more clues. - -dotweak.cgi TCL. Tweaks a bunch of checkins in ahook at once. - Called by: - show2.cgi - showcheckins.cgi - Calls: - nobody - -editcheckin.cgi TCL. Edits a checkin on the hook. - Called by: - show2.cgi - showcheckins.cgi - Calls: - doeditcheckin.cgi - -editmessage.cgi TCL. Edits one of the email messages that bonsai sends - people. - Called by: - admin.cgi - Calls: - doeditmessage.cgi - -editprofile.cgi TCL. Edit peoples contact info. Left-over code from - before we started getting this info from LDAP. - Called by: - localprofile.cgi - Calls: - doeditprofile.cgi - -editwhiteboard.cgi TCL. Edits the free-for-all whiteboard. - Called by: - toplevel.cgi - Calls: - doeditwhiteboard.cgi - -globals.tcl ??? - -handleAdminMail.tcl TCL. Mail is piped to this script and parsed. - Calls: - adminfuncs.tcl - -handleCheckinMail.tcl TCL. Mail is piped to this script and parsed. It - then adds a checkin to a Bonsai hook. - -header.pl ??? - -index.html ??? - -indextest.pl ??? - -lloydcgi.pl parses CGI args from $QUERY_STRING and leaves them - in $form{$key}; and puts cookies in %cookie_jar. - Calls: nobody - Called by: everybody - -localprofile.cgi TCL. Display peoples contact info. Left-over code - from before we started getting this info from LDAP. - Called by: - nobody - Calls: - editprofile.cgi - profile.cgi - -maketables.sh ??? - Unused? - -moduleanalyse.cgi Shows the directories in a module. - Called by: - nobody - Calls: - moduleanalyse.cgi module=[all|?] cvsroot= - rview.cgi dir= cvsroot= - cvsblame.cgi file= root= - -modules.pl ??? - Called by: - branchspam.cgi - cvsqueryform.cgi - moduleanalyse.cgi - -multidiff.cgi Implements the "Show me ALL the Diffs" button - Called by: - cvsquery.cgi - show2.cgi - showcheckins.cgi - Calls: - nobody - -myglobrecur.tcl ??? - -openmessage ??? - -perlifyconfig.tcl ??? - -processqueue.pl ??? - -profile.cgi TCL. Stupid interface to LDAP to show all the info - about a person. - Called by: - localprofile.cgi - show2.cgi - Calls: - profile.cgi person= - -rebuildcvshistory.cgi TCL. Admin script to go rebuild the bonsai database - from CVS. - Called by: - admin.cgi - Calls: - nobody - -rebuilddatabase.tcl ??? - -rebuildtaginfo.cgi TCL. Half-written piece of junk to try and remember - things about tags. Should probably nuke it. - Called by: - admin.cgi - -repophook.cgi TCL. Rebuilds a bonsai hook from the bonsai database. - Called by: - admin.cgi - Calls: - nobody - -reposfiles.pl ??? - -rview.cgi Lets you browse a directory in a CVS repository. - Called by: - cvsblame.cgi - cvslog.cgi - cvsview2.cgi - moduleanalyse.cgi - Calls: - rview.cgi dir= cvsroot= rev= - rview.cgi dir= cvsroot= rev= ?=chdir - rview.cgi dir= cvsroot= rev= ?=Set Branch - &make_cgi_args ??? - ../registry/file.cgi cvsroot= file= dir= - -show2.cgi TCL. This seems to be a variant on showcheckins.cgi? - Called by: - nobody - Calls: - dotweak.cgi - showcheckins.cgi [various funky args] - editcheckin.cgi id= [various funky args]w - profile.cgi person= [various funky args] - cvsview2.cgi subdir= files= command=DIRECTORY - branch= - http://w3/cgi/cvsview2.cgi subdir= files= - command=DIRECTORY - multidiff.cgi allchanges= - -showcheckins.cgi TCL. Shows some set of checkins in a bonsai hook. - Called by: - admin.cgi - show2.cgi - toplevel.cgi - Calls: - dotweak.cgi - showcheckins.cgi [various funky args] - editcheckin.cgi id= [various funky args]w - http://phonebook/ds/dosearch/phonebook/... - cvsview2.cgi root= subdir= files= - command=DIRECTORY branch= - http://w3/cgi/cvsview2.cgi subdir= files= - command=DIRECTORY - multidiff.cgi allchanges= - -status/ ??? - -switchtree.cgi TCL. Lets you choose a different bonsai branch. - Called by: - toplevel.cgi - Calls: - nobody - -testlock.pl ??? - -toplevel.cgi TCL. Main interface to the bonsai hook. - Called by: - CGI.tcl - contacthelp.html - index.html - sheriff2.html - switchtree.cgi - toplevel.cgi - viewold.cgi - Calls: - editwhiteboard.cgi [...] - http://phonebook/ds/dosearch/phonebook/... - showcheckins.cgi - http://warp/tinderbox/showbuilds.cgi - switchtree.cgi [...] - news:mcom.dev.client.build.busted - http://phonebook/ - viewold.cgi [...] - countcheckins.cgi [...] - admin.cgi [...] - index.html - http://warp/client/dogbert/tree.html - contacthelp.html - http://warp/client/dogbert/buildlore/index.html - -trapdoor.c ??? - -utils.pl ??? - -viewold.cgi TCL. Lets you choose an old bonsai hook to view. - Called by: - toplevel.cgi - Calls: - toplevel.cgi treeid= - - - ================= - Glossary of terms - ================= - -Here are some funky terms you may find here and there: - -Hook The 'hook' is actually the oldest part of the Bonsai - code. The idea is, every so often (at Netscape, it was - every day), some build engineers will close the tree - and make sure that everything still builds properly. - If it doesn't, then the build engineers want to have a - list of people they can go beat up, this being the list - of people who changed the tree since the last time they - successfully built the tree. Those people are "on the - hook"; they are held responsible for any probs that - arise. - - So, it works out to: the list of people who have - checked in since the tree was last closed. diff --git a/mozilla/webtools/bonsai/SourceChecker.cgi b/mozilla/webtools/bonsai/SourceChecker.cgi deleted file mode 100755 index 0cac292f155..00000000000 --- a/mozilla/webtools/bonsai/SourceChecker.cgi +++ /dev/null @@ -1,237 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# SourceChecker.cgi -- tools for creating or modifying the dictionary -# used by cvsblame.cgi. -# -# Created: Scott Collins , 4 Feb 1998. -# -# Arguments (passes via GET or POST): -# ... -# - -use CGI; -use SourceChecker; - - - - # - # Global - # - -$query = new CGI; - - - - # - # Subroutines - # - - -sub print_page_header() - { - print <<'END_OF_HEADER'; -

    SourceChecker Dictionary Maintainance

    -END_OF_HEADER - } - - -sub print_page_trailer() - { - print <<'END_OF_TRAILER'; -
    - -Last updated 5 Feb 1998. -Dictionary maintainance and help. -Mail feedback to <scc@netscape.com>. -END_OF_TRAILER - } - - - -$error_header = '

    I couldn\'t process your request...

    '; - -sub print_error($) - { - local $message = shift; - print "$error_header

    Error: $message

    "; - $error_header = ''; - } - - -sub print_query_building_form() - { - print $query->start_multipart_form; - - print '

    Build a new request

    '; - print '

    ...to modify or create a remote dictionary with words from one or more local files.

    '; - - print '

    Files on the server

    '; - print '

    ...i.e., the dictionary to be created or modified.

    '; - - print $query->textfield( -name=>'dictionary', - -default=>'', - -override=>1, - -size=>30 ); - print '-- the path to dictionary.'; - - print '

    Files on your local machine

    '; - print '

    ...that will be uploaded to the server, so their contents can be added to the dictionary.

    '; - - print '
    '; - print $query->filefield( -name=>'ignore_english', -size=>30 ); - print '-- contains english (i.e., transformable) words to ignore.'; - - print '
    '; - print $query->filefield( -name=>'ignore_strings', -size=>30 ); - print '-- contains identifiers (i.e., non-transformable) words to ignore.'; - - print '
    '; - print $query->filefield( -name=>'flag_strings', -size=>30 ); - print '-- contains identifiers words to be flagged.'; - - print '
    '; - print $query->filefield( -name=>'ignore_names', -size=>30 ); - print '-- contains user names to be ignored.'; - - print '
    '; - print $query->submit; - - print $query->endform; - } - - -sub do_add_good_words($) - { - local $file = shift; - - while ( <$file> ) - { - next if /\#/; - add_good_words($_); - } - } - - -sub do_add_bad_words($) - { - local $file = shift; - - while ( <$file> ) - { - next if /\#/; - add_bad_words($_); - } - } - - -sub do_add_good_english($) - { - local $file = shift; - - while ( <$file> ) - { - next if /\#/; - add_good_english($_); - } - } - - -sub do_add_names($) - { - local $file = shift; - - while ( <$file> ) - { - next if /\#/; - add_names($_); - } - } - - -sub handle_query() - { - $dictionary_path = $query->param('dictionary'); - if ( ! $dictionary_path ) - { - print_error('You didn\'t supply a path to the dictionary file.'); - return; - } - - dbmopen %SourceChecker::token_dictionary, "$dictionary_path", 0666 - || print_error("The dictionary you named could not be opened."); - - $added_some_words = 0; - - if ( $file_of_good_english = $query->param('ignore_english') ) - { - do_add_good_english($file_of_good_english); - $added_some_words = 1; - } - - if ( $file_of_good_words = $query->param('ignore_strings') ) - { - do_add_good_words($file_of_good_words); - $added_some_words = 1; - } - - if ( $file_of_bad_words = $query->param('flag_strings') ) - { - do_add_bad_words($file_of_bad_words); - $added_some_words = 1; - } - - if ( $file_of_names = $query->param('ignore_names') ) - { - do_add_names($file_of_names); - $added_some_words = 1; - } - - if ( ! $added_some_words ) - { - print_error("You did not supply any words to add to the dictionary."); - } - - dbmclose %SourceChecker::token_dictionary; - } - - - - # - # The main script - # - -print $query->header; -print $query->start_html(-title=>'SourceChecker Dictionary Maintainance', - -author=>'scc@netscape.com'); - -print_page_header(); - -if ( $query->param ) - { - handle_query(); - } - -print_query_building_form(); -print_page_trailer(); - -print $query->end_html; - -__DATA__ - diff --git a/mozilla/webtools/bonsai/SourceChecker.pm b/mozilla/webtools/bonsai/SourceChecker.pm deleted file mode 100755 index 0bb7d4fc0e0..00000000000 --- a/mozilla/webtools/bonsai/SourceChecker.pm +++ /dev/null @@ -1,192 +0,0 @@ -# -*- Mode: perl; tab-width: 4; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -package SourceChecker; -require Exporter; -@ISA = qw(Exporter); -@EXPORT = qw(%token_dictionary, add_good_english, add_good_words, add_bad_words, add_names, tokenize_line, markup_line); -@EXPORT_OK = qw($GOOD_TOKEN, $UNKNOWN_TOKEN, $BAD_TOKEN, $NAME_TOKEN, add_token, canonical_token, @markup_prefix, @markup_suffix); - -$GOOD_TOKEN = \-1; -$UNKNOWN_TOKEN = \0; -$NAME_TOKEN = \1; -$BAD_TOKEN = \2; - - -@markup_prefix = ('', '', ''); -@markup_suffix = ('', '', ''); - - - -sub canonical_token($) - { - my $token = shift; - - if ( defined $token ) - { - $token =~ s/[\'Õ\&]+//g; - $token = length($token)>2 ? lc $token : undef; - } - - $token; - } - - - -sub _push_tokens($$) - { - # Note: inherits |@exploded_phrases| and |@exploded_tokens| from caller(s) - push @exploded_phrases, shift; - push @exploded_tokens, canonical_token(shift); - } - - - -sub _explode_line($) - { - # Note: inherits (and returns results into) |@exploded_phrases| and |@exploded_tokens| from caller(s) - - my $line = shift; - - my $between_tokens = 0; - foreach $phrase ( split /([A-Za-z\'Õ\&]+)/, $line ) - { - if ( $between_tokens = !$between_tokens ) - { - _push_tokens($phrase, undef); - next; - } - - for ( $_ = $phrase; $_; ) - { - m/^[A-Z\'Õ\&]*[a-z\'Õ\&]*/; - $token = $&; - $_ = $'; - - if ( ($token =~ m/[A-Z][a-z\'Õ]+/) && $` ) - { - $token = $&; - _push_tokens($`, $`); - } - _push_tokens($token, $token); - } - } - - $#exploded_phrases; - } - - -sub tokenize_line($) - { - my $line = shift; - local @exploded_tokens; - _explode_line($line); - - my $i = -1; - foreach $token ( @exploded_tokens ) - { - $exploded_tokens[++$i] = $token if defined $token; - } - $#exploded_tokens = $i; - @exploded_tokens; - } - - - -sub markup_line($) - { - my $line = shift; - - local @exploded_phrases; - local @exploded_tokens; - - _explode_line($line); - - $i = 0; - foreach $phrase ( @exploded_phrases ) - { - $phrase =~ s/&/&/g; - $phrase =~ s//>/g; - - my $token = $exploded_tokens[$i]; - if ( defined $token && ($token_kind = $token_dictionary{$token}) >= 0 ) - { - $phrase = $markup_prefix[$token_kind] . $phrase . $markup_suffix[$token_kind]; - } - ++$i; - } - - join '', @exploded_phrases; - } - - -sub add_token($$) - { - (my $token, my $token_kind) = @_; - if ( !defined $token_dictionary{$token} || ($token_kind > $token_dictionary{$token}) ) - { - $token_dictionary{$token} = $token_kind; - } - } - -sub add_good_english($) - { - my $line = shift; - - foreach $token ( tokenize_line($line) ) - { - add_token($token, $$GOOD_TOKEN); - - my $initial_char = substr($token, 0, 1); - (my $remainder = substr($token, 1)) =~ s/[aeiouy]+//g; - - $abbreviated_length = length($remainder) + 1; - if ( $abbreviated_length != length($token) && $abbreviated_length > 2 ) - { - add_token("$initial_char$remainder", $$GOOD_TOKEN); - } - } - } - -sub _add_tokens($$) - { - (my $line, my $token_kind) = @_; - - foreach $token ( tokenize_line($line) ) - { - add_token($token, $token_kind); - } - } - -sub add_good_words($) - { - _add_tokens(shift, $$GOOD_TOKEN); - } - -sub add_bad_words($) - { - _add_tokens(shift, $$BAD_TOKEN); - } - -sub add_names($) - { - _add_tokens(shift, $$NAME_TOKEN); - } - -1; diff --git a/mozilla/webtools/bonsai/addcheckin.tcl b/mozilla/webtools/bonsai/addcheckin.tcl deleted file mode 100755 index 2e1adea161d..00000000000 --- a/mozilla/webtools/bonsai/addcheckin.tcl +++ /dev/null @@ -1,250 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source globals.tcl - -# cmdtrace on - -assert {![info exists checkinlist]} - -set inheader 1 -set foundlogline 0 - -proc trim {str} { - return [string trim $str] -} - -set filelist {} -set log {} - -set appendjunk {} -set repository {/m/src} - - -if {[cequal [lindex $argv 0] "-treeid"]} { - lvarpop argv - set forcetreeid [lvarpop argv] -} - - -# Stupid hack to make empty array -set group(xyzzy) 1 -unset group(xyzzy) - - -for_file line $argv { - set line [trim $line] - if {$inheader} { - switch -glob -- $line { - {} { - set inheader 0 - } - } - } elseif {!$foundlogline} { - switch -glob -- $line { - {?|*} { - append appendjunk "$line\n" - lassign [split $line "|"] chtype date name repository dir \ - file version sticky branch addlines removelines - set key [list $date $branch $repository $dir $name] - lappend group($key) [list $file $version $addlines \ - $removelines $sticky] - } - {Tag|*} { - set data [split $line "|"] - lvarpop data - set repository [lvarpop data] - set tagtime [lvarpop data] - set tagname [lvarpop data] - regsub -all -- / $repository _ mungedname - set filename "data/taginfo/$mungedname/[MungeTagName $tagname]" - Lock - if {[catch {set fid [open "$filename" "a"]}]} { - catch {mkdir data/taginfo} - catch {chmod 0777 data/taginfo} - catch {mkdir data/taginfo/$mungedname} - catch {chmod 0777 data/taginfo/$mungedname} - set fid [open "$filename" "a"] - } - puts $fid "$tagtime|[join $data {|}]" - close $fid - catch {chmod 0666 $filename} - Unlock - } - {LOGCOMMENT} { - set foundlogline 1 - } - } - } else { - if {[cequal $line ":ENDLOGCOMMENT"]} { - break - } - append log "$line\n" - } -} - -set plainlog $log -set log [html_quote [trim $log]] - - -regsub -all -- {[0-9][0-9][0-9][0-9][0-9]*} $log $BUGSYSTEMEXPR log - - -Lock -LoadTreeConfig -if {![info exists forcetreeid]} { - regsub -all -- / $repository _ mungedname - set filename "data/checkinlog$mungedname" - set fid [open $filename "a"] - catch {chmod 0666 $filename} - puts $fid "[set appendjunk]LOGCOMMENT\n$plainlog\n:ENDLOGCOMMENT" - close $fid - - ConnectToDatabase - AddToDatabase $appendjunk $plainlog - -} -Unlock - - -if {[info exists forcetreeid]} { - set treestocheck $forcetreeid -} else { - set treestocheck $treelist -} - - -foreach key [array names group] { - lassign $key date branch repository dir name - set branch2 [crange $branch 1 end] - set files {} - set fullinfo {} - foreach i $group($key) { - lassign $i file version addlines removelines - lappend files $file - lappend fullinfo $i - } - - foreach treeid $treestocheck { - if {[info exists treeinfo($treeid,nobonsai)]} { - continue - } - - if {![cequal $branch $treeinfo($treeid,branch)] && \ - ![cequal $branch2 $treeinfo($treeid,branch)]} { - continue - } - - if {![cequal $repository $treeinfo($treeid,repository)]} { - continue - } - - LoadDirList - - set okdir 0 - - # Sigh. We have some specific files listed as well as modules. So, - # painfully go through *every* file we're checking in, and see if any - # of them are ones we're interested in. - - foreach f $files { - set full $dir/$f - foreach d $legaldirs { - if {[string match $d $full]} { - set okdir 1 - break - } - } - if {$okdir} { - break - } - } - - if {$okdir} { - Lock - catch {unset batchid} - catch {unset checkinlist} - LoadCheckins - set id checkin-$date-[id process] - lappend checkinlist $id - upvar #0 $id foo - set foo(person) $name - set foo(date) $date - set foo(dir) $dir - set foo(files) $files - set foo(log) $log - set foo(treeopen) $treeopen - set foo(fullinfo) $fullinfo - WriteCheckins - Log "Added checkin $name $dir $files" - Unlock - if {$treeopen} { - set filename [DataDir]/openmessage - foreach i $checkinlist { - upvar #0 $i info - if {[cequal $info(person) $name]} { - if {![cequal $id $i]} { - # This person already has a checkin, so we don't - # need to bother him again. - set filename thisFileDoesntExist - } - } - } - } else { - set filename [DataDir]/closemessage - } - if {![info exists forcetreeid] && [file exists $filename]} { - set fid [open $filename "r"] - set text [read $fid] - close $fid - set profile [GenerateProfileHTML $name] - set nextclose {[We don't remember close times any more...]} - foreach k {name dir files log profile nextclose} { - regsub -all -- "%$k%" $text [set $k] text - } - exec /usr/lib/sendmail -t << $text - Log "Mailed file $filename to $name" - } - } - } -} - - -NOTDEF { - -set tmp $log - -while {[regexp -nocase -- {.*bugfix([ 0-9]*)(.*)$} $tmp foo list tmp]} { - set fileversions {} - foreach i [array names group] { - lassign $i file version - lappend $fileversions [list $file $version] - } - foreach b $list { - set result [exec /usr/local/bin/lynx -dump "http://scopus.mcom.com/terrsplat/doclosebug.cgi?id=$b&directory=$dir&fileversions=$fileversions&who=$name&log=$plainlog"] - if {$result != "OK\n"} { - } - } -} - -} - - - -exit diff --git a/mozilla/webtools/bonsai/admin.cgi b/mozilla/webtools/bonsai/admin.cgi deleted file mode 100755 index fd4afd20420..00000000000 --- a/mozilla/webtools/bonsai/admin.cgi +++ /dev/null @@ -1,205 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -Lock -LoadCheckins -LoadMOTD -LoadTreeConfig -Unlock - -puts "Content-type: text/html - - - - -Bonsai administration - - - -

    Bonsai administration

    - -You realize, of course, that you have to know the magic password to do -anything from here. - -
    -Go tweak bunches of checkins at once. -
    - -" - - -puts " -
    -Password:
    - -" - -if {$treeopen} { - puts " - -Closing time stamp is: -
    - -" -} else { - puts " - -The new \"good\" timestamp is: - -
    -Clear the list of checkins.
    - -" -} -puts " -
    - -
    - -
    -Password:
    - - - - - - - - - - - -
    Last good timestamp:
    Last close timestamp:
    - -
    - - -
    - -
    - -Password:
    - - -Change the message-of-the-day:
    - -
    - -
    - - -
    - -
    - - -Change the e-mail message sent: - -
    - - -
    - - -
    - -
    - -Password:
    - -Repopulate the hook from scratch.

    -This can be very dangerous. You should -usually only need to do this to populate a new Bonsai branch. -

    -Use any checkin since: - -
    - -

    - -
    - -
    - -Password:
    - -Recreate the entire table of tags for the $treeinfo($treeid,repository) -repository from scratch. -

    -This can take a very, very long time. You -should -usually only need to do this when first introducing an entire CVS repository -into Bonsai. (And, in fact, nothing right now ever even uses that info, so -don't bother unless you know what you're doing.) -
    - -

    - -
    - -
    - -Password:
    - -Recreate the entire list of every checkin ever done to the -$treeinfo($treeid,repository) repository from scratch. -

    -This can take an incredibly long time. You -should -usually only need to do this when first introducing an entire CVS repository -into Bonsai. -

    -Ignore checkins earlier than: - -
    -Ignore files before (must be full path starting with $treeinfo($treeid,repository); leave blank to do everything): - -
    -Only do files within the subdirectory of $treeinfo($treeid,repository) named: - -
    - -

    - -
    -
    - - -Change password.
    -Old password:
    -New password:
    -Retype new password:
    -Change password for this tree
    -Change master Bonsai password
    - -
    -" - - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/adminfuncs.tcl b/mozilla/webtools/bonsai/adminfuncs.tcl deleted file mode 100755 index 3a62a22e707..00000000000 --- a/mozilla/webtools/bonsai/adminfuncs.tcl +++ /dev/null @@ -1,84 +0,0 @@ -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -proc AdminOpenTree {lastgood clearp} { - global lastgoodtimestamp treeopen checkinlist - if {$treeopen} { - return - } - set lastgoodtimestamp $lastgood - set treeopen 1 - PickNewBatchID - if {$clearp} { - SendMail treeopened - set checkinlist {} - } else { - SendMail treeopenedsamehook - } - Log "Tree opened. lastgood is [MyFmtClock $lastgoodtimestamp]" -} - - -proc AdminCloseTree {closetime} { - global closetimestamp treeopen - if {!$treeopen} { - return - } - set closetimestamp $closetime - set treeopen 0 - SendMail treeclosed - Log "Tree closed. closetime is [MyFmtClock $closetimestamp]" -} - - -proc MakeHookList {} { - global checkinlist - - # First, the hack to make an empty array. - set people(zzz) 1 - unset people(zzz) - - foreach c $checkinlist { - upvar #0 $c info - set people($info(person)) 1 - } - - return [lsort [array names people]] -} - - - -proc SendMail {filename} { - set hooklist [join [MakeHookList] ", "] - if {[lempty $hooklist]} { - return - } - - set fullfilename [DataDir]/$filename - if {[file exists $fullfilename]} { - set text [read_file $fullfilename] - } else { - set text "" - } - - foreach k {hooklist} { - regsub -all -- "%$k%" $text [set $k] text - } - - exec /usr/lib/sendmail -t << $text -} diff --git a/mozilla/webtools/bonsai/adminmail.tcl b/mozilla/webtools/bonsai/adminmail.tcl deleted file mode 100755 index 00d0d1f6bce..00000000000 --- a/mozilla/webtools/bonsai/adminmail.tcl +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source globals.tcl -source adminfuncs.tcl - -proc GetDate {line} { - set date [getclock] - if [regexp -- {[0-9].*$} $line str] { - catch {set date [convertclock $str]} - } - return $date -} - - - -Lock - -for_file line $argv { - if {[scan $line "%s %s" foobar theTree] != 2} { - continue - } - set treeid $theTree - switch -glob -- $foobar { - OPENNOCLEAR - - opennoclear { - LoadCheckins - AdminOpenTree [GetDate $line] 0 - WriteCheckins - } - OPEN - - open { - LoadCheckins - AdminOpenTree [GetDate $line] 1 - WriteCheckins - } - CLOSE - - close { - LoadCheckins - AdminCloseTree [GetDate $line] - WriteCheckins - } - } -} - -Unlock - -exit 0 - - diff --git a/mozilla/webtools/bonsai/bonsai.gif b/mozilla/webtools/bonsai/bonsai.gif deleted file mode 100755 index 5ae282f5b38fa74dc086e72e1d6716c50399ae5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20285 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 diff --git a/mozilla/webtools/bonsai/branchspam.cgi b/mozilla/webtools/bonsai/branchspam.cgi deleted file mode 100755 index 00ed021717d..00000000000 --- a/mozilla/webtools/bonsai/branchspam.cgi +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# Query the CVS database. -# -$|=1; - -print "Content-type: text/html - -"; - -require 'modules.pl'; - - -print " - -The CVS Branch Spammer (TM) - -

    The CVS Branch Spammer (TM)

    -

    Questions, Comments, Feature requests? mail ltabb -

    What this tool does

    - -

    In the course of software development, it is necessary to form a branch -to do development on for a period of time. Sometimes you want to merge these -changes back into the trunk in one shot. Sometime you want to have the developers -merge the changes themselves, individually. This tool makes sure the developers -have merged their changes in individually. - -

    The CVS Branch Spammer goes out and figures out what changes were made on -a branch and then looks to see if these changes where also made on the tip. It -formulates a mail message and send the mail to the indivual developers. The -individual developers look at the mail and reply that they have made their -changes in the tip. - -

    To run this program answer the following questions and bonk the spam button. - - -

    -

    -"; - - -# -# module selector -# -print " - -Pick the name of the CVS Module you use to pull your source -\n"; - -# -# Branch -# -print "
    What is the name of your branch: \n"; - -print "
    Who should the email message be from?: \n"; - -print " -
    -
    - -
    "; - diff --git a/mozilla/webtools/bonsai/branchspammer.cgi b/mozilla/webtools/bonsai/branchspammer.cgi deleted file mode 100755 index 73dfff2e5a6..00000000000 --- a/mozilla/webtools/bonsai/branchspammer.cgi +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -require 'lloydcgi.pl'; -require 'timelocal.pl'; -require 'cvsquery.pl'; - -$| = 1; - -print "Content-type: text/html - -"; - -$CHECKIN_DATA_FILE = 'data/checkinlog_m_src'; -$CHECKIN_INDEX_FILE = 'data/index_m_src'; - -# -# build a module map -# -$query_module = $form{'module'}; - -@query_dirs = split(/[;, \t]+/, $form{'dir'}); - -$query_date_type = $form{'date'}; -$query_date_min = time-(24*60*60*15); -$query_who ='' ; -$query_branch = $form{'branch'}; - - -print "

    Running Query, this may take a while...

    "; - -$result= &query_checkins( $mod_map ); - -# -# Test code to print the results -# - - if( 0 ) { - if( $form{"sortby"} eq "Who" ){ - $result = [sort { - $a->[$CI_WHO] cmp $b->[$CI_WHO] - || $b->[$CI_DATE] <=> $a->[$CI_DATE] - } @{$result}] ; - $head_who = $SORT_HEAD; - } - elsif( $form{"sortby"} eq "File" ){ - $result = [sort { - $a->[$CI_FILE] cmp $b->[$CI_FILE] - || $b->[$CI_DATE] <=> $a->[$CI_DATE] - || $a->[$CI_DIRECTORY] cmp $b->[$CI_DIRECTORY] - } @{$result}] ; - $head_file = $SORT_HEAD; - } - elsif( $form{"sortby"} eq "Directory" ){ - $result = [sort { - $a->[$CI_DIRECTORY] cmp $b->[$CI_DIRECTORY] - || $a->[$CI_FILE] cmp $b->[$CI_FILE] - || $b->[$CI_DATE] <=> $a->[$CI_DATE] - } @{$result}] ; - $head_directory = $SORT_HEAD; - } - elsif( $form{"sortby"} eq "Change Size" ){ - $result = [sort { - - ($b->[$CI_LINES_ADDED]- $b->[$CI_LINES_REMOVED]) - <=> ($a->[$CI_LINES_ADDED]- $a->[$CI_LINES_REMOVED]) - #|| $b->[$CI_DATE] <=> $a->[$CI_DATE] - } @{$result}] ; - $head_delta = $SORT_HEAD; - } - else{ - $result = [sort {$b->[$CI_DATE] <=> $a->[$CI_DATE]} @{$result}] ; - $head_date = $SORT_HEAD; - } - } - -print "
    ";
    -for $ci (@$result) {
    -    $ci->[$CI_LOG] = '';
    -    $s = join("|",@$ci);
    -    print "$s\n";
    -}
    -
    diff --git a/mozilla/webtools/bonsai/changebar.tcl b/mozilla/webtools/bonsai/changebar.tcl
    deleted file mode 100755
    index a50d775de92..00000000000
    --- a/mozilla/webtools/bonsai/changebar.tcl
    +++ /dev/null
    @@ -1,83 +0,0 @@
    -#!/usr/bonsaitools/bin/mysqltcl
    -# -*- Mode: tcl; indent-tabs-mode: nil -*-
    -#
    -# The contents of this file are subject to the Netscape Public License
    -# Version 1.0 (the "License"); you may not use this file except in
    -# compliance with the License. You may obtain a copy of the License at
    -# http://www.mozilla.org/NPL/
    -#
    -# Software distributed under the License is distributed on an "AS IS"
    -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
    -# License for the specific language governing rights and limitations
    -# under the License.
    -#
    -# The Original Code is the Bonsai CVS tool.
    -#
    -# The Initial Developer of the Original Code is Netscape Communications
    -# Corporation. Portions created by Netscape are Copyright (C) 1998
    -# Netscape Communications Corporation. All Rights Reserved.
    -
    -# Takes two files, and creates a file with changebars.
    -
    -set file1 [lvarpop argv]
    -set file2 [lvarpop argv]
    -
    -set data(foo) {}
    -unset data(foo)
    -
    -set count 0
    -for_file line $file1 {
    -    incr count
    -    set data($count) $line
    -    set mark($count) " "
    -}
    -
    -set fid [open "|/usr/local/bin/diff -b -e $file1 $file2" "r"]
    -
    -
    -proc Delete {first last} {
    -    global data
    -    for {set i $first} {$i<=$last} {incr i} {
    -        unset data($i)
    -    }
    -}
    -
    -proc Add {first fid} {
    -    global data mark
    -    set sub 10000
    -    while {[gets $fid line] >= 0} {
    -        if {[cequal $line "."]} {
    -            break
    -        }
    -        set data($first.$sub) $line
    -        set mark($first.$sub) "|"
    -        incr sub
    -    }
    -}
    -
    -
    -
    -while {[gets $fid line] >= 0} {
    -    if {![regexp {^(.*),(.*)(a|c|d)$} $line foo first last]} {
    -        set first [crange $line 0 end-1]
    -        set last $first
    -    }
    -    switch [cindex $line end] {
    -        d {
    -            Delete $first $last
    -        }
    -        c {
    -            Delete $first $last
    -            Add $first $fid
    -        }
    -        a {
    -            Add $first $fid
    -        }
    -    }
    -}
    -
    -catch {close $fid}
    -
    -foreach i [lsort -real [array names data]] {
    -    puts "$mark($i) $data($i)"
    -}
    diff --git a/mozilla/webtools/bonsai/closemessage b/mozilla/webtools/bonsai/closemessage
    deleted file mode 100644
    index 997eb53b7fc..00000000000
    --- a/mozilla/webtools/bonsai/closemessage
    +++ /dev/null
    @@ -1,23 +0,0 @@
    -From: bonsai-daemon
    -To: %name%
    -Subject: [Bonsai] Hey!  You checked in while the tree was closed!
    -Mime-Version: 1.0
    -Content-Type: text/html
    -
    -
    -
    -

    Boy, you better have had permission!

    - -You just checked into %dir% the files %files%. The -tree is currently frozen. You better have had permission from the build group -to make a checkin; otherwise, you're in deep doo-doo. - -

    - -Your contact info and other vital data is listed below. Please -update -this info immediately if it is at all inaccurate or incorrect. - -


    - -%profile% diff --git a/mozilla/webtools/bonsai/contacthelp.html b/mozilla/webtools/bonsai/contacthelp.html deleted file mode 100644 index 7c3574c50a5..00000000000 --- a/mozilla/webtools/bonsai/contacthelp.html +++ /dev/null @@ -1,27 +0,0 @@ - -Changing other people's contact info. - - - -

    Changing other people's contact info.

    - -Occasionally, you need to change the "contact info" listed for some -other person. (Like, they just called you on their celphone from the -horrible traffic accident they just got in, and need you to go on the -hook for them.) Well, it's easy. Go ahead onto their contact page, -change the contact info field, and type your own username and UNIX -password to the form. It'll work. -

    -Note that you're only allowed to change the "Current Contact Info" -field this way. It won't let you change anything else. - -


    - -Back to the top of Bonsai - -
    -
    Terry Weissman <terry@netscape.com>
    - -Last modified: Wed Oct 30 13:03:35 1996 - - diff --git a/mozilla/webtools/bonsai/countcheckins.cgi b/mozilla/webtools/bonsai/countcheckins.cgi deleted file mode 100755 index 84273a42d31..00000000000 --- a/mozilla/webtools/bonsai/countcheckins.cgi +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -set maxsize 400 - -LoadCheckins - -puts "Content-type: text/html - - -Beancounter central. - -

    Meaningless checkin statistics

    - - - - - - -" - -set list {} - - -foreach i [glob "[DataDir]/batch-*\[0-9\]"] { - regexp -- {[0-9]*$} $i n - lappend list $n -} - -set list [lsort -integer -decreasing $list] - -set first 1 - -set biggest 1 - -foreach i $list { - source [DataDir]/batch-$i - set num($i) [llength $checkinlist] - if {$num($i) > $biggest} { - set biggest $num($i) - } - if {$first} { - set donetime($i) "Current hook" - set first 0 - } else { - set donetime($i) [MyFmtClock $closetimestamp] - } - catch {unset people} - set people(zzz) 1 - unset people(zzz) - foreach c $checkinlist { - upvar #0 $c info - set people($info(person)) 1 - } - set numpeople($i) [array size people] -} - -foreach i $list { - puts "" - puts "" - puts "" - puts "" - puts "" - puts "" -} -puts "
    Tree closedNumber
    of
    people
    making
    changes
    Number of checkins
    $donetime($i)$numpeople($i)$num($i)
     
    " - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/createlegaldirs.tcl b/mozilla/webtools/bonsai/createlegaldirs.tcl deleted file mode 100755 index 997597f879c..00000000000 --- a/mozilla/webtools/bonsai/createlegaldirs.tcl +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source globals.tcl - -set treeid [lindex $argv 0] -LoadTreeConfig -set modulename $treeinfo($treeid,module) - -Log "Attempting to recreate legaldirs..." - -proc digest {str} { - global array - set key [lvarpop str] - if {[cequal [cindex [lindex $str 0] 0] "-"]} { - lvarpop str - } - set array($key) $str -} - - - -set env(CVSROOT) $treeinfo($treeid,repository) -set origdir [pwd] -cd / -set fid [open "|$cvscommand checkout -c" r] -cd $origdir - -set curline "" -while {[gets $fid line] >= 0} { - if {[ctype space [cindex $line 0]]} { - append curline $line - } else { - digest $curline - set curline $line - } -} -digest $curline -close $fid - -if {![info exists array($modulename)]} { - error "modules file no longer includes $modulename ???" -} - -set oldlist {} -set list $modulename - -while {![cequal $list $oldlist]} { - set oldlist $list - set list {} - foreach i $oldlist { - if {[info exists array($i)]} { - set list [concat $list $array($i)] - # Do an unset to prevent infinite recursion. - unset array($i) - } else { - lappend list $i - } - } -} - - - - - -Lock -set fid [open "[DataDir]/legaldirs" "w"] -catch {chmod 0666 "[DataDir]/legaldirs"} -foreach i $list { - puts $fid $i - puts $fid "$i/*" -} -close $fid -Log "...legaldirs recreated." -Unlock - -exit diff --git a/mozilla/webtools/bonsai/cvsblame.cgi b/mozilla/webtools/bonsai/cvsblame.cgi deleted file mode 100755 index b4cec4a2ddf..00000000000 --- a/mozilla/webtools/bonsai/cvsblame.cgi +++ /dev/null @@ -1,614 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# cvsblame.cgi -- cvsblame with logs as popups and allowing html in comments. - -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -# Created: Steve Lamm , 12-Sep-97. -# Modified: Marc Byrd , 19971030. -# -# Arguments (passed via GET or POST): -# file - path to file name (e.g. ns/cmd/xfe/Makefile) -# root - cvs root (e.g. /warp/webroot) -# - default includes /m/src/ and /h/rodan/cvs/repository/1.0 -# rev - revision (default is the latest version) -# line_nums - boolean for line numbers on/off (use 1,0). -# (1,on by default) -# use_html - boolean for html comments on/off (use 1,0). -# (0,off by default) -# sanitize - path to sanitization dictionary -# (e.g. /warp2/webdoc/projects/bonsai/dictionary/sanitization.db) -# mark - highlight a line -# - -require 'lloydcgi.pl'; -require 'cvsblame.pl'; -require 'utils.pl'; -use SourceChecker; - -$| = 1; - -# Cope with the cookie and print the header, first thing. That way, if -# any errors result, they will show up for the user. - -print "Content-Type:text/html\n"; -if ($ENV{"REQUEST_METHOD"} eq 'POST' && defined($form{'set_line'})) { - # Expire the cookie 5 months from now - print "Set-Cookie: line_nums=$form{'set_line'}; expires=" - . toGMTString(time + 86400 * 152) . "; path=/\n"; -} -print "\n"; - - -# Some Globals -# - -@src_roots = getRepositoryList(); - -# Init sanitiazation source checker -# -$sanitization_dictionary = $form{'sanitize'}; -$opt_sanitize = defined $sanitization_dictionary; -if ( $opt_sanitize ) -{ - dbmopen %SourceChecker::token_dictionary, "$sanitization_dictionary", 0664; -} - -# Init byrd's 'feature' to allow html in comments -# -$opt_html_comments = &html_comments_init(); - - -# Handle the "file" argument -# -$filename = ''; -$filename = $form{'file'} if defined($form{'file'}); -if ($filename eq '') -{ - &print_usage; - exit; -} -($file_head, $file_tail) = $filename =~ m@(.*/)?(.+)@; - -# Handle the "rev" argument -# -$opt_rev = $form{'rev'} if defined($form{'rev'} && $form{'rev'} ne 'HEAD'); -$browse_revtag = "HEAD"; -$browse_revtag = $opt_rev if ($opt_rev =~ /[A-Za-z]/); -$revision = ''; - - -# Handle the "root" argument -# -if (defined($root = $form{'root'}) && $root ne '') { - $root =~ s|/$||; - validateRepository($root); - if (-d $root) { - unshift(@src_roots, $root); - } else { - &print_top; - print "Error: Root, $root, is not a directory.

    \n"; - print "\n"; - &print_bottom; - exit; - } -} - - -# Find the rcs file -# -foreach (@src_roots) { - $root = $_; - $rcs_filename = "$root/$filename,v"; - goto found_file if -r $rcs_filename; - $rcs_filename = "$root/${file_head}Attic/$file_tail,v"; - goto found_file if -r $rcs_filename; -} -# File not found -&print_top; -print "Rcs file, $filename, does not exist.

    \n"; -print "\n"; -&print_bottom; -exit; - -found_file: - - ($rcs_path) = $rcs_filename =~ m@$root/(.*)/.+?,v@; - -CheckHidden($rcs_filename); - - -# Parse the rcs file ($opt_rev is passed as a global) -# -$revision = &parse_cvs_file($rcs_filename); -$file_rev = $revision; - -# Handle the "line_nums" argument -# -$opt_line_nums = 0; -$opt_line_nums = 1 if $cookie_jar{'line_nums'} eq 'on'; -$opt_line_nums = 0 if $form{'line_nums'} =~ /off|no|0/i; -$opt_line_nums = 1 if $form{'line_nums'} =~ /on|yes|1/i; - -# Option to make links to included files -$opt_includes = 0; -$opt_includes = 1 if $form{'includes'} =~ /on|yes|1/i; -$opt_includes = 1 if $opt_includes && $file_tail =~ /(.c|.h|.cpp)$/; - -@text = &extract_revision($revision); -die "$progname: Internal consistency error" if ($#text != $#revision_map); - - -# Handle the "mark" argument -# -$mark_arg = ''; -$mark_arg = $form{'mark'} if defined($form{'mark'}); -foreach $mark (split(',',$mark_arg)) { - if (($begin, $end) = $mark =~ /(\d*)\-(\d*)/) { - $begin = 1 if $begin eq ''; - $end = $#text + 1 if $end eq '' || $end > $#text + 1; - next if $begin >= $end; - $mark_line{$begin} = 'begin'; - $mark_line{$end} = 'end'; - } else { - $mark_line{$mark} = 'single'; - } -} - -# Start printing out the page -# -&print_top; - -if ($ENV{'HTTP_USER_AGENT'} =~ /Win/) { - $font_tag = "
    ";
    -} else {
    -    # We don't want your stinking Windows font
    -    #$font_tag = "";
    -    $font_tag = "
    ";
    -}
    -
    -# Print link at top for directory browsing
    -#
    -$output = "
    "; -foreach $path (split('/',$rcs_path)) { - $link_path .= url_encode2($path); - $output .= "$path/ "; - $link_path .= '/'; -} -$output .= "$file_tail " - ." ("; -$output .= "$browse_revtag:" unless $browse_revtag eq 'HEAD'; -$output .= $revision if $revision; -$output .= ")"; - -$output .= "
    "; -EmitHtmlHeader("CVS Blame", $output); -print "
    \n"; - -print $font_tag; - -# Print each line of the revision, preceded by its annotation. -# -$start_of_mark = 0; -$end_of_mark = 0; -$count = $#revision_map; -if ($count == 0) { - $count = 1; -} -$line_num_width = int(log($count)/log(10)) + 1; -$revision_width = 3; -$author_width = 5; -$line = 0; -$usedlog{$revision} = 1; -foreach $revision (@revision_map) -{ - $text = $text[$line++]; - $usedlog{$revision} = 1; - - - if ($opt_html_comments) { - # Don't escape HTML in C/C++ comments - $text = &leave_html_comments($text); - } elsif ( $opt_sanitize ){ - # Mark filty words and Escape HTML meta-characters - $text = markup_line($text); - } else { - $text =~ s/&/&/g; - $text =~ s//>/g; - } - # Add a link to traverse to included files - $text = &link_includes($text) if $opt_includes; - - - $output = ""; - - # Highlight lines - if (defined($mark_cmd = $mark_line{$line}) - && $mark_cmd ne 'end') { - - $output .= ""; - #if( defined($prev_revision{$file_rev})) { - $output .= ""; - #} - $output .= "
    $font_tag"; - } - - $output .= sprintf("%${line_num_width}s ", $line) if $opt_line_nums; - - if ($old_revision ne $revision || $rev_count > 20) { - - $author_width = max($author_width,length($revision_author{$revision})); - $revision_width = max($revision_width,length($revision)); - - $output .= ($rev_count > 20 ? '| ' : '+ '); - - $output .= sprintf("%-${author_width}s ",$revision_author{$revision}); - - $output .= "$revision "; - $output .= ' ' x ($revision_width - length($revision)); - - $old_revision = $revision; - $rev_count = 0; - } else { - $output .= '| ' . ' ' x ($author_width + $revision_width); - } - $rev_count++; - - $output .= "$text"; - - # Close the highlighted section - if (defined($mark_cmd) && $mark_cmd ne 'begin') { - chop($output); - $output .= "Previous Revision ($prev_revision{$file_rev}) 
    "; - } - - print $output; -} -print "
    \n"; - -# Write out cvs log messages as a JS variables -# -print ""; - -&print_bottom; - -print "
    (This page is much cooler with a layers enabled browser)
    "; - -if ( $opt_sanitize ) -{ - dbmclose %SourceChecker::token_dictionary; -} - -## END of main script - -sub max { - local ($a, $b) = @_; - return ($a > $b ? $a : $b); -} - -sub print_top { - local ($title_text) = "for $file_tail ("; - $title_text .= "$browse_revtag:" unless $browse_revtag eq 'HEAD'; - $title_text .= $revision if $revision; - $title_text .= ")"; - $title_text =~ s/\(\)//; - - local ($diff_dir_link) = - "cvsview2.cgi?subdir=$rcs_path&files=$file_tail&command=DIRECTORY"; - $diff_dir_link .= "&root=$form{'root'}" if defined $form{'root'}; - $diff_dir_link .= "&branch=$browse_revtag" unless $browse_revtag eq 'HEAD'; - - local ($diff_link) = "cvsview2.cgi?diff_mode=context&whitespace_mode=show"; - $diff_link .= "&root=$form{'root'}" if defined $form{'root'}; - $diff_link .= "&subdir=$rcs_path&command=DIFF_FRAMESET&file=$file_tail"; - - $diff_link = &url_encode3($diff_link); - - print <<__TOP__; - - -CVS Blame $title_text - - - - -__TOP__ -} # print_top - -sub print_usage { - local ($linenum_message) = ''; - local ($new_linenum, $src_roots_list); - local ($title_text) = "Usage"; - - if ($ENV{"REQUEST_METHOD"} eq 'POST' && defined($form{'set_line'})) { - - # Expire the cookie 5 months from now - $set_cookie = "Set-Cookie: line_nums=$form{'set_line'}; expires=" - .&toGMTString(time + 86400 * 152)."; path=/"; - } - if (!defined($cookie_jar{'line_nums'}) && !defined($form{'set_line'})) { - $new_linenum = 'on'; - } elsif ($cookie_jar{'line_nums'} eq 'off' || $form{'set_line'} eq 'off') { - $linenum_message = 'Line numbers are currently off.'; - $new_linenum = 'on'; - } else { - $linenum_message = 'Line numbers are currently on.'; - $new_linenum = 'off'; - } - $src_roots_list = join('
    ', @src_roots); - - print <<__USAGE__; - - -CVS Blame $title_text - -

    CVS Blame Usage

    -Add parameters to the query string to view a file. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParamDefaultExampleDescription
    file--ns/cmd/Makefilepath to file name
    root$src_roots_list/warp/webrootcvs root
    revHEAD1.3 -
    ACTRA_branch
    revision
    line_numsoff *on -
    off
    line numbers
    #<line_number>--#111jump to a line
    - -

    Examples: -
      - - cvsblame.cgi?file=ns/cmd/Makefile -
      - - cvsblame.cgi?file=ns/cmd/xfe/mozilla.c&rev=Dogbert4xEscalation_BRANCH -
      - - cvsblame.cgi?file=projects/bonsai/cvsblame.cgi&root=/warp/webroot -
      - - cvsblame.cgi?file=ns/config/config.mk&line_nums=on -
      - - cvsblame.cgi?file=ns/cmd/xfe/dialogs.c#2384 -
    - -

    -You may also begin a query with the CVS Query Form. -

    - - - - - - - - -
    *Instead of the line_nums parameter, you can - - line numbers.
    $linenum_message
    - - -
    -__USAGE__ - &print_bottom; -} # sub print_usage - -sub print_bottom { - print <<__BOTTOM__; -
    - -Page configuration and help. -Mail feedback to <slamm\@netscape.com>. - - -__BOTTOM__ -} # print_bottom - - -sub link_includes { - local ($text) = $_[0]; - - if ($text =~ /\#(\s*)include(\s*)"(.*?)"/) { - foreach $trial_root (($rcs_path, 'ns/include', - "$rcs_path/Attic", "$rcs_path/..")) { - if (-r "$root/$trial_root/$3,v") { - $text = "$`#$1include$2\"$3\";$'"; - last; - } - } - } - return $text; -} - -sub html_comments_init { - return 0 unless defined($form{'use_html'}) && $form{'use_html'}; - - # Initialization for C comment context switching - $in_comments = 0; - $open_delim = '\/\*'; - $close_delim = '\*\/'; - - # Initialize the next expected delim - $expected_delim = $open_delim; - - return 1; -} - -sub leave_html_comments { - local ($text) = $_[0]; - # Allow HTML in the comments. - # - $newtext = ""; - $oldtext = $text; - while ($oldtext =~ /(.*$expected_delim)(.*\n)/) { - $a = $1; - $b = $2; - # pay no attention to C++ comments within C comment context - if ($in_comments == 0) { - $a =~ s//>/g; - $expected_delim = $close_delim; - $in_comments = 1; - } - else { - $expected_delim = $open_delim; - $in_comments = 0; - } - $newtext = $newtext . $a; - $oldtext = $b; - } - # Handle thre remainder - if ($in_comments == 0){ - $oldtext =~ s//>/g; - } - $text = $newtext . $oldtext; - - # Now fix the breakage of stuff on xfe. -byrd - if ($text =~ /(.*)<(.*@.*)>(.*\n)/) { - $text = $1 . "$2" . $3; - } - - return $text; -} diff --git a/mozilla/webtools/bonsai/cvsblame.pl b/mozilla/webtools/bonsai/cvsblame.pl deleted file mode 100755 index 04c88abc5de..00000000000 --- a/mozilla/webtools/bonsai/cvsblame.pl +++ /dev/null @@ -1,825 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -############################################################################## -# -# cvsblame.pl - Shamelessly adapted from Scott Furman's cvsblame script -# by Steve Lamm (slamm@netscape.com) -# - Annotate each line of a CVS file with its author, -# revision #, date, etc. -# -# Report problems to Steve Lamm (slamm@netscape.com) -# -############################################################################## - -require 'timelocal.pl'; # timestamps -use Date::Format; # human-readable dates - -$debug = 0; - -# Extract base part of this script's name -($progname) = $0 =~ /([^\/]+)$/; - -&cvsblame_init; - -1; - - -sub cvsblame_init { - # Use default formatting options if none supplied - if (!$opt_A && !$opt_a && !$opt_d && !$opt_v) { - $opt_a = 1; - $opt_v = 1; - } - - $time = time; - $SECS_PER_DAY = 60 * 60 * 24; - - # Timestamp threshold at which annotations begin to occur, if -m option present. - $opt_m_timestamp = $time - $opt_m * $SECS_PER_DAY; -} - -# Generic traversal of a CVS tree. Invoke callback function for -# individual directories that contain CVS files. -sub traverse_cvs_tree { - local ($dir, *callback, $nlink) = @_; - local ($dev, $ino, $mode, $subcount); - - # Get $nlink for top-level directory - ($dev, $ino, $mode, $nlink) = stat($dir) unless $nlink; - - # Read directory - opendir(DIR, $dir) || die "Can't open $dir\n"; - local(@filenames) = readdir(DIR); - closedir(DIR); - - return if ! -d "$dir/CVS"; - - &callback($dir); - - # This dir has subdirs - if ($nlink != 2) { - $subcount = $nlink - 2; # Number of subdirectories - for (@filenames) { - last if $subcount == 0; - next if $_ eq '.'; - next if $_ eq '..'; - next if $_ eq 'CVS'; - $name = "$dir/$_"; - - ($dev, $ino, $mode, $nlink) = lstat($name); - next unless -d _; - if (-x _ && -r _) { - print STDERR "$progname: Entering $name\n"; - &traverse_cvs_tree($name, *callback, $nlink); - } else { - warn("Couldn't chdir to $name"); - } - --$subcount; - } - } -} - -# Consume one token from the already opened RCSFILE filehandle. -# Unescape string tokens, if necessary. -sub get_token { - # Erase all-whitespace lines. - while ($line_buffer =~ /^$/) { - die ("Unexpected EOF") if eof(RCSFILE); - $line_buffer = ; - $line_buffer =~ s/^\s+//; # Erase leading whitespace - } - - # A string of non-whitespace characters is a token ... - return $1 if ($line_buffer =~ s/^([^;@][^;\s]*)\s*//o); - - # ...and so is a single semicolon ... - return ';' if ($line_buffer =~ s/^;\s*//o); - - # ...or an RCS-encoded string that starts with an @ character. - $line_buffer =~ s/^@([^@]*)//o; - $token = $1; - - # Detect single @ character used to close RCS-encoded string. - while ($line_buffer !~ /@/o || # Short-circuit optimization - $line_buffer !~ /([^@]|^)@([^@]|$)/o) { - $token .= $line_buffer; - die ("Unexpected EOF") if eof(RCSFILE); - $line_buffer = ; - } - - # Retain the remainder of the line after the terminating @ character. - $i = rindex($line_buffer, '@'); - $token .= substr($line_buffer, 0, $i); - $line_buffer = substr($line_buffer, $i + 1); - - # Undo escape-coding of @ characters. - $token =~ s/@@/@/og; - - # Digest any extra blank lines. - while (($line_buffer =~ /^$/) && !eof(RCSFILE)) { - $line_buffer = ; - } - return $token; -} - -# Consume a token from RCS filehandle and ensure that it matches -# the given string constant. -sub match_token { - local ($match) = @_; - - local ($token) = &get_token; - die "Unexpected parsing error in RCS file $rcs_pathname.\n", - "Expected token: $match, but saw: $token\n" - if ($token ne $match); -} - -# Push RCS token back into the input buffer. -sub unget_token { - local ($token) = @_; - $line_buffer = $token . " " . $line_buffer; -} - -# Parses "administrative" header of RCS files, setting these globals: -# -# $head_revision -- Revision for which cleartext is stored -# $principal_branch -# $file_description -# %revision_symbolic_name -- mapping from numerical revision # to symbolic tag -# %tag_revision -- mapping from symbolic tag to numerical revision # -# -sub parse_rcs_admin { - local ($token, $tag, $tag_name, $tag_revision); - - # Undefine variables, because we may have already read another RCS file - undef %tag_revision; - undef %revision_symbolic_name; - - while (1) { - # Read initial token at beginning of line - $token = &get_token(RCSFILE); - - # We're done once we reach the description of the RCS tree - if ($token =~ /^\d/o) { - &unget_token($token); - return; - } - -# print "token: $token\n"; - - if ($token eq "head") { - $head_revision = &get_token; - &get_token; # Eat semicolon - } elsif ($token eq "branch") { - $principal_branch = &get_token; - &get_token; # Eat semicolon - } elsif ($token eq "symbols") { - - # Create an associate array that maps from tag name to - # revision number and vice-versa. - while (($tag = &get_token) ne ';') { - ($tag_name, $tag_revision) = split(':', $tag); - - $tag_revision{$tag_name} = $tag_revision; - $revision_symbolic_name{$tag_revision} = $tag_name; - } - } elsif ($token eq "comment") { - $file_description = &get_token; - &get_token; # Eat semicolon - - # Ignore all these other fields - We don't care about them. - } elsif (($token eq "locks") || - ($token eq "strict") || - ($token eq "expand") || - ($token eq "access")) { - (1) while (&get_token ne ';'); - } else { - warn ("Unexpected RCS token: $token\n"); - } - } - - die "Unexpected EOF"; -} - -# Construct associative arrays that represent the topology of the RCS tree -# and other arrays that contain info about individual revisions. -# -# The following associative arrays are created, keyed by revision number: -# %revision_date -- e.g. "96.02.23.00.21.52" -# %timestamp -- seconds since 12:00 AM, Jan 1, 1970 GMT -# %revision_author -- e.g. "tom" -# %revision_branches -- descendant branch revisions, separated by spaces, -# e.g. "1.21.4.1 1.21.2.6.1" -# %prev_revision -- revision number of previous *ancestor* in RCS tree. -# Traversal of this array occurs in the direction -# of the primordial (1.1) revision. -# %prev_delta -- revision number of previous revision which forms the -# basis for the edit commands in this revision. -# This causes the tree to be traversed towards the -# trunk when on a branch, and towards the latest trunk -# revision when on the trunk. -# %next_delta -- revision number of next "delta". Inverts %prev_delta. -# -# Also creates %last_revision, keyed by a branch revision number, which -# indicates the latest revision on a given branch, -# e.g. $last_revision{"1.2.8"} == 1.2.8.5 -# -sub parse_rcs_tree { - local($revision, $date, $author, $branches, $next); - local($branch, $is_trunk_revision); - local($mon,$day,$hhmm,$year); - # Undefine variables, because we may have already read another RCS file - undef %timestamp; - undef %revision_age; - undef %revision_author; - undef %revision_branches; - undef %revision_ctime; - undef %revision_date; - undef %prev_revision; - undef %prev_delta; - undef %next_delta; - undef %last_revision; - - while (1) { - $revision = &get_token; - - # End of RCS tree description ? - if ($revision eq 'desc') { - &unget_token($revision); - return; - } - - $is_trunk_revision = ($revision =~ /^[0-9]+\.[0-9]+$/); - - $tag_revision{$revision} = $revision; - ($branch) = $revision =~ /(.*)\.[0-9]+/o; - $last_revision{$branch} = $revision; - - # Parse date - &match_token('date'); - $date = &get_token; - $revision_date{$revision} = $date; - &match_token(';'); - - # Convert date into timestamp - @date_fields = reverse(split(/\./, $date)); - $date_fields[4]--; # Month ranges from 0-11, not 1-12 - $timestamp{$revision} = &timegm(@date_fields); - - # Compute date string; Format it the way I like. - - ($mon, $day, $hhmm, $year) = split(/#/, - time2str("%b#%e#%H:%M#%Y", - $timestamp{$revision})); - $revision_ctime{$revision} = "$day $mon $year $hhmm"; - - # Save age - $revision_age{$revision} = - ($time - $timestamp{$revision}) / $SECS_PER_DAY; - - # Parse author - &match_token('author'); - $author = &get_token; - $revision_author{$revision} = $author; - &match_token(';'); - - # Parse state; - &match_token('state'); - (1) while (&get_token ne ';'); - - # Parse branches - &match_token('branches'); - $branches = ''; - while (($token = &get_token) ne ';') { - $prev_revision{$token} = $revision; - $prev_delta{$token} = $revision; - $branches .= "$token "; - } - $revision_branches{$revision} = $branches; - - # Parse revision of next delta in chain - &match_token('next'); - $next = ''; - if (($token = &get_token) ne ';') { - $next = $token; - &get_token; # Eat semicolon - $next_delta{$revision} = $next; - $prev_delta{$next} = $revision; - if ($is_trunk_revision) { - $prev_revision{$revision} = $next; - } else { - $prev_revision{$next} = $revision; - } - } - - if ($debug >= 3) { - print "
    revision = $revision\n";
    -            print "date     = $date\n";
    -            print "author   = $author\n";
    -            print "branches = $branches\n";
    -            print "next     = $next
    \n\n"; - } - } -} - -sub parse_rcs_description { - &match_token('desc'); - $rcs_file_description = &get_token; -} - -# Construct associative arrays containing info about individual revisions. -# -# The following associative arrays are created, keyed by revision number: -# %revision_log -- log message -# %revision_deltatext -- Either the complete text of the revision, -# in the case of the head revision, or the -# encoded delta between this revision and another. -# The delta is either with respect to the successor -# revision if this revision is on the trunk or -# relative to its immediate predecessor if this -# revision is on a branch. -sub parse_rcs_deltatext { - undef %revision_log; - undef %revision_deltatext; - - while (!eof(RCSFILE)) { - $revision = &get_token; - print "Reading delta for revision: $revision\n" if ($debug >= 3); - &match_token('log'); - $revision_log{$revision} = &get_token; - &match_token('text'); - $revision_deltatext{$revision} = &get_token; - } -} - -# Reads and parses complete RCS file from already-opened RCSFILE descriptor. -sub parse_rcs_file { - print "Reading RCS admin...\n" if ($debug >= 2); - &parse_rcs_admin(); - print "Reading RCS revision tree topology...\n" if ($debug >= 2); - &parse_rcs_tree(); - - if( $debug >= 3 ){ - print "
    Keys:\n\n";
    -        for $i (keys %tag_revision ){
    -            $k = $tag_revision{$i};
    -            print "yoyuo $i: $k\n";            
    -        }
    -        print "
    \n"; - } - - &parse_rcs_description(); - print "Reading RCS revision deltas...\n" if ($debug >= 2); - &parse_rcs_deltatext(); - print "Done reading RCS file...\n" if ($debug >= 2); -} - -# Map a tag to a numerical revision number. The tag can be a symbolic -# branch tag, a symbolic revision tag, or an ordinary numerical -# revision number. -sub map_tag_to_revision { - local($tag_or_revision) = @_; - - local ($revision) = $tag_revision{$tag_or_revision}; - - # Is this a branch tag, e.g. xxx.yyy.0.zzz - if ($revision =~ /(.*)\.0\.([0-9]+)/o) { - $branch = $1 . '.' . $2; - # Return latest revision on the branch, if any. - return $last_revision{$branch} if (defined($last_revision{$branch})); - return $1; # No revisions on branch - return branch point - } else { - return $revision; - } -} - -# Construct an ordered list of ancestor revisions to the given -# revision, starting with the immediate ancestor and going back -# to the primordial revision (1.1). -# -# Note: The generated path does not traverse the tree the same way -# that the individual revision deltas do. In particular, -# the path traverses the tree "backwards" on branches. - -sub ancestor_revisions { - local ($revision) = @_; - local (@ancestors); - - $revision = $prev_revision{$revision}; - while ($revision) { - push(@ancestors, $revision); - $revision = $prev_revision{$revision}; - } - - return @ancestors; -} - -# Extract the given revision from the digested RCS file. -# (Essentially the equivalent of cvs up -rXXX) -sub extract_revision { - local ($revision) = @_; - local (@path); - - # Compute path through tree of revision deltas to most recent trunk revision - while ($revision) { - push(@path, $revision); - $revision = $prev_delta{$revision}; - } - @path = reverse(@path); - shift @path; # Get rid of head revision - - # Get complete contents of head revision - local (@text) = split(/^/, $revision_deltatext{$head_revision}); - - # Iterate, applying deltas to previous revision - foreach $revision (@path) { - $adjust = 0; - @diffs = split(/^/, $revision_deltatext{$revision}); - - local ($lines_added) = 0; - local ($lines_removed) = 0; - - foreach $command (@diffs) { - if ($add_lines_remaining > 0) { - # Insertion lines from a prior "a" command. - splice(@text, $start_line + $adjust, - 0, $command); - $add_lines_remaining--; - $adjust++; - } elsif ($command =~ /^d(\d+)\s(\d+)/) { - # "d" - Delete command - ($start_line, $count) = ($1, $2); - splice(@text, $start_line + $adjust - 1, $count); - $adjust -= $count; - $lines_removed += $count; - } elsif ($command =~ /^a(\d+)\s(\d+)/) { - # "a" - Add command - ($start_line, $count) = ($1, $2); - $add_lines_remaining = $count; - $lines_added += $lines_added; - } else { - die "Error parsing diff commands"; - } - } - $lines_removed{$revision} += $lines_removed; - $lines_added{$revision} += $lines_added; - } - - return @text; -} - -sub parse_cvs_file { - local($rcs_pathname) = @_; - - # Args in: $opt_rev - requested revision - # $opt_m - time since modified - # Args out: @revision_map - # $revision - # %timestamp - # (%revision_deltatext) - - @revision_map = (); - CheckHidden($rcs_pathname); - - die "$progname: error: This file appeared to be under CVS control, " . - "but the RCS file is inaccessible.\n(Couldn't open '$rcs_pathname')\n" - if !open (RCSFILE, "< $rcs_pathname"); - &parse_rcs_file(); - close(RCSFILE); - - if (!defined($opt_rev) || $opt_rev eq '' || $opt_rev eq 'HEAD') { - # Explicitly specified topmost revision in tree - $revision = $head_revision; - } else { - # Symbolic tag or specific revision number specified. - $revision = &map_tag_to_revision($opt_rev); - die "$progname: error: -r: No such revision: $opt_rev\n" - if ($revision eq ''); - } - - # The primordial revision is not always 1.1! Go find it. - my $primordial = $revision; - while ($prev_revision{$primordial} != "") { - $primordial = $prev_revision{$primordial}; - } - - # Don't display file at all, if -m option is specified and no - # changes have been made in the specified file. - return if ($opt_m && $timestamp{$revision} < $opt_m_timestamp); - - # Figure out how many lines were in the primordial, i.e. version 1.1, - # check-in by moving backward in time from the head revision to the - # first revision. - $line_count = split(/^/, $revision_deltatext{$head_revision}); - for ($rev = $prev_revision{$head_revision}; $rev; - $rev = $prev_revision{$rev}) { - @diffs = split(/^/, $revision_deltatext{$rev}); - foreach $command (@diffs) { - if ($skip > 0) { - # Skip insertion lines from a prior "a" command. - $skip--; - } elsif ($command =~ /^d(\d+)\s(\d+)/) { - # "d" - Delete command - ($start_line, $count) = ($1, $2); - $line_count -= $count; - } elsif ($command =~ /^a(\d+)\s(\d+)/) { - # "a" - Add command - ($start_line, $count) = ($1, $2); - $skip = $count; - $line_count += $count; - } else { - die "$progname: error: illegal RCS file $rcs_pathname\n", - " error appears in revision $rev\n"; - } - } - } - - # Now, play the delta edit commands *backwards* from the primordial - # revision forward, but rather than applying the deltas to the text of - # each revision, apply the changes to an array of revision numbers. - # This creates a "revision map" -- an array where each element - # represents a line of text in the given revision but contains only - # the revision number in which the line was introduced rather than - # the line text itself. - # - # Note: These are backward deltas for revisions on the trunk and - # forward deltas for branch revisions. - - # Create initial revision map for primordial version. - while ($line_count--) { - push(@revision_map, $primordial); - } - - @ancestors = &ancestor_revisions($revision); - unshift (@ancestors, $revision); # - pop @ancestors; # Remove "1.1" - $last_revision = $primordial; - foreach $revision (reverse @ancestors) { - $is_trunk_revision = ($revision =~ /^[0-9]+\.[0-9]+$/); - - if ($is_trunk_revision) { - @diffs = split(/^/, $revision_deltatext{$last_revision}); - - # Revisions on the trunk specify deltas that transform a - # revision into an earlier revision, so invert the translation - # of the 'diff' commands. - foreach $command (@diffs) { - if ($skip > 0) { - $skip--; - } else { - if ($command =~ /^d(\d+)\s(\d+)$/) { # Delete command - ($start_line, $count) = ($1, $2); - - $#temp = -1; - while ($count--) { - push(@temp, $revision); - } - splice(@revision_map, $start_line - 1, 0, @temp); - } elsif ($command =~ /^a(\d+)\s(\d+)$/) { # Add command - ($start_line, $count) = ($1, $2); - splice(@revision_map, $start_line, $count); - $skip = $count; - } else { - die "Error parsing diff commands"; - } - } - } - } else { - # Revisions on a branch are arranged backwards from those on - # the trunk. They specify deltas that transform a revision - # into a later revision. - $adjust = 0; - @diffs = split(/^/, $revision_deltatext{$revision}); - foreach $command (@diffs) { - if ($skip > 0) { - $skip--; - } else { - if ($command =~ /^d(\d+)\s(\d+)$/) { # Delete command - ($start_line, $count) = ($1, $2); - splice(@revision_map, $start_line + $adjust - 1, $count); - $adjust -= $count; - } elsif ($command =~ /^a(\d+)\s(\d+)$/) { # Add command - ($start_line, $count) = ($1, $2); - - $skip = $count; - $#temp = -1; - while ($count--) { - push(@temp, $revision); - } - splice(@revision_map, $start_line + $adjust, 0, @temp); - $adjust += $skip; - } else { - die "Error parsing diff commands"; - } - } - } - } - $last_revision = $revision; - } - $revision; -} - -__END__ -# -# The following are parts of the original cvsblame script that are not -# used for cvsblame.pl -# - -# Read CVS/Entries and CVS/Repository files. -# -# Creates these associative arrays, keyed by the CVS file pathname -# -# %cvs_revision -- Revision # present in working directory -# %cvs_date -# %cvs_sticky_revision -- Sticky tag, if any -# -# Also, creates %cvs_files, keyed by the directory path, which contains -# a space-separated list of the files under CVS control in the directory -sub read_cvs_entries -{ - local ($directory) = @_; - local ($filename, $rev, $date, $idunno, $sticky, $pathname); - - $cvsdir = $directory . '/CVS'; - - CheckHidden($cvsdir); - - return if (! -d $cvsdir); - - return if !open(ENTRIES, "< $cvsdir/Entries"); - - while() { - chop; - ($filename, $rev, $date, $idunno, $sticky) = split("/", substr($_, 1)); - ($pathname) = $directory . "/" . $filename; - $cvs_revision{$pathname} = $rev; - $cvs_date{$pathname} = $date; - $cvs_sticky_revision{$pathname} = $sticky; - $cvs_files{$directory} .= "$filename\\"; - } - close(ENTRIES); - - return if !open(REPOSITORY, "< $cvsdir/Repository"); - $repository = ; - chop($repository); - close(REPOSITORY); - $repository{$directory} = $repository; -} - -# Given path to file in CVS working directory, compute path to RCS -# repository file. Cache that info for future use. - - -sub rcs_pathname { - ($pathname) = @_; - - if ($pathname =~ m@/@) { - ($directory,$filename) = $pathname =~ m@(.*)/([^/]+)$@; - } else { - ($directory,$filename) = ('.',$pathname); - $pathname = "./" . $pathname; - } - if (!defined($repository{$directory})) { - &read_cvs_entries($directory); - } - - if (!defined($cvs_revision{$pathname})) { - die "$progname: error: File '$pathname' does not appear to be under" . - " CVS control.\n" - } - - print STDERR "file: $filename\n" if $debug; - local ($rcs_path) = $repository{$directory} . '/' . $filename . ',v'; - return $rcs_path if (-r $rcs_path); - - # A file that exists only on the branch, not on the trunk, is found - # in the Attic subdir. - return $repository{$directory} . '/Attic/' . $filename . ',v'; -} - -sub show_annotated_cvs_file { - local($pathname) = @_; - local(@output) = (); - - $revision = &parse_cvs_file($pathname); - - @text = &extract_revision($revision); - die "$progname: Internal consistency error" if ($#text != $#revision_map); - - # Set total width of line annotation. - # Warning: field widths here must match format strings below. - $annotation_width = 0; - $annotation_width += 8 if $opt_a; # author - $annotation_width += 7 if $opt_v; # revision - $annotation_width += 6 if $opt_A; # age - $annotation_width += 12 if $opt_d; # date - $blank_annotation = ' ' x $annotation_width; - - if ($multiple_files_on_command_line) { - print "\n", "=" x (83 + $annotation_width); - print "\n$progname: Listing file: $pathname\n" - } - - # Print each line of the revision, preceded by its annotation. - $line = 0; - foreach $revision (@revision_map) { - $text = $text[$line++]; - $annotation = ''; - - # Annotate with revision author - $annotation .= sprintf("%-8s", $revision_author{$revision}) if $opt_a; - - # Annotate with revision number - $annotation .= sprintf(" %-6s", $revision) if $opt_v; - - # Date annotation - $annotation .= " $revision_ctime{$revision}" if $opt_d; - - # Age annotation ? - $annotation .= sprintf(" (%3s)", - int($revision_age{$revision})) if $opt_A; - - # -m (if-modified-since) annotion ? - if ($opt_m && ($timestamp{$revision} < $opt_m_timestamp)) { - $annotation = $blank_annotation; - } - - # Suppress annotation of whitespace lines, if requested; - $annotation = $blank_annotation if $opt_w && ($text =~ /^\s*$/); - -# printf "%4d ", $line if $opt_l; -# print "$annotation - $text"; - push(@output, sprintf("%4d ", $line)) if $opt_l; - push(@output, "$annotation - $text"); - } - @output; -} - -sub usage { - die -"$progname: usage: [options] [file|dir]...\n", -" Options:\n", -" -r Specify CVS revision of file to display\n", -" can be any of:\n", -" + numeric tag, e.g. 1.23,\n", -" + symbolic branch or revision tag, e.g. CHEDDAR,\n", -" + HEAD keyword (most recent revision on trunk)\n", -" -a Annotate lines with author (username)\n", -" -A Annotate lines with age, in days\n", -" -v Annotate lines with revision number\n", -" -d Annotate lines with date, in local time zone\n", -" -l Annotate lines with line number\n", -" -w Don't annotate all-whitespace lines\n", -" -m <# days> Only annotate lines modified within last <# days>\n", -" -h Print help (this message)\n\n", -" (-a -v assumed, if none of -a, -v, -A, -d supplied)\n" -; -} - -&usage if (!&Getopts('r:m:Aadhlvw')); -&usage if ($opt_h); # help option - -$multiple_files_on_command_line = 1 if ($#ARGV != 0); - -&cvsblame_init; - -sub annotate_cvs_directory -{ - local($dir) = @_; - &read_cvs_entries($dir); - foreach $file (split(/\\/, $cvs_files{$dir})) { - &show_annotated_cvs_file("$dir/$file"); - } -} - -# No files on command-line ? Use current directory. -push(@ARGV, '.') if ($#ARGV == -1); - -# Iterate over files/directories on command-line -while ($#ARGV >= 0) { - $pathname = shift @ARGV; - # Is it a directory ? - if (-d $pathname) { - &traverse_cvs_tree($pathname, *annotate_cvs_directory); - - # No, it must be a file. - } else { - &show_annotated_cvs_file($pathname); - } -} diff --git a/mozilla/webtools/bonsai/cvsguess.cgi b/mozilla/webtools/bonsai/cvsguess.cgi deleted file mode 100755 index bce58a5aa83..00000000000 --- a/mozilla/webtools/bonsai/cvsguess.cgi +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -require 'lloydcgi.pl'; -require 'utils.pl'; - -$file= $form{'file'}; -$mark= $form{'mark'}; -$ln = ($mark > 10 ? $mark-10 : 1 ); -$rev = $form{'rev'}; -$debug = $form{'debug'}; - -print "Content-Type: text/html\n\n"; - -$CVS_ROOT = $form{'root'}; -if( $CVS_ROOT eq '' ){ - $CVS_ROOT = pickDefaultRepository(); -} -validateRepository($CVS_ROOT); - -$CVS_REPOS_SUFIX = $CVS_ROOT; -$CVS_REPOS_SUFIX =~ s/\//_/g; - -$db = ConnectToDatabase(); - -$f = SqlQuote($file); -$qstring = "select distinct dirs.dir from checkins,dirs,files,repositories where dirs.id=dirid and files.id=fileid and repositories.id=repositoryid and repositories.repository='$CVS_ROOT' and files.file='$f' order by dirs.dir"; - -if ($debug) { - print "
    $qstring
    \n"; -} - -$query = $db->Query($qstring) || die $Mysql::db_errstr; - -while(@row = $query->fetchrow){ - $d = $row[0]; - push @fl, "$d/$file"; -} - -if( @fl == 0 ){ - print "

    No files matched this file name. It may have been added recently.

    "; -} -elsif( @fl == 1 ){ - $s = $fl[0]; - print " - - - "; -} -else { - print "

    Pick the file that best matches the one you are looking for:

    \n"; - for $s (@fl) { - print "
    $s"; - } -} diff --git a/mozilla/webtools/bonsai/cvsindex.pl b/mozilla/webtools/bonsai/cvsindex.pl deleted file mode 100755 index f9628cfd16f..00000000000 --- a/mozilla/webtools/bonsai/cvsindex.pl +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -# Figure out which directory bonsai is in by looking at argv[0] - -$bonsaidir = $0; -$bonsaidir =~ s:/[^/]*$::; # Remove last word, and slash before it. -if ($bonsaidir eq "") { - $bonsaidir = "."; -} - -chdir $bonsaidir || die "Couldn't chdir to $bonsaidir"; -require "utils.pl"; - -if( $ARGV[0] eq '' ){ - $CVS_ROOT = pickDefaultRepository(); -} -else { - $CVS_ROOT = $ARGV[0]; -} - -$CVS_REPOS_SUFIX = $CVS_ROOT; -$CVS_REPOS_SUFIX =~ s:/:_:g; - - -$CHECKIN_DATA_FILE = "$bonsaidir/data/checkinlog${CVS_REPOS_SUFIX}"; -$CHECKIN_INDEX_FILE = "$bonsaidir/data/index${CVS_REPOS_SUFIX}"; - -&build_index; -&print_keys; - -sub build_index { - open(CI, "<$CHECKIN_DATA_FILE") || die "could not open checkin data file\n"; - - $file_pos = 0; - $lastlog = 0; - $last_date = 0; - $index = {}; - $now = time; - while( ){ - if( /^LOGCOMMENT/ ){ - $done = 0; - $file_pos += length; - while( !$done && ($line = ) ){ - if( $line =~ /^:ENDLOGCOMMENT/ ){ - $done = 1; - } - $file_pos += length($line); - } - } - else { - #print $_ . "\n"; - $ci = [split(/\|/)]; - $d = $ci->[1]; - - if( $d < $now && $d > ($last_date + 60*60*4) ){ - $index->{$d} = $file_pos; - $last_date = $d; - } - $file_pos += length; - } - } - close( CI ); -} - -sub print_keys { - Lock(); - open(INDEX , ">$CHECKIN_INDEX_FILE"); - for $i (sort {$b <=> $a} keys %{$index}) { - print INDEX "$index->{$i}|$i\n"; - } - close(INDEX); - Unlock(); -} diff --git a/mozilla/webtools/bonsai/cvslog.cgi b/mozilla/webtools/bonsai/cvslog.cgi deleted file mode 100755 index 2be1f957e56..00000000000 --- a/mozilla/webtools/bonsai/cvslog.cgi +++ /dev/null @@ -1,503 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# cvslog.cgi -- cvslog with logs as popups and allowing html in comments. -# -# Created: Steve Lamm , 31-Mar-98. -# -# Arguments (passed via GET or POST): -# file - path to file name (e.g. ns/cmd/xfe/Makefile) -# root - cvs root (e.g. /warp/webroot) -# rev - revision (default is the latest version) -# mark - highlight a revision -# author - filter based on author -# - -require 'lloydcgi.pl'; -require 'cvsblame.pl'; -require 'utils.pl'; -use SourceChecker; - -# Some Globals -# - -$| = 1; - -print "Content-Type:text/html\n\n"; - -@src_roots = getRepositoryList(); - - -# Handle the "file" argument -# -$filename = ''; -$filename = $form{'file'} if defined($form{'file'}); -if ($filename eq '') -{ - &print_usage; - exit; -} -($file_head, $file_tail) = $filename =~ m@(.*/)?(.+)@; - - -# Handle the "rev" argument -# -$opt_rev = $form{'rev'} if defined($form{'rev'} && $form{'rev'} ne 'HEAD'); -$browse_revtag = 'HEAD'; -$browse_revtag = $opt_rev if ($opt_rev =~ /[A-Za-z]/); -$revision = ''; - - -# Handle the "root" argument -# -if (defined($root = $form{'root'}) && $root ne '') { - $root =~ s|/$||; - validateRepository($root); - if (-d $root) { - unshift(@src_roots, $root); - } else { - &print_top; - print "Error: Root, $root, is not a directory.

    \n"; - print "\n"; - &print_bottom; - exit; - } -} - - - -# Find the rcs file -# -foreach (@src_roots) { - $root = $_; - $rcs_filename = "$root/$filename,v"; - goto found_file if -r $rcs_filename; - $rcs_filename = "$root/${file_head}Attic/$file_tail,v"; - goto found_file if -r $rcs_filename; -} -# File not found -&print_top; -print "Rcs file, $filename, does not exist.

    \n"; -print "\n"; -&print_bottom; -exit; - -found_file: - ($rcs_path) = $rcs_filename =~ m@$root/(.*)/.+?,v@; - - -# Parse the rcs file ($opt_rev is passed as a global) -# -$revision = &parse_cvs_file($rcs_filename); -$file_rev = $revision; - - -# Handle the "mark" argument -# -$mark_arg = ''; -$mark_arg = $form{'mark'} if defined($form{'mark'}); -foreach $rev (split(',',$mark_arg)) { - $mark{$rev} = 1; -} - - -# Handle the "author" argument -# -$author_arg = ''; -$author_arg = $form{'author'} if defined($form{'author'}); -foreach $author (split(',',$author_arg)) { - $use_author{$author} = 1; -} - - -# Handle the "sort" argument -$opt_sort = ''; -$opt_sort = $form{'sort'}; - - -# Start printing out the page -# -&print_top; - -if ($ENV{'HTTP_USER_AGENT'} =~ /Win/) { - $font_tag = ""; -} else { - # We don't want your stinking Windows font - $font_tag = ""; -} - -# Print link at top for directory browsing -# -$output = "
    "; - -foreach $path (split('/',$rcs_path)) { - $link_path .= $path; - $output .= "$path/ "; - $link_path .= '/'; -} -$output .= "$file_tail ("; -$output .= "$browse_revtag:" unless $browse_revtag eq 'HEAD'; -$output .= $revision if $revision; -$output .= ")"; - -EmitHtmlHeader("CVS Log", $output); - -&print_useful_links($filename); - -# Create a table with header links to sort by column. -# -$table_tag = ""; -if ($opt_sort eq 'author') { - $table_header_tag .= "
    RevAuthorDateLog"; -} else { - $table_header_tag .= "RevAuthorDateLog"; -} - -$table_header_tag = &url_encode3($table_header_tag); -print "$font_tag$table_tag$table_header_tag"; - -# Print each line of the revision, preceded by its annotation. -# -if ($browse_revtag eq 'HEAD') { - $start_rev = $head_revision; # $head_revision is a global from cvsblame.pl -} else { - $start_rev = map_tag_to_revision($browse_revtag); -} -$row_count = 0; -$max_rev_length = length($start_rev); -$max_author_length = 8; -@revisions = ($start_rev, ancestor_revisions($start_rev)); -@revisions = sort by_author @revisions if $opt_sort eq 'author'; -#@revisions = sort by_author @revisions if $opt_sort eq 'date' && $rev eq 'all'; -foreach $revision (@revisions) -{ - $author = $revision_author{$revision}; - next unless $author_arg eq '' || $use_author{$author}; - - $log = $revision_log{$revision}; - $log =~ s/&/&/g; - $log =~ s//>/g; - eval ('$log =~ s@\d{4,6}@' . $BUGSYSTEMEXPR . '@g;'); - $log =~ s/\n|\r|\r\n/
    /g; - - if ($bgcolor eq '') { - #$bgcolor = ' BGCOLOR="#EEEEEE"';# My browser translates this to white. - $bgcolor = ' BGCOLOR="#E7E7E7"'; # Pick a grey that shows up on 8-bit. - } else { - $bgcolor = ''; - } - - $output = ''; - $row_count++; - if ($row_count > 20) { - $output .= "
    \n$table_tag"; - $row_count = 0; - } - - $output .= "
    " - .""; - - $anchor = "'; - - $output .= "".$author - .' ' x ($max_author_length - length($author)).'$rev_time $log
    "; -&print_bottom; - -## END of main script - -sub by_revision { - local (@a_parts) = split(/\./,$a); - local (@b_parts) = split(/\./,$b); - while(1) { - local ($aa) = shift @a_parts; - local ($bb) = shift @b_parts; - return 1 if $aa eq ''; - return -1 if $bb eq ''; - return $bb <=> $aa if $aa ne $bb; - } -} - -sub by_author { - local ($a_author) = $revision_author{$a}; - local ($b_author) = $revision_author{$b}; - - return $a_author cmp $b_author if $a_author ne $b_author; - return by_revision; -} - -sub revision_pad { - local ($revision) = @_; - return ' ' x ($max_rev_length - length($revision)); -} - -sub sprint_author { - local ($revision) = @_; - local ($author) = $revision_author{$revision}; - - return -} - - -sub print_top { - local ($title_text) = "for $file_tail ("; - $title_text .= "$browse_revtag:" unless $browse_revtag eq 'HEAD'; - $title_text .= $revision if $revision; - $title_text .= ")"; - $title_text =~ s/\(\)//; - - print <<__TOP__; - - -CVS Log $title_text - - - - - - - -__TOP__ -} # print_top - -sub print_usage { - local ($linenum_message) = ''; - local ($new_linenum, $src_roots_list); - local ($title_text) = "Usage"; - - $src_roots_list = join('
    ', @src_roots); - - print <<__USAGE__; - - -CVS Log $title_text - -

    CVS Log Usage

    -Add parameters to the query string to view a file. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParamDefaultExampleDescription
    file--ns/cmd/MakefilePath to file name
    root$src_roots_list/warp/webrootCVS root
    revHEAD1.3 -
    ACTRA_branch
    Revision
    author--slamm,mtoyFilter out these authors
    #<rev_number>--#1.2Jump to a revision
    - -

    Examples: -
      - - cvslog.cgi?file=ns/cmd/Makefile -
      - - cvslog.cgi?file=ns/cmd/xfe/mozilla.c&rev=Dogbert4xEscalation_BRANCH -
      - - cvslog.cgi?file=projects/bonsai/cvslog.cgi&root=/warp/webroot -
      - - cvslog.cgi?file=ns/cmd/xfe/dialogs.c#1.19 -
    -

    -You may also begin a query with the CVS Query Form. -

    -__USAGE__ - &print_bottom; -} # sub print_usage - -sub print_bottom { - print <<__BOTTOM__; -
    - -Page configuration and help. -Mail feedback to <slamm\@netscape.com>. - - -__BOTTOM__ -} # print_bottom - -sub print_useful_links { - my ($path) = @_; - my ($dir, $file) = $path =~ m@(.*/)?(.+)@; - $dir =~ s@/$@@; - - my $diff_base = "cvsview2.cgi"; - my $blame_base = "cvsblame.cgi"; - - # total kludge!! lxr omits the top-level "mozilla" directory... - my $lxr_path = $path; - if ($mozilla_lxr_kludge eq 'TRUE') { - $lxr_path =~ s@^ns/@@; - $lxr_path =~ s@^mozilla/@@; - } - - my $lxr_link = "$lxr_base/$lxr_path"; - my $diff_link = "$diff_base?command=DIRECTORY\&subdir=$dir\&files=$file"; - my $blame_link = "$blame_base?root=$CVS_ROOT\&file=$path"; - -print "
    - - - - -
    - - - - - - - - - - - - - -
    lxr: browse the source code as hypertext.
    diff: compare any two versions.
    blame: annotate the author of each line.
    -
    -
    -"; -} diff --git a/mozilla/webtools/bonsai/cvsmenu.pl b/mozilla/webtools/bonsai/cvsmenu.pl deleted file mode 100644 index 6f8057df577..00000000000 --- a/mozilla/webtools/bonsai/cvsmenu.pl +++ /dev/null @@ -1,64 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -1; - -require 'utils.pl'; - -sub cvsmenu { -my($extra) = @_; -loadConfigData(); -print " -
    Menu
    -

    "; - -my $pass; -my $i; -foreach $pass ("cvsqueryform|Query", - "rview|Browse", - "moduleanalyse|Examine Modules") { - ($page, $title) = split(/\|/, $pass); - print "$title
      \n"; - foreach $i (@treelist) { - my $branch = $treeinfo{$i}->{'branch'}; - if ($branch ne "") { - $branch = "&branch=" . $branch; - } - $desc = $treeinfo{$i}->{'shortdesc'}; - if ($desc eq "") { - $desc = $treeinfo{$i}->{'description'}; - } - print "
    • {'repository'}&module=$treeinfo{$i}->{'module'}$branch>$desc\n"; - }; - print "
    \n"; -}; - -if (open(EXTRA, ") { - print $_; - } - close EXTRA; -} - -print "
    -

    Questions, Comments, Feature requests? mail terry -
    -"; - -} - diff --git a/mozilla/webtools/bonsai/cvsquery.cgi b/mozilla/webtools/bonsai/cvsquery.cgi deleted file mode 100755 index 47df2fb4490..00000000000 --- a/mozilla/webtools/bonsai/cvsquery.cgi +++ /dev/null @@ -1,650 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -require 'lloydcgi.pl'; -require 'utils.pl'; -use Date::Parse; - -loadConfigData(); -$CVS_ROOT = $form{"cvsroot"}; - -require 'timelocal.pl'; -require 'cvsquery.pl'; - -$| = 1; - -$sm_font_tag = ""; - -print "Content-type: text/html - -"; - -$script_str=''; -&setup_script; - -print "$script_str"; - -#print "
    ";
    -
    -
    -$CVS_REPOS_SUFIX = $CVS_ROOT;
    -$CVS_REPOS_SUFIX =~ s/\//_/g;
    -
    -$CHECKIN_DATA_FILE = "data/checkinlog${CVS_REPOS_SUFIX}";
    -$CHECKIN_INDEX_FILE = "data/index${CVS_REPOS_SUFIX}";
    -
    -
    -$SORT_HEAD="bgcolor=\"#DDDDDD\"";
    -
    -#
    -# Log the query
    -open( LOG, ">>data/querylog.txt");
    -$t = time;
    -print LOG "$ENV{'REMOTE_ADDR'} $t $ENV{'QUERY_STRING'}\n";
    -close(LOG);
    -
    -#
    -# build a module map
    -#
    -$query_module = $form{'module'};
    -
    -#
    -# allow ?file=/a/b/c/foo.c to be synonymous with ?dir=/a/b/c&file=foo.c
    -#
    -if ( $form{'dir'} eq '' ) {
    -    my ( $d, $f ) = $form{'file'} =~ m@(.*?/)([^/]*)$@;
    -    $form{'dir'} = $d;
    -    $form{'file'} = $f;
    -}
    -
    -#
    -# build a directory map
    -#
    -@query_dirs = split(/[;, \t]+/, $form{'dir'});
    -
    -$query_file = $form{'file'};
    -$query_filetype = $form{'filetype'};
    -$query_logexpr = $form{'logexpr'};
    -
    -
    -
    -
    -#
    -# date
    -#
    -$query_date_type = $form{'date'};
    -if( $query_date_type eq 'hours' ){
    -    $query_date_min = time - $form{'hours'}*60*60;
    -} 
    -elsif( $query_date_type eq 'day' ){
    -    $query_date_min = time - 24*60*60;
    -}
    -elsif( $query_date_type eq 'week' ){
    -    $query_date_min = time - 7*24*60*60;
    -}
    -elsif( $query_date_type eq 'month' ){
    -    $query_date_min = time - 30*24*60*60;
    -}
    -elsif( $query_date_type eq 'all' ){
    -    $query_date_min = 0;
    -}
    -elsif( $query_date_type eq 'explicit' ){
    -    if ($form{'mindate'} ne "") {
    -        $query_date_min = parse_date($form{'mindate'});
    -    }
    -
    -    if ($form{'maxdate'} ne "") {
    -        $query_date_max = parse_date($form{'maxdate'});
    -    }
    -}
    -else {
    -    $query_date_min = time-60*60*2;
    -}
    -
    -#
    -# who
    -#
    -$query_who = $form{'who'};
    -$query_whotype = $form{'whotype'};
    -
    -
    -$show_raw = $form{'raw'} ne '';
    -
    -#
    -# branch
    -#
    -$query_branch = $form{'branch'};
    -$query_branchtype = $form{'branchtype'};
    -
    -
    -#
    -# tags
    -#
    -$query_begin_tag = $form{'begin_tag'};
    -$query_end_tag = $form{'end_tag'};
    -
    -
    -#
    -# Get the query in english and print it.
    -#
    -$t = $e = &query_to_english;
    -$t =~ s/<[^>]*>//g;
    -
    -$query_debug = $form{'debug'};
    -
    -$result= &query_checkins( $mod_map );
    -
    -for $i (@{$result}) {
    -    $w{"$i->[$CI_WHO]\@netscape.com"} = 1;
    -}
    -
    -@p = sort keys %w;
    -$pCount = @p;
    -$s = join(",%20", @p);
    -
    -$e =~ s/Checkins in/In/;
    -
    -my $menu = "
    -

    $e -

    -Modify Query -
    Mail everyone on this page -($pCount people) -"; - -EmitHtmlTitleAndHeader($t, "CVS Checkins", "$menu"); - -# -# Test code to print the results -# - -$|=1; - -if( !$show_raw ) { - - if( $form{"sortby"} eq "Who" ){ - $result = [sort { - $a->[$CI_WHO] cmp $b->[$CI_WHO] - || $b->[$CI_DATE] <=> $a->[$CI_DATE] - } @{$result}] ; - $head_who = $SORT_HEAD; - } - elsif( $form{"sortby"} eq "File" ){ - $result = [sort { - $a->[$CI_FILE] cmp $b->[$CI_FILE] - || $b->[$CI_DATE] <=> $a->[$CI_DATE] - || $a->[$CI_DIRECTORY] cmp $b->[$CI_DIRECTORY] - } @{$result}] ; - $head_file = $SORT_HEAD; - } - elsif( $form{"sortby"} eq "Directory" ){ - $result = [sort { - $a->[$CI_DIRECTORY] cmp $b->[$CI_DIRECTORY] - || $a->[$CI_FILE] cmp $b->[$CI_FILE] - || $b->[$CI_DATE] <=> $a->[$CI_DATE] - } @{$result}] ; - $head_directory = $SORT_HEAD; - } - elsif( $form{"sortby"} eq "Change Size" ){ - $result = [sort { - - ($b->[$CI_LINES_ADDED]- $b->[$CI_LINES_REMOVED]) - <=> ($a->[$CI_LINES_ADDED]- $a->[$CI_LINES_REMOVED]) - #|| $b->[$CI_DATE] <=> $a->[$CI_DATE] - } @{$result}] ; - $head_delta = $SORT_HEAD; - } - else{ - $result = [sort {$b->[$CI_DATE] <=> $a->[$CI_DATE]} @{$result}] ; - $head_date = $SORT_HEAD; - } - - &print_result($result); -} -else { - print "

    ";
    -    for $ci (@$result) {
    -        $ci->[$CI_LOG] = '';
    -        $s = join("|",@$ci);
    -        print "$s\n";
    -    }
    -}
    -
    -
    -#
    -# code to debug the modules_map
    -#
    -#print "
    \n";
    -#while( ($k,$v) = each(%{$mod_map})) {
    -#    print "$k=$v\n";
    -#}
    -
    -#
    -#
    -#
    -sub print_tcl {
    -    local($result) = @_;
    -    local($t, $count,$first,$i, $k, $files);
    -
    -    $t = time;
    -    print TCLOUT "set treeopen 0\n" .
    -                 "set lastgoodtimestamp $t\n" .
    -                 "set closetimestamp $t\n";
    -    $count = 0;
    -    $first = 0;
    -    $i = 1;
    -
    -
    -    $max = @{$result}+1;
    -
    -    while( $i < $max ){
    -        $c1 = $result->[$first];
    -        $c2 = $result->[$i];
    -        if( $i == $max-1
    -                || $c1->[$CI_DATE] != $c2->[$CI_DATE]
    -                || $c1->[$CI_DIR] ne $c2->[$CI_DIR]
    -                || $c1->[$CI_WHO] ne $c2->[$CI_WHO]
    -        ) {
    -            $files = '{';
    -            $fu = '{';
    -            $k = $first;
    -            while( $k < $i ){
    -                $files .= $result->[$k][$CI_FILE] . " ";
    -                $fu .= &make_fullinfo( $result->[$k] );
    -                $k++;
    -            }
    -            $files .= '}';
    -            $fu .= '}';
    -            print TCLOUT "set ci-${count}(date) $c1->[$CI_DATE]\n" .
    -                      "set ci-${count}(dir) $c1->[$CI_DIR]\n" .
    -                      "set ci-${count}(person) $c1->[$CI_WHO]\n" .
    -                      "set ci-${count}(files) $files\n" .
    -                      "set ci-${count}(fullinfo) $fu\n" .
    -                      "set ci-${count}(log) \{$c1->[$CI_LOG]\}\n" .
    -                      "set ci-${count}(treeopen) 1\n";
    -            $count++;
    -            $first = $i;
    -        }
    -        $i++;
    -    }
    -}
    -
    -sub make_fullinfo{
    -    local( $ci ) = @_;
    -    local( $s );
    -
    -    $a = &tcl_value( $ci->[$CI_FILE] );
    -    $b = &tcl_value( $ci->[$CI_REV] );
    -    $c = &tcl_value( $ci->[$CI_LINES_ADDED] );
    -    $d = &tcl_value( $ci->[$CI_LINES_REMOVED] );
    -    $e = &tcl_value( $ci->[$CI_STICKY] );
    -
    -    return "{$a $b $c $d $e}";
    -}
    -
    -sub tcl_value {
    -    local( $a ) = @_;
    -
    -    if( $a eq '' ){
    -        return '{}';
    -    }
    -    else {
    -        return $a;
    -    }
    -}
    -
    -#
    -#
    -#
    -sub print_result {
    -    local($result) = @_;
    -    local($ci,$i,$k,$j,$max, $l, $span);
    -
    -    &print_head;
    -
    -    $i = 20;
    -    $k = 0;
    -    $max = @{$result};
    -
    -    while( $k < $max ){
    -        $ci = $result->[$k];
    -        $span = 1;
    -        if( ($l = $ci->[$CI_LOG]) ne '' ){
    -            # 
    -            # Calculate the number of consequitive logs that are 
    -            #  the same and nuke them
    -            #
    -            $j = $k+1;
    -            while( $j < $max && $result->[$j]->[$CI_LOG] eq $l ){
    -                $result->[$j]->[$CI_LOG] = '';
    -                $j++;
    -            }
    -
    -            # 
    -            # Make sure we don't break over a description block
    -            #
    -            $span = $j-$k;
    -            if( $span-1 > $i ){
    -                $i = $j-$k;
    -            }
    -        }
    -
    -        &print_ci( $ci, $span );
    -        
    -
    -        if( $i <= 0 ){
    -            $i = 20;
    -            print "
    \n"; - } - else { - $i--; - } - $k++; - } - - &print_foot; -} - -sub print_ci { - local($ci, $span) = @_; - local($sec,$minute,$hour,$mday,$mon,$year,$t); - local($log); - - ($sec,$minute,$hour,$mday,$mon,$year) = localtime( $ci->[$CI_DATE] ); - $t = sprintf("%02d/%02d/%02d %02d:%02d",$mon+1,$mday,$year,$hour,$minute); - - $log = &html_log($ci->[$CI_LOG]); - $rev = $ci->[$CI_REV]; - - print "\n"; - - print "\n"; -} - -sub print_head { - -if ($versioninfo ne "") { - print ""; - print ""; - print ""; - print ""; - print ""; - print "(+$lines_added/$lines_removed) Lines changed."; -} - -$anchor = $ENV{QUERY_STRING}; -$anchor =~ s/\&sortby\=[A-Za-z\ \+]*//g; -$anchor = " - - -"; -} - - -sub print_foot { - print "
    ${sm_font_tag}$t"; - print "[$CI_WHO]','',event);\" >" - . "$ci->[$CI_WHO]\n"; - print "[$CI_DIR]','$ci->[$CI_FILE]','$ci->[$CI_REV]','$query_branch',event)\">\n"; -# if( (length $ci->[$CI_FILE]) + (length $ci->[$CI_DIR]) > 30 ){ -# $d = $ci->[$CI_DIR]; -# if( (length $ci->[$CI_DIR]) > 30 ){ -# $d =~ s/([^\n]*\/)(classes\/)/$1classes\/
      /; -# # Insert a
    before any directory named -# # 'classes.' -# } -# print " $d/
      $ci->[$CI_FILE]
    \n"; -# } -# else{ -# print " $ci->[$CI_DIR]/$ci->[$CI_FILE]\n"; -# } - $d = "$ci->[$CI_DIR]/$ci->[$CI_FILE]"; - if( $query_module eq 'allrepositories' ){ $d = "$ci->[$CI_REPOSITORY]/$d"; } - $d =~ s:/:/ :g; # Insert a whitespace after any slash, so that - # we'll break long names at a reasonable place. - print "$d\n"; - - if( $rev ne '' ){ - $prevrev = &PrevRev( $rev ); - print "
    ${sm_font_tag}$rev\n"; - } - else { - print "\ \n"; - } - - if( !$query_branch_head ){ - print "$ci->[$CI_BRANCH] \n"; - } - print "${sm_font_tag}$ci->[$CI_LINES_ADDED]/$ci->[$CI_LINES_REMOVED] \n"; - if( $log ne '' ){ - eval ('$log =~ s@\d{4,6}@' . $BUGSYSTEMEXPR . '@g;'); - $log =~ s/([ #\t])([0-9][0-9][0-9][0-9][0-9])([^0-9])/$1$2<\/a>$3/g; - # Makes numbers into links to bugsplat. - - $log =~ s/\n/
    /g; - # Makes newlines into
    's - - if( $span > 1 ){ - print "
    $log\n"; - } - else { - print "$log\n"; - } - } - print "
    $anchor>When -${anchor}&sortby=Who>Who -${anchor}&sortby=File>File -Rev -"; - -$descwidth = 47; -if( !$query_branch_head ){ - print "Branch\n"; - $descwidth -= 2; -} - -print " -${anchor}&sortby=Change+Size>+/- -Description -
    "; - print "

    "; -} - -sub html_log { - local( $log ) = @_; - $log =~ s/&/&/g; - $log =~ s/ 7000000) { - return $d; - } - return 0; -} - - - -sub setup_script { - -$script_str =<<'ENDJS'; - - - - - -ENDJS - -} - -# -# Actually do the query -# -sub query_to_english { - my $english = 'Checkins '; - - if( $query_module eq 'allrepositories' ){ - $english .= "to All Repositories "; - } - elsif( $query_module ne 'all' && @query_dirs == 0 ){ - $english .= "to module $query_module "; - } - elsif( $form{dir} ne "" ) { - my $word = "directory"; - if (@query_dirs > 1) { - $word = "directories"; - } - $english .= "to $word $form{dir} "; - } - - if ($query_file ne "") { - if ($english ne 'Checkins ') { - $english .= "and "; - } - $english .= "to file $query_file "; - } - - if( ! ($query_branch =~ /^[ ]*HEAD[ ]*$/i) ){ - if($query_branch eq '' ){ - $english .= "on all branches "; - } - else { - $english .= "on branch $query_branch "; - } - } - - if( $query_who ne '' ){ - $english .= "by $query_who "; - } - - $query_date_type = $form{'date'}; - if( $query_date_type eq 'hours' ){ - $english .="in the last $form{hours} hours"; - } - elsif( $query_date_type eq 'day' ){ - $english .="in the last day"; - } - elsif( $query_date_type eq 'week' ){ - $english .="in the last week"; - } - elsif( $query_date_type eq 'month' ){ - $english .="in the last month"; - } - elsif( $query_date_type eq 'all' ){ - $english .="since the beginning of time"; - } - elsif( $query_date_type eq 'explicit' ){ - if ( $form{mindate} ne "" && $form{maxdate} ne "" ) { - $w1 = "between"; - $w2 = "and" ; - } - else { - $w1 = "since"; - $w2 = "before"; - } - - if( $form{'mindate'} ne "" ){ - $dd = &parse_date($form{'mindate'}); - ($sec,$minute,$hour,$mday,$mon,$year) = localtime( $dd ); - $t = sprintf("%02d/%02d/%02d %02d:%02d",$mon+1,$mday,$year,$hour,$minute); - $english .= "$w1 $t "; - } - - if( $form{'maxdate'} ne "" ){ - $dd = &parse_date($form{'maxdate'}); - ($sec,$minute,$hour,$mday,$mon,$year) = localtime( $dd ); - $t = sprintf("%02d/%02d/%02d %02d:%02d",$mon+1,$mday,$year,$hour,$minute); - $english .= "$w2 $t "; - } - } - return $english . ":"; -} - diff --git a/mozilla/webtools/bonsai/cvsquery.pl b/mozilla/webtools/bonsai/cvsquery.pl deleted file mode 100755 index 5be3316ec1f..00000000000 --- a/mozilla/webtools/bonsai/cvsquery.pl +++ /dev/null @@ -1,448 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -require 'utils.pl'; - -# -# Constants -# -$CI_CHANGE=0; -$CI_DATE=1; -$CI_WHO=2; -$CI_REPOSITORY=3; -$CI_DIR=4; -$CI_FILE=5; -$CI_REV=6; -$CI_STICKY=7; -$CI_BRANCH=8; -$CI_LINES_ADDED=9; -$CI_LINES_REMOVED=10; -$CI_LOG=11; - -$NOT_LOCAL = 1; -$IS_LOCAL = 2; - - -if( $CVS_ROOT eq "" ){ - $CVS_ROOT = pickDefaultRepository(); -} - -#global variables - -$lines_added = 0; -$lines_removed = 0; - -$modules = {}; - -if( $ENV{"OS"} eq "Windows_NT" ){ - # for debugging purposes - $CVS_MODULES='k:/warp/projects/bonsai/modules'; -} -else { - $CVS_MODULES="${CVS_ROOT}/CVSROOT/modules"; - #$CVS_MODULES='data/modules'; -} - -open( MOD, "<$CVS_MODULES") || die "can't open ${CVS_MODULES}"; -&parse_modules; -close( MOD ); - -1; - -# -# Actually do the query -# -sub query_checkins { - local($mod_map) = @_; - local($ci,$result,$lastlog,$rev,$begin_tag,$end_tag); - - if( $query_module ne 'all' && $query_module ne 'allrepositories' && @query_dirs == 0 ){ - $have_mod_map = 1; - $mod_map = &get_module_map( $query_module ); - } - else { - $have_mod_map = 0; - $mod_map = {}; - } - - for $i (@query_dirs ){ - $i =~ s:^/::; # Strip leading slash. - $i =~ s:/$::; # Strip trailing slash. - - if( !$have_mod_map ){ - $mod_map = {}; - $have_mod_map = 1; - } - $mod_map->{$i} = $NOT_LOCAL; - } - - if( $query_branch =~ /^[ ]*HEAD[ ]*$/i ){ - $query_branch_head = 1; - } - - $begin_tag = ""; - $end_tag = ""; - - if ( $query_begin_tag ne '') { - $begin_tag = load_tag($query_begin_tag); - } - - if ( $query_end_tag ne '') { - $end_tag = load_tag($query_end_tag); - } - - - $result = []; - - my $db = ConnectToDatabase(); - - my $qstring = "select type, UNIX_TIMESTAMP(when), people.who, repositories.repository, dirs.dir, files.file, revision, stickytag, branches.branch, addedlines, removedlines, descs.description from checkins,people,repositories,dirs,files,branches,descs where people.id=whoid and repositories.id=repositoryid and dirs.id=dirid and files.id=fileid and branches.id=branchid and descs.id=descid"; - - if( $query_module ne 'allrepositories' ){ - $qstring .= " and repositories.repository = '$CVS_ROOT'"; - } - - if ($query_date_min) { - my $t = formatSqlTime($query_date_min); - $qstring .= " and when >= '$t'"; - } - if ($query_date_max) { - my $t = formatSqlTime($query_date_max); - $qstring .= " and when <= '$t'"; - } - if ($query_branch_head) { - $qstring .= " and branches.branch = ''"; - } elsif ($query_branch ne '') { - my $q = SqlQuote($query_branch); - if ($query_branchtype eq 'regexp') { - $qstring .= - " and branches.branch regexp '$q'"; - } else { - $qstring .= - " and (branches.branch = '$q' or branches.branch = 'T$q')"; - } - } - - if( $query_file ne '') { - my $q = SqlQuote($query_file); - if ($query_filetype eq 'regexp') { - $qstring .= " and files.file regexp '$q'"; - } else { - $qstring .= " and files.file = '$q'"; - } - } - if ($query_who ne '') { - my $q = SqlQuote($query_who); - if ($query_whotype eq 'regexp') { - $qstring .= " and people.who regexp '$q'"; - } else { - $qstring .= " and people.who = '$q'"; - } - } - - if ($query_logexpr ne '') { - my $q = SqlQuote($query_logexpr); - $qstring .= " and descs.description regexp '$q'"; - } - - if ($query_debug) { - print "
     Query: $qstring
    "; - } - - $query = $db->Query($qstring) || die $Mysql::db_errstr; - - $lastlog = 0; - while(@row = $query->fetchrow) { - $ci = []; -# print "
    ";
    -        for ($i=0 ; $i<=$CI_LOG ; $i++) {
    -            $ci->[$i] = $row[$i];
    -# print "$row[$i] ";
    -        }
    -# print "
    "; - - - $key = "$ci->[$CI_DIR]/$ci->[$CI_FILE]"; - if (IsHidden("$ci->[$CI_REPOSITORY]/$key")) { - next; - } - - - - if( $have_mod_map && - !&in_module( $mod_map, $ci->[$CI_DIR], $ci->[$CI_FILE] ) ){ - next; - } - - if( $begin_tag) { - $rev = $begin_tag->{$key}; - print "
    $key begintag is $rev
    \n"; - if ($rev == "" || rev_is_after($ci->[$CI_REV], $rev)) { - next; - } - } - - if( $end_tag) { - $rev = $end_tag->{$key}; - print "
    $key endtag is $rev
    \n"; - if ($rev == "" || rev_is_after($rev, $ci->[$CI_REV])) { - next; - } - } - - if( $query_logexpr ne '' && !($ci->[$CI_LOG] =~ /$query_logexpr/i) ){ - next; - } - - push( @$result, $ci ); - } - - for $ci (@{$result}) { - $lines_added += $ci->[$CI_LINES_ADDED]; - $lines_removed += $ci->[$CI_LINES_REMOVED]; - $versioninfo .= "$ci->[$CI_WHO]|$ci->[$CI_DIR]|$ci->[$CI_FILE]|$ci->[$CI_REV],"; - } - return $result; -} - -sub load_tag { - my $tagname = @_[0]; - - my $tagfile; - my $cvssuffix; - my $s; - my @line; - my $time; - my $cmd; - my $dir; - - $cvssuffix = $CVS_ROOT; - $cvssuffix =~ s/\//_/g; - - $s = $tagname; - - $s =~ s/ /\%20/g; - $s =~ s/\%/\%25/g; - $s =~ s/\//\%2f/g; - $s =~ s/\?/\%3f/g; - $s =~ s/\*/\%2a/g; - - $tagfile = "data/taginfo/$cvssuffix/$s"; - - open(TAG, "<$tagfile") || die "Unknown tag $tagname"; - $result = {}; - - -print "
    parsing tag $tagname
    \n"; - while ( ) { - chop; - @line = split(/\|/); - $time = shift @line; - $cmd = shift @line; - if ($cmd != "add") { - # We ought to be able to cope with these... XXX - next; - } - $dir = shift @line; - $dir =~ s:^$CVS_ROOT/::; - $dir =~ s:^\./::; - - while (@line) { - $file = shift @line; - $file = "$dir/$file"; - $version = shift @line; - $result->{$file} = $version; -print "
    Added ($file,$version) for tag $tagname
    \n"; - } - } - - return $result; -} - - - -sub rev_is_after { - my $r1 = shift @_; - my $r2 = shift @_; - - my @a = split /:/, $r1; - my @b = split /:/, $r2; - - if (@b > @a) { - return 1; - } - - if (@b < @a) { - return 0; - } - - for (my $i=0 ; $i<@a ; $i++) { - if ($a[$i] > $b[$i]) {return 1;} - if ($a[$i] < $b[$i]) {return 0;} - } - return 0; -} - - - -sub find_date_offset { - local( $o, $d, $done, $line ); - $done = 0; - local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$mtime,$ctime,$blksize,$blocks) = stat($CHECKIN_INDEX_FILE); - if ($mtime eq "" || time() - $mtime> 24 * 60 * 60) { - print "

    Please wait -- rebuilding index file...

    \n"; - system "./cvsindex.pl $CVS_ROOT"; - print "

    ...OK, done.

    \n"; - } - Lock(); - if(! open(IDX , "<$CHECKIN_INDEX_FILE") ){ - print "

    can't open index

    "; - Unlock(); - return 0; - } - $i = 0; - while( ($line = ) && !$done){ - chop($line); - ($o,$d) = split(/\|/,$line); - if( $d && $query_date_min > $d ){ - $done = 1; - } - $i++; - } - if( $F_DEBUG ){ - print "seekdate($d) seekoffset($o) readcount($i)\n"; - } - close IDX; - Unlock(); - return $o; -} - - -sub in_module { - local($mod_map, $dirname, $filename ) = @_; - local( @path ); - local( $i, $fp, $local ); - - # - #quick check if it is already in there. - # - if( $mod_map{$dirname} ){ - return 1; - } - - - @path = split(/\//, $dirname); - - $fp = ''; - - for( $i = 0; $i < @path; $i++){ - - $fp .= ($fp ne '' ? '/' : '') . $path[$i]; - - if( $local = $mod_map->{$fp} ){ - if( $local == $IS_LOCAL ){ - if( $i == (@path-1) ){ - return 1; - } - } - else { - # Add directories to the map as we encounter them so we go - # faster - if( $mod_map{$dirname} == 0 ){ - $mod_map{$dirname} = $IS_LOCAL; - } - return 1; - } - } - } - if( $mod_map->{ $fp . '/' . $filename} ) { - return 1; - } - else { - return 0; - } -} - - -sub get_module_map { - local($name) = @_; - local($mod_map); - $mod_map = {}; - &build_map( $name, $mod_map ); - return $mod_map; -} - -sub parse_modules { - while( $l = &get_line ){ - ($mod_name, $flag, @params) = split(/[ \t]+/,$l); - if( $flag ne '-a' ){ - next; - } - $modules->{$mod_name} = [@params]; - } -} - - -sub build_map { - local($name,$mod_map) = @_; - local($bFound, $local); - - $local = $NOT_LOCAL; - $bFound = 0; - - for $i ( @{$modules->{$name}} ){ - $bFound = 1; - if( $i eq '-l' ){ - $local = $IS_LOCAL; - } - elsif( !build_map($i, $mod_map )){ - $mod_map->{$i} = $local; - } - } - return $bFound; -} - - - -sub get_line { - local($l, $save); - - $bContinue = 1; - - while( $bContinue && ($l = ) ){ - chop($l); - if( $l =~ /^[ \t]*\#/ - || $l =~ /^[ \t]*$/ ){ - $l=''; - } - elsif( $l =~ /\\[ \t]*$/ ){ - chop ($l); - $save .= $l . ' '; - } - elsif( $l eq '' && $save eq ''){ - # ignore blank lines - } - else { - $bContinue = 0; - } - } - return $save . $l; -} - - diff --git a/mozilla/webtools/bonsai/cvsqueryform.cgi b/mozilla/webtools/bonsai/cvsqueryform.cgi deleted file mode 100755 index 6a6a2ae81b2..00000000000 --- a/mozilla/webtools/bonsai/cvsqueryform.cgi +++ /dev/null @@ -1,321 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# Query the CVS database. -# -require 'lloydcgi.pl'; -require 'cvsmenu.pl'; -require 'utils.pl'; - - -$|=1; - -$CVS_ROOT = $form{"cvsroot"}; - -print "Content-type: text/html\n\n"; - -require 'modules.pl'; - - -EmitHtmlHeader("CVS Query Form", $CVS_ROOT); - - -print " -

    -

    -

    - -"; - - -# -# module selector -# -print " - -\n"; -print ""; - -# -# Branch -# -if( defined $form{branch} ){ - $b = $form{branch}; -} -else { - $b = "HEAD"; -} -print " - -"; - -# -# Query by directory -# -print " - - - - -"; - -print " - - - - -"; - - -# -# Who -# -print " - - - -"; - - -# -# Log contains -# -#print " -#
    -#Log contains: -#(you can use regular expressions)\n"; - - -# -# Sort order -# -print " - - - - -"; - -# -# Print the date selector -# - -$CVS_REPOS_SUFFIX = $CVS_ROOT; -$CVS_REPOS_SUFFIX =~ s:/:_:g; - -$startdate = fetchCachedStartDate($CVS_ROOT); - -if ($form{date} eq "") { - $form{date} = "hours"; -} - -print " - - - -"; - -print " - - - - -
    Module: -"; -cvsmenu(); -print "
    Branch:
    \n" . -regexpradio('branchtype') . - "
    (leaving this field empty will show you checkins on both -HEAD and branches) -
    Directory: -
    -(you can list multiple directories) -
    File: -
    " . -regexpradio('filetype') . " -
    Who:
    " . -regexpradio('whotype') . " -
    Sort By: - -

    Date:
    - - - - - - - - - - - - - - - - - - - - -
    In the last hours
    In the last day
    In the last week
    In the last month
    Since the beginning of time (which happens to be $startdate currently)
    - - - - - - - -
    -Between You can use the form -mm/dd/yy hh:mm:ss or a Unix time_t -(seconds since the Epoch.) -
    - and
    -
    -

    - - -
    -

    "; - -sub sortTest { - if( $_[0] eq $form{sortby} ){ - return " SELECTED"; - } - else { - return ""; - } -} - -refigureStartDateIfNecessary($CVS_ROOT); - -sub dateTest { - if( $_[0] eq $form{date} ){ - return " CHECKED value=$_[0]"; - } - else { - return "value=$_[0]"; - } -} - -sub regexpradio { - my($name) = @_; - my $useregexp = ($form{$name} eq 'regexp'); - my $c1 = $useregexp ? "" : "checked"; - my $c2 = $useregexp ? "checked" : ""; - return " -Exact match -      -Regular expression"; -} - - -sub fetchCachedStartDate { - my ($repository) = @_; - open(CACHE, ") { - chop(); - my($rep,$date,$cachedate) = split(/\|/); - if ($rep eq $repository) { - $rememberedcachedate = $cachedate; - return $date; - } - } - return "unknown"; -} - -sub refigureStartDateIfNecessary { - my ($repository) = @_; - my $now = time(); - if ((defined $rememberedcachedate) && - $now - $rememberedcachedate < 24*60*60 && - $rememberedcachedate < $now) { - return; - } - - my $db = ConnectToDatabase(); - - my $query = $db->Query("select min(when) from checkins,repositories where repositories.id = repositoryid and repository = '$CVS_ROOT'") || die $Mysql::db_errstr; - - my @row = $query->fetchrow(); - my $startdate = $row[0]; - if ($startdate eq "") { - $startdate = "nonexistant"; - } - open(OUTCACHE, ">data/cachedstartdates.$$") || die "Can't open output date cache file"; - if (open(INCACHE, ") { - chop(); - my($rep,$date,$cachedate) = split(/\|/); - if ($rep ne $repository) { - print OUTCACHE "$_\n"; - } - } - close INCACHE; - } - print OUTCACHE "$repository|$startdate|$now\n"; - close OUTCACHE; - rename "data/cachedstartdates.$$", "data/cachedstartdates"; -} diff --git a/mozilla/webtools/bonsai/cvsregexp.html b/mozilla/webtools/bonsai/cvsregexp.html deleted file mode 100644 index b9d777f0ccc..00000000000 --- a/mozilla/webtools/bonsai/cvsregexp.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - Regular expressions in the cvs query tool - - - -

    -Description of MySQL regular expression syntax.

    -Regular expressions are a powerful way of specifying complex searches. - -

    MySQL uses regular Henry Spencers inplementation of regular expressions. -And that is aimed to conform to POSIX 1003.2. MySQL uses the extended -version. - -

    To get more exact information see Henry Spencers regex.7 manual. - -

    This is a simplistic reference that skips the details. From here on -a regualr expressions is called a regexp. - -

    A regular expression describes a set of strings. The simplest case is -one that has no special characters in it. For example the regexp hello -matches hello and nothing else. - -

    Nontrivial regular expressions use certain special constructs so that -they can match more than one string. For example, the regexp hello|word -matches either the string hello or the string word. - -

    And a more comples example regexp B[an]*s matches any of the -strings Bananas, Baaaaas, Bs and all other string -starting with a B and continuing with any number of a -n and ending with a s. - -

    The following special characters/constructs are known. -

    -
    -^
    - -
    -Start of whole string.
    - -
    mysql> select "fo\nfo" regexp "^fo$";           -> 0
    -mysql> select "fofo" regexp "^fo";              -> 1
    - -
    -$
    - -
    -End of whole string.
    - -
    mysql> select "fo\no" regexp "^fo\no$";         -> 1
    -mysql> select "fo\no" regexp "^fo$";            -> 0
    - -
    -.
    - -
    -Any character (including newline).
    - -
    mysql> select "fofo" regexp "^f.*";             -> 1
    -mysql> select "fo\nfo" regexp "^f.*";           -> 1
    - -
    -a*
    - -
    -Any sequence of zero or more a's.
    - -
    mysql> select "Ban" regexp "^Ba*n";             -> 1
    -mysql> select "Baaan" regexp "^Ba*n";           -> 1
    -mysql> select "Bn" regexp "^Ba*n";              -> 1
    - -
    -a+
    - -
    -Any sequence of one or more a's.
    - -
    mysql> select "Ban" regexp "^Ba+n";             -> 1
    -mysql> select "Bn" regexp "^Ba+n";              -> 0
    - -
    -a?
    - -
    -Either zero or one a.
    - -
    mysql> select "Bn" regexp "^Ba?n";              -> 1
    -mysql> select "Ban" regexp "^Ba?n";             -> 1
    -mysql> select "Baan" regexp "^Ba?n";            -> 0
    - -
    -de|abc
    - -
    -Either the sequence de or abc.
    - -
    mysql> select "pi" regexp "pi|apa";             -> 1
    -mysql> select "axe" regexp "pi|apa";            -> 0
    -mysql> select "apa" regexp "pi|apa";            -> 1
    -mysql> select "apa" regexp "^(pi|apa)$";        -> 1
    -mysql> select "pi" regexp "^(pi|apa)$";         -> 1
    -mysql> select "pix" regexp "^(pi|apa)$";        -> 0
    - -
    -(abc)*
    - -
    -Zero or more times the sequence abc.
    - -
    mysql> select "pi" regexp "^(pi)+$";            -> 1
    -mysql> select "pip" regexp "^(pi)+$";           -> 0
    -mysql> select "pipi" regexp "^(pi)+$";          -> 1
    - -
    -{1}
    - -
    -{2,3}
    - -
    -The is a more general way of writing regexps that match many occurences.
    - -
    -
    -a*
    - -
    -Can be written as a{0,}.
    - -
    -+
    - -
    -Can be written as a{1,}.
    - -
    -?
    - -
    -Can be written as a{0,1}.
    -
    -To be more precice an atom followed by a bound containing one integer i -and no comma matches a sequence of exactly i matches of the atom. -An atom followed by a bound containing one integer i and a comma -matches a sequence of i or more matches of the atom. An atom followed -by a bound containing two integers i and j matches a -sequence of i through j (inclusive) matches of the atom. -Both arguments must 0 >= value <= RE_DUP_MAX (default 255), -and if there are two of them, the second must be bigger or equal to the -first. -
    -[a-dX]
    - -
    -[^a-dX]
    - -
    -Any character which is (not if ^ is used) either a, b, -c, d or X. To include ] it has to be -written first. To include - it has to be written first or last. -So [0-9] matches any decimal digit. All character that does not -have a defined mening inside a [] pair has no special meaning -and matches only itself.
    - -
    mysql> select "aXbc" regexp "[a-dXYZ]";         -> 1
    -mysql> select "aXbc" regexp "^[a-dXYZ]$";       -> 0
    -mysql> select "aXbc" regexp "^[a-dXYZ]+$";      -> 1
    -mysql> select "aXbc" regexp "^[^a-dXYZ]+$";     -> 0
    -mysql> select "gheis" regexp "^[^a-dXYZ]+$";    -> 1
    -mysql> select "gheisa" regexp "^[^a-dXYZ]+$";   -> 0
    - -
    -[[.characters.]]
    - -
    -The sequence of characters of that collating element. The sequence is a -single element of the bracket expression's list. A bracket expression containing -a multi-character collating element can thus match more than one character, -e.g. if the collating sequence includes a ch collating element, -then the RE [[.ch.]]*c matches the first five characters of chchcc.
    - -
    -[=character-class=]
    - -
    -An equivalence class, standing for the sequences of characters of all collating -elements equivalent to that one, including itself. For example, if o -and (+) are the members of an equivalence class, then [[=o=]], -[[=(+)=]], and [o(+)] are all synonymous. An equivalence -class may not be an endpoint of a range.
    - -
    -[:character_class:]
    - -
    -Within a bracket expression, the name of a character class enclosed in -[: and :] stands for the list of all characters belonging -to that class. Standard character class names are:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    alnum digit punct 
    alpha graph space 
    blank lower upper 
    cntrl print xdigit 
    -These stand for the character classes defined in ctype(3). A locale may -provide others. A character class may not be used as an endpoint of a range. -
    mysql> select "justalnums" regexp "[[:alnum:]]+";       -> 1
    -mysql> select "!!" regexp "[[:alnum:]]+";               -> 0
    - -
  • -[[:<:]]
  • - -
  • -[[:>:]] These match the null string at the beginning and end of a word -respectively. A word is defined as a sequence of word characters which -is neither preceded nor followed by word characters. A word character is -an alnum character (as defined by ctype(3)) or an underscore.
  • - -
    mysql> select "a word a" regexp "[[:<:]]word[[:>:]]";      -> 1
    -mysql> select "a xword a" regexp "[[:<:]]word[[:>:]]";     -> 0
    -
    - -
    mysql> select "weeknights" regexp "^(wee|week)(knights|nights)$"; -> 1
    -  - - diff --git a/mozilla/webtools/bonsai/cvsview2.cgi b/mozilla/webtools/bonsai/cvsview2.cgi deleted file mode 100755 index 0909f9ae693..00000000000 --- a/mozilla/webtools/bonsai/cvsview2.cgi +++ /dev/null @@ -1,972 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# cvsview.cgi - fake up some HTML based on RCS logs and diffs -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# brendan and fur -# -# TODO in no particular order: -# - Mocha-automate the main page's form so clicking on rev links in the table -# change the default filename and revisions. -# - Add a tab width input to the main page's form. -# - Include log message in wasted horizontal real-estate of Shortcuts frame. -# - Make old and new diff lines go to separate, side-by-side frames, and use -# Mocha to slave their scrollbars together. -# - Allow expansion of the top-level table to include the revision histories -# of all the files in the directory. -# - More more more xdiff/gdiff-like features... -# - -# -# SRCROOTS is an array of repository roots under which to look for CVS files. -# - -# Figure out which directory bonsai is in by looking at argv[0] - -$bonsaidir = $0; -$bonsaidir =~ s:/[^/]*$::; # Remove last word, and slash before it. -if ($bonsaidir eq '') { - $bonsaidir = '.'; -} - -chdir $bonsaidir || die "Couldn't chdir to $bonsaidir"; -require 'utils.pl'; - -loadConfigData(); - -NEXTTREE: foreach $i (@treelist) { - $r = $treeinfo{$i}->{'repository'}; - foreach $j (@SRCROOTS) { - if ($r eq $j) { - next NEXTTREE; - } - } - push @SRCROOTS, $r; -} - - -$MAX_REVS = 8; - -# -# Make sure both kinds of standard output go to STDOUT. -# XXX dup stdout onto stderr and flush stdout after the following prints -# -# Until then, replace standard die built-in with our own. -sub die { - print 'fatal error: '; - print @_; - exit; -} - -# Consume one token from the already opened RCSFILE filehandle. -# Unescape string tokens, if necessary. -sub get_token { - # Erase all-whitespace lines. - while ($line_buffer =~ /^$/) { - &die ('Unexpected EOF') if eof(RCSFILE); - $line_buffer = ; - $line_buffer =~ s/^\s+//; # Erase leading whitespace - } - - # A string of non-whitespace characters is a token ... - return $1 if ($line_buffer =~ s/^([^;@][^;\s]*)\s*//o); - - # ...and so is a single semicolon ... - return ';' if ($line_buffer =~ s/^;\s*//o); - - # ...or an RCS-encoded string that starts with an @ character. - $line_buffer =~ s/^@([^@]*)//o; - $token = $1; - - # Detect single @ character used to close RCS-encoded string. - while ($line_buffer !~ /^@[^@]*$/o) { - $token .= $line_buffer; - &die ('Unexpected EOF') if eof(RCSFILE); - $line_buffer = ; - } - - # Retain the remainder of the line after the terminating @ character. - ($line_buffer) = ($line_buffer =~ /^@\s*([^@]*)/o); - - # Undo escape-coding of @ characters. - $token =~ s/@@/@/og; - - return $token; -} - -# Consume a token from RCS filehandle and ensure that it matches -# the given string constant. -sub match_token { - local ($match) = @_; - - local ($token) = &get_token; - &die ("Unexpected parsing error in RCS file.\n", - "Expected token: $match, but saw: $token\n") - if ($token ne $match); -} - -# Push RCS token back into the input buffer. -sub unget_token { - local ($token) = @_; - $line_buffer = "$token $line_buffer"; -} - -# Parses "administrative" header of RCS files, setting these globals: -# -# $head_revision -- Revision for which cleartext is stored -# $principal_branch -# $file_description -# %revision_symbolic_name -- mapping from numerical revision # to symbolic tag -# %tag_revision -- mapping from symbolic tag to numerical revision # -# -sub parse_rcs_admin { - local ($token, $tag, $tag_name, $tag_revision); - local (@tags); - - # Undefine variables, because we may have already read another RCS file - undef %tag_revision; - undef %revision_symbolic_name; - - while (1) { - # Read initial token at beginning of line - $token = &get_token(RCSFILE); - - # We're done once we reach the description of the RCS tree - if ($token =~ /^\d/o) { - &unget_token($token); - return; - } - -# print "token: $token\n"; - - if ($token eq 'head') { - $head_revision = &get_token; - &get_token; # Eat semicolon - } elsif ($token eq 'branch') { - $principal_branch = &get_token; - &get_token; # Eat semicolon - } elsif ($token eq 'symbols') { - - # Create an associate array that maps from tag name to - # revision number and vice-versa. - while (($tag = &get_token) ne ';') { - ($tag_name, $tag_revision) = split(':', $tag); - - $tag_revision{$tag_name} = $tag_revision; - $revision_symbolic_name{$tag_revision} = $tag_name; - } - } elsif ($token eq 'comment') { - $file_description = &get_token; - &get_token; # Eat semicolon - - # Ignore all these other fields - We don't care about them. - } elsif (($token eq 'locks') || - ($token eq 'strict') || - ($token eq 'expand') || - ($token eq 'access')) { - (1) while (&get_token ne ';'); - } else { - warn ("Unexpected RCS token: $token\n"); - } - } - - &die('Unexpected EOF'); -} - -# Construct associative arrays that represent the topology of the RCS tree -# and other arrays that contain info about individual revisions. -# -# The following associative arrays are created, keyed by revision number: -# %revision_date -- e.g. "96.02.23.00.21.52" -# %timestamp -- seconds since 12:00 AM, Jan 1, 1970 GMT -# %revision_author -- e.g. "tom" -# %revision_branches -- descendant branch revisions, separated by spaces, -# e.g. "1.21.4.1 1.21.2.6.1" -# %prev_revision -- revision number of previous *ancestor* in RCS tree. -# Traversal of this array occurs in the direction -# of the primordial (1.1) revision. -# %prev_delta -- revision number of previous revision which forms the -# basis for the edit commands in this revision. -# This causes the tree to be traversed towards the -# trunk when on a branch, and towards the latest trunk -# revision when on the trunk. -# %next_delta -- revision number of next "delta". Inverts %prev_delta. -# -# Also creates %last_revision, keyed by a branch revision number, which -# indicates the latest revision on a given branch, -# e.g. $last_revision{"1.2.8"} == 1.2.8.5 -# -sub parse_rcs_tree { - local($revision, $date, $author, $branches, $next); - local($branch, $is_trunk_revision); - - # Undefine variables, because we may have already read another RCS file - undef %revision_date; - undef %timestamp; - undef %revision_author; - undef %revision_branches; - undef %prev_revision; - undef %prev_delta; - undef %next_delta; - undef %last_revision; - - while (1) { - $revision = &get_token; - - # End of RCS tree description ? - if ($revision eq 'desc') { - &unget_token($revision); - return; - } - - $is_trunk_revision = ($revision =~ /^[0-9]+\.[0-9]+$/); - - $tag_revision{$revision} = $revision; - ($branch) = $revision =~ /(.*)\.[0-9]+/o; - $last_revision{$branch} = $revision; - - # Parse date - &match_token('date'); - $date = &get_token; - $revision_date{$revision} = $date; - &match_token(';'); - - # Convert date into timestamp -# @date_fields = reverse(split(/\./, $date)); -# $date_fields[4]--; # Month ranges from 0-11, not 1-12 -# $timestamp{$revision} = &timegm(@date_fields); - - # Parse author - &match_token('author'); - $author = &get_token; - $revision_author{$revision} = $author; - &match_token(';'); - - # Parse state; - &match_token('state'); - (1) while (&get_token ne ';'); - - # Parse branches - &match_token('branches'); - $branches = ''; - while (($token = &get_token) ne ';') { - $prev_revision{$token} = $revision; - $prev_delta{$token} = $revision; - $branches .= "$token "; - } - $revision_branches{$revision} = $branches; - - # Parse revision of next delta in chain - &match_token('next'); - $next = ''; - if (($token = &get_token) ne ';') { - $next = $token; - &get_token; # Eat semicolon - $next_delta{$revision} = $next; - $prev_delta{$next} = $revision; - if ($is_trunk_revision) { - $prev_revision{$revision} = $next; - } else { - $prev_revision{$next} = $revision; - } - } - - if ($debug > 1) { - print "revision = $revision\n"; - print "date = $date\n"; - print "author = $author\n"; - print "branches = $branches\n"; - print "next = $next\n\n"; - } - } -} - -# Reads and parses complete RCS file from already-opened RCSFILE descriptor. -sub parse_rcs_file { - local ($file) = @_; - &die("Couldn't open $file\n") if !open(RCSFILE, "< $file"); - $line_buffer = ''; - print "Reading RCS admin...\n" if ($debug); - &parse_rcs_admin(); - print "Reading RCS revision tree topology...\n" if ($debug); - &parse_rcs_tree(); - print "Done reading RCS file...\n" if ($debug); - close(RCSFILE); -} - -# Map a tag to a numerical revision number. The tag can be a symbolic -# branch tag, a symbolic revision tag, or an ordinary numerical -# revision number. -sub map_tag_to_revision { - local($tag_or_revision) = @_; - - local ($revision) = $tag_revision{$tag_or_revision}; - - # Is this a branch tag, e.g. xxx.yyy.0.zzz - if ($revision =~ /(.*)\.0\.([0-9]+)/o) { - $branch = $1 . '.' . $2; - # Return latest revision on the branch, if any. - return $last_revision{$branch} if (defined($last_revision{$branch})); - return $1; # No revisions on branch - return branch point - } else { - return $revision; - } -} - -# -# Print HTTP content-type header and the header-delimiting extra newline. -# -print "Content-type: text/html\n\n"; - -$request_method = $ENV{'REQUEST_METHOD'}; # e.g., "GET", "POST", etc. -$script_name = $ENV{'SCRIPT_NAME'}; -$prefix = $script_name . $ENV{PATH_INFO} . '?'; # prefix for HREF= entries -$query_string = $ENV{QUERY_STRING}; - -# Undo % URL-encoding -while ($query_string =~ /(.*)\%([0-9a-fA-F][0-9a-fA-F])(.*)/) { - # XXX - inefficient - $query_string = $1 . pack('c', hex($2)) . $3; -} - -&die("REQUEST_METHOD 'GET' expected: got '$request_method'\n") - if ($request_method ne 'GET'); - -# Default option values -$opt_diff_mode = 'context'; -$opt_whitespace_mode = 'show'; - -# Parse options in URL. For example, -# http://w3/cgi/cvsview.pl?subdir=foo&file=bar would assign -# $opt_subdir = foo and $opt_file = bar. -foreach $option (split(/&/, $query_string)) { - &die("command $opt_command: garbled option $option\n") - if ($option !~ /^([^=]+)=(.*)/); - eval('$opt_' . $1 . '="' . $2 . '";'); -} - -if( $opt_branch eq 'HEAD' ) { $opt_branch = ''; } - -# Configuration colors for diff output. - -$stable_bg_color = 'White'; -$skipping_bg_color = '#c0c0c0'; -$header_bg_color = 'Orange'; -$change_bg_color = 'LightBlue'; -$addition_bg_color = 'LightGreen'; -$deletion_bg_color = 'LightGreen'; -$diff_bg_color = 'White'; - -# Ensure that necessary arguments are present -&die("command not defined in URL\n") if $opt_command eq ''; -&die("command $opt_command: subdir not defined\n") if $opt_subdir eq ''; -if ($opt_command eq 'DIFF' || - $opt_command eq 'DIFF_FRAMESET' || - $opt_command eq 'DIFF_LINKS') { - &die("command $opt_command: file not defined in URL\n") if $opt_file eq ''; - &die("command $opt_command: rev1 not defined in URL\n") if $opt_rev1 eq ''; - &die("command $opt_command: rev2 not defined in URL\n") if $opt_rev2 eq ''; - -} - -# Propagate diff options to created links -$prefix .= "diff_mode=$opt_diff_mode"; -$prefix .= "&whitespace_mode=$opt_whitespace_mode"; -$prefix .= "&root=$opt_root"; - -# Create a shorthand for the longest common initial substring of our URL. -$magic_url = "$prefix&subdir=$opt_subdir"; - -# Now that we've munged QUERY_STRING into perl variables, set rcsdiff options. -$rcsdiff = "$rcsdiffcommand -f"; -$rcsdiff .= ' -w' if ($opt_whitespace_mode eq 'ignore'); - -# Handle the "root" argument -# -if (defined($root = $opt_root) && $root ne '') { - $root =~ s|/$||; - if (-d $root) { - unshift(@SRCROOTS, $root); - } else { - print "Error: Root, $root, is not a directory.
    \n"; - print "\n"; - exit; - } -} -foreach $root (@SRCROOTS) { - $dir = "$root/$opt_subdir"; - if (-d $dir) { - $found = 1; - last; - } -} -if (!$found) { - print "Error: $opt_subdir not found in " - .join(',', @SRCROOTS), "\n"; - exit; -} - -# Create top-level frameset document. -sub do_diff_frameset { - chdir($dir); - - print "$opt_file: $opt_rev1 vs. $opt_rev2\n"; - print "\n"; - - print " \n"; - - print " \n"; - print "\n"; -} - - -# Create links to document created by DIFF command. -sub do_diff_links { - - print "\n"; - print "\n"; - print "$opt_file: $opt_rev1 vs. $opt_rev2\n"; - print ""; - print "\n"; - - CheckHidden("$dir/$opt_file"); - - chdir($dir); - - open(RCSDIFF, "$rcsdiff -r$opt_rev1 -r$opt_rev2 $opt_file 2>/dev/null |"); - - print '
    '; - - my $diff_base = "cvsview2.cgi"; - my $blame_base = "cvsblame.cgi"; - - # total kludge!! lxr omits the top-level "mozilla" directory... - my $lxr_path = "$opt_subdir/$opt_file"; - if ($mozilla_lxr_kludge eq 'TRUE') { - $lxr_path =~ s@^ns/@@; - $lxr_path =~ s@^mozilla/@@; - } - - my $lxr_link = "$lxr_base/$lxr_path"; - my $blame_link = "$blame_base?root=$CVS_ROOT\&file=$opt_subdir/$opt_file"; - my $diff_link = "$magic_url&command=DIRECTORY&file=$opt_file&rev1=$opt_rev1&rev2=$opt_rev2"; - $diff_link .= "&root=$opt_root" if defined($opt_root); - - print ""; - - print ""; - print ""; - - print "
    "; - print ""; - print ""; - print "\n"; - print ""; - print "\n"; - print ""; - print "\n"; - print "
    diff: Change diff parameters.
    blame:Annotate line authors.
    lxr: Browse source as hypertext.
    "; - print "
    "; - - print ""; - print "
    "; - print ""; - print "
    "; - - $anchor_num = 0; - while () { - # Get one command from the diff file - if (/^(c|a)(\d+)/) { - $line = $2; - while () { - last if /^\.$/; - } - } elsif (/^d(\d+)/) { - $line = $1; - } else { - print "Internal error:", - " unknown command $_", - " at $. in $opt_file $opt_rev1\n"; - } - - print ' ' x (4 - length($line)); - print "$line "; - $anchor_num++; - } - close(RCSDIFF); - - print '
    '; - print "
    \n"; -} - - -# Default tab width, although it's frequently 4. -$tab_width = 8; - -sub next_tab_stop { - local ($pos) = @_; - - return int(($pos + $tab_width) / $tab_width) * $tab_width; -} - -# -# Look for the magic emacs tab width comment, or for long lines with more -# than 4 leading tabs in more than 50% of the lines that start with a tab. -# In the latter case, set $tab_width to 4. -# -sub guess_tab_width { - local ($opt_file) = @_; - local ($found_tab_width) = 0; - local ($many_tabs, $any_tabs) = (0, 0); - - open(RCSFILE, "$opt_file"); - while () { - if (/tab-width: (\d)/) { - $tab_width = $1; - $found_tab_width = 1; - last; - } - if (/^(\t+)/) { - $many_tabs++ if (length($1) >= 4); - $any_tabs++; - } - } - if (!$found_tab_width && $many_tabs > $any_tabs / 2) { - $tab_width = 4; - } - close(RCSFILE); -} - -# Create gdiff-like output. -sub do_diff { - - print ""; - print "$opt_file: $opt_rev1 vs. $opt_rev2\n"; - print ""; - print ""; - - CheckHidden("$dir/$opt_file"); - - chdir($dir); - - local ($rcsfile) = "$opt_file,v"; - $rcsfile = "Attic/$opt_file,v" if (! -r $rcsfile); - &guess_tab_width($rcsfile); - - &html_diff($rcsfile, $opt_rev1, $opt_rev2); - print "\n\n"; -} - - -# Show specified CVS log entry. -sub do_log { - print "$opt_file: $opt_rev CVS log entry\n"; - print '
    ';
    -
    -    CheckHidden("$dir/$opt_file");
    -
    -    chdir($dir);
    -
    -    open(RCSLOG, "rlog -r$opt_rev $opt_file |");
    -
    -    while () {
    -        last if (/^revision $opt_rev$/);
    -    }
    -
    -    while () {
    -        last if (/^===============================================/);
    -        print "$_
    "; - } - close(RCSLOG); - - print '
    '; -} - - -# -# Main script: generate a table of revision diff and log message hotlinks -# for each modified file in $opt_subdir, and a form for choosing a file and any -# two of its revisions. -# -sub do_directory { - - $output = "
    "; - - foreach $path (split('/',$opt_subdir)) { - $link_path .= $path; - $output .= "$path/ "; - $link_path .= '/'; - } - chop ($output); - - if ($opt_branch) { - $output .= "
    Branch: $opt_branch"; - } - $output .= "
    "; - - EmitHtmlHeader("CVS Differences", $output); - - CheckHidden($dir); - chdir($dir); - - print "\n"; - - foreach $file (split(/\+/, $opt_files)) { - local ($path) = "$dir/$file,v"; - - CheckHidden($path); - $path = "$dir/Attic/$file,v" if (! -r $path); - &parse_rcs_file($path); - - # total kludge!! lxr omits the top-level "mozilla" directory... - my $lxr_path = "$opt_subdir/$file"; - if (mozilla_lxr_kludge) { - $lxr_path =~ s@^ns/@@; - $lxr_path =~ s@^mozilla/@@; - } - - my $lxr_link = "$lxr_base/$lxr_path"; - - print "\n"; - - if ($opt_branch) { - $first_rev = &map_tag_to_revision($opt_branch); - &die("$0: error: -r: No such revision: $opt_branch\n") - if ($first_rev eq ''); - } else { - $first_rev = $head_revision; - } - - $skip = $opt_skip; - $revs_remaining = $MAX_REVS; - for ($rev = $first_rev; $rev; $rev = $prev) { - $prev = $prev_revision{$rev}; - next if $skip-- > 0; - if (!$revs_remaining--) { - #print '\n"; - last; - } - - my $href_open = ""; - my $href_close = ""; - if ( $prev && $rev ) { - $href_open = "$href_open$rev$href_close
    "; - print "$revision_author{$rev}"; - } - - print "
    \n"; - - if (0) { - print "\n"; - $skip = $opt_skip; - $revs_remaining = $MAX_REVS; - for ($rev = $first_rev; $rev; $rev = $prev_revision{$rev}) { - next if $skip-- > 0; - last if !$revs_remaining--; - print "\n"; - } - print "\n";} - } - - print "
    "; - print "$file
    "; - print "Change Log\n"; - print "
    '; - print ''; - print "Prior revisions", "
    $revision_author{$rev}", - "
    \n"; - print '
    '; - print ''; - print ""; - print 'New Query:'; - print '
      '; - - - # pick something remotely sensible to put in the "Filename" field. - my $file = $opt_file; - if ( !$file && $opt_files ) { - $file = $opt_files; - $file =~ s@\+.*@@; - } - - print "\n
      \n", - 'Filename:', - '', - '', - "\n
      \n", - - 'Old version:', - '', - '', - "\n
      \n", - - 'New version:', - '', - '', - "\n
      \n"; - print '
      ', - '', - ' Show Whitespace', - '
      ', - ' Ignore Whitespace', - '
      ', - '', - ' Context Diffs', - '
      ', - ' Full Source Diffs'; - print '
      '; - print "\n"; - print '
    '; - print "
    \n"; - - &print_bottom; -} - -# -# This function generates a gdiff-style, side-by-side display using HTML. -# It requires two arguments, each of which must be an open filehandle. -# The first filehandle, DIFF, must be a `diff -f` style output containing -# commands to convert the contents of the second filehandle, OLDREV, into -# a later version of OLDREV's file. -# -sub html_diff { - local ($file, $rev1, $rev2) = @_; - local ($old_line_num) = 1; - - open(DIFF, "$rcsdiff -f -r$rev1 -r$rev2 $file 2>/dev/null |"); - open(OLDREV, "$cocommand -p$rev1 $file 2>/dev/null |"); - - $anchor_num = 0; - - if ($ENV{'HTTP_USER_AGENT'} =~ /Win/) { - $font_tag = "
    ";
    -    } else {
    -        # We don't want your stinking Windows font
    -        $font_tag = "
    ";
    -    }
    -    print "';
    -    print "";
    -    while () {
    -        $mark = 0;
    -        if (/^a(\d+)/) {
    -            $point = $1;
    -            &skip_to_line($point + 1, *OLDREV, *old_line_num);
    -            while () {
    -                last if (/^\.$/);
    -                &print_row('', $stable_bg_color, $_, $addition_bg_color);
    -            }
    -        } elsif ((($point, $mark) = /^c(\d+) (\d+)$/) ||
    -                 (($point) = /^c(\d+)$/)) {
    -            $mark = $point if (!$mark);
    -            &skip_to_line($point, *OLDREV, *old_line_num);
    -            while () {
    -                last if (/^\.$/);
    -                if ($old_line_num <= $mark) {
    -                    $old_line = ;
    -                    $old_line_num++;
    -                } else {
    -                    $old_line = ''
    -                }
    -                &print_row($old_line, $change_bg_color, $_, $change_bg_color);
    -            }
    -            while ($old_line_num <= $mark) {
    -                $old_line = ;
    -                $old_line_num++;
    -                &print_row($old_line, $change_bg_color, '', $change_bg_color);
    -            }
    -        } elsif ((($point, $mark) = /^d(\d+) (\d+)$/) ||
    -                 (($point) = /^d(\d+)$/)) {
    -            $mark = $point if (!$mark);
    -            &skip_to_line($point, *OLDREV, *old_line_num);
    -            while ($old_line = ) {
    -                $old_line_num++;
    -                &print_row($old_line, $deletion_bg_color, '', $stable_bg_color);
    -                last if ($. == $mark);
    -            }
    -        } else {
    -            print "
    Version $rev1Version $rev2
    Internal error:", - " unknown command $_", - " at $. in $opt_file $opt_rev1\n"; - exit; - } - } - - # - # Print the remaining lines in the original file. These are lines that - # were not modified in the later revision - # - local ($base_old_line_num) = $old_line_num; - while ($old_line = ) { - $old_line_num++; - &print_row($old_line, $stable_bg_color, $old_line, $stable_bg_color) - if ($opt_diff_mode eq 'full' || - $old_line_num <= $base_old_line_num + 5); - } - -# print "
    \n"; - print "
    \n"; - - &print_bottom; - - close(OLDREV); - close(DIFF); -} - -sub skip_to_line { - local ($line_num, *OLDREV, *old_line_num) = @_; - local ($anchor_printed) = 0; - local ($skip_line_printed) = ($line_num - $old_line_num <= 10); - local ($base_old_line_num) = $old_line_num; - - - while ($old_line_num < $line_num) { - if (!$anchor_printed && $old_line_num >= $line_num - 10) { - print "\n
    "; - $anchor_printed = 1; - } - - if ($opt_diff_mode eq 'context' && !$skip_line_printed && - $line_num - 5 <= $old_line_num) { - print "\n\n"; - print "'; - print ""; - &print_cell($line1, $color1); - &print_cell($line2, $color2); -} - -sub print_bottom { - print <<__BOTTOM__; -

    -

    ", - "Skipping to line $old_line_num: "; - $skip_line_printed = 1; - } - - $old_line = ; - $old_line_num++; - - &print_row($old_line, $stable_bg_color, $old_line, $stable_bg_color) - if ($opt_diff_mode eq 'full' || - $old_line_num <= $base_old_line_num + 5 || - $line_num - 5 < $old_line_num); - } - - print "" if (!$anchor_printed); - print ''; - $anchor_num++; -} - -sub print_cell { - local ($line, $color) = @_; - local ($i, $j, $k, $n); - local ($c, $newline); - - if ($color eq $stable_bg_color) { - print "$font_tag"; - } else { - print "$font_tag"; - } - - while (($c = substr($line, -1)) && ($c eq "\n" || $c eq "\r")) { - chop $line; - } - $n = length($line); - $newline = ''; - for ($i = $j = 0; $i < $n; $i++) { - $c = substr($line, $i, 1); - if ($c eq "\t") { - for ($k = &next_tab_stop($j); $j < $k; $j++) { - $newline .= ' '; - } - } else { - $newline .= $c; - $j++; - } - } - $newline =~ s/&/&/g; - $newline =~ s//>/g; - if (length($newline) <= 80) { - $newline = sprintf("%-80.80s", $newline); - } else { - $newline =~ s/([^\n\r]{80})([^\n\r]*)/$1\n$2/g; - } - print $newline; -} - -sub print_row { - local ($line1, $color1, $line2, $color2) = @_; - print "\n
    -
    -
    - -  Mail feedback and feature requests to slamm.   -
    - - -__BOTTOM__ -} # print_bottom - - -sub do_cmd { - if ($opt_command eq 'DIFF_FRAMESET') { do_diff_frameset; } - elsif ($opt_command eq 'DIFF_LINKS') { do_diff_links; } - elsif ($opt_command eq 'DIFF') { do_diff; } - elsif ($opt_command eq 'LOG') { do_log; } - elsif ($opt_command eq 'DIRECTORY') { do_directory; } - else { print "invalid command \"$opt_command\"."; } - exit; -} - -do_cmd; diff --git a/mozilla/webtools/bonsai/doadmin.cgi b/mozilla/webtools/bonsai/doadmin.cgi deleted file mode 100755 index cc1cf3d26a4..00000000000 --- a/mozilla/webtools/bonsai/doadmin.cgi +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -source CGI.tcl -source adminfuncs.tcl - -puts "Content-type: text/html - -" - -CheckPassword $FORM(password) - -Lock -LoadCheckins - - - -switch -exact -- $FORM(command) { - close { - AdminCloseTree [ParseTimeAndCheck [FormData closetimestamp]] - - puts " -Clang! -

    The tree is now closed.

    -Mail has been sent notifying \"the hook\" and anyone subscribed to -bonsai-treeinterest. -

    -Click here -to send e-mail about it to clienteng. -" - - } - open { - AdminOpenTree [ParseTimeAndCheck [FormData lastgood]] \ - [info exists FORM(doclear)] - puts " -The floodgates are open. -

    The tree is now open.

    -Mail has been sent notifying \"the hook\" and anyone subscribed to -bonsai-treeinterest. -Click here -to send e-mail about it to clienteng. -" - } - tweaktimes { - set lastgoodtimestamp [ParseTimeAndCheck [FormData lastgood]] - set closetimestamp [ParseTimeAndCheck [FormData lastclose]] - puts " -Let's do the time warp again... -

    Times have been tweaked.

    -" - Log "Times tweaked: lastgood is [MyFmtClock $lastgoodtimestamp], closetime is [MyFmtClock $closetimestamp]" - } - editmotd { - LoadMOTD - if {![cequal [FormData origmotd] $motd]} { - puts " -Oops! -

    Someone else has been here!

    - -It looks like somebody else has changed the message-of-the-day. -Terry was too lazy to implement anything beyond detecting this -condition. You'd best go start over -- go back to the top of Bonsai, -look at the current message-of-the-day, and decide if you still -want to make your edits." - PutsTrailer - exit - } - - MailDiffs "message-of-the-day" $motd [FormData motd] - set motd [FormData motd] - puts " -New MOTD -

    The message-of-the-day has been changed.

    -" - WriteMOTD - Log "New motd: $motd" - } - changepassword { - if {![cequal $FORM(newpassword) $FORM(newpassword2)]} { - puts " -Oops! -

    Mismatch!

    -The two passwords you typed didn't match. Click Back and try again." - PutsTrailer - exit - } - if {$FORM(doglobal)} { - CheckGlobalPassword - set outfile data/passwd - } else { - set outfile "[DataDir]/treepasswd" - } - set encoded [string trim [exec ./data/trapdoor $FORM(newpassword)]] - set fid [open $outfile "w"] - puts $fid $encoded - close $fid - catch {chmod 0777 $outfile} - puts " -Locksmithing complete. -

    Password changed.

    -The new password is now in effect." - PutsTrailer - exit - } -} - - -PutsTrailer - -WriteCheckins -Unlock - -exit diff --git a/mozilla/webtools/bonsai/doeditcheckin.cgi b/mozilla/webtools/bonsai/doeditcheckin.cgi deleted file mode 100755 index 02e0cd9863f..00000000000 --- a/mozilla/webtools/bonsai/doeditcheckin.cgi +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -puts "Content-type: text/html - -" - -CheckPassword $FORM(password) - -Lock -LoadCheckins - -set busted 0 - -if {![info exists $FORM(id)]} { - set busted 1 -} else { - - upvar #0 $FORM(id) info - - if {![info exists info(notes)]} { - set info(notes) "" - } - - foreach i [lsort [array names info]] { - if {![cequal [FormData "orig$i"] $info($i)]} { - set busted 1 - set text "Key $i -- orig is [FormData "orig$i"], new is $info($i)" - break - } - } -} - -if {$busted} { - Unlock - puts " -Oops! -

    Someone else has been here!

    - -It looks like somebody else has changed or deleted this checkin. -Terry was too lazy to implement anything beyond detecting this -condition. You'd best go start over -- go back to the list of -checkins, look for this checkin again, and decide if you still want to -make your edits." - - PutsTrailer - exit -} - -proc ParseTimeAndCheck {timestr} { - if {[catch {set result [convertclock $timestr]}]} { - puts " -Time trap -

    Can't grok the time

    -You entered a time of $timestr, and I can't understand it. Please -hit Back and try again." - exit - } - return $result -} - -if {[info exists FORM(nukeit)]} { - Log "A checkin for $info(person) has been nuked." -} else { - Log "A checkin for $info(person) has been modified." -} - -set info(date) [ParseTimeAndCheck [FormData datestring]] -foreach i {person dir files notes treeopen log} { - set info($i) [FormData $i] -} - -if {[info exists FORM(nukeit)]} { - set w [lsearch -exact $checkinlist $FORM(id)] - if {$w >= 0} { - set checkinlist [lreplace $checkinlist $w $w] - } -} - -WriteCheckins - -puts "OK, the checkin has been changed." - -PutsTrailer -exit diff --git a/mozilla/webtools/bonsai/doeditmessage.cgi b/mozilla/webtools/bonsai/doeditmessage.cgi deleted file mode 100755 index 197f91e88a4..00000000000 --- a/mozilla/webtools/bonsai/doeditmessage.cgi +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -puts "Content-type: text/html - -" - -CheckPassword $FORM(password) - - -set filename $FORM(msgname) - -set fullfilename [DataDir]/$filename - -Lock - -if {[file exists $fullfilename]} { - set text [read_file $fullfilename] -} else { - set text {} -} - -if {![cequal [FormData origtext] $text]} { - puts " -Oops! -

    Someone else has been here!

    - -It looks like somebody else has changed this message while you were editing it. -Terry was too lazy to implement anything beyond detecting this -condition. You'd best go start over -- go back to the top of Bonsai, -work your way back to editing the message, and decide if you still -want to make your edits." - PutsTrailer - exit -} - - -set text [FormData text] -set fid [open $fullfilename "w"] -puts $fid $text -catch {chmod 0666 $fullfilename } -close $fid - - -Log "$filename set to $text" - -Unlock - - puts " -New $filename -

    The file $filename has been changed.

    -" - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/doeditprofile.cgi b/mozilla/webtools/bonsai/doeditprofile.cgi deleted file mode 100755 index 424504d1bf2..00000000000 --- a/mozilla/webtools/bonsai/doeditprofile.cgi +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -puts "Content-type: text/html - -" - -NOTDEF { - if {![cequal $FORM(password) $FORM(password2)]} { - puts { - Bzzzzt! -

    Passwords don't match.

    - The two password fields in the form don't contain the same thing. You must - type the same password in both places. -

    - Please click the Back button and try again. - } - exit - } -} - -Lock -LoadPerson $FORM(person) - -foreach i [array names person] { - if {[info exists FORM($i)]} { - set person($i) [FormData $i] - } -} - - - - -switch $FORM(contacttype) { - mailto { - set person(contact) [ConstructMailTo [FormData mailtoname] \ - [FormData mailtosubject]] - } - misc { - set person(contact) [FormData misccontact] - } -} - - - - -WritePerson $FORM(person) -Unlock - -puts " -Your profile has been updated.


    [GenerateProfileHTML]" - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/doeditwhiteboard.cgi b/mozilla/webtools/bonsai/doeditwhiteboard.cgi deleted file mode 100755 index abbe4b55e97..00000000000 --- a/mozilla/webtools/bonsai/doeditwhiteboard.cgi +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -Lock -LoadWhiteboard - -set oldvalue [FormData origwhite] - - -if {![cequal $oldvalue $whiteboard]} { - Unlock - puts "Content-type: text/html - -Error -- pen stolen. -

    Someone else just changed the whiteboard.

    - -Somebody else has changed what's on the whiteboard. Your changes will -stomp over theirs. -

    -The whiteboard now reads: -


    -
    $whiteboard
    -
    -If you really want to change the whiteboard to your text, click the button -below. Or maybe you want to tweak your text first. Or you can forget it and -go back to the beginning. - -
    - - -Change the free-for-all whiteboard:
    -
    - -
    -" - PutsTrailer - exit -} - - -set newwhiteboard [string trimright [FormData whiteboard]] - -MailDiffs "whiteboard" $whiteboard $newwhiteboard - -set whiteboard $newwhiteboard -WriteWhiteboard - -Unlock - -puts " -Where's my blue marker? -

    The whiteboard has been changed.

    -The whiteboard now reads: -
    -
    $whiteboard
    -" - - - - -Log "Whiteboard changed to be: $whiteboard" - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/dolog.pl b/mozilla/webtools/bonsai/dolog.pl deleted file mode 100755 index 3eee413d743..00000000000 --- a/mozilla/webtools/bonsai/dolog.pl +++ /dev/null @@ -1,239 +0,0 @@ -#!/tools/ns/bin/perl5 -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -# You need to put this in your CVSROOT directory, and check it in. (Change the -# first line above to point to a real live perl5.) Then, add a line to your -# CVSROOT/loginfo file that says something like: -# -# ALL $CVSROOT/CVSROOT/dolog.pl -r /cvsroot bonsai-checkin-daemon@my.bonsai.machine -# -# Replace "/cvsroot" with the name of the CVS root directory, and -# "my.bonsai.machine" with the name of the machine Bonsai runs on. -# Now, on my.bonsai.machine, add a mail alias so that mail sent to -# "bonsai-checkin-daemon" will get piped to handleCheckinMail.tcl. -# The first argument to handleCheckinMail.tcl is the directory that -# bonsai is installed in. - - -$username = getlogin || (getpwuid($<))[0] || "nobody"; -$MAILER = "/usr/lib/sendmail -t"; -$envcvsroot = $ENV{'CVSROOT'}; -$cvsroot = $envcvsroot; -$flag_debug = 0; -$flag_tagcmd = 0; -$repository = ''; -$repository_tag = ''; -$rlogcommand = '/tools/ns/bin/rlog'; - -@mailto=(); -@changed_files = (); -@added_files = (); -@removed_files = (); -@log_lines = (); -@outlist = (); - -$STATE_NONE = 0; -$STATE_CHANGED = 1; -$STATE_ADDED = 2; -$STATE_REMOVED = 3; -$STATE_LOG = 4; - -&process_args; - -if ($flag_debug ){ - print STDERR "----------------------------------------------\n"; - print STDERR "LOGINFO:\n"; - print STDERR " pwd:" . `pwd` . "\n"; - print STDERR " Args @ARGV\n"; - print STDERR " CVSROOT: $cvsroot\n"; - print STDERR " who: $username\n"; - print STDERR " Repository: $repository\n"; - print STDERR " mailto: @mailto\n"; - print STDERR "----------------------------------------------\n"; -} - -if ($flag_tagcmd) { - &process_tag_command; -} else { - &get_loginfo; - &process_cvs_info; -} - -if( $flag_debug){ - print STDERR "----------------------------------------------\n"; - print STDERR @outlist; - print STDERR "----------------------------------------------\n"; -} - -&mail_notification; - -0; - -sub process_args { - while (@ARGV) { - $arg = shift @ARGV; - - if ($arg eq '-d') { - $flag_debug = 1; - print STDERR "Debug turned on...\n"; - } elsif ($arg eq '-r') { - $cvsroot = shift @ARGV; - } elsif ($arg eq '-t') { - $flag_tagcmd = 1; - last; # Keep the rest in ARGV; they're handled later. - } else { - push(@mailto, $arg); - } - } - if( $repository eq '' ){ - open( REP, "; - chop($repository); - close(REP); - } - $repository =~ s:^$cvsroot/::; - $repository =~ s:^$envcvsroot/::; - - if (!$flag_tagcmd) { - if( open( REP, "; - chop($repository_tag); - close(REP); - } - } -} - -sub get_loginfo { - - if( $flag_debug){ - print STDERR "----------------------------------------------\n"; - } - - # Iterate over the body of the message collecting information. - # - while () { - chop; # Drop the newline - - if( $flag_debug){ - print STDERR "$_\n"; - } - - if (/^In directory/) { - next; - } - - if (/^Modified Files/) { $state = $STATE_CHANGED; next; } - if (/^Added Files/) { $state = $STATE_ADDED; next; } - if (/^Removed Files/) { $state = $STATE_REMOVED; next; } - if (/^Log Message/) { $state = $STATE_LOG; next; } - - s/^[ \t\n]+//; # delete leading whitespace - s/[ \t\n]+$//; # delete trailing whitespace - - if ($state == $STATE_CHANGED) { push(@changed_files, split); } - if ($state == $STATE_ADDED) { push(@added_files, split); } - if ($state == $STATE_REMOVED) { push(@removed_files, split); } - if ($state == $STATE_LOG) { push(@log_lines, $_); } - } - - if( $flag_debug){ - print STDERR "----------------------------------------------\n" - . "changed files: @changed_files\n" - . "added files: @added_files\n" - . "removed files: @removed_files\n"; - print STDERR "----------------------------------------------\n"; - } - -} - -sub process_cvs_info { - local($d,$fn,$rev,$mod_time,$sticky,$tag,$stat,@d,$l,$rcsfile); - open(ENT, " ){ - chop; - ($d,$fn,$rev,$mod_time,$sticky,$tag) = split(/\//); - $stat = 'C'; - for $i (@changed_files, "BEATME.NOW", @added_files ) { - if( $i eq "BEATME.NOW" ){ $stat = 'A'; } - if($i eq $fn ){ - $rcsfile = "$envcvsroot/$repository/$fn,v"; - if( ! -r $rcsfile ){ - $rcsfile = "$envcvsroot/$repository/Attic/$fn,v"; - } - open(LOG, "$rlogcommand -N -r$rev $rcsfile |") - || print STDERR "dolog.pl: Couldn't run rlog\n"; - while(){ - if( /^revision /){ - $l = ; - chop($l); - if( $flag_debug ){ print STDERR "$l\n";} - @d = split(/[ ]+/,$l); - $lines_added = $d[8]; - $lines_removed = $d[9]; - } - } - close( LOG ); - push(@outlist, ("$stat|$time|$username|$cvsroot|$repository|$fn|$rev|$sticky|$tag|$lines_added|$lines_removed\n")); - } - } - } - close(ENT); - - for $i (@removed_files) { - push( @outlist, ("R|$time|$username|$cvsroot|$repository|$i|||$repository_tag\n")); - } - - push (@outlist, "LOGCOMMENT\n"); - push (@outlist, join("\n",@log_lines)); - push (@outlist, "\n:ENDLOGCOMMENT\n"); -} - - -sub process_tag_command { - local($str,$part,$time); - $time = time; - $str = "Tag|$cvsroot|$time"; - while (@ARGV) { - $part = shift @ARGV; - $str .= "|" . $part; - } - push (@outlist, ("$str\n")); -} - - - -sub do_commitinfo { -} - - - -sub mail_notification { - - open(MAIL, "| /bin/mail @mailto"); - if ($flag_tagcmd) { - print MAIL "Subject: cvs tag in $repository\n"; - } else { - print MAIL "Subject: cvs commit to $repository\n"; - } - print MAIL "\n"; - print MAIL @outlist, "\n"; - close(MAIL); -} diff --git a/mozilla/webtools/bonsai/dotweak.cgi b/mozilla/webtools/bonsai/dotweak.cgi deleted file mode 100755 index 15cec50bac9..00000000000 --- a/mozilla/webtools/bonsai/dotweak.cgi +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -puts "Content-type: text/html - -" - -CheckPassword $FORM(password) - -Lock -LoadCheckins - -if {![info exists FORM(command)]} { - set FORM(command) nocommand -} - - -set list {} - -foreach i [array names FORM] { - switch -glob -- $i { - {checkin-*} { - if {[lsearch -exact $checkinlist $i] >= 0} { - lappend list $i - } - } - } -} - - -set origtree $treeid - -switch -exact -- $FORM(command) { - nuke { - foreach i $list { - set w [lsearch -exact $checkinlist $i] - if {$w >= 0} { - set checkinlist [lreplace $checkinlist $w $w] - } - } - set what "deleted." - } - setopen { - foreach i $list { - upvar #0 $i info - set info(treeopen) 1 - } - set what "modified to be open." - } - - setclose { - foreach i $list { - upvar #0 $i info - set info(treeopen) 0 - } - set what "modified to be closed." - } - movetree { - if {[cequal $treeid $FORM(desttree)]} { - puts "

    Pick a different tree

    " - puts "You attempted to move checkins into the tree that they're" - puts "already in. Hit Back and try again." - PutsTrailer - exit - } - foreach i $list { - set w [lsearch -exact $checkinlist $i] - if {$w >= 0} { - set checkinlist [lreplace $checkinlist $w $w] - } - } - WriteCheckins - unset checkinlist - set treeid $FORM(desttree) - unset batchid - LoadCheckins - LoadTreeConfig - foreach i $list { - lappend checkinlist $i - } - set what "moved to the $treeinfo($treeid,description) tree." - } - default { - puts "

    No command selected

    " - puts "You need to select one of the radio command buttons at the" - puts "bottom. Hit Back and try again." - PutsTrailer - exit - } -} - -WriteCheckins -Unlock - -puts " -

    OK, done.

    -The selected checkins have been $what" - -set treeid $origtree - -PutsTrailer -exit - diff --git a/mozilla/webtools/bonsai/editcheckin.cgi b/mozilla/webtools/bonsai/editcheckin.cgi deleted file mode 100755 index 912f2c0cea5..00000000000 --- a/mozilla/webtools/bonsai/editcheckin.cgi +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -LoadCheckins - -upvar #0 $FORM(id) info - -puts "Content-type: text/html - - -Say the magic word. -

    Edit a checkin.

    - -Congratulations, you have found the hidden edit-a-checkin feature. Of course, -you need to know the magic word to do anything from here. - -

    - -

    - - - - - - - -" - -if {![info exists info(notes)]} { - set info(notes) "" -} - -foreach i {person dir files notes} { - puts "" - puts "" -} - -proc CheckString {value} { - if {$value} { - return "CHECKED" - } else { - return "" - } -} - -puts " - - - - - -
    Password:
    When: -
    $i:
    Tree state:Open -
    Closed -
    Log message:
    -Check this box to blow away this checkin entirely.
    - -" - -foreach i [lsort [array names info]] { - puts "" -} -puts "" - -puts "" - - - -puts "
    " - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/editmessage.cgi b/mozilla/webtools/bonsai/editmessage.cgi deleted file mode 100755 index 7f91a7d1d5d..00000000000 --- a/mozilla/webtools/bonsai/editmessage.cgi +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - - -puts "Content-type: text/html - - - - -We don't need no stinkin' HTML compose window - - - -

    Message editor

    " - -set filename $FORM(msgname) - -set fullfilename [DataDir]/$filename - -if {[file exists $fullfilename]} { - set text [read_file $fullfilename] -} else { - set text {} -} - -puts " -Below is the template for the $filename message. Type the -magic word and edit at will, but be careful to not break anything, -especially around the headers. - -The following magic symbols exist: - -" - -proc PutDoc {name desc} { - puts "" - puts "" - puts "" - puts "" -} - - -switch -exact -- $filename { - openmessage - - closemessage { - PutDoc name "username of the person getting mail" - PutDoc dir "directory for this checkin" - PutDoc files "list of files for this checkin" - PutDoc log "log message for this checkin" - PutDoc profile "profile for this user" - } - treeopened - - treeopenedsamehook - - treeclosed { - PutDoc "hooklist" "comma-separated list of e-mail address of people on the hook" - } - default { - puts "
    %$name%Replaced by the $desc

    Uh, hey, this isn't a legal file for" - puts "you to be editing here!" - PutsTrailer - exit - } -} - -puts " - -

    - -Password:
    - - -
    - -
    - - " - - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/editprofile.cgi b/mozilla/webtools/bonsai/editprofile.cgi deleted file mode 100755 index 7693a46b059..00000000000 --- a/mozilla/webtools/bonsai/editprofile.cgi +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -LoadPerson $FORM(person) - -puts "Content-type: text/html - -" - -NOTDEF { - if {![cequal $FORM(password) $person(password)]} { - puts "Bzzzzt!" - puts "

    Invalid password.

    " - puts "Please click the Back button and try again." - exit - } -} - - -puts " -Tell us about yourself... -

    Profile for $person(name)

    -
    - - - - - - - - - -" - -NOTDEF { - puts " - - - - - - -} - -puts " -
    Real name:
    Contact:" - - -set mailmatch 0 -if {[regexp -- {^Send mail to (.*)$} \ - $person(contact) foo name1 subject name2]} { - if {[cequal $name1 $name2]} { - set mailmatch 1 - } -} -if {$mailmatch} { - set checked "CHECKED" -} else { - set name1 $person(name) - set subject "Build busted" - set checked {} -} - - - -puts " - Send mail to - with subject -
    " - -if {$mailmatch} { - set checked {} - set value {} -} else { - set checked "CHECKED" - set value $person(contact) -} - -puts " - Other: -
    Password:
    Retype password:
    -Other info (office phone, home phone numbers, graffiti, whatever): -
    - -
    -
    -" - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/editwhiteboard.cgi b/mozilla/webtools/bonsai/editwhiteboard.cgi deleted file mode 100755 index 6cc46702517..00000000000 --- a/mozilla/webtools/bonsai/editwhiteboard.cgi +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -LoadWhiteboard - -puts "Content-type: text/html - -Scritch, scritch. -
    - - - -The free-for-all whiteboard is a fine place to put notes of general -and temporary interest about the tree. (Like, \"I'm checking in a bunch -of nasty stuff; stay out of the tree until 3:30pm\".) - -

    - -Change the free-for-all whiteboard:
    -
    - -

    -" - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/globals.tcl b/mozilla/webtools/bonsai/globals.tcl deleted file mode 100755 index 4ce6d6a93fa..00000000000 --- a/mozilla/webtools/bonsai/globals.tcl +++ /dev/null @@ -1,695 +0,0 @@ -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# What some of the global variables mean: -# lastgoodtimestamp -- the timestamp when we last knew we had a good tree. -# closetimestamp -- when the tree was closed. When we open, it probably -# becomes the lastgoodtimestamp - -set cvscommand /tools/ns/bin/cvs -set rlogcommand /tools/ns/bin/rlog -set rcsdiffcommand /tools/ns/bin/rcsdiff -set cocommand /tools/ns/bin/co -set lxr_base http://cvs-mirror.mozilla.org/webtools/lxr/source -set mozilla_lxr_kludge TRUE - -set ldapserver directory.mcom.com -# set ldapserver hoth.mcom.com -set ldapport 389 - - -if {![info exists env(TZ)] || [cequal $env(TZ) ""]} { - # Shouldn't have to do this! Something busted on warp, I think. - set env(TZ) PST8PDT -} - - -# BUGSYSTEMEXPR is something that may be redefined in data/configdata, which -# will define what to use in the replacement part of a regsub to quote bug -# numbers that appear in the system. -set BUGSYSTEMEXPR {&} -set treeid {default} - -proc NOTDEF {foo} { -} - -proc ConnectToDatabase {} { - global mysqlhandle - if {![info exists mysqlhandle]} { - set mysqlhandle [mysqlconnect] - mysqluse $mysqlhandle "bonsai" - } -} - -proc SendSQL { str } { -# puts $str - global mysqlhandle errorInfo - if {[catch {mysqlsel $mysqlhandle $str} errmsg]} { - puts $str - error "$errmsg - $str" $errorInfo - } - return 0 -} - -proc MoreSQLData {} { - global mysqlhandle - set result [mysqlresult $mysqlhandle "rows?"] - return [expr ![cequal $result ""] && $result > 0] -} - -proc FetchSQLData {} { - global mysqlhandle - return [mysqlnext $mysqlhandle] -} - -proc SqlQuote {str} { - regsub -all "'" $str "''" str - # - # This next line is quoting hell. One level of quoting comes from - # the TCL interpreter, and another level comes from TCL's regular - # expression parser. It really works out to "change every - # backslash to two backslashes". - regsub -all "\\\\" $str "\\\\\\\\" str - - return $str -} - - -# proc GetId {table field value} { -# global lastidcache -# if {[info exists lastidcache($table)]} { -# lassign lastidcache($table) cval id -# if {[cequal $value $cval]} { -# return $id -# } -# } -# set qvalue [SqlQuote $value] -# SendSQL "select id from $table where $field = '$qvalue'" -# set result [lindex [FetchSQLData] 0] -# if {[cequal $result ""]} { -# SendSQL "insert into $table ($field) values ('$qvalue')" -# SendSQL "select LAST_INSERT_ID()" -# set result [lindex [FetchSQLData] 0] -# } -# set lastidcache($table) [list $value $result] -# return $result -# } - -proc GetId {table field value} { - global lastidcache - if {[info exists lastidcache($table,$field,$value)]} { - set id $lastidcache($table,$field,$value) - return $id - } - set qvalue [SqlQuote $value] - SendSQL "select id from $table where $field = '$qvalue'" - set result [lindex [FetchSQLData] 0] - if {[cequal $result ""]} { - SendSQL "insert into $table ($field) values ('$qvalue')" - SendSQL "select LAST_INSERT_ID()" - set result [lindex [FetchSQLData] 0] - } - set lastidcache($table,$field,$value) $result - return $result -} - - -set lastdescription { } -set lastdescriptionid 0 -proc AddToDatabase {lines desc} { - global lastdescription lastdescriptionid - if {[clength $desc] > 60000} { - set desc [crange $desc 0 60000] - } - set desc [string trimright $desc] - - if {[cequal $desc $lastdescription]} { - set descid $lastdescriptionid - } else { - set descid {} - } - - set basequery "replace into checkins(type,when,whoid,repositoryid,dirid," - append basequery "fileid,revision,stickytag,branchid,addedlines," - append basequery "removedlines,descid) values (" - foreach line [split $lines "\n"] { - if {[cequal $line ""]} { - continue - } - lassign [split $line "|"] chtype date name repository dir \ - file version sticky branch addlines removelines - - regsub {^T} $branch {} branch - regsub {/$} $dir {} dir - if {[cequal $addlines ""]} { - set addlines 0 - } - if {[cequal $removelines ""]} { - set removelines 0 - } - if {[catch {set removelines [expr abs($removelines)]}]} { - continue - } - if {[catch {set date [fmtclock $date {%Y-%m-%d %H:%M}]}]} { - continue - } - - - if {[cequal $descid ""]} { - set quoted [SqlQuote $desc] - SendSQL "select distinct descid from checkins,descs where when = '$date' and descs.id = descid and descs.description = '$quoted'" - if {![MoreSQLData]} { - SendSQL "insert into descs (description) values ('$quoted')" - SendSQL "select LAST_INSERT_ID()" - } - set descid [lindex [FetchSQLData] 0] - set lastdescriptionid $descid - set lastdescription $desc - } - - set query $basequery - switch $chtype { - "C" { - append query "'Change'" - } - "A" { - append query "'Append'" - } - "R" { - append query "'Remove'" - } - default { - append query "NULL" - } - } - append query ",'$date'" - append query ",[GetId people who $name]" - append query ",[GetId repositories repository $repository]" - append query ",[GetId dirs dir $dir]" - append query ",[GetId files file $file]" - append query ",'[SqlQuote $version]'" - append query ",'[SqlQuote $sticky]'" - append query ",[GetId branches branch $branch]" - append query ",$addlines" - append query ",$removelines" - append query ",$descid)" - SendSQL $query - } -} - - - - - - - - - -proc assert {arg} { - set result [uplevel 1 expr $arg] - if {!$result} { - error "Bad assertion $arg" - } -} -set lockcount 0 - - -proc html_quote {var} { - regsub -all {&} "$var" {\&} var - regsub -all {<} "$var" {\<} var - regsub -all {>} "$var" {\>} var - return $var -} - -proc url_quote_char {c} { - scan $c "%c" value - if {$value <= 32 || [regexp {[ %=&?]} $c]} { - return [format "%%%02x" $value] - } - return $c -} - -proc url_quote {var} { - set result "" - foreach c [split $var ""] { - append result [url_quote_char $c] - } - return $result -} - -proc DataDir {} { - global treeid - if {[cequal $treeid "default"]} { - return data - } else { - return data/$treeid - } -} - - -proc Lock {} { - global lockcount lockfid - if {$lockcount <= 0} { - set lockcount 0 - if {[catch {set lockfid [open "data/lockfile" "a"]}]} { - catch {mkdir data} - catch {chmod 0777 data} - set lockfid [open "data/lockfile" "a"] - } - flock -write $lockfid - catch {chmod 0666 data/lockfile} - } - incr lockcount -} - - -proc Unlock {} { - global lockcount lockfid - incr lockcount -1 - if {$lockcount <= 0} { - funlock $lockfid - close $lockfid - } -} - - -proc LoadDirList {} { - global legaldirs treeid treeinfo - set legaldirs {} - - if {![info exists treeinfo($treeid,repository)]} { - LoadTreeConfig - } - - set modules $treeinfo($treeid,repository)/CVSROOT/modules - set dirsfile [DataDir]/legaldirs - - if {[file exists $modules]} { - if {![file exists $dirsfile] || - [file mtime $dirsfile] < [file mtime $modules]} { - catch {exec ./createlegaldirs.tcl $treeid} - } - } - - Lock - for_file line $dirsfile { - lappend legaldirs $line - } - Unlock -} - - -proc PickNewBatchID {} { - global batchid - incr batchid - Lock - set fid [open [DataDir]/batchid "w"] - puts $fid "set batchid $batchid" - close $fid - Unlock -} - - - -set readonly 0 - -proc LoadCheckins {} { - global batchid treeopen checkinlist - global lastgoodtimestamp closetimestamp - assert {![info exists checkinlist]} - Lock - if {![info exists batchid]} { - set filename "[DataDir]/batchid" - if {![file exists $filename]} { - set fid [open $filename "w"] - chmod 0666 $filename - puts $fid "set batchid 1" - close $fid - } - uplevel #0 source $filename - } - set filename [DataDir]/batch-$batchid - if {[file exists $filename]} { - uplevel #0 source $filename - } - Unlock - - if {![info exists checkinlist]} { - set checkinlist {} - } - if {![info exists treeopen]} { - set treeopen 1 - } - foreach t {lastgoodtimestamp closetimestamp} { - if {![info exists $t]} { - set $t [convertclock "1/1/70"] - } - } -} - - -proc WriteCheckins {} { - global batchid checkinlist treeopen readonly - global lastgoodtimestamp closetimestamp - if {$readonly} { - puts "

    Can't write checkins file; not viewing" - puts "current info." - return - } - set filename [DataDir]/temp-[id process] - set fid [open $filename "w"] - chmod 0666 $filename - # Hack to make person be an empty array: - set person(xyzzy) 1 - unset person(xyzzy) - foreach i {treeopen lastgoodtimestamp closetimestamp checkinlist} { - puts $fid [list set $i [set $i]] - } - foreach c $checkinlist { - upvar #0 $c info - foreach i [lsort [array names info]] { - puts $fid [list set [set c]($i) $info($i)] - } - set person($info(person)) 1 - } - close $fid - Lock - set filedest [DataDir]/batch-$batchid - if {[file exists $filedest]} { - unlink $filedest - } - frename $filename $filedest - - set fid [open $filename "w"] - chmod 0666 $filename - foreach i [lsort [array names person]] { - puts $fid $i - } - puts $fid "bonsai-hookinterest@glacier" - puts $fid "mcom.dev.client.build.busted" - close $fid - frename $filename [DataDir]/hooklist - - Unlock -} - - - -proc ConstructMailTo {name subject} { - return "Send mail to $name" -} - - - -proc Log {str} { - Lock - set filename "[DataDir]/logfile" - set fid [open $filename "a"] - catch {chmod 0666 $filename} - puts $fid "[fmtclock [getclock] "%D %H:%M"] $str" - close $fid - Unlock -} - - -proc GenerateProfileHTML {name} { - global ldapserver ldapport - foreach i { - {cn Name} - {mail E-mail} - {telephonenumber Phone} - {pager Pager} - {nscpcurcontactinfo {Contact Info}} - } { - lassign $i n t - lappend namelist $n - set title($n) $t - set value($n) "" - } - - if {[catch {set fid [open "|./data/ldapsearch -b \"o=Netscape Communications Corp.,c=US\" -h $ldapserver -p $ldapport -s sub \"(mail=$name@netscape.com)\" $namelist" r]} errinfo]} { - return "Error -- Couldn't contact the directory server.

    $errinfo
    " - } - - set result "" - - while {[gets $fid line] >= 0} { - if {[regexp -- {^([a-z]*): (.*)$} $line foo n v]} { - lappend value($n) $v - } - } - - if {[catch {close $fid} errinfo]} { - return "Error -- problem running ldapsearch.
    $errinfo
    " - } - - foreach i $namelist { - foreach v $value($i) { - append result "" - append result "" - } - } - append result "
    $title($i):$v
    " - - return $result -} - - -proc MyFmtClock {time} { - return [fmtclock $time "%D %T"] -} - - -proc LoadMOTD {} { - global motd - Lock - set motd {} - if {[file exists [DataDir]/motd]} { - uplevel #0 source [DataDir]/motd - } - Unlock -} - -proc WriteMOTD {} { - global motd - Lock - set fid [open [DataDir]/motd "w"] - catch {chmod 0666 [DataDir]/motd} - puts $fid [list set motd $motd] - close $fid - Unlock -} - -proc LoadWhiteboard {} { - global whiteboard origwhiteboard - set whiteboard {} - Lock - if {[file exists [DataDir]/whiteboard]} { - set whiteboard [read_file [DataDir]/whiteboard] - } - Unlock - set origwhiteboard $whiteboard -} - - -proc WriteWhiteboard {} { - global whiteboard origwhiteboard - if {![cequal $origwhiteboard $whiteboard]} { - Lock - set filename "[DataDir]/whiteboard" - if {[file exists $filename]} { - catch {unlink $filename} - } - set fid [open $filename w] - puts $fid $whiteboard - close $fid - catch {chmod 0666 $filename} - Unlock - } -} - - - -proc LoadTreeConfig {} { - global treelist treeinfo - Lock - set treelist {} - catch {unset treeinfo} - set filename data/configdata - if {[file exists $filename]} { - uplevel #0 source $filename - } - Unlock -} - - -proc Pluralize {str num} { - if {$num == 1} { - return $str - } else { - return "[set str]s" - } -} - - -proc MailDiffs {name oldstr newstr} { - if {[cequal $oldstr $newstr]} { - return - } - set old "data/old[set name].[id process]" - set new "data/new[set name].[id process]" - set diffs data/diffs.[id process] - set fid [open $old "w"] - puts $fid $oldstr - close $fid - set fid [open $new "w"] - puts $fid $newstr - close $fid - catch {exec diff -c -b $old $new > $diffs} - set difftext [read_file $diffs] - if {[clength $difftext] > 3} { - set text "From: bonsai-daemon -To: bonsai-messageinterest@glacier, mcom.dev.client.build.busted -Subject: [SubjectTag] Changes made to $name -Mime-Version: 1.0 -Content-Type: text/plain - -$difftext -" - - exec /usr/lib/sendmail -t << $text - } - unlink $old - unlink $new - unlink $diffs -} - - -proc PrettyDelta {delta} { - set result "" - set oneday [expr 24*60*60] - if {$delta > $oneday} { - set numdays [$delta / $oneday] - append result " $numdays day" - if {$numdays > 1} { - append result "s" - } - set delta [expr $delta % $oneday] - } - set onehour [expr 60*60] - set numhours [expr $delta / $onehour] - if {$numhours > 0} { - append result " $numhours hour" - if {$numhours > 1} { - append result "s" - } - set delta [expr $delta % $onehour] - } - set oneminute 60 - set numminutes [expr $delta / $oneminute] - if {$numminutes > 0} { - append result " $numminutes minute" - if {$numminutes > 1} { - append result "s" - } - set delta [expr $delta % $oneminute] - } - if {$delta > 0} { - append result " $delta second" - if {$delta > 1} { - append result "s" - } - } - return $result -} - - - -# Generate a string to put at the head of a subject of an e-mail. -proc SubjectTag {} { - global treeid - if {[cequal $treeid default]} { - return {[Bonsai]} - } else { - return "\[Bonsai-$treeid\]" - } -} - - -# Confirm that the given password is right. If not, generate HTML and exit. - -proc CheckGlobalPassword {password {encoded {}}} { - set fid [open data/passwd "r"] - set correct [string trim [read $fid]] - close $fid - - if {[clength $encoded] == 0} { - set encoded [string trim [exec ./data/trapdoor $password]] - } - - if {![cequal $correct $encoded]} { - puts "Bzzzzt!" - puts "

    Invalid password.

    " - puts "Please click the Back button and try again." - Log "Invalid admin password entered." - exit - } -} - -proc CheckPassword {password} { - set encoded [string trim [exec ./data/trapdoor $password]] - set f [DataDir]/treepasswd - set correct "xxx $encoded" - if {[file exists $f]} { - set fid [open $f "r"] - set correct [string trim [read $fid]] - close $fid - } - - if {![cequal $correct $encoded]} { - CheckGlobalPassword $password $encoded - } -} - - -proc ParseTimeAndCheck {timestr} { - if {[catch {set result [convertclock $timestr]}]} { - puts " -Time trap -

    Can't grok the time

    -You entered a time of $timestr, and I can't understand it. Please -hit Back and try again." - exit - } - return $result -} - - - -proc MungeTagName {name} { - set result "" - foreach c [split $name ""] { - scan $c "%c" value - if {$value <= 32 || [regexp {[ %/?*]} $c]} { - append result [format "%%%02x" $value] - } else { - append result $c - } - } - return $result -} diff --git a/mozilla/webtools/bonsai/handleAdminMail.tcl b/mozilla/webtools/bonsai/handleAdminMail.tcl deleted file mode 100755 index e94130b87b8..00000000000 --- a/mozilla/webtools/bonsai/handleAdminMail.tcl +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -if {[llength $argv] > 0} { - cd [lindex $argv 0] -} else { - cd [file dirname $argv0] -} - -set filename data/admin.[id process] - -catch {unlink $filename} -exec cat >> $filename -catch {chmod 0666 $filename} -exec ./adminmail.tcl $filename -# unlink $filename - -exit diff --git a/mozilla/webtools/bonsai/handleCheckinMail.tcl b/mozilla/webtools/bonsai/handleCheckinMail.tcl deleted file mode 100755 index 40593bb9670..00000000000 --- a/mozilla/webtools/bonsai/handleCheckinMail.tcl +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - - -if {[llength $argv] > 0} { - cd [lindex $argv 0] -} else { - cd [file dirname $argv0] -} - -set filename data/temp.[id process] - -catch {unlink $filename} -exec cat >> $filename -catch {chmod 0666 $filename} -exec ./addcheckin.tcl $filename -# unlink $filename - -exit diff --git a/mozilla/webtools/bonsai/header.pl b/mozilla/webtools/bonsai/header.pl deleted file mode 100644 index 57246f247da..00000000000 --- a/mozilla/webtools/bonsai/header.pl +++ /dev/null @@ -1,61 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -sub EmitHtmlTitleAndHeader { - my($doctitle,$heading,$subheading) = @_; - - print "$doctitle"; - print ""; - - if (open(BANNER, ") { print; } - close BANNER; - } elsif (open(BANNER, "<../bonsai/data/banner.html")) { - while () { print; } - close BANNER; - } - - print ""; - print " \n"; - print " \n"; - print "
    \n"; - print " \n"; - print " \n"; - print "
    \n"; - print " $heading\n"; - print "
    \n"; - print " $subheading\n"; - print "
    \n"; - print "
    \n"; - - if (open(BLURB, ") { print; } - close BLURB; - } - - print "
    \n"; -} - -sub EmitHtmlHeader { - my($heading,$subheading) = @_; - EmitHtmlTitleAndHeader($heading,$heading,$subheading); -} - -1; diff --git a/mozilla/webtools/bonsai/index.html b/mozilla/webtools/bonsai/index.html deleted file mode 100644 index 2a5b49d22d6..00000000000 --- a/mozilla/webtools/bonsai/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - -Going to
    -
    - toplevel.cgi -
    - - diff --git a/mozilla/webtools/bonsai/indextest.pl b/mozilla/webtools/bonsai/indextest.pl deleted file mode 100755 index a667fc8217e..00000000000 --- a/mozilla/webtools/bonsai/indextest.pl +++ /dev/null @@ -1,44 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -if( $ARGV[0] eq '' ){ - $CVS_ROOT = '/m/src'; -} -else { - $CVS_ROOT = $ARGV[0]; -} - -$CVS_REPOS_SUFIX = $CVS_ROOT; -$CVS_REPOS_SUFIX =~ s/\//_/g; - -$CHECKIN_DATA_FILE = "data/checkinlog${CVS_REPOS_SUFIX}"; -$CHECKIN_INDEX_FILE = "data/index${CVS_REPOS_SUFIX}"; - - - open(INDEX , "<$CHECKIN_INDEX_FILE"); - open(CI, "<$CHECKIN_DATA_FILE") || die "could not open checkin data file\n"; - - while( ){ - chop; - ($o,$d) = split(/\|/); - seek(CI, $o, 0); - $line = ; - ($j,$d1) = split(/\|/); - print "$d|$d1\n"; - } - diff --git a/mozilla/webtools/bonsai/lloydcgi.pl b/mozilla/webtools/bonsai/lloydcgi.pl deleted file mode 100755 index f23dca07197..00000000000 --- a/mozilla/webtools/bonsai/lloydcgi.pl +++ /dev/null @@ -1,100 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -%form = (); -&split_cgi_args; -1; - -sub split_cgi_args { - local (@args, $pair, $key, $value, $s); - - if ($ENV{"REQUEST_METHOD"} eq 'POST') { - $s .= $_ while (<>); - } - else { - $s = $ENV{"QUERY_STRING"}; - } - - $s =~ tr/+/ /; - @args= split(/\&/, $s ); - - for $pair (@args) { - ($key, $value) = split(/=/, $pair); - $key =~ s/%([a-fA-F0-9]{2})/pack("C", hex($1))/eg; - $value =~ s/%([a-fA-F0-9]{2})/pack("C", hex($1))/eg; - $form{$key} = $value; - } - - # extract the cookies from the HTTP_COOKIE environment - %cookie_jar = split('[;=] *',$ENV{'HTTP_COOKIE'}); -} - -sub make_cgi_args { - local($k,$v,$ret); - for $k (sort keys %form){ - $ret .= ($ret eq "" ? '?' : '&'); - $v = $form{$k}; - $ret .= &url_encode2($k); - $ret .= '='; - $ret .= &url_encode2($v); - } - return $ret; -} - -sub url_encode2 { - local( $s ) = @_; - - $s =~ s/\%/\%25/g; - $s =~ s/\=/\%3d/g; - $s =~ s/\?/\%3f/g; - $s =~ s/ /\%20/g; - $s =~ s/\n/\%0a/g; - $s =~ s/\r//g; - $s =~ s/\"/\%22/g; - $s =~ s/\'/\%27/g; - $s =~ s/\|/\%7c/g; - $s =~ s/\&/\%26/g; - $s =~ s/\+/\%2b/g; - return $s; -} - -sub url_encode3 { - local( $s ) = @_; - - $s =~ s/\n/\%0a/g; - $s =~ s/\r//g; - $s =~ s/\"/\%22/g; - $s =~ s/\+/\%2b/g; - return $s; -} - - -@weekdays = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); -@months = ('Jan','Feb','Mar','Apr','May','Jun', - 'Jul','Aug','Sep','Oct','Nov','Dec'); - -sub toGMTString { - local ($seconds) = $_[0]; - - local ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) - = gmtime($seconds); - $year += 1900; - - sprintf('%s, %02d-%s-%d %02d:%02d:%02d GMT', - $weekdays[$wday],$mday,$months[$mon],$year,$hour,$min,$sec); -} diff --git a/mozilla/webtools/bonsai/localprofile.cgi b/mozilla/webtools/bonsai/localprofile.cgi deleted file mode 100755 index 672e47a6e07..00000000000 --- a/mozilla/webtools/bonsai/localprofile.cgi +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -proc PutsLDAPDisclaimer {} { - puts " -
    - Yes, yes, we will punt all this stuff and use the Directory Server, -but we have some exploring and hacking to do first. Meanwhile, we at -least try to display the phonebook record below. - -" -} - - - -puts "Content-type: text/html - -" - - -puts [GenerateProfileHTML $FORM(person)] - -puts " -
    - - -To change this profile, " - -NOTDEF { - puts " type in the associated password (if any) and " -} - -puts " -click on Edit. - -
    - -" - -NOTDEF { - puts " -Password: -" -} - -puts " -
    - - -
    - -See someone else's profile. - -" - -PutsLDAPDisclaimer - - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/maketables.sh b/mozilla/webtools/bonsai/maketables.sh deleted file mode 100755 index ecc4d7f3c3c..00000000000 --- a/mozilla/webtools/bonsai/maketables.sh +++ /dev/null @@ -1,146 +0,0 @@ -#!/bin/sh -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -mysql > /dev/null 2>/dev/null << OK_ALL_DONE - -use bonsai; - -drop table descs; -drop table checkins; -drop table people; -drop table repositories; -drop table dirs; -drop table files; -drop table branches; -drop table tags; -OK_ALL_DONE - - - -mysql << OK_ALL_DONE -use bonsai; -create table descs ( - id mediumint not null auto_increment primary key, - description text -); - -show columns from descs; -show index from descs; - -create table people ( - id mediumint not null auto_increment primary key, - who varchar(16) not null, - - unique(who) -); - -show columns from people; -show index from people; - - -create table repositories ( - id mediumint not null auto_increment primary key, - repository varchar(64) not null, - - unique(repository) -); - -show columns from repositories; -show index from repositories; - - - -create table dirs ( - id mediumint not null auto_increment primary key, - dir varchar(128) not null, - - unique(dir) -); - -show columns from dirs; -show index from dirs; - - -create table files ( - id mediumint not null auto_increment primary key, - file varchar(128) not null, - - unique(file) -); - -show columns from files; -show index from files; - - - -create table branches ( - id mediumint not null auto_increment primary key, - branch varchar(64) not null, - - unique(branch) -); - -show columns from branches; -show index from branches; - - - -create table checkins ( - type enum('Change', 'Add', 'Remove'), - when datetime not null, - whoid mediumint not null, - repositoryid mediumint not null, - dirid mediumint not null, - fileid mediumint not null, - revision varchar(32) not null, - stickytag varchar(255) not null, - branchid mediumint not null, - addedlines int not null, - removedlines int not null, - descid mediumint, - - unique (repositoryid,dirid,fileid,revision), - index(when), - index(whoid), - index(repositoryid), - index(dirid), - index(fileid), - index(branchid) -); - -show columns from checkins; -show index from checkins; - - -create table tags ( - repositoryid mediumint not null, - branchid mediumint not null, - dirid mediumint not null, - fileid mediumint not null, - revision varchar(32) not null, - - unique(repositoryid,dirid,fileid,branchid,revision), - index(repositoryid), - index(dirid), - index(fileid), - index(branchid) -); - - - -OK_ALL_DONE diff --git a/mozilla/webtools/bonsai/moduleanalyse.cgi b/mozilla/webtools/bonsai/moduleanalyse.cgi deleted file mode 100755 index 4eb973f8024..00000000000 --- a/mozilla/webtools/bonsai/moduleanalyse.cgi +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -# -# Unroll a module -# -require 'lloydcgi.pl'; -require 'cvsmenu.pl'; - -$|=1; - -$CVS_ROOT = $form{"cvsroot"}; - -print "Content-type: text/html - -"; - -require 'modules.pl'; - -print " - -CVS Module Analyzer -"; - -cvsmenu("align=right width=20%"); - -print " -

    CVS Module Analyzer

    -

    This tool will show you the directories and files that make up a given -cvs module. -"; - - -print " -

    -

    -"; - - -# -# module selector -# -print " - -Module: -\n"; - - -print " -
    -
    - - -
    "; - - -if( $form{module} ne '' ){ - $mod = $form{module}; - print "

    Examining Module '$mod'

    \n\n"; - $mod_map = &get_module_map( $mod ); - for $i (sort keys %$mod_map) { - if( -d "$CVS_ROOT/$i"){ - print "
    Dir:   "; - print "$i"; - } - elsif ( -r "$CVS_ROOT/$i,v" ){ - print "
    File:  "; - print "$i"; - } - else { - print "
    Error: "; - print "$i : Not a file or a directory."; - } - - if( $mod_map->{$i} == $IS_LOCAL ){ - print " LOCAL"; - } - print "\n"; - } -} - - -sub sortTest { - if( $_[0] eq $form{sortby} ){ - return " SELECTED"; - } - else { - return ""; - } -} - -sub dateTest { - if( $_[0] eq $form{date} ){ - return " CHECKED value=$_[0]"; - } - else { - return "value=$_[0]"; - } -} diff --git a/mozilla/webtools/bonsai/modules.pl b/mozilla/webtools/bonsai/modules.pl deleted file mode 100755 index a2870d51cac..00000000000 --- a/mozilla/webtools/bonsai/modules.pl +++ /dev/null @@ -1,170 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -require 'utils.pl'; - -$NOT_LOCAL = 1; -$IS_LOCAL = 2; - -$modules = {}; - -if( $CVS_ROOT eq "" ){ - $CVS_ROOT = pickDefaultRepository(); -} - -if( $ENV{"OS"} eq "Windows_NT" ){ - $CVS_MODULES='modules'; -} -else { - $CVS_MODULES="${CVS_ROOT}/CVSROOT/modules"; -} - -open( MOD, "<$CVS_MODULES") || die "can't open $CVS_MODULES"; -&parse_modules; -close( MOD ); - -1; - -sub in_module { - local($mod_map, $dirname, $filename ) = @_; - local( @path ); - local( $i, $fp, $local ); - - # - #quick check if it is already in there. - # - if( $mod_map{$dirname} ){ - return 1; - } - - - @path = split(/\//, $dirname); - - $fp = ''; - - for( $i = 0; $i < @path; $i++){ - - $fp .= ($fp ne '' ? '/' : '') . $path[$i]; - - if( $local = $mod_map->{$fp} ){ - if( $local == $IS_LOCAL ){ - if( $i == (@path-1) ){ - return 1; - } - } - else { - # Add directories to the map as we encounter them so we go - # faster - if( $mod_map{$dirname} == 0 ){ - $mod_map{$dirname} = $IS_LOCAL; - } - return 1; - } - } - } - if( $mod_map->{ $fp . '/' . $filename} ) { - return 1; - } - else { - return 0; - } -} - - -sub get_module_map { - local($name) = @_; - local($mod_map); - $mod_map = {}; - &build_map( $name, $mod_map ); - return $mod_map; -} - -sub parse_modules { - local @finaloptions=(); - while( $l = &get_line ){ - @finaloptions=(); - - ($mod_name, $flag, @params) = split(/[ \t]+/,$l); - while ( $flag =~ /^-.$/){ - if( $flag eq '-a' ){ - $flag=""; - last; - } - if ( $flag eq '-l' ){ # then keep it - push @finaloptions, ($flag, shift @params); - $flag= shift @options; - next; - } - if( $flag =~ /^-.$/ ){ - shift @params; # skip parameter's argument - $flag = shift @params; - next; - } - last; # No options found... - } - unshift @params, $flag if ( $flag ne "" ); - $modules->{$mod_name} = [(@finaloptions,@params)]; - } -} - -sub build_map { - local($name,$mod_map) = @_; - local($bFound, $local); - - $local = $NOT_LOCAL; - $bFound = 0; - -# printf "looking for $name in %s
    \n",join(",", @{$modules->{$name}}); - for $i ( @{$modules->{$name}} ){ - $bFound = 1; - if( $i eq '-l' ){ - $local = $IS_LOCAL; - } - elsif( ($i eq $name) || !build_map($i, $mod_map )){ - $mod_map->{$i} = $local; - } - } - return $bFound; -} - - - -sub get_line { - local($l, $save); - - $bContinue = 1; - - while( $bContinue && ($l = ) ){ - chop($l); - if( $l =~ /^[ \t]*\#/ - || $l =~ /^[ \t]*$/ ){ - $l=''; - } - elsif( $l =~ /\\[ \t]*$/ ){ - chop ($l); - $save .= $l . ' '; - } - elsif( $l eq '' && $save eq ''){ - # ignore blank lines - } - else { - $bContinue = 0; - } - } - return $save . $l; -} diff --git a/mozilla/webtools/bonsai/multidiff.cgi b/mozilla/webtools/bonsai/multidiff.cgi deleted file mode 100755 index c22a975000a..00000000000 --- a/mozilla/webtools/bonsai/multidiff.cgi +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -# -# Multi file diff cgi -# - -require 'utils.pl'; - -$|=1; - -loadConfigData(); - -print "Content-type: text/html - -
    
    -";
    -
    -@revs = ();
    -
    -#if( $ENV{"QUERY_STRING"} eq "" ){
    -#    $ENV{"QUERY_STRING"}="brendan%2Cns%2Fjs%2Fsrc%2Cjsapi.c%2C-1=on&brendan%2Cns%2Fjs%2Fsrc%2Cjsapi.h%2C-1=on&brendan%2Cns%2Fjs%2Fsrc%2Cjsarray.c%2C-106=on&brendan%2Cns%2Fjs%2Fsrc%2Cjsarray.h%2C-0=on&brendan%2Cns%2Fjs%2Fsrc%2Cjsatom.c%2C-9=on";
    -#}
    -
    -&split_cgi_args;
    -
    -#while( ($k,$v) = each(%ENV) ){
    -#    print "$k='$v'\n";
    -#}
    -
    -if( $form{"cvsroot"} ne "" ){
    -    $cvsroot = $form{"cvsroot"};
    -}
    -else {
    -    $cvsroot = pickDefaultRepository();
    -}
    -
    -if( $form{"allchanges"} ne "" ){
    -    @revs = split(/,/, $form{"allchanges"} );
    -}
    -else {
    -    while( ($k, $v) = each( %form ) ){
    -        push( @revs, $k );
    -    }
    -}
    -
    -$didone = 0;
    -for $k (@revs) {
    -    ($who,$dir,$file,$rev) = split(/\|/, $k );
    -    if ($rev eq "") {
    -        next;
    -    }
    -    $prevrev = &PrevRev($rev);
    -    
    -    # this doesn't handle files in the attic
    -    $fullname = "$cvsroot/$dir/$file,v";
    -    if (IsHidden($fullname)) {
    -        next;
    -    }
    -    open( DIFF, "$rcsdiffcommand -c -r$prevrev -r$rev $fullname 2>&1|" );
    -    $_ =~ s/&/&/g;
    -    $_ =~ s/){
    -        print "$who:  $_";
    -    }
    -    $didone = 1;
    -}
    -
    -if ($didone == 0) {
    -    print "No changes were selected.  Please press Back and try again.\n";
    -}
    -
    -
    -
    -sub split_cgi_args {
    -    local($i,$var,$value, $s);
    -
    -    if( $ENV{"REQUEST_METHOD"} eq 'POST'){
    -        while(<> ){
    -            $s .= $_;
    -        }
    -    }
    -    else {
    -        $s = $ENV{"QUERY_STRING"};
    -    }
    -
    -    @args= split(/\&/, $s );
    -
    -    for $i (@args) {
    -        ($var, $value) = split(/=/, $i);
    -        $var =~ tr/+/ /;
    -        $var =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    -        $value =~ tr/+/ /;
    -        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    -        $form{$var} = $value;
    -    }
    -}
    -
    -sub PrevRev {
    -    local( $rev ) = @_;
    -    local( $i, $j, $ret, @r );
    -
    -    @r = split( /\./, $rev );
    -
    -    $i = @r-1;
    -    
    -    $r[$i]--;
    -    if( $r[$i] == 0 ){
    -        $i -= 2;
    -    }
    -
    -    $j = 0;
    -    while( $j < $i ){
    -        $ret .= "$r[$j]\.";
    -        $j++
    -    }
    -    $ret .= $r[$i];
    -}
    diff --git a/mozilla/webtools/bonsai/myglobrecur.tcl b/mozilla/webtools/bonsai/myglobrecur.tcl
    deleted file mode 100644
    index c2b41f3a663..00000000000
    --- a/mozilla/webtools/bonsai/myglobrecur.tcl
    +++ /dev/null
    @@ -1,79 +0,0 @@
    -# -*- Mode: tcl; indent-tabs-mode: nil -*-
    -
    -# The below was taken from the tclX distribution (version 7.4a), and modified
    -# to quietly continue if it runs into a directory it doesn't have permission
    -# to enter, and also to skip . directories.
    -
    -
    -
    -#
    -# globrecur.tcl --
    -#
    -#  Build or process a directory list recursively.
    -#------------------------------------------------------------------------------
    -# Copyright 1992-1994 Karl Lehenbauer and Mark Diekhans.
    -#
    -# Permission to use, copy, modify, and distribute this software and its
    -# documentation for any purpose and without fee is hereby granted, provided
    -# that the above copyright notice appear in all copies.  Karl Lehenbauer and
    -# Mark Diekhans make no representations about the suitability of this
    -# software for any purpose.  It is provided "as is" without express or
    -# implied warranty.
    -#------------------------------------------------------------------------------
    -# $Id: myglobrecur.tcl,v 1.1 1998-06-16 21:43:04 terry Exp $
    -#------------------------------------------------------------------------------
    -#
    -
    -
    -
    -proc my_for_recursive_glob {var dirlist globlist cmd {depth 1}} {
    -    upvar $depth $var myVar
    -    set recurse {}
    -    foreach dir $dirlist {
    -        if ![file isdirectory $dir] {
    -            error "\"$dir\" is not a directory"
    -        }
    -        set code 0
    -        set result {}
    -        foreach pattern $globlist {
    -            if {[catch {set list [glob -nocomplain -- $dir/$pattern]}]} {
    -                continue
    -            }
    -            foreach file $list {
    -                set myVar $file
    -                set code [catch {uplevel $depth $cmd} result]
    -                if {$code != 0 && $code != 4} break
    -            }
    -            if {$code != 0 && $code != 4} break
    -        }
    -        if {$code != 0 && $code != 4} {
    -            if {$code == 3} {
    -                return $result
    -            }
    -            if {$code == 1} {
    -                global errorCode errorInfo
    -                return -code $code -errorcode $errorCode \
    -                        -errorinfo $errorInfo $result
    -            }
    -            return -code $code $result
    -        }
    -
    -        if {[catch {set list [readdir $dir]}]} {
    -            continue
    -        }
    -        foreach file $list {
    -            set file $dir/$file
    -            if [file isdirectory $file] {
    -                set fileTail [file tail $file]
    -                if {![cequal "." [crange $fileTail 0 0]]} {
    -                    lappend recurse $file
    -                }
    -            }
    -        }
    -    }
    -    if ![lempty $recurse] {
    -        return [my_for_recursive_glob $var $recurse $globlist $cmd \
    -                    [expr {$depth + 1}]]
    -    }
    -    return {}
    -}
    diff --git a/mozilla/webtools/bonsai/openmessage b/mozilla/webtools/bonsai/openmessage
    deleted file mode 100644
    index 2095bbdf58f..00000000000
    --- a/mozilla/webtools/bonsai/openmessage
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -From: bonsai-daemon
    -To: %name%
    -Subject: [Bonsai] You're on the hook now!
    -Mime-Version: 1.0
    -Content-Type: text/html
    -
    -
    -
    -

    You are responsible to make sure the build works.

    - -You just checked into %dir% the files %files%. At -about %nextclose%, the tree will be frozen. From about -an hour later on, you are to be available for the build team to pester -in case of any problems. - -

    - -Any further checkins you make before the tree closes will not -cause you to receive more copies of this mail, but you'll be held -responsible for them too. - -

    - -For more info on the current state of the tree, see the -Bonsai main page. - -

    - -Your contact info and other vital data is listed below. Please -update -this info immediately if it is at all inaccurate or incorrect. - -


    - -%profile% diff --git a/mozilla/webtools/bonsai/perlifyconfig.tcl b/mozilla/webtools/bonsai/perlifyconfig.tcl deleted file mode 100755 index dc4efa60702..00000000000 --- a/mozilla/webtools/bonsai/perlifyconfig.tcl +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# Oy, what a hack. -# -# Bonsai has a split heritage, and so some of it is written in Perl, and -# some of it is written in TCL. The perl half wants to be able to look -# at the basic configuration, kept in data/configdata. But that file is -# designed to be quickly read by TCL. And I don't feel like writing perl -# code to parse it. So, instead, we have this hack which will read the -# file and push it out in a form friendlier to perl. Gross, gross, gross. - - -source globals.tcl - -proc haschar {str char} { - return [string match "*$char*" $str] -} - -proc PerlStringify {str} { - if {![haschar $str "'"]} { - return "'$str'" - } - foreach i [list "/" ":" "@" "#" "%" "^"] { - if {![haschar $str $i]} { - return "q$i$str$i" - } - } -} - - - - - - -Lock -LoadTreeConfig - -set outfilename "data/configdata.pl" -set fid [open $outfilename "w"] -puts $fid "\# WARNING! Do not edit this file! Automatically generated!" -puts $fid "\# You want to instead edit the 'configdata' file. This file" -puts $fid "\# gets automatically generated from that one." -puts $fid "" -regsub -all {(^|[^\])&} $BUGSYSTEMEXPR {\1$\&} BUGSYSTEMEXPR -puts $fid "\$BUGSYSTEMEXPR = [PerlStringify $BUGSYSTEMEXPR];" -puts $fid "\$cvscommand = [PerlStringify $cvscommand];" -puts $fid "\$rlogcommand = [PerlStringify $rlogcommand];" -puts $fid "\$rcsdiffcommand = [PerlStringify $rcsdiffcommand];" -puts $fid "\$cocommand = [PerlStringify $cocommand];" -puts $fid "\$lxr_base = [PerlStringify $lxr_base];" -puts $fid "\$mozilla_lxr_kludge = [PerlStringify $mozilla_lxr_kludge];" -set list "" -foreach i $treelist { - append list [PerlStringify $i] - append list ", " -} -puts $fid "@treelist = ($list);" - -foreach i [lsort [array names treeinfo]] { - lassign [split $i ","] a b - if {![info exists done($a)]} { - set done($a) 1 - puts $fid "\$treeinfo{[PerlStringify $a]} = {};" - } - puts $fid "\$treeinfo{[PerlStringify $a]}->{[PerlStringify $b]} = [PerlStringify $treeinfo($i)];" -} - - -close $fid -catch {chmod 0666 $outfilename} - -Unlock diff --git a/mozilla/webtools/bonsai/processqueue.pl b/mozilla/webtools/bonsai/processqueue.pl deleted file mode 100755 index a17438e6a39..00000000000 --- a/mozilla/webtools/bonsai/processqueue.pl +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# This takes a bunch of files that have been put into the 'bonsai -# queue' (the 'queue' subdirectory) and processes them as checkins. -# This is to work around worlds where we can't send mail from inside -# the CVS loginfo file. -# -# Each file is expected to have the CVSROOT in the first line, any args in the -# second line (currently unused), and the data fed to loginfo as the remaining -# lines. - -$inprocess = "data/queue/processing-$$"; - -foreach $file (sort(glob("data/queue/*.q"))) { - rename $file, $inprocess || die "Couldn't rename queue file."; - system "./dolog.pl < $inprocess"; - rename $inprocess, "$file.done"; -} diff --git a/mozilla/webtools/bonsai/profile.cgi b/mozilla/webtools/bonsai/profile.cgi deleted file mode 100755 index 76972069fb7..00000000000 --- a/mozilla/webtools/bonsai/profile.cgi +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - - - - -if {![info exists FORM(person)]} { - puts { -Uh, who? -

    Who would you like to know more about?

    -Please enter the username of the person whose Bonsai profile -you'd like to see. -

    -

    -User: -
    - } - PutsTrailer - exit -} - - -set fid [open "|./data/ldapsearch -b \"o=Netscape Communications Corp.,c=US\" -h $ldapserver -p $ldapport -s sub \"(mail=$FORM(person)@netscape.com)\" cn" r] - -while {[gets $fid line] >= 0} { - if {[regexp -- {^cn: (.*)$} $line foo n]} { - set fullname $n - } -} - -close $fid - -if {![info exists fullname]} { - puts { -Uh, who? -

    Who would you like to know more about?

    -There doesn't seem to be anybody with e-mail address -$FORM(person). - -

    - -Please enter the username of the person whose Bonsai profile -you'd like to see. -

    -

    -User: -
    - } - PutsTrailer - exit -} - - - - -puts "Content-type: text/html -Refresh: 0; URL=http://phonebook/cgi-bin/expand-entry.pl?fullname=[url_quote "$fullname,o=Netscape Communications Corp.,c=US"] - - -What a hack. -One moment while we whisk you away to the appropriate phonebook page..." - - - -exit diff --git a/mozilla/webtools/bonsai/rebuildcvshistory.cgi b/mozilla/webtools/bonsai/rebuildcvshistory.cgi deleted file mode 100755 index f59c004dd08..00000000000 --- a/mozilla/webtools/bonsai/rebuildcvshistory.cgi +++ /dev/null @@ -1,386 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl -source myglobrecur.tcl - -if {[llength $argv] == 5} { - lassign $argv treeid FORM(startfrom) FORM(firstfile) FORM(subdir) FORM(modules) -} else { - puts "Content-type: text/plain - -" - - CheckPassword $FORM(password) -} - -set startfrom [ParseTimeAndCheck [FormData startfrom]] - -set firstfile [string trim [FormData firstfile]] - -set subdir [string trim [FormData subdir]] - -Lock -LoadTreeConfig -Unlock - -ConnectToDatabase - -set repository $treeinfo($treeid,repository) -regsub -all -- / $repository _ mungedname - -puts "Rebuilding entire checkin history in $treeinfo($treeid,description) ..." -flush stdout - - - -# cmdtrace on - -set repositoryid [GetId repositories repository $repository] - -proc ProcessOneFile {filename} { - global repository startfrom rlogcommand - - puts "$filename" - flush stdout - set fid [open "|$rlogcommand $filename" r] - set doingtags 0 - catch {unset branchname} - regsub -- {,v$} $filename {} filerealname - set filehead [file dirname $filerealname] - regsub -- "^$repository" $filehead {} filehead - regsub -- {^/} $filehead {} filehead - if {[clength $filehead] == 0} { - set filehead "." - } - set filetail [file tail $filerealname] - while {1} { - if {[gets $fid line] < 0} { - break - } - set trimmed [string trim $line] - if {$doingtags} { - if {![cequal "\t" [crange $line 0 0]]} { - set doingtags 0 - } else { - lassign [split $trimmed ":"] tag version - if {[clength $tag] == 0 || [clength $version] == 0} { - continue - } - set version [string trim $version] - - set branchid [GetId branches branch $tag] - set dirid [GetId dirs dir $filehead] - set fileid [GetId files file $filetail] -# Don't touch the tags database for now. Nothing uses it, and it just takes -# up too much damn space. -# SendSQL "replace into tags (branchid, repositoryid, dirid, fileid, revision) values ($branchid, $repositoryid, $dirid, $fileid, '$version')" - - set vlist [split $version '.'] - set sub [expr [llength $vlist] - 2] - if {[cequal "0" [lindex $vlist $sub]]} { - # Aha! Second-to-last being a zero is CVS's special way - # of remembering a branch tag. - set bnum [join [lreplace $vlist $sub $sub] "."] - set branchname($bnum) $tag - } - continue - } - } - switch -regexp -- $line { - {^symbolic names} { - set doingtags 1 - } - {^revision ([0-9.]*)$} { - set indesc 0 - while {1} { - if {$indesc} { - if {[cequal $line "----------------------------"] || - [cequal $line "============================================================================="]} { - # OK, we're done. Write it out. - if {[info exists revision] && - [info exists datestr] && - [info exists author]} { - if {[regexp -- {^([0-9]*)/([0-9]*)/([0-9]*) ([0-9]*):([0-9]*):([0-9]*)$} $datestr foo year month day hours mins secs]} { - set date [convertclock "$month/$day/$year $hours:$mins:$secs" GMT] - - if {$date >= $startfrom} { - set tbranch "T$branch" - if {[cequal $tbranch "T"]} { - set tbranch "" - } - set entrystr "C|$date|$author|$repository|$filehead|$filetail|$revision||$branch|+$pluscount|-$minuscount" - AddToDatabase $entrystr $desc - } - } - } - set indesc 0 - } else { - append desc $line - append desc "\n" - } - } else { - switch -regexp -- $line { - {^revision ([0-9.]*)$} { - if {[regexp -- {^revision ([0-9.]*)$} $line foo new]} { - set revision $new - catch {unset datestr} - catch {unset author} - set pluscount 0 - set minuscount 0 - set desc {} - - regsub -- {.[0-9]*$} $revision {} bnum - if {[info exists branchname($bnum)]} { - set branch "$branchname($bnum)" - } else { - set branch "" - } - } - } - {^date:} { - regexp -- {^date: ([0-9 /:]*); author: ([^;]*);} $line foo datestr author - regexp -- {lines: \+([0-9]*) -([0-9]*)} $line foo pluscount minuscount - } - {^branches: [0-9 .;]*$} { - # Ignore these lines; make sure they don't - # become part of the desciption. - } - default { - set indesc 1 - set desc "$line\n" - - } - } - } - if {[gets $fid line] < 0} { - break - } - } - } - } - } - catch {close $fid} -} - - -proc ProcessDirectory {dir} { - global firstfile - my_for_recursive_glob filename $dir "*,v" { - if {![cequal $firstfile ""]} { - if {![cequal $filename $firstfile]} { - puts "Skipping $filename" - flush stdout - continue - } - set firstfile "" - } - ProcessOneFile $filename - } -} - - - -proc digest {str} { - global array - set key [lvarpop str] - if {[cequal [cindex [lindex $str 0] 0] "-"]} { - lvarpop str - } - set array($key) $str -} - - - -set env(CVSROOT) $treeinfo($treeid,repository) -set origdir [pwd] -cd / -set fid [open "|$cvscommand checkout -c" r] -cd $origdir - -set curline "" -while {[gets $fid line] >= 0} { - if {[ctype space [cindex $line 0]]} { - append curline $line - } else { - digest $curline - set curline $line - } -} -digest $curline -close $fid - - -set startingdir $repository/$subdir - -regsub -- {/\.$} $startingdir {} startingdir -regsub -- {/$} $startingdir {} startingdir - - -set oldlist {} - -set list {} - -if {[info exists FORM(modules)]} { - set list [split $FORM(modules) ","] -} - -if {[lempty $list]} { - set list $treeinfo($treeid,module) -} - - -while {![cequal $list $oldlist]} { - set oldlist $list - set list {} - foreach i $oldlist { - if {[info exists array($i)]} { - set list [concat $list $array($i)] - # Do an unset to prevent infinite recursion. - unset array($i) - } else { - lappend list $i - } - } -} - - -set tlist {} -catch {unset present} -foreach i $list { - if {![info exists present($i)]} { - lappend tlist $i - set present($i) 1 - } -} -catch {unset present} - - -set list {} - -foreach i $tlist { - set d $repository/$i - regsub -- {/\.$} $d {} d - regsub -- {/$} $d {} d - lappend list $d -} - -if {[lempty $list]} { - set $list $startingdir -} - -set slen [expr [clength $startingdir] - 1] - -puts "Doing directories: $list" - -foreach dir $list { - if {![cequal [crange $dir 0 $slen] $startingdir]} { - puts "*** Skipping $dir ***" - continue - } - if {![file isdirectory $dir]} { - if {[file isfile $dir]} { - ProcessOneFile $dir - } - } else { - ProcessDirectory $dir - } -} - - - - -# puts "
    Putting entries ($count unique descriptions) into database...

    " -# flush stdout - -# set infid [open data/checkinlog$mungedname "r"] - -# ConnectToDatabase - -# set buffer {} -# set desc {} -# set indesc 0 -# set done 0 -# while {[gets $infid line] >= 0} { -# if {$indesc} { -# if {[cequal $line ":ENDLOGCOMMENT"]} { -# AddToDatabase $buffer $desc -# set buffer {} -# set desc {} -# set indesc 0 -# incr done -# if {$done % 5 == 0} { -# puts "$done done.
    " -# flush stdout -# } -# } else { -# append desc $line -# append desc "\n" -# } -# } else { -# if {[cequal $line "LOGCOMMENT"]} { -# set indesc 1 -# } else { -# append buffer $line -# append buffer "\n" -# } -# } -# } -# close $infid - - - - - - -# puts "


    " -# flush stdout - -# set dir data/taginfo -# catch {mkdir $dir} -# catch {chmod 0777 $dir} -# append dir /tmp_[set mungedname]_[id process] -# catch {mkdir $dir} -# catch {chmod 0777 $dir} - -# set numtags 0 - -# foreach n [lsort [info var tag_*]] { -# upvar #0 $n t -# set tagname [crange $n 4 end] -# puts "Dumping tag $tagname
    " -# flush stdout -# set filename $dir/[MungeTagName $tagname] -# set fid [open "$filename" "w"] -# foreach f [lsort [array names t]] { -# puts $fid "0|add|$f|$t($f)" -# } -# close $fid -# incr numtags -# } - - -# Lock -# set newdir data/taginfo/$mungedname -# catch {exec rm -rf $newdir} -# frename $dir $newdir -# Unlock - -# puts "

    Done. $numfiles files checked; $numtags tags created.

    " - diff --git a/mozilla/webtools/bonsai/rebuilddatabase.tcl b/mozilla/webtools/bonsai/rebuilddatabase.tcl deleted file mode 100755 index a6c57e853e7..00000000000 --- a/mozilla/webtools/bonsai/rebuilddatabase.tcl +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source globals.tcl - -ConnectToDatabase - -set repository [lindex $argv 0] -set startdate [lindex $argv 1] - -if {![cequal $startdate ""]} { - set startdate [convertclock $startdate] -} - - -regsub -all -- / $repository _ mungedname - -set infid [open data/checkinlog$mungedname "r"] - -# SendSQL "select descid from checkins where repository='[SqlQuote $repository]'" -# -# set ids(zz) 1 -# unset ids(zz) -# while {[MoreSQLData]} { -# set ids([lindex [FetchSQLData] 0]) 1 -# } -# -# set list [array names ids] -# -# -# set num [llength $list] -# -# set d 0 -# foreach i $list { -# SendSQL "delete from descs where id=$i" -# incr d -# if {$d % 100 == 0} { -# puts "Deleted $d of $num old descriptions
    " -# } -# } -# -# -# SendSQL "delete from checkins where repository = '[SqlQuote $repository]'" - - -set buffer {} -set desc {} -set indesc 0 - -if {![cequal $startdate ""]} { - puts "Searching for first entry after [fmtclock $startdate] ...
    " - flush stdout - - if {![catch {set index [open data/index$mungedname r]}]} { - while {[gets $index line] >= 0} { - lassign [split $line "|"] offset date - if {$date <= $startdate} { - seek $infid $offset - puts "Seeked to position $offset.
    " - flush stdout - break - } - } - close $index - } - - set count 0 - set foundfirst 0 - while {!$foundfirst && [gets $infid line] >= 0} { - if {$indesc} { - if {[cequal $line ":ENDLOGCOMMENT"]} { - set indesc 0 - } - } else { - if {[cequal $line "LOGCOMMENT"]} { - set indesc 1 - } else { - lassign [split $line "|"] chtype date - set problem [catch { - if {$date >= $startdate} { - if {$date - $startdate < 10 * 24 * 60 * 60} { - set foundfirst 1 - } - } - incr count - if {$count % 100 == 0} { - puts "[fmtclock $date]
    " - flush stdout - } - } errorinfo] - if {$problem} { - puts "Date parsing problem? $date $errorinfo" - flush stdout - } - } - } - } - - set buffer "$line\n" - puts "OK, found first line:\n$buffer
    " - flush stdout -} - -set done 0 -while {[gets $infid line] >= 0} { - if {$indesc} { - if {[cequal $line ":ENDLOGCOMMENT"]} { - if {$done % 100 == 0} { - lassign [split $buffer "|"] chtype date - if {[catch {set prettydate [fmtclock $date]}]} { - puts "Couldn't format date; buffer is $buffer " - } else { - puts "$done done. ([fmtclock $date])
    " - flush stdout - } - } - AddToDatabase $buffer $desc - set buffer {} - set desc {} - set indesc 0 - incr done - } else { - append desc $line - append desc "\n" - } - } else { - if {[cequal $line "LOGCOMMENT"]} { - set indesc 1 - } else { - append buffer $line - append buffer "\n" } - } -} -close $infid - -# Now get rid of any dangling descriptions. Sigh; there ought to be a better -# way. - -puts "Gathering unique ids from descs ...
    " -flush stdout -SendSQL "lock tables descs read,checkins read" -SendSQL "select id from descs" -set ids(zz) 1 -unset ids(zz) -while {[MoreSQLData]} { - set ids([lindex [FetchSQLData] 0]) 1 -} -puts "... [array size ids] found.
    " -puts "Gathering unique ids from checkins ...
    " -flush stdout -set cids(zz) 1 -unset cids(zz) -SendSQL "select distinct descid from checkins" -while {[MoreSQLData]} { - set cids([lindex [FetchSQLData] 0]) 1 -} -puts "... [array size cids] found.
    " -flush stdout - -set n 0 -set remove {} -foreach i [array names ids] { - if {![info exists cids($i)]} { - lappend remove $i - incr n - } -} - -puts "Removing $n unused descs:
    " -SendSQL "unlock tables" - -set n 0 -foreach i $remove { - SendSQL "delete from descs where id = $i" - incr n - if {$n % 100 == 0} { - puts "Deleted $n.
    " - flush stdout - } -} diff --git a/mozilla/webtools/bonsai/rebuildtaginfo.cgi b/mozilla/webtools/bonsai/rebuildtaginfo.cgi deleted file mode 100755 index ebccfc8eac0..00000000000 --- a/mozilla/webtools/bonsai/rebuildtaginfo.cgi +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl -source myglobrecur.tcl - -puts "Content-type: text/html - -" - -CheckPassword $FORM(password) - -Lock -LoadTreeConfig -Unlock - -set repository $treeinfo($treeid,repository) -regsub -all -- / $repository _ mungedname - -puts "

    Searching for tags in all files in $repository ...

    " -flush stdout - -set numfiles 0 -set numtags 0 - -my_for_recursive_glob filename $repository "*,v" { - puts "$filename
    " - flush stdout - set fid [open "|$rc -h $filename" r] - set doingtags 0 - while {1} { - if {[gets $fid line] < 0} { - break - } - if {$doingtags} { - if {![cequal "\t" [crange $line 0 0]]} { - break - } - lassign [split [string trim $line] ":"] tag version - if {[clength $tag] == 0 || [clength $version] == 0} { - continue - } - set tag_[set tag]($cutename) [string trim $version] - } elseif {[cequal [string trim $line] "symbolic names:"]} { - set doingtags 1 - regsub -- {,v$} $filename {} tmp - regsub -- {/([^/]*$)} $tmp {|\1} cutename - } - } - catch {close $fid} - incr numfiles -} - -puts "
    " -flush stdout - -set dir data/taginfo -catch {mkdir $dir} -catch {chmod 0777 $dir} -append dir /tmp_[set mungedname]_[id process] -catch {mkdir $dir} -catch {chmod 0777 $dir} - -foreach n [lsort [info var tag_*]] { - upvar #0 $n t - set tagname [crange $n 4 end] - puts "Dumping tag $tagname
    " - flush stdout - set filename $dir/[MungeTagName $tagname] - set fid [open "$filename" "w"] - foreach f [lsort [array names t]] { - puts $fid "0|add|$f|$t($f)" - } - close $fid - incr numtags -} - - -Lock -set newdir data/taginfo/$mungedname -catch {exec rm -rf $newdir} -frename $dir $newdir -Unlock - -puts "

    Done. $numfiles files checked; $numtags tags created.

    " - -PutsTrailer diff --git a/mozilla/webtools/bonsai/repophook.cgi b/mozilla/webtools/bonsai/repophook.cgi deleted file mode 100755 index c1067e21acf..00000000000 --- a/mozilla/webtools/bonsai/repophook.cgi +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -puts "Content-type: text/html - -" - -CheckPassword $FORM(password) - -set startfrom [ParseTimeAndCheck [FormData startfrom]] - -Lock -LoadTreeConfig -LoadCheckins -set checkinlist {} -WriteCheckins -Unlock - - -puts " Rebooting, please wait... - -

    Recreating the hook

    - -

    $treeinfo($treeid,description)

    - -

    -Searching for first checkin after [MyFmtClock $startfrom]...

    " - -flush stdout - -regsub -all -- / $treeinfo($treeid,repository) _ mungedname -set filename "data/checkinlog$mungedname" - -set fid [open $filename "r"] - - -set foundfirst 0 - -set buffer {} - - -set tempfile data/repophook.[id process] - -proc FlushBuffer {} { - global buffer tempfile treeid foundfirst count - if {!$foundfirst || [cequal $buffer ""]} { - return - } - write_file $tempfile "junkline\n\n$buffer" - exec ./addcheckin.tcl -treeid $treeid $tempfile - unlink $tempfile - set buffer {} - incr count - if {$count % 100 == 0} { - puts "$count scrutinized...
    " - flush stdout - } -} - -set now [getclock] -set count 0 -set lastdate 0 - -while {[gets $fid line] >= 0} { - switch -glob -- $line { - {?|*} { - lassign [split $line "|"] chtype date - if {$date < $lastdate} { - puts "Ick; dates out of order!
    " - puts "

    [value_quote $line]

    " - } - set $lastdate $date - if {$foundfirst} { - append buffer "$line\n" - } else { - if {$date >= $startfrom} { - if {$date >= $now} { - puts "Found a future date! (ignoring):
    " - puts "

    [value_quote $line]

    " - flush stdout - } else { - set foundfirst 1 - puts "Found first line:

    [value_quote $line]

    " - puts "OK, now processing checkins...

    " - flush stdout - set buffer "$line\n" - set count 0 - } - } else { - incr count - if {$count % 2000 == 0} { - puts "Skipped $count lines...

    " - flush stdout - } - } - } - } - {:ENDLOGCOMMENT} { - append buffer "$line\n" - FlushBuffer - } - default { - append buffer "$line\n" - } - } -} - -FlushBuffer - - -catch {unset checkinlist} -LoadCheckins - -puts "Done. [llength $checkinlist] relevant checkins were found." - -PutsTrailer diff --git a/mozilla/webtools/bonsai/reposfiles.pl b/mozilla/webtools/bonsai/reposfiles.pl deleted file mode 100755 index cdc47ca5fd2..00000000000 --- a/mozilla/webtools/bonsai/reposfiles.pl +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -if( $ARGV[0] eq '' ){ - $CVS_ROOT = '/m/src'; -} -else { - $CVS_ROOT = $ARGV[0]; -} - -$CVS_REPOS_SUFIX = $CVS_ROOT; -$CVS_REPOS_SUFIX =~ s/\//_/g; - - -$FILE_LIST = "/d/webdocs/projects/bonsai/data/reposfiles${CVS_REPOS_SUFIX}"; - -open FL, ">$FILE_LIST"; - -GoDir($CVS_ROOT); - -sub GoDir { - local($dir) = @_; - local(@dirs, $i); - - chdir "$dir"; - - while(<*> ){ - if( $_ ne '.' && $_ ne '..' ){ - if( -d $_ ) { - push @dirs, $_; - } - else { - print FL "$dir/$_\n"; - } - } - } - - for $i (@dirs) { - GoDir( "$dir/$i"); - } -} diff --git a/mozilla/webtools/bonsai/rview.cgi b/mozilla/webtools/bonsai/rview.cgi deleted file mode 100755 index 725ecf22144..00000000000 --- a/mozilla/webtools/bonsai/rview.cgi +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -# -# Query the CVS database. -# -require 'lloydcgi.pl'; -require 'cvsmenu.pl'; - -$|=1; - -$CVS_ROOT = $form{"cvsroot"}; - -# get dir, remove leading and trailing slashes - -$dir = $form{"dir"}; -$dir =~ s/^\/([^:]*)/$1/; -$dir =~ s/([^:]*)\/$/$1/; - -$rev = $form{"rev"}; - -print "Content-type: text/html - -"; - - -&setup_script; -print $script_str; - - -if( $CVS_ROOT eq "" ){ - $CVS_ROOT = pickDefaultRepository(); -} - -validateRepository($CVS_ROOT); - -if( $rev ne "" ){ - $s = "for branch $rev"; -} - -print " -Repository Directory $CVS_ROOT/$dir $s"; - -CheckHidden("$CVS_ROOT/$dir"); - -$output = "

    "; - -($dir_head, $dir_tail) = $dir =~ m@(.*/)?(.+)@; -foreach $path (split('/',$dir_head)) { - $link_path .= $path; - $output .= " -
    -Goto Directory: - - - - -
    -
    -Branch: - - - - - - - -"; - -@dirs = (); - -while( <*> ){ - if( -d $_ ){ - push @dirs, $_; - } -} - -if( @dirs != 0 ){ - $j = 1; - $split = int(@dirs/4)+1; - print "

    Directories:
    "; - - - for $i (@dirs){ - $form{"dir"} = ($dir ne "" ? "$dir/$i" : $i); - $anchor = &make_cgi_args; - print "
    $i\n"; - if( $j % $split == 0 ){ - print "\n
    \n"; - } - $j++; - } - $form{"dir"} = $dir; - print "\n
    \n"; -} - - -print "

    Files:"; -print "
    "; -@files = <*,v>; -$j = 1; -$split = int(@files/4)+1; - -for $_ (@files){ - $_ =~ s/\,v//; - print "\n"; - print "
    $_\n"; - if( $j % $split == 0 ){ - print "\n
    \n"; - } - $j++; -} -print "\n
    \n"; - - -sub setup_script { - -$script_str =<<'ENDJS'; - - - - - -ENDJS - -} - diff --git a/mozilla/webtools/bonsai/show2.cgi b/mozilla/webtools/bonsai/show2.cgi deleted file mode 100755 index c9538f5508f..00000000000 --- a/mozilla/webtools/bonsai/show2.cgi +++ /dev/null @@ -1,348 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -Lock -LoadCheckins -LoadTreeConfig -Unlock - - -# Stupid hack to make an empty array: -set peoplearray(zzz) 1 -unset peoplearray(zzz) -set versioninfo "" - -proc BreakBig {str} { - set result {} - while {[clength $str] > 20} { - set head [crange $str 0 19] - set w [string last "/" $head] - if {$w < 0} { - set w 19 - } - append result "[crange $str 0 $w]
    " - incr w - set str [crange $str $w end] - } - append result $str -} - - - -set tweak [info exists FORM(tweak)] - -set delta_size 1 ;#[info exists FORM(delta_size)] - -puts "Content-type: text/html" - -if {[info exists FORM(sort)]} { - puts "Set-Cookie: SORT=$FORM(sort)" -} elseif {[info exists COOKIE(SORT)]} { - set FORM(sort) $COOKIE(SORT) -} else { - set FORM(sort) date -} - -puts " -" - -if {[info exists FORM(person)]} { - puts "Checkins for $FORM(person)" - puts "

    Checkins for $FORM(person)

    " - set list {} - foreach i $checkinlist { - upvar #0 $i info - if {[cequal $info(person) $FORM(person)]} { - lappend list $i - } - } -} elseif {[info exists FORM(mindate)] || [info exists FORM(maxdate)]} { - set str "Checkins" - set min 0 - set max [expr 1<<30] - if {[info exists FORM(mindate)]} { - set min $FORM(mindate) - append str " since [fmtclock $min "%m/%d %H:%M"]" - if {[info exists FORM(maxdate)]} { - append str " and" - } - } - if {[info exists FORM(maxdate)]} { - set max $FORM(maxdate) - append str " before [fmtclock $max "%m/%d %H:%M"]" - } - puts "$str" - puts "

    $str

    " - set list {} - foreach i $checkinlist { - upvar #0 $i info - if {$info(date) >= $min && $info(date) <= $max} { - lappend list $i - } - } -} else { - puts "All checkins" - puts "

    All Checkins

    " - set list $checkinlist -} - -if {$readonly} { - puts "

    Be aware that you are looking at an old hook!

    " -} - - -puts "(Current sort is by $FORM(sort); click on a column header -to sort by that column.)" - -# Oh, boy, is this ever gross. Dynamically write some code to be the sort -# comparison routine, so that we know that the sort code will run fast. - -set fields [split $FORM(sort) ","] -set w [lsearch $fields "date"] -if {$w >= 0} { - set fields [lrange $fields 0 [expr $w - 1]] -} - -set body { - upvar #0 $n1 a $n2 b -} -foreach i $fields { - append body "set delta \[string compare \$a($i) \$b($i)\]" - append body "\n" - append body {if {$delta != 0} {return $delta}} - append body "\n" -} -append body {return [expr $b(date) - $a(date)]} - -eval [list proc Compare {n1 n2} $body] - -set total_added 0 -set total_removed 0 - -# -# Calculate delta information -# -if {$delta_size} { - foreach i $list { - upvar #0 $i info - set info(added) 0 - set info(removed) 0 - - # - # Loop through the checkins, grab the filename and stickyflags - # - if {[info exists info(fullinfo)]} { - foreach fu $info(fullinfo) { - set fn [lindex $fu 0] - set sticky [lindex $fu 4] - - # - # if the file is binary, don't show the delta information - # - if { ![string match {*.gif} $fn] - && ![string match {*.bmp} $fn] - && ![string match {-kb} $sticky]} { - scan [lindex $fu 2] {%d} file_added - scan [lindex $fu 3] {%d} file_removed - if {[info exists file_added] && [info exists file_removed]} { - incr info(added) $file_added - incr info(removed) $file_removed - } - } - } - } - - set info(lines_changed) [format "%7d" [expr 1000000 - ($info(added) - $info(removed))]] - incr total_added $info(added) - incr total_removed $info(removed) - } -} - -set list [lsort -command Compare $list] - -regsub -all {[&?]sort=[^&]*} $buffer {} otherparams - -proc NewSort {key} { - global otherparams FORM - set list [split $FORM(sort) ","] - set w [lsearch $list $key] - if {$w >= 0} { - set list [lreplace $list $w $w] - } - set list [linsert $list 0 $key] - return "[set otherparams]&sort=[join $list ,]" -} - - -if {$tweak} { - puts "" -} - - -puts " - - -" - -if {$tweak} { - puts "" -} - -puts " -" - -set count 0 -set maxcount 100 - -set branchpart {} - -if {![cequal $treeinfo($treeid,branch) {}]} { - set branchpart "&branch=$treeinfo($treeid,branch)" -} - -foreach i $list { - upvar #0 $i info - incr count - if {$count >= $maxcount} { - set count 0 - # Don't make tables too big, or toy computers will break. - puts "
    When -Tree state -Who -Directory -Files" - -if {$delta_size} { - puts "+/-" -} - -puts " -Description -
    " - } - puts "" - if {$tweak} { - puts "" - } - puts "" - puts "" - set peoplearray($info(person)) 1 - puts "" - puts "" - puts "" - if {$delta_size} { - puts "" - } - if {[info exists info(fullinfo)]} { - foreach f $info(fullinfo) { - lassign $f file version - append versioninfo "$info(person)|$info(dir)|$file|$version," - } - } - puts "" - puts "" -} -puts "
    " - puts "[fmtclock $info(date) "%m/%d %H:%M"]" - if {$info(treeopen)} { - puts "open" - } else { - puts "CLOSED" - } - if {[info exists info(notes)]} { - if {![cequal $info(notes) ""]} { - puts "
    $info(notes)" - } - } - puts "
    $info(person)[BreakBig $info(dir)]" - foreach f $info(files) { - puts "$f" - } - - puts "" - if {$info(removed) < 0} { - set str_removed $info(removed) - } else { - set str_removed "-0" - } - puts "+$info(added)
    $str_removed" - puts "
    $info(log)
    " - - -if {$delta_size} { - set deltastr "     Lines changed ($total_added/$total_removed)." -} else { - set deltastr "" -} - - -puts "[llength $list] checkins listed. $deltastr" - - -if {$tweak} { - puts " -
    -Check the checkins you wish to affect. Then select one of the below options. -And type the magic word. Then click on submit. -

    - -Delete these checkins.
    -Set the tree state on these checkins to be Open.
    -Set the tree state on these checkins to be Closed.
    -Move these checkins over to this tree: -

    -Password: -
    - -

    " -} else { - puts "          " - puts "
    Tweak some of these checkins." - puts "

    " - puts "
    " - puts "" - puts "" - puts "
    " -} - -if {[info exists FORM(ltabbhack)]} { - puts "" - puts "" -} - - -PutsTrailer diff --git a/mozilla/webtools/bonsai/showcheckins.cgi b/mozilla/webtools/bonsai/showcheckins.cgi deleted file mode 100755 index 1bd069e057b..00000000000 --- a/mozilla/webtools/bonsai/showcheckins.cgi +++ /dev/null @@ -1,350 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -Lock -LoadCheckins -LoadTreeConfig -Unlock - - -# Stupid hack to make an empty array: -set peoplearray(zzz) 1 -unset peoplearray(zzz) -set versioninfo "" - -proc BreakBig {str} { - set result {} - while {[clength $str] > 20} { - set head [crange $str 0 19] - set w [string last "/" $head] - if {$w < 0} { - set w 19 - } - append result "[crange $str 0 $w]
    " - incr w - set str [crange $str $w end] - } - append result $str -} - - - -set tweak [info exists FORM(tweak)] - -set delta_size 1 ;#[info exists FORM(delta_size)] - -puts "Content-type: text/html" - -if {[info exists FORM(sort)]} { - puts "Set-Cookie: SORT=$FORM(sort)" -} elseif {[info exists COOKIE(SORT)]} { - set FORM(sort) $COOKIE(SORT) -} else { - set FORM(sort) date -} - -puts " -" - -if {[info exists FORM(person)]} { - puts "Checkins for $FORM(person)" - puts "

    Checkins for $FORM(person)

    " - set list {} - foreach i $checkinlist { - upvar #0 $i info - if {[cequal $info(person) $FORM(person)]} { - lappend list $i - } - } -} elseif {[info exists FORM(mindate)] || [info exists FORM(maxdate)]} { - set str "Checkins" - set min 0 - set max [expr 1<<30] - if {[info exists FORM(mindate)]} { - set min $FORM(mindate) - append str " since [fmtclock $min "%m/%d %H:%M"]" - if {[info exists FORM(maxdate)]} { - append str " and" - } - } - if {[info exists FORM(maxdate)]} { - set max $FORM(maxdate) - append str " before [fmtclock $max "%m/%d %H:%M"]" - } - puts "$str" - puts "

    $str

    " - set list {} - foreach i $checkinlist { - upvar #0 $i info - if {$info(date) >= $min && $info(date) <= $max} { - lappend list $i - } - } -} else { - puts "All checkins" - puts "

    All Checkins

    " - set list $checkinlist -} - -if {$readonly} { - puts "

    Be aware that you are looking at an old hook!

    " -} - - -puts "(Current sort is by $FORM(sort); click on a column header -to sort by that column.)" - -# Oh, boy, is this ever gross. Dynamically write some code to be the sort -# comparison routine, so that we know that the sort code will run fast. - -set fields [split $FORM(sort) ","] -set w [lsearch $fields "date"] -if {$w >= 0} { - set fields [lrange $fields 0 [expr $w - 1]] -} - -set body { - upvar #0 $n1 a $n2 b -} -foreach i $fields { - append body "set delta \[string compare \$a($i) \$b($i)\]" - append body "\n" - append body {if {$delta != 0} {return $delta}} - append body "\n" -} -append body {return [expr $b(date) - $a(date)]} - -eval [list proc Compare {n1 n2} $body] - -set total_added 0 -set total_removed 0 - -# -# Calculate delta information -# -if {$delta_size} { - foreach i $list { - upvar #0 $i info - set info(added) 0 - set info(removed) 0 - - # - # Loop through the checkins, grab the filename and stickyflags - # - if {[info exists info(fullinfo)]} { - foreach fu $info(fullinfo) { - set fn [lindex $fu 0] - set sticky [lindex $fu 4] - - # - # if the file is binary, don't show the delta information - # - if { ![string match {*.gif} $fn] - && ![string match {*.bmp} $fn] - && ![string match {-kb} $sticky]} { - scan [lindex $fu 2] {%d} file_added - scan [lindex $fu 3] {%d} file_removed - if {[info exists file_added] && [info exists file_removed]} { - incr info(added) $file_added - incr info(removed) $file_removed - } - } - } - } - - set info(lines_changed) [format "%7d" [expr 1000000 - ($info(added) - $info(removed))]] - incr total_added $info(added) - incr total_removed $info(removed) - } -} - -set list [lsort -command Compare $list] - -regsub -all {[&?]sort=[^&]*} $buffer {} otherparams - -proc NewSort {key} { - global otherparams FORM - set list [split $FORM(sort) ","] - set w [lsearch $list $key] - if {$w >= 0} { - set list [lreplace $list $w $w] - } - set list [linsert $list 0 $key] - return "[set otherparams]&sort=[join $list ,]" -} - - -if {$tweak} { - puts "
    " -} - - -puts " - - -" - -if {$tweak} { - puts "" -} - -puts " -" - -set count 0 -set maxcount 100 - -set branchpart {} - -if {![cequal $treeinfo($treeid,branch) {}]} { - set branchpart "&branch=$treeinfo($treeid,branch)" -} - -foreach i $list { - upvar #0 $i info - incr count - if {$count >= $maxcount} { - set count 0 - # Don't make tables too big, or toy computers will break. - puts "
    When -Tree state -Who -Directory -Files" - -if {$delta_size} { - puts "+/-" -} - -puts " -Description -
    " - } - puts "" - if {$tweak} { - puts "" - } - puts "" - puts "" - set peoplearray($info(person)) 1 - puts "" - puts "" - puts "" - if {$delta_size} { - puts "" - } - if {[info exists info(fullinfo)]} { - foreach f $info(fullinfo) { - lassign $f file version - append versioninfo "$info(person)|$info(dir)|$file|$version," - } - } - puts "" - puts "" -} -puts "
    " - puts "[fmtclock $info(date) "%m/%d %H:%M"]" - if {$info(treeopen)} { - puts "open" - } else { - puts "CLOSED" - } - if {[info exists info(notes)]} { - if {![cequal $info(notes) ""]} { - puts "
    $info(notes)" - } - } - puts "
    $info(person)[BreakBig $info(dir)]" - foreach f $info(files) { - puts "$f" - } - - puts "" - if {$info(removed) < 0} { - set str_removed $info(removed) - } else { - set str_removed "-0" - } - puts "+$info(added)
    $str_removed" - puts "
    $info(log)
    " - - -if {$delta_size} { - set deltastr "     Lines changed ($total_added/$total_removed)." -} else { - set deltastr "" -} - - -puts "[llength $list] checkins listed. $deltastr" - - -if {$tweak} { - puts " -
    -Check the checkins you wish to affect. Then select one of the below options. -And type the magic word. Then click on submit. -

    - -Delete these checkins.
    -Set the tree state on these checkins to be Open.
    -Set the tree state on these checkins to be Closed.
    -Move these checkins over to this tree: -

    -Password: -
    - -

    " -} else { - puts "          " - puts "Tweak some of these checkins." - puts "

    " - puts "
    " - puts "" - puts "" - puts "
    " -} - -if {[info exists FORM(ltabbhack)]} { - puts "" - puts "" -} - - -PutsTrailer diff --git a/mozilla/webtools/bonsai/switchtree.cgi b/mozilla/webtools/bonsai/switchtree.cgi deleted file mode 100755 index d9249d6a926..00000000000 --- a/mozilla/webtools/bonsai/switchtree.cgi +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -LoadTreeConfig - -proc IsChecked {value} { - global treeid - if {[cequal $value $treeid]} { - return "CHECKED" - } else { - return "" - } -} - -puts "Content-type: text/html - - -George, George, George of the jungle... - -Which tree would you like to see? -" - -puts "
    " - -foreach i $treelist { - if {![info exists treeinfo($i,nobonsai)]} { - puts "" - puts "$treeinfo($i,description)
    " - } -} - -puts "
    " - -PutsTrailer - -exit diff --git a/mozilla/webtools/bonsai/testlock.pl b/mozilla/webtools/bonsai/testlock.pl deleted file mode 100755 index 2ebf0b05fa1..00000000000 --- a/mozilla/webtools/bonsai/testlock.pl +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- - -require 'utils.pl'; - -Lock(); - -print "Got lock.\n"; - -sleep 10; - -Unlock(); diff --git a/mozilla/webtools/bonsai/toplevel.cgi b/mozilla/webtools/bonsai/toplevel.cgi deleted file mode 100755 index 2dcb7ed667e..00000000000 --- a/mozilla/webtools/bonsai/toplevel.cgi +++ /dev/null @@ -1,261 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -Lock -LoadCheckins -LoadMOTD -LoadWhiteboard -LoadTreeConfig -Unlock - - -if {$treeopen} { - set openword Open -} else { - set openword Closed -} - -puts "Content-type: text/html -Refresh: 300 - - -($openword) Bonsai -- the art of effectively controlling trees - - -

    Bonsai -- Tree Control

    - -
    -

    - - -foreach t $treelist { - if {![info exists treeinfo($t,nobonsai)]} { - if {[cequal $t $treeid]} { - set c "SELECTED" - } else { - set c "" - } - puts "

    " - - - -if {$readonly} { - puts "

    Be aware that you are looking at an old hook!

    " -} - -puts "[fmtclock [getclock] "%R"]: The tree is currently " - -if {$treeopen} { - puts "OPEN
    " -} else { - puts "CLOSED

    " -} - -if {!$treeopen} { - puts "The tree has been closed since [MyFmtClock $closetimestamp]." -} -puts "
    " -puts "The last known good tree had a timestamp " -puts "of [fmtclock $lastgoodtimestamp "%D %T %Z"].
    " - -puts "
    $motd

    " - - -puts "
    " - -# if {[info exists FORM(whitedelta)]} { -# set delta $FORM(whitedelta) -# } else { -# set delta [expr 24 * 60 * 60] -# } -# -# set fileok 0 -# set filename [DataDir]/whitedelta-$delta -# if {[file exists $filename]} { -# if {[file mtime $filename] > [file mtime [DataDir]/whiteboard]} { -# set fileok 1 -# } -# } -# -# if {!$fileok} { -# set tmp [DataDir]/tmpwhite.[id process] -# Lock -# set date [fmtclock [expr [getclock] - $delta] "%a %b %d %H:%M:%S LT %Y"] -# catch {exec co -q -d$date -p [DataDir]/whiteboard > $tmp 2> /dev/null} -# catch {chmod 0666 $tmp} -# exec ./changebar.tcl $tmp [DataDir]/whiteboard > $filename -# unlink $tmp -# catch {chmod 0666 $filename} -# Unlock -# } - - -#puts "Free-for-all whiteboard: (Changebars indicate changes within last [PrettyDelta $delta])
    [html_quote [read_file $filename]]

    " - -puts "Free-for-all whiteboard:
    [html_quote $whiteboard]

    " - - -foreach c $checkinlist { - upvar #0 $c info - lappend people($info(person)) $c - if {!$info(treeopen)} { - lappend closedcheckin($info(person)) $c - } -} - -if {[info exists people]} { - - puts "The following people are on \"the hook\", since they have made" - puts "checkins to the tree since it last opened: " - puts "

    " - - set peoplelist [lsort [array names people]] - - set query "(| " - foreach p $peoplelist { - append query "(mail=$p@netscape.com) " - set fullname($p) "" - set curcontact($p) "" - } - append query ")" - - set ldaperror 0 - - if {[catch {set fid [open "|./data/ldapsearch -b \"o=Netscape Communications Corp.,c=US\" -h $ldapserver -p $ldapport -s sub -S mail \"$query\" mail cn nscpcurcontactinfo" r]} errvar]} { - set ldaperror 1 - } else { - set doingcontactinfo 0 - while {[gets $fid line] >= 0} { - if {$doingcontactinfo} { - if {[regexp -- {^ (.*)$} $line foo n]} { - append curcontact($curperson) $n - continue - } - set doingcontactinfo 0 - } - if {[regexp -- {^mail: (.*)@} $line foo n]} { - set curperson $n - } elseif {[regexp -- {^cn: (.*)$} $line foo n]} { - set fullname($curperson) $n - } elseif {[regexp -- {^nscpcurcontactinfo: (.*)$} $line foo n]} { - set curcontact($curperson) $n - set doingcontactinfo 1 - } - } - if {[catch {close $fid} errvar]} { - set ldaperror 1 - } - } - - if {$ldaperror} { - puts "Can't contact the directory server at $ldapserver:$ldapport -- $errvar" - } - - puts "" - puts "" - - foreach p $peoplelist { - if {[info exists closedcheckin($p)]} { - set extra " ([llength $closedcheckin($p)] while tree closed!)" - } else { - set extra "" - } - - puts " - - - -" - puts " -" - } - - puts "
    WhoWhatHow to contact
    $fullname($p) -$p[llength $people($p)] -[Pluralize change [llength $people($p)]]$extra$curcontact($p) -
    " - puts "[llength $checkinlist] checkins." - - if {[cequal $treeid default]} { - set mailaddr "bonsai-hook" - } else { - set f [open data/$treeid/hooklist r] - set fileEOF [gets $f hookentry] - set theHookList {} - while { $fileEOF != -1 } { - set theHookList [concat $theHookList $hookentry] - set fileEOF [gets $f hookentry] - } - set mailaddr "$theHookList" - } - puts "

    " - puts "Show all checkins.
    " - if {[cequal $treeid default]} { - puts "" - } else { - puts "" - } - puts "Send mail to \"the hook\".
    " -} else { - puts "Nobody seems to have made any changes since the tree opened." -} - - -set cvsqueryurl "cvsqueryform.cgi?cvsroot=$treeinfo($treeid,repository)&module=$treeinfo($treeid,module)" -if {[clength $treeinfo($treeid,branch)] > 0} { - append cvsqueryurl "&branch=$treeinfo($treeid,branch)" -} - -puts " -


    - - - - - - -
    Useful links Help corner
    -CVS Query Tool
    -Tinderbox continuous builds
    -Switch to look at a different tree or branch
    -Look at the Busted Tree Newsgroup
    -Look up someone in the phonebook.
    -Time warp -- view a different day's hook.
    -See some stupid statistics about recent checkins.
    -Administration menu.
    -
    - -Introduction to Bonsai.
    -Overview of our source tree strategy.
    -Changing someone else's contact info (yes you can!)
    -Dogbert build lore -
    -" - - -exit diff --git a/mozilla/webtools/bonsai/trapdoor.c b/mozilla/webtools/bonsai/trapdoor.c deleted file mode 100644 index c3f70ad8da9..00000000000 --- a/mozilla/webtools/bonsai/trapdoor.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -main(int argc, char** argv) { - printf("%s\n", crypt(argv[1], "aa")); - return 0; -} diff --git a/mozilla/webtools/bonsai/utils.pl b/mozilla/webtools/bonsai/utils.pl deleted file mode 100644 index 8a6f06de7f0..00000000000 --- a/mozilla/webtools/bonsai/utils.pl +++ /dev/null @@ -1,174 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -use Mysql; - -require 'header.pl'; - -$lockcount = 0; - -1; - - -sub Lock { - if ($lockcount <= 0) { - $lockcount = 0; - if (!open(LOCKFID, ">>data/lockfile")) { - mkdir "data", 0777; - chmod 0777, "data"; - open(LOCKFID, ">>data/lockfile") || die "Can't open lockfile."; - } - my $val = flock(LOCKFID,2); - if (!$val) { # '2' is magic 'exclusive lock' const. - print "Lock failed: $val\n"; - } - chmod 0666, "data/lockfile"; - } - $lockcount++; -} - -sub Unlock { - $lockcount--; - if ($lockcount <= 0) { - flock(LOCKFID,8); # '8' is magic 'unlock' const. - close LOCKFID; - } -} - - -sub loadConfigData { - if (@treelist > 0) {return;} - local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$pmtime,$ctime,$blksize,$blocks) = stat("data/configdata.pl"); - local $tmtime; - ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$tmtime,$ctime,$blksize,$blocks) = stat("data/configdata"); - - if ($pmtime eq "" || $pmtime < $tmtime) { - system "./perlifyconfig.tcl"; - } - - open(CONFIGDATA, ") { - eval; - } - close CONFIGDATA; -} - - -sub pickDefaultRepository { - loadConfigData(); - return $treeinfo{$treelist[0]}->{'repository'}; -} - - -sub getRepositoryList { - loadConfigData(); - my @result = (); - TREELOOP: foreach my $i (@treelist) { - my $r = $treeinfo{$i}->{'repository'}; - foreach my $j (@result) { - if ($j eq $r) { - next TREELOOP; - } - } - push @result, $r; - } - return @result; -} - - -sub validateRepository { - my ($root) = @_; - my @list = getRepositoryList(); - foreach my $r (@list) { - if ($r eq $root) { - return; - } - } - print "Invalid repository $root selected. Send mail to terry\@netscape.com if you think this should have worked.\n"; - exit; -} - -sub ConnectToDatabase { - if ($dbh == "") { - $dbh = Mysql->Connect("localhost") || die "Can't connect to database server -- $Mysql::db_errstr"; - $dbh->SelectDB("bonsai") || die "Can't select bonsai database"; - } - return $dbh; -} - - -sub formatSqlTime { - my $when = @_[0]; - my($sec,$minute,$hour,$mday,$mon,$year) = localtime( $when ); - return sprintf("%04d-%02d-%02d %02d:%02d:%02d", - $year + 1900, $mon + 1, $mday, - $hour, $minute, $sec); -} - - -sub SqlQuote { - $_ = @_[0]; - s/'/''/g; - s/\\/\\\\/g; - return $_; -} - - -# Returns true if the given directory or filename is one of the hidden ones -# that we don't want to show users. - -sub IsHidden { - my ($name) = (@_); - $name =~ s:///*:/:g; # Remove any multiple slashes. - if (!defined @hidelist) { - if (open(HIDE, ") { - chop; - s/^\s*//g; # Strip leading whitespace - s/\s*$//g; # Strip trailing whitespace - if ( /^#/ || /^$/) { - next; - } - - push(@hidelist, $_); - } - close HIDE; - } else { - @hidelist = (); - } - } - foreach my $item (@hidelist) { - if ($name =~ m/$item/) { - return 1; - } - } - return 0; -} - -sub CheckHidden { - my ($name) = (@_); - if (IsHidden($name)) { - $| = 1; - print ""; - die "Security violation; not allowed to access $name."; - } -} - - diff --git a/mozilla/webtools/bonsai/viewold.cgi b/mozilla/webtools/bonsai/viewold.cgi deleted file mode 100755 index f45680ccda0..00000000000 --- a/mozilla/webtools/bonsai/viewold.cgi +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bonsaitools/bin/mysqltcl -# -*- Mode: tcl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Bonsai CVS tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -source CGI.tcl - -LoadCheckins - -proc IsChecked {value} { - global batchid - if {[cequal $value $batchid]} { - return "CHECKED" - } else { - return "" - } -} - -puts "Content-type: text/html - - -Let's do the time warp again... - -Which hook would you like to see? -" - -set list {} - - -foreach i [glob "[DataDir]/batch-*\[0-9\]"] { - regexp -- {[0-9]*$} $i num - lappend list $num -} - -set list [lsort -integer -decreasing $list] - -puts "
    " -puts "" -puts "
    " - -set value [lvarpop list] - -puts "" -puts "The current hook.
    " - -set count 1 -foreach i $list { - set value [lvarpop list] - puts "" - source [DataDir]/batch-$i - puts "Hook for tree that closed on [MyFmtClock $closetimestamp]
    " -} - -puts "" -puts "
    " - -PutsTrailer - -exit diff --git a/mozilla/webtools/lxr/.htaccess b/mozilla/webtools/lxr/.htaccess deleted file mode 100644 index 4e4cdae543b..00000000000 --- a/mozilla/webtools/lxr/.htaccess +++ /dev/null @@ -1,7 +0,0 @@ - -SetHandler cgi-script -order allow,deny -allow from all -deny from agni.nut.roche.com -deny from user198.anilam.com - diff --git a/mozilla/webtools/lxr/INSTALL b/mozilla/webtools/lxr/INSTALL deleted file mode 100644 index 9dd579c5c1c..00000000000 --- a/mozilla/webtools/lxr/INSTALL +++ /dev/null @@ -1,121 +0,0 @@ -In order to install LXR, you will need: - - - Perl version 5 or later. - - A webserver with cgi-script capabilities. - -and optionally, to enable the freetext search queries: - - - Glimpse - - -If you don't have Perl installed, get it from -. - -If you need a webserver, take a look at Apache at - - -If you want Glimpse and the freetext searching facilites, visit -. - - -LXR has so far been tested on the GNU/Linux operating system using the -Apache webserver. Other unix-like operating systems and decently -featured webservers should do as well. - - -To install LXR itself: - - - Set the variables PERLBIN and INSTALLPREFIX in the makefile to - reflect where the Perl 5 binary is located on your system and where - you want the LXR files to be installed. - - - Do "make install". - - - Edit $(INSTALLPREFIX)/http/lxr.conf to fit your source code - installations and needs. - - - Make sure the files in $(INSTALLPREFIX)/http can be reached via - your webserver. Make sure your webserver executes the files - search, source, ident and diff as cgi-scripts. With the Apache - webserver this can be accomplished by making - $(INSTALLPREFIX)/http/.htaccess contain the following lines: - - - SetHandler cgi-script - - - - Generate the identifier database. Go to the directory you - configured as "dbdir" and do "$(INSTALLPREFIX)/bin/genxref foo", - where foo is the subdirectory containing the actual source code. - - - (Optional) Generate the Glimpse database. Go to the directory you - configured as "dbdir" and do "glimpseindex -H . foo", where foo is - the same as above. You might want to add other options to the - commandline (e.g. "-n"), see the Glimpse documentation for details. - - -If it doesn't work: - - - Make sure all the permissions are right. Remember that the - webserver needs to be able to access most of them. - - - Check that all the Perl scripts find their library files, also when - executed by the webserver. - -The lxr.conf file: - - LXR does not care much about your directory structure, all relevant - paths can be configured from the lxr.conf file. This file is located - in the same directory as the perl script files. This makes it - possible to have different source trees in different directories on - the web server. - - LXR recognizes the following options in the configuration file. - - htmlhead - The header of all html files. This is a template that - contains mainly html code but it can also contain some special - directives, these are documented below. - - htmltail - Template for bottom of pages. - - htmldir - Template for the directory listing. - - sourceroot - The root of the source that you want to index. - - sourcerootname - The name of the root (more....) - - incprefix - Where to find source specific include files. - - dbdir - Where to find the database files that lxr needs (fileidx xref and - the glimpse files). - - glimpsebin - Location of the glimpse binary on your system. - - variable - This defines a variable that can be used in templates and - the config file. The syntax is - variable: , , , - is the name of the variable, is a textual description, - are the possible values of the variable. - is the default value of the variable. - - The field can either be a list starting with a "(" and - ending with a ")", with elements separated with ",", or it can be - [ ]. In this case the values are read from a file with - one value on each line. - - map - This makes it possible to rewrite directories using variables. - The linux sourcecode for instance contains several different - architectures, the include files for each of these are found in the - directory /include/asm-/. To remap each of these - according to a variable $a you can specify - map: /include/asm[^\/]*/ /include/asm-$a/ - Find creative uses for this option :-) diff --git a/mozilla/webtools/lxr/diff b/mozilla/webtools/lxr/diff deleted file mode 100755 index 6c02433a090..00000000000 --- a/mozilla/webtools/lxr/diff +++ /dev/null @@ -1,206 +0,0 @@ -#!/usr/bonsaitools/bin/perl -# $Id: diff,v 1.1 1998-06-11 23:56:15 jwz Exp $ - -# diff -- Display diff output with markup. -# -# Arne Georg Gleditsch -# Per Kristian Gjermshus -# -# -# 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. - -###################################################################### - -use lib 'lib/'; -use SimpleParse; -use LXR::Common; -use LXR::Config; -use DB_File; - - -sub htmlsub { - my ($s, $l) = @_; - my @s = split(/(<[^>]*>|&[\#\w\d]+;?)/, $s); - $s = ''; - - while (@s) { - my $f = substr(shift(@s), 0, $l); - $l -= length($f); - $s .= $f; - $f = shift(@s); - if ($f =~ /^&/) { - if ($l > 0) { - $s .= $f; - $l--; - } - } else { - $s .= $f; - } - } - $s .= ' ' x $l; - return $s; -} - - -sub printdiff { - - unless ($diffvar) { - foreach ($Conf->allvariables) { - push(@vars, $Conf->vardescription($_)); - } - - $vars[$#vars-1] .= " or ".pop(@vars) if $#vars > 0; - - print("

    \n", - "Please indicate the version of the file you wish to\n", - "compare to by clicking on the appropriate\n", - join(", ",@vars)," button.\n", - "

    \n"); - return; - } - - unless ($Path->{'file'}) { - print("

    Diff not yet supported for directories.

    \n"); - return; - } - - $origvirt = $Path->{'virt'}.$Path->{'file'}; - $origreal = $Path->{'real'}.$Path->{'file'}; - - $origval = $Conf->variable($diffvar); - $Conf->variable($diffvar,$diffval); - $diffvirt = $Conf->mappath($Path->{'virt'}).$Path->{'file'}; - $diffreal = $Conf->sourceroot.$diffvirt; - $Conf->variable($diffvar,$origval); - -# print("

    Diff of $origvirt -> $diffvirt

    \n"); -# print("

    ($origreal -> $diffreal)

    \n"); - - # FIXME: Check existence of $origreal & $diffreal. - - &fflush; - unless (open(DIFF, "-|")){ - open(STDERR, ">&STDOUT"); - exec('diff', '-U0', $origreal, $diffreal); - print "*** Diff subprocess died unexpextedly: $!\n"; - exit; - } - - - while () { - if (($os, $ol, $ns, $nl) = - /@@ -(\d+)(?:,(\d+)|) \+(\d+)(?:,(\d+)|) @@/) { - $os++ if $ol eq '0'; - $ns++ if $nl eq '0'; - $ol = 1 unless defined($ol); - $nl = 1 unless defined($nl); - - $bo = $os + $ofs; - if ($ol < $nl) { - $ofs += $nl - $ol; - - $dir = '>>'; - $ms = $nl - $ol; - $ml = $ol; - $orig{$os+$ol} = $ms; - } else { - $dir = '<<'; - $ms = $ol - $nl; - $ml = $nl; - $new{$ns+$nl} = $ms; - } - foreach (0..$ml - 1) { - $chg{$bo + $_} = '!!'; - } - foreach (0..$ms - 1) { - $chg{$bo + $ml + $_} = $dir; - } - - } - } - close(); - - - print("

    Diff markup

    \n", - "

    Differences between ", - - &fileref("$origvirt (".$Conf->vardescription($diffvar). - " $origval)", $origvirt, undef, "$diffvar=$origval"), - " and ", - - &fileref("$diffvirt (".$Conf->vardescription($diffvar). - " $diffval)",$diffvirt, undef, "$diffvar=$diffval"), - "


    \n"); - -# "\n\n\n
    ", -# -# &fileref("$origvirt (".$Conf->vardescription($diffvar). -# " $origval)", $origvirt, undef, "$diffvar=$origval"), -# "
    ", -# -# &fileref("$diffvirt (".$Conf->vardescription($diffvar). -# " $diffval)",$diffvirt, undef, "$diffvar=$diffval"), -# "
    \n"); - - - open(FOO, $origreal); - $orig = ''; - &markupfile(\*FOO, $Path->{'virt'}, $Path->{'file'}, - sub { $orig .= shift }); - $len = $.+$ofs; - close(FOO); - - $Conf->variable($diffvar, $diffval); - - open(FOO, $diffreal); - $new = ''; - &markupfile(\*FOO, $Conf->mappath($Path->{'virt'}), $Path->{'file'}, - sub { $new .= shift }); - close(FOO); - - $Conf->variable($diffvar, $origval); - - $i = 1; $orig =~ s/^/"\n" x ($orig{$i++})/mge; - $i = 1; $new =~ s/^/"\n" x ($new{$i++})/mge; - - @orig = split(/\n/, $orig); - @new = split(/\n/, $new); - - print("
    ");
    -    foreach $i (0..$len) {
    -	$o = &htmlsub($orig[$i], 50);
    -#	$n = &htmlsub($new[$i], 999);
    -	$n = $new[$i];
    -
    -#	print("$o".
    -#	      " ", $chg{$i+1}, " ".
    -#	      "$n\n");
    -	print("$o ", ($chg{$i+1} || "  "), " $n\n");
    -    }
    -    print("
    "); - -# print(""); -} - - -($Conf, $HTTP, $Path) = &init; -$diffvar = $HTTP->{'param'}->{'diffvar'}; -$diffval = $HTTP->{'param'}->{'diffval'}; - -&makeheader('diff'); -&printdiff; -&makefooter('diff'); - - diff --git a/mozilla/webtools/lxr/find b/mozilla/webtools/lxr/find deleted file mode 100755 index 90511df962a..00000000000 --- a/mozilla/webtools/lxr/find +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bonsaitools/bin/perl -# $Id: find,v 1.3 1998-06-12 21:58:37 jwz Exp $ - -# find -- Find files -# -# Arne Georg Gleditsch -# Per Kristian Gjermshus -# -# -# 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. - -###################################################################### - -use lib 'lib/'; -use LXR::Common; -use LXR::Config; - -sub find { - print("

    \n", - "Search for files (by name) using regular expressions.\n", - "
    (Need some Hints ", - "on performing searches?)\n"); - - print ("

    \n"); - - foreach ($Conf->allvariables) { - if ($Conf->variable($_) ne $Conf->vardefault($_)) { - print("variable($_), "\">\n"); - } - } - - print("Find file: \n", - "\n", - "
    \n"); - - - if ($searchtext ne "") { - unless (open(FILELLISTING,$Conf->dbdir."/.glimpse_filenames")) { - &warning("Could not open .glimpse_filenames."); - return; - } - print("
    \n"); - $sourceroot = $Conf->sourceroot; - while($file = ) { - $file =~ s/^$sourceroot//; - if($file =~ /$searchtext/) { - print(&fileref("$file", "$file"),"
    \n"); - } - } - } -} - - -($Conf, $HTTP, $Path) = &init; -$searchtext = $HTTP->{'param'}->{'string'}; - -&makeheader('find'); -&find; -&makefooter('find'); - diff --git a/mozilla/webtools/lxr/genxref b/mozilla/webtools/lxr/genxref deleted file mode 100755 index 901ec31bcd8..00000000000 --- a/mozilla/webtools/lxr/genxref +++ /dev/null @@ -1,338 +0,0 @@ -#!/usr/bonsaitools/bin/perl -# $Id: genxref,v 1.2 1998-06-12 18:55:52 jwz Exp $ - -# genxref.pl -- Finds identifiers in a set of C files using an -# extremely fuzzy algorithm. It sort of works. -# -# Arne Georg Gleditsch -# Per Kristian Gjermshus -# -# -# 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. - -# TODO: ns/cmd/xfe/src/MozillaApp.h, XFE_MozillaApp - -###################################################################### - -use lib 'lib/'; -use integer; -use DB_File; - - -%itype = (('macro', 'M'), - ('typedef', 'T'), - ('struct', 'S'), - ('enum', 'E'), - ('union', 'U'), - ('function', 'F'), - ('funcprot', 'f'), - ('class', 'C'), # (C++) - ('classforw', 'c'), # (C++) - ('var', 'V')); -# ('reference', 'R') - -@reserved = ('auto', 'break', 'case', 'char', 'const', 'continue', - 'default', 'do', 'double', 'else', 'enum', 'extern', - 'float', 'for', 'goto', 'if', 'int', 'long', 'register', - 'return', 'short', 'signed', 'sizeof', 'static', - 'struct', 'switch', 'typedef', 'union', 'unsigned', - 'void', 'volatile', 'while', 'fortran', 'asm', - 'inline', 'operator', - 'class', # (C++) -# Her bør vi ha flere av disse: - '__asm__','__inline__'); - - -$ident = '\~?_*[a-zA-Z][a-zA-Z0-9_]*'; - - -$realpath = $ARGV[0]; -$realpath ||= '.'; -$realpath .= '/'; - - -sub wash { - my $towash = $_[0]; - $towash =~ s/[^\n]+//gs; - return($towash); -} - -sub stripodd { - my $tostrip = $_[0]; - while ($tostrip =~ s/\{([^\{\}]*)\}/ - "\05".&wash($1)/ges) {} - $tostrip =~ s/\05/\{\}/gs; - $tostrip =~ s/[\{\}]//gs; - return($tostrip); -} - -sub classes { - my @c = (shift =~ /($ident)\s*(?:$|,)/gm); - if (@c) { - return(join(":", @c)."::"); - } else { - return(''); - } -} - -sub findident { - print(STDERR "Starting pass 1: Collect identifier definitions.\n"); - - $start = time; - $fnum = 0; $defs = 0; - - foreach $f (@f) { - $f =~ s/^$realpath//o; - $fileidx{++$fnum} = $f; - - open(SRCFILE, $realpath.$f); - $_ = $/; undef($/); $contents = ; $/ = $_; - close(SRCFILE); - - print(STDERR - "(Pass 1) $f (",length($contents), - "), file $fnum of ",$#f+1,"...\n"); - - # Remove comments. - $contents =~ s/\/\*(.*?)\*\//&wash($1)/ges; - $contents =~ s/\/\/[^\n]*//g; # C++ - - # Unwrap continunation lines. - $contents =~ s/\\\s*\n/$1\05/gs; - while ($contents =~ s/\05([^\n\05]+)\05/$1\05\05/gs) {} - $contents =~ s/(\05+)([^\n]*)/"$2"."\n" x length($1)/gse; - - # Find macro (un)definitions. - $l = 0; - foreach ($contents =~ /^(.*)/gm) { - $l++; - if (/^[ \t]*\#\s*(define|undef)\s+($ident)/o) { - $xref{$2} .= "$itype{'macro'}$fnum:$l\t"; - $defs++; - } - } - - # We want to do some funky heuristics with preprocessor blocks - # later, so mark them. (FIXME: #elif) - $contents =~ s/^[ \t]*\#\s*if.*/\01/gm; - $contents =~ s/^[ \t]*\#\s*else.*/\02/gm; - $contents =~ s/^[ \t]*\#\s*endif.*/\03/gm; - - # Strip all preprocessor directives. - $contents =~ s/^[ \t]*\#(.*)//gm; - - # Now, remove all odd block markers ({,}) we find inside - # #else..#endif blocks. (And pray they matched one in the - # preceding #if..#else block.) - while ($contents =~ s/\02([^\01\02\03]*\03)/&stripodd($1)/ges || - $contents =~ s/\01([^\01\02\03]*)\03/$1/gs) {} - - while ($contents =~ /([\01\02\03\04\05])/gs) { - print(STDERR "\t ** stray ".($1 eq "\01" - ? "#if" - : ($1 eq "\02" - ? "#else" - : ($1 eq "\03" - ? "#endif" - : "control sequence" - ) - ) - )." found.\n"); - } - $contents =~ s/[\01\02\03\04\05]//gs; - - # Remove all but outermost blocks. (No local variables.) - while ($contents =~ s/\{([^\{\}]*)\}/ - "\05".&wash($1)/ges) {} - $contents =~ s/\05/\{\}/gs; - - # Remove nested parentheses. - while ($contents =~ s/\(([^\)]*)\(/\($1\05/g || - $contents =~ s/\05([^\(\)]*)\)/ $1 /g) {} - - # Some heuristics here: Try to recognize "code" and delete - # everything up to the next block delimiter. - # $contents =~ s/([\;\}\{])(\s*$ident\s*\([^\)]*\)[^\{\}]*)/ - # "$1".&wash($2)/goes; - # $contents =~ s/([\;\{])(\s*\**$ident\s*\=[^\{\}]*)/ - # "$1".&wash($2)/goes; - - # Parentheses containing commas are probably not interesting. - $contents =~ s/\(([^\)]*\,[^\)]*)\)/ - "()".&wash($1)/ges; - - - # This operator-stuff messes things up. (C++) - $contents =~ s/operator[\<\>\=\!\+\-\*\%\/]{1,2}/operator/g; - - # Ranges are uninteresting (and confusing). - $contents =~ s/\[.*?\]//gs; - - # And so are assignments. - $contents =~ s/\=(.*?);/";".&wash($1)/ges; - - # From here on, \01 and \02 are used to encapsulate found - # identifiers, - - # Find struct, enum and union definitions. - $contents =~ s/((struct|enum|union)\s+($ident|)\s*({}|(;)))/ - "$2 ".($3 ? "\01".$itype{$2}.$3."\02 " : "").$5.&wash($1)/goes; - - # Find class definitions. (C++) - $contents =~ s/((class)\s+($ident)\s*(:[^;\{]*|)({}|(;)))/ - "$2 "."\01".$itype{$2.($6 ? 'forw' : '')}. - &classes($4).$3."\02 ".$6.&wash($1)/goes; - - @contents = split(/[;\}]/, $contents); - $contents = ''; - - foreach (@contents) { - s/^(\s*)(struct|enum|union|inline)/$1/; - - if (/$ident[^a-zA-Z0-9_]+$ident/) { # It takes two, baby. - - $t = /^\s*typedef/s; # Is this a type definition? - - s/($ident(?:\s*::\s*$ident|)) # ($1) Match the identifier - ([\s\)]* # ($2) Tokens allowed after identifier - (\([^\)]*\) # ($3) Function parameters? - (?:\s*:[^\{]*|) # inheritage specification (C++) - |) # No function parameters - \s*($|,|\{))/ # ($4) Allowed termination chars. - "\01". # identifier marker - ($t # if type definition... - ? $itype{'typedef'} # ..mark as such - : ($3 # $3 is empty unless function definition. - ? ($4 eq '{' # Terminating token indicates - ? $itype{'function'} # function or - : $itype{'funcprot'}) # function prototype. - : $itype{'var'}) # Variable. - )."$1\02 ".&wash($2)/goesx; - } - - $contents .= $_; - } - - $l = 0; - foreach ($contents =~ /^(.*)/gm) { - $l++; - while (/\01(.)(?:(.+?)\s*::\s*|)($ident)\02/go) { - $xref{$3} .= "$1$fnum:$l".($2 ? ":$2" : "")."\t"; - $defs++; - } - } - } - - # Så juksar me litt. - foreach (@reserved) { - delete($xref{$_}); - } - - print(STDERR - "Completed pass 1 (",(time-$start),"s):", - " $defs definitions found.\n\n"); -} - - -sub findusage { - print(STDERR "Starting pass 2: Generate reference statistics.\n"); - - $start = time; - $fnum = 0; $refs = 0; - - foreach $f (@f) { - $f =~ s/^$realpath//o; - $fnum++; - $lcount = 0; - %tref = (); - - open(SRCFILE, $realpath.$f); - $_ = $/; undef($/); $contents = ; $/ = $_; - close(SRCFILE); - - print(STDERR - "(Pass 2) $f (",length($contents), - "), file $fnum of ",$#f+1,"...\n"); - - # Remove comments - $contents =~ s/\/\*(.*?)\*\//&wash($1)/ges; - $contents =~ s/\/\/[^\n]*//g; - - # Remove include statements - $contents =~ s/^[ \t]*\#include[ \t]+[^\n]*//gm; - - # FIXME: "var" - - @lines = split(/\n/, $contents); - - foreach $line (@lines) { - $lcount++; - foreach ($line =~ /(?:^|[^a-zA-Z_\#])($ident)\b/og) { - $tref{$_} .= "$lcount," if $xref{$_}; - } - } - - while (($a, $b) = each(%tref)) { - chop($b); - $xref{$a} .= "R$fnum:$b\t"; - $refs++; - } - } - print(STDERR - "Completed pass 2 (",(time-$start),"s):", - "$refs references to known identifiers found.\n\n"); -} - - -sub dumpdb { - print(STDERR "Starting pass 3: Dump database to disk.\n"); - - $start = time; - tie (%xrefdb, "DB_File" , "xref", O_RDWR|O_CREAT, 0664, $DB_HASH) - || die("Could not open \"xref\" for writing"); - - $i = 0; - while (($k, $v) = each(%xref)) { - $i++; - delete($xref{$k}); - $xrefdb{$k} = $v; - unless ($i % 100) { - print(STDERR "(Pass 3) identifier $i of maximum $defs...\n"); - } - } - - untie(%xrefdb); - print(STDERR - "Completed pass 3 (",(time-$start),"s):", - "Information on $i identifiers dumped to disk.\n\n"); -} - - -tie (%fileidx, "DB_File", "fileidx", O_RDWR|O_CREAT, 0660, $DB_HASH) - || die("Could not open \"fileidx\" for writing"); - -open(FILES, "find $realpath -print |"); -while () { - chop; - push(@f, $_) if /\.([ch]|cpp?|cc)$/i; # Duplicated in lib/LXR/Common.pm -} -close(FILES); - -&findident; -&findusage; -&dumpdb; - -dbmclose(%fileidx); - diff --git a/mozilla/webtools/lxr/ident b/mozilla/webtools/lxr/ident deleted file mode 100755 index 0d0ba3bd0fe..00000000000 --- a/mozilla/webtools/lxr/ident +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bonsaitools/bin/perl -# $Id: ident,v 1.4 1998-06-13 18:26:54 jwz Exp $ - -# ident -- Look up identifiers -# -# Arne Georg Gleditsch -# Per Kristian Gjermshus -# -# -# 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. - -###################################################################### - -use lib 'lib/'; -use LXR::Common; -use LXR::Config; -use DB_File; - -%ty = (('M', 'preprocessor macro'), - ('V', 'variable'), - ('f', 'function prototype'), - ('F', 'function'), - ('C', 'class'), # C++ - ('c', '(forwarded) class'), # C++ - ('T', 'type'), - ('S', 'struct type'), - ('E', 'enum type'), - ('U', 'union type')); - - -sub ident { - - print("

    \n", - "Type the full name of an identifier to summarize", - "
    (a function name, variable name, typedef, etc.)\n", - "
    Matches are case-sensitive.\n"); - - print("

    \n"); - - foreach ($Conf->allvariables) { - if ($Conf->variable($_) ne $Conf->vardefault($_)) { - print("variable($_), "\">\n"); - } - } - - print("Identifier: \n", - "\n", - "
    \n"); - - - if ($identifier) { - tie(%xref, "DB_File", $Conf->dbdir."/xref", - O_RDONLY, undef, $DB_HASH) || - &fatal("Could not open \"".$Conf->dbdir."/xref\""); - - @refs = split(/\t/,$xref{$identifier}); - - print("

    $identifier

    \n"); - - if (@refs) { - tie(%fileidx, "DB_File", $Conf->dbdir."/fileidx", - O_RDONLY, undef, $DB_HASH) || - &fatal("Could not open \"".$Conf->dbdir."/fileidx\""); - - foreach (@refs) { - $f{$1} .= "$2\t" if /^(.)(.*)/; - } - - foreach $t (keys(%ty)) { - if ($f{$t}) { - print("Defined as a $ty{$t} in:
      \n"); - - @_ = split(/\t/, $f{$t}); - unshift(@_); - foreach (@_) { - ($fnum, $line, @clss) = split(/:/, $_); - - print("
    • ", - &fileref("$fileidx{$fnum}, line $line", - "/$fileidx{$fnum}", $line)); - - if (@clss) { - if ($t eq 'F' || $t eq 'f') { - print(", as member of "); - if ($xref{$clss[0]}) { - print(&idref("class $clss[0]", $clss[0])); - } else { - print("class $clss[0]"); - } - } elsif ($t eq 'C') { - print(", inheriting
        \n"); - foreach (@clss) { - print("
      • "); - if ($xref{$_}) { - print(&idref("class $_", $clss[0])); - } else { - print("class $_"); - } - } - print("
      "); - } - } - print("\n"); - } - print("
    \n"); - } - } - - print("Referenced (in ",int(grep(/^R/, @refs))," files total) in:\n", - "
      \n"); - $concise = 0; - foreach (@refs) { - if (/^R(.+):([\d,]+)/) { - $fnam = $fileidx{$1}; - @fpos = split(/,/, $2); - if ($concise) { - print("
    • ", &fileref("$fnam", "/$fnam"), - ", ",$#fpos+1," times\n"); - } else { - print("
    • $fnam:\n
        \n"); - print( -"View " -."change log or Blame" -."" -." annotations" -."\n" - ); - - foreach (@fpos) { - print("
      • ", &fileref("line $_", - "/$fnam", $_),"\n"); - } - print("
      \n"); - } - } - } - print("
    \n"); - untie(%fileidx); - - } else { - print("
    Not used"); - } - - untie(%xref); - } -} - -($Conf, $HTTP, $Path) = &init; -$identifier = $HTTP->{'param'}->{'i'}; - -&makeheader('ident'); -&ident; -&makefooter('ident'); - diff --git a/mozilla/webtools/lxr/index.html b/mozilla/webtools/lxr/index.html deleted file mode 100644 index bbf5176ece5..00000000000 --- a/mozilla/webtools/lxr/index.html +++ /dev/null @@ -1,170 +0,0 @@ - - Mozilla Cross-Reference - - - - -
    - - - - - - - - - - -
    -
    - Mozilla Cross-Reference -

    -
    - - - - - -
    - -
    -

    Starting Points: -

    - - - - - - -
    - mozilla/ - - - Click here to start
    - browsing at the root
    - of the directory tree. -
    -
    - -

    - - - - - -
    - -
    - - - - - - - - - -
    - Text
    Search:
    -
    - - -
    - Use this field to search
    through all the text.
    -
    -
    - -
    - - - - - - - - - -
    - File Name
    Search:
    -
    - - -
    - Use this field to search
    for files by name.
    -
    -
    - -
    - - - - - - - - - -
    - Identifier
    Search:
    -
    - - -
    - Use this field to find
    a particular function,
    variable, etc.
    -
    -
    - -
    - -

    - -
    - -

    This is a cross referenced display of the -Mozilla source code. -The sources displayed are those that are currently checked -in to the mainline of the mozilla.org -CVS server; -these pages are updated many times a day, so they should -be pretty close to the latest-and-greatest. - -

    It's possible to search through the entire Mozilla source text; -or to search for files whose name matches a pattern; or to search -for the definitions of particular functions, variables, etc. - -

    The individual files of the source code are formatted on the fly -and presented with clickable identifiers. An identifier is a -macro, typedef, struct, enum, union, function, function prototype or -variable. Clicking on them shows you a summary of how and where they -are used. - -

    The free-text search command is implemented -using Glimpse, so all the -capabilities of Glimpse are available. -Regular expression searches are -especially useful. - -

    (Don't use use a web-crawler to try and download all of these pages; -the CGIs will feed you several gigabytes worth of generated HTML!) - -

    The pages here are generated by the -LXR tool, which was originally -written to display the source code of the Linux kernel (LXR stands -for ``Linux Cross Reference.'') Check out the -main LXR site for more information. - -

    Thanks to - Arne Georg Gleditsch and - Per Kristian Gjermshus, the - authors of the LXR tool, for writing it and making it available - to the world; and thanks to - Dawn Endico for - doing almost all of the work to get LXR working with the Mozilla - sources. - -

    - -

    diff --git a/mozilla/webtools/lxr/lib/LXR/Common.pm b/mozilla/webtools/lxr/lib/LXR/Common.pm deleted file mode 100755 index 6d5fd7c62e6..00000000000 --- a/mozilla/webtools/lxr/lib/LXR/Common.pm +++ /dev/null @@ -1,785 +0,0 @@ -# $Id: Common.pm,v 1.10 1998-06-23 01:01:39 jwz Exp $ - -package LXR::Common; - -use DB_File; - -require Exporter; -@ISA = qw(Exporter); -@EXPORT = qw(&warning &fatal &abortall &fflush &urlargs - &fileref &idref &htmlquote &freetextmarkup &markupfile - &markspecials &htmlquote &freetextmarkup &markupstring - &init &makeheader &makefooter &expandtemplate); - - -$wwwdebug = 1; - -$SIG{__WARN__} = 'warning'; -$SIG{__DIE__} = 'fatal'; - - -@cterm = ('atom', '\\\\.', '', - 'comment', '/\*', '\*/', - 'comment', '//', "\n", - 'string', '"', '"', - 'string', "'", "'", - 'include', '#include', "\n"); - - -sub warning { - print(STDERR "[",scalar(localtime),"] warning: $_[0]\n"); - print("

    ** Warning: $_[0]

    \n") if $wwwdebug; -} - - -sub fatal { - print(STDERR "[",scalar(localtime),"] fatal: $_[0]\n"); - print("

    ** Fatal: $_[0]

    \n") if $wwwdebug; - exit(1); -} - - -sub abortall { - print(STDERR "[",scalar(localtime),"] abortall: $_[0]\n"); - print("Content-Type: text/html; charset=iso-8859-1\n\n", - "\n\nAbort\n\n", - "

    Abort!

    \n", - "** Aborting: $_[0]\n", - "\n\n") if $wwwdebug; - exit(1); -} - - -sub fflush { - $| = 1; print(''); -} - - -sub urlargs { - my @args = @_; - my %args = (); - my $val; - - foreach (@args) { - $args{$1} = $2 if /(\S+)=(\S*)/; - } - @args = (); - - foreach ($Conf->allvariables) { - $val = $args{$_} || $Conf->variable($_); - push(@args, "$_=$val") unless ($val eq $Conf->vardefault($_)); - delete($args{$_}); - } - - foreach (keys(%args)) { - push(@args, "$_=$args{$_}"); - } - - return($#args < 0 ? '' : '?'.join(';',@args)); -} - - -sub fileref { - my ($desc, $path, $line, @args) = @_; - return("{virtroot}/source$path". - &urlargs(@args). - ($line > 0 ? "#$line" : ""). - "\"\>$desc"); -} - - -sub diffref { - my ($desc, $path, $darg) = @_; - - ($darg,$dval) = $darg =~ /(.*?)=(.*)/; - return("{virtroot}/diff$path". - &urlargs(($darg ? "diffvar=$darg" : ""), - ($dval ? "diffval=$dval" : ""), - @args). - "\"\>$desc"); -} - - -sub idref { - my ($desc, $id, @args) = @_; - return("{virtroot}/ident". - &urlargs(($id ? "i=$id" : ""), - @args). - "\"\>$desc"); -} - - -sub http_wash { - my $t = shift; - $t =~ s/\+/ /g; - $t =~ s/\%([\da-f][\da-f])/pack("C", hex($1))/gie; - - # Paranoia check. Regexp-searches in Glimpse won't work. - # if ($t =~ tr/;<>*|\`&$!#()[]{}:\'\"//) { - - # Should be sufficient to keep "open" from doing unexpected stuff. - if ($t =~ tr/<>|\"\'\`//) { - &abortall("Illegal characters in HTTP-parameters."); - } - - return($t); -} - - -sub markspecials { - $_[0] =~ s/([\&\<\>])/\0$1/g; -} - - -sub htmlquote { - $_[0] =~ s/\0&/&/g; - $_[0] =~ s/\0/>/g; -} - - -sub freetextmarkup { - $_[0] =~ s#((ftp|http)://\S*[^\s.])#$1#g; - $_[0] =~ s/(<(.*@.*)>)/$1<\/a>/g; -} - - -sub linetag { -#$frag =~ s/\n/"\n".&linetag($virtp.$fname, $line)/ge; -# my $tag = ''.$_[1].' '; - my $tag; - $tag .= ' ' if $_[1] < 10; - $tag .= ' ' if $_[1] < 100; - $tag .= &fileref($_[1], $_[0], $_[1]).' '; - $tag =~ s/])/\0$1/g; - - # Look for identifiers and create links with identifier search query. - tie (%xref, "DB_File", $Conf->dbdir."/xref", O_RDONLY, 0664, $DB_HASH) - || &warning("Cannot open xref database."); - $string =~ s#(^|[^a-zA-Z_\#0-9\.])([a-zA-Z_~][a-zA-Z0-9_]*)\b# - $1.(is_linkworthy($2) ? &idref($2,$2) : $2)#ge; - untie(%xref); - - # HTMLify the special characters we marked earlier, - # but not the ones in the recently added xref html links. - $string=~ s/\0&/&/g; - $string=~ s/\0/>/g; - - # HTMLify email addresses and urls. - $string=~ s#((ftp|http)://\S*[^\s.])#$1#g; - $string=~ s/(<(.*@.*)>)/$1<\/a>/g; - - # HTMLify file names (assume file is in the current directory). - $string =~ s#([\w-_\/]+\.(c|h|cc|cp|cpp))# - {virtroot}/source$virtp$1\">$1#g; - - return($string); -} - -# dme: Return true if string is in the identifier db and it seems like its -# use in the sentence is as an identifier and its not just some word that -# happens to have been used as a variable name somewhere. We don't want -# words like "of", "to" and "a" to get links. The string must be long -# enough, and either contain "_" or if some letter besides the first -# is capitalized -sub is_linkworthy{ - my ($string) = @_; - - if ( ($string =~ /....../) && - ( ($string =~ /_/) || - ($string =~ /.[A-Z]/) - ) && - (defined($xref{$string})) - ){ - return (1); - }else{ - return (0); - } -} - -sub markupfile { - my ($INFILE, $virtp, $fname, $outfun) = @_; - - $line = 1; - - # A C/C++ file - if ($fname =~ /\.([ch]|cpp?|cc)$/i) { # Duplicated in genxref. - - &SimpleParse::init($INFILE, @cterm); - - tie (%xref, "DB_File", $Conf->dbdir."/xref", O_RDONLY, 0664, $DB_HASH) - || &warning("Cannot open xref database."); - - &$outfun(# "
    \n".
    -		 #"');
    -		 &linetag($virtp.$fname, $line++));
    -
    -	($btype, $frag) = &SimpleParse::nextfrag;
    -	
    -	while (defined($frag)) {
    -	    &markspecials($frag);
    -
    -	    if ($btype eq 'comment') {
    -		# Comment
    -		# Convert mail adresses to mailto:
    -		&freetextmarkup($frag);
    -		$frag = "$frag";
    -		$frag =~ s#\n#\n#g;
    -	    } elsif ($btype eq 'string') {
    -		# String
    -		$frag = "$frag";
    -		
    -	    } elsif ($btype eq 'include') { 
    -		# Include directive
    -                $frag =~ s#(\")(.*)(\")#
    -                    $1.&fileref($2, $virtp.$2).$3#e;
    -                $frag =~ s#(\0<)(.*)(\0>)#
    -                    $1.
    -                    &fileref($2, $Conf->mappath($Conf->incprefix."/$2")).
    -                    $3#e;
    -	    } else {
    -		# Code
    -		$frag =~ s#(^|[^a-zA-Z_\#0-9])([a-zA-Z_~][a-zA-Z0-9_]*)\b#
    -                    $1.(defined($xref{$2}) ? &idref($2,$2) : $2)#ge;
    -	    }
    -
    -	    &htmlquote($frag);
    -	    $frag =~ s/\n/"\n".&linetag($virtp.$fname, $line++)/ge;
    -	    &$outfun($frag);
    -	    
    -	    ($btype, $frag) = &SimpleParse::nextfrag;
    -	}
    -	    
    -#	&$outfun("
    \n"); - untie(%xref); - - } elsif ($fname =~ /\.(gif|jpg|jpeg|pjpg|pjpeg|xbm)$/i) { - - &$outfun("
    "); - &$outfun("
      "); - &$outfun("
      Image: "); - - &$outfun("{virtroot}/source".$virtp.$fname. - &urlargs("raw=1")."\" border=\"0\" alt=\"$fname\">"); - - &$outfun("
    ");
    -
    -    } elsif ($fname eq 'CREDITS') {
    -	while (<$INFILE>) {
    -	    &SimpleParse::untabify($_);
    -	    &markspecials($_);
    -	    &htmlquote($_);
    -            s/^N:\s+(.*)/$1<\/strong>/gm;
    -	    s/^(E:\s+)(\S+@\S+)/$1$2<\/a>/gm;
    -	    s/^(W:\s+)(.*)/$1$2<\/a>/gm;
    -#	    &$outfun("<\/a>".$_);
    -	    &$outfun(&linetag($virtp.$fname, $.).$_);
    -	}
    -    } else {
    -
    -	my $first_line = <$INFILE>;
    -	my $is_binary = -1;
    -
    -	$_ = $first_line;
    -	if ( m/^\#!/ ) {			# it's a script
    -	    $is_binary = 0;
    -	} elsif ( m/-\*-.*mode:/i ) {		# has an emacs mode spec
    -	    $is_binary = 0;
    -	} elsif (length($_) > 132) {		# no linebreaks
    -	    $is_binary = 1;
    -	} elsif ( m/[\000-\010\013\014\016-\037\200-Ÿ]/ ) {	# ctrl or ctrl+
    -	    $is_binary = 1;
    -	} else {				# no idea, but assume text.
    -	    $is_binary = 0;
    -	}
    -
    -	if ( $is_binary ) {
    -
    -	    &$outfun("
    "); - &$outfun("
    ");
    -
    -	} else {
    -	    $_ = $first_line;
    -	    do {
    -		&SimpleParse::untabify($_);
    -		&markspecials($_);
    -		&htmlquote($_);
    -		&freetextmarkup($_);
    -#	    &$outfun("<\/a>".$_);
    -		&$outfun(&linetag($virtp.$fname, $.).$_);
    -	    } while (<$INFILE>);
    -	}
    -    }
    -}
    -
    -
    -sub fixpaths {
    -    $Path->{'virtf'} = '/'.shift;
    -    $Path->{'root'} = $Conf->sourceroot;
    -    
    -    while ($Path->{'virtf'} =~ s#/[^/]+/\.\./#/#g) {
    -       }
    -    $Path->{'virtf'} =~ s#/\.\./#/#g;
    -	   
    -    $Path->{'virtf'} .= '/' if (-d $Path->{'root'}.$Path->{'virtf'});
    -    $Path->{'virtf'} =~ s#//+#/#g;
    -    
    -    ($Path->{'virt'}, $Path->{'file'}) = $Path->{'virtf'} =~ m#^(.*/)([^/]*)$#;
    -
    -    $Path->{'real'} = $Path->{'root'}.$Path->{'virt'};
    -    $Path->{'realf'} = $Path->{'root'}.$Path->{'virtf'};
    -
    -    @pathelem = $Path->{'virtf'} =~ /([^\/]+$|[^\/]+\/)/g;
    -    
    -    $fpath = '';
    -    foreach (@pathelem) {
    -	$fpath .= $_;
    -	push(@addrelem, $fpath);
    -    }
    -
    -    unshift(@pathelem, $Conf->sourcerootname.'/');
    -    unshift(@addrelem, "");
    -    
    -    foreach (0..$#pathelem) {
    -	if (defined($addrelem[$_])) {
    -
    -	    # jwz: put a space after each / in the banner so that it's possible
    -	    # for the pathnames to wrap.  The  tag ought to do this, but
    -	    # it is ignored when sizing table cells, so we have to use a real
    -	    # space.  It's somewhat ugly to have these spaces be visible, but
    -	    # not as ugly as getting a horizontal scrollbar...
    -	    #
    -	    $Path->{'xref'} .= &fileref($pathelem[$_], "/$addrelem[$_]") . " ";
    -	} else {
    -	    $Path->{'xref'} .= $pathelem[$_];
    -	}
    -    }
    -    $Path->{'xref'} =~ s#/#/#gi;
    -}
    -
    -
    -sub init {
    -    my ($argv_0) = @_;
    -
    -    my @a;
    -
    -    $HTTP->{'path_info'} = &http_wash($ENV{'PATH_INFO'});
    -    $HTTP->{'this_url'} = &http_wash(join('', 'http://',
    -					  $ENV{'SERVER_NAME'},
    -					  ':', $ENV{'SERVER_PORT'},
    -					  $ENV{'SCRIPT_NAME'},
    -					  $ENV{'PATH_INFO'},
    -					  '?', $ENV{'QUERY_STRING'}));
    -
    -    foreach ($ENV{'QUERY_STRING'} =~ /([^;&=]+)(?:=([^;&]+)|)/g) {
    -	push(@a, &http_wash($_));
    -    }
    -    $HTTP->{'param'} = {@a};
    -
    -    $HTTP->{'param'}->{'v'} ||= $HTTP->{'param'}->{'version'};
    -    $HTTP->{'param'}->{'a'} ||= $HTTP->{'param'}->{'arch'};
    -    $HTTP->{'param'}->{'i'} ||= $HTTP->{'param'}->{'identifier'};
    -
    -
    -    $identifier = $HTTP->{'param'}->{'i'};
    -    $readraw    = $HTTP->{'param'}->{'raw'};
    -    
    -    $Conf = new LXR::Config;
    -
    -    foreach ($Conf->allvariables) {
    -	$Conf->variable($_, $HTTP->{'param'}->{$_}) if $HTTP->{'param'}->{$_};
    -    }
    -    
    -    &fixpaths($HTTP->{'path_info'} || $HTTP->{'param'}->{'file'});
    -
    -    if (defined($readraw)) {
    -	print("\n");
    -    } else {
    -        print("Content-Type: text/html; charset=iso-8859-1\n");
    -
    -	#
    -	# Print out a Last-Modified date that is the larger of: the
    -	# underlying file that we are presenting; and the "source" script
    -	# itself (passed in as an argument to this function.)  If we can't
    -	# stat either of them, don't print out a L-M header.  (Note that this
    -	# stats lxr/source but not lxr/lib/LXR/Common.pm.  Oh well, I can
    -	# live with that I guess...)    -- jwz, 16-Jun-98
    -	#
    -	my $file1 = $Path->{'realf'};
    -	my $file2 = $argv_0;
    -
    -	# make sure the thing we call stat with doesn't end in /.
    -	if ($file1) { $file1 =~ s@/$@@; }
    -	if ($file2) { $file2 =~ s@/$@@; }
    -
    -	my $time1 = 0, $time2 = 0;
    -	if ($file1) { $time1 = (stat($file1))[9]; }
    -	if ($file2) { $time2 = (stat($file2))[9]; }
    -
    -	my $time = ($time1 > $time2 ? $time1 : $time2);
    -	if ($time > 0) {
    -	    my @t = gmtime($time);
    -	    my ($sec, $min, $hour, $mday, $mon, $year,$wday) = @t;
    -	    my @days = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");
    -	    my @months = ("Jan", "Feb", "Mar", "Apr", "May", "Jun",
    -			  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
    -	    $year += 1900;
    -	    $wday = $days[$wday];
    -	    $mon = $months[$mon];
    -	    # Last-Modified: Wed, 10 Dec 1997 00:55:32 GMT
    -	    print sprintf("Last-Modified: %s, %2d %s %d %02d:%02d:%02d GMT\n",
    -			  $wday, $mday, $mon, $year, $hour, $min, $sec);
    -	}
    -
    -	# Close the HTTP header block.
    -        print("\n");
    -    }
    -    
    -    
    -    if (defined($readraw)) {
    -	open(RAW, $Path->{'realf'});
    -	while () {
    -	    print;
    -	}
    -	close(RAW);
    -	exit;
    -    }
    -
    -    return($Conf, $HTTP, $Path);
    -}
    -
    -
    -sub expandtemplate {
    -    my ($templ, %expfunc) = @_;
    -    my ($expfun, $exppar);
    -
    -    while ($templ =~ s/(\{[^\{\}]*)\{([^\{\}]*)\}/$1\01$2\02/s) {}
    -    
    -    $templ =~ s/(\$(\w+)(\{([^\}]*)\}|))/{
    -	if (defined($expfun = $expfunc{$2})) {
    -	    if ($3 eq '') {
    -		&$expfun;
    -	    } else {
    -		$exppar = $4;
    -		$exppar =~ s#\01#\{#gs;
    -		$exppar =~ s#\02#\}#gs;
    -		&$expfun($exppar);
    -	    }
    -	} else {
    -	    $1;
    -	}
    -    }/ges;
    -
    -    $templ =~ s/\01/\{/gs;
    -    $templ =~ s/\02/\}/gs;
    -    return($templ);
    -}
    -
    -
    -# What follows is a pretty hairy way of expanding nested templates.
    -# State information is passed via localized variables.
    -
    -# The first one is simple, the "banner" template is empty, so we
    -# simply return an appropriate value.
    -sub bannerexpand {
    -    if ($who eq 'source' || $who eq 'sourcedir' || $who eq 'diff') {
    -	return($Path->{'xref'});
    -    } else {
    -	return('');
    -    }
    -}
    -
    -sub pathname {
    -    return $Path->{'virtf'};
    -}
    -
    -
    -sub titleexpand {
    -    if ($who eq 'source' || $who eq 'sourcedir' || $who eq 'diff') {
    -	return($Conf->sourcerootname.$Path->{'virtf'});
    -
    -    } elsif ($who eq 'ident') {
    -	my $i = $HTTP->{'param'}->{'i'};
    -	return($Conf->sourcerootname.' identfier search'.
    -	       ($i ? " \"$i\"" : ''));
    -
    -    } elsif ($who eq 'search') {
    -	my $s = $HTTP->{'param'}->{'string'};
    -	return($Conf->sourcerootname.' freetext search'.
    -	       ($s ? " \"$s\"" : ''));
    -
    -    } elsif ($who eq 'find') {
    -	my $s = $HTTP->{'param'}->{'string'};
    -	return($Conf->sourcerootname.' file search'.
    -	       ($s ? " \"$s\"" : ''));
    -    }
    -}
    -
    -
    -sub thisurl {
    -    my $url = $HTTP->{'this_url'};
    -
    -    $url =~ s/([\?\&\;\=])/sprintf('%%%02x',(unpack('c',$1)))/ge;
    -    return($url);
    -}
    -
    -
    -sub baseurl {
    -    return($Conf->baseurl);
    -}
    -
    -sub dotdoturl {
    -    my $url = $Conf->baseurl;
    -    $url =~ s@/$@@;
    -    $url =~ s@/[^/]*$@@;
    -    return($url);
    -}
    -
    -# This one isn't too bad either.  We just expand the "modes" template
    -# by filling in all the relevant values in the nested "modelink"
    -# template.
    -sub modeexpand {
    -    my $templ = shift;
    -    my $modex = '';
    -    my @mlist = ();
    -    local $mode;
    -    
    -    if ($who eq 'source' || $who eq 'sourcedir') {
    -	push(@mlist, "source navigation");
    -    } else {
    -	push(@mlist, &fileref("source navigation", $Path->{'virtf'}));
    -    }
    -    
    -    if ($who eq 'diff') {
    -	push(@mlist, "diff markup");
    -	
    -    } elsif (($who eq 'source' || $who eq 'sourcedir') && $Path->{'file'}) {
    -	push(@mlist, &diffref("diff markup", $Path->{'virtf'}));
    -    }
    -    
    -    if ($who eq 'ident') {
    -	push(@mlist, "identifier search");
    -    } else {
    -	push(@mlist, &idref("identifier search", ""));
    -    }
    -
    -    if ($who eq 'search') {
    -	push(@mlist, "freetext search");
    -    } else {
    -	push(@mlist, "{virtroot}/search".
    -	     &urlargs."\">freetext search");
    -    }
    -    
    -    if ($who eq 'find') {
    -	push(@mlist, "file search");
    -    } else {
    -	push(@mlist, "{virtroot}/find".
    -	     &urlargs."\">file search");
    -    }
    -    
    -    foreach $mode (@mlist) {
    -	$modex .= &expandtemplate($templ,
    -				  ('modelink', sub { return($mode) }));
    -    }
    -    
    -    return($modex);
    -}
    -
    -# This is where it gets a bit tricky.  varexpand expands the
    -# "variables" template using varname and varlinks, the latter in turn
    -# expands the nested "varlinks" template using varval.
    -sub varlinks {
    -    my $templ = shift;
    -    my $vlex = '';
    -    my ($val, $oldval);
    -    local $vallink;
    -    
    -    $oldval = $Conf->variable($var);
    -    foreach $val ($Conf->varrange($var)) {
    -	if ($val eq $oldval) {
    -	    $vallink = "$val";
    -	} else {
    -	    if ($who eq 'source' || $who eq 'sourcedir') {
    -		$vallink = &fileref($val, 
    -				    $Conf->mappath($Path->{'virtf'},
    -						   "$var=$val"),
    -				    0,
    -				    "$var=$val");
    -
    -	    } elsif ($who eq 'diff') {
    -		$vallink = &diffref($val, $Path->{'virtf'}, "$var=$val");
    -		
    -	    } elsif ($who eq 'ident') {
    -		$vallink = &idref($val, $identifier, "$var=$val");
    -		
    -	    } elsif ($who eq 'search') {
    -		$vallink = "{virtroot}/search".
    -		    &urlargs("$var=$val",
    -			     "string=".$HTTP->{'param'}->{'string'}).
    -				 "\">$val";
    -		
    -	    } elsif ($who eq 'find') {
    -		$vallink = "{virtroot}/find".
    -		    &urlargs("$var=$val",
    -			     "string=".$HTTP->{'param'}->{'string'}).
    -				 "\">$val";
    -	    }
    -	}
    -	$vlex .= &expandtemplate($templ,
    -				 ('varvalue', sub { return($vallink) }));
    -
    -    }
    -    return($vlex);
    -}
    -
    -
    -sub varexpand {
    -    my $templ = shift;
    -    my $varex = '';
    -    local $var;
    -    
    -    foreach $var ($Conf->allvariables) {
    -	$varex .= &expandtemplate($templ,
    -				  ('varname',  sub { 
    -				      return($Conf->vardescription($var))}),
    -				  ('varlinks', \&varlinks));
    -    }
    -    return($varex);
    -}
    -
    -
    -sub makeheader {
    -    local $who = shift;
    -    $template = undef;
    -    my $def_templ = "\n
    \n"; - - if ($who eq "sourcedir" && $Conf->sourcedirhead) { - if (!open(TEMPL, $Conf->sourcedirhead)) { - &warning("Template ".$Conf->sourcedirhead." does not exist."); - $template = $def_templ; - } - } elsif (($who eq "source" || $who eq 'sourcedir') && $Conf->sourcehead) { - if (!open(TEMPL, $Conf->sourcehead)) { - &warning("Template ".$Conf->sourcehead." does not exist."); - $template = $def_templ; - } - } elsif ($who eq "find" && $Conf->findhead) { - if (!open(TEMPL, $Conf->findhead)) { - &warning("Template ".$Conf->findhead." does not exist."); - $template = $def_templ; - } - } elsif ($who eq "ident" && $Conf->identhead) { - if (!open(TEMPL, $Conf->identhead)) { - &warning("Template ".$Conf->identhead." does not exist."); - $template = $def_templ; - } - } elsif ($who eq "search" && $Conf->searchhead) { - if (!open(TEMPL, $Conf->searchhead)) { - &warning("Template ".$Conf->searchhead." does not exist."); - $template = $def_templ; - } - } elsif ($Conf->htmlhead) { - if (!open(TEMPL, $Conf->htmlhead)) { - &warning("Template ".$Conf->htmlhead." does not exist."); - $template = $def_templ; - } - } - - if (!$template) { - $save = $/; undef($/); - $template = ; - $/ = $save; - close(TEMPL); - } - - print( -#"\n", -# "\n", -# "\n", -# "",$Conf->sourcerootname," Cross Reference\n", -# "baseurl,"\">\n", -# "\n", - - &expandtemplate($template, - ('title', \&titleexpand), - ('banner', \&bannerexpand), - ('baseurl', \&baseurl), - ('dotdoturl', \&dotdoturl), - ('thisurl', \&thisurl), - ('pathname', \&pathname), - ('modes', \&modeexpand), - ('variables', \&varexpand))); -} - - -sub makefooter { - local $who = shift; - $template = undef; - my $def_templ = "
    \n\n"; - - if ($who eq "sourcedir" && $Conf->sourcedirtail) { - if (!open(TEMPL, $Conf->sourcedirtail)) { - &warning("Template ".$Conf->sourcedirtail." does not exist."); - $template = $def_templ; - } - } elsif (($who eq "source" || $who eq 'sourcedir') && $Conf->sourcetail) { - if (!open(TEMPL, $Conf->sourcetail)) { - &warning("Template ".$Conf->sourcetail." does not exist."); - $template = $def_templ; - } - } elsif ($who eq "find" && $Conf->findtail) { - if (!open(TEMPL, $Conf->findtail)) { - &warning("Template ".$Conf->findtail." does not exist."); - $template = $def_templ; - } - } elsif ($who eq "ident" && $Conf->identtail) { - if (!open(TEMPL, $Conf->identtail)) { - &warning("Template ".$Conf->identtail." does not exist."); - $template = $def_templ; - } - } elsif ($who eq "search" && $Conf->searchtail) { - if (!open(TEMPL, $Conf->searchtail)) { - &warning("Template ".$Conf->searchtail." does not exist."); - $template = $def_templ; - } - } elsif ($Conf->htmltail) { - if (!open(TEMPL, $Conf->htmltail)) { - &warning("Template ".$Conf->htmltail." does not exist."); - $template = $def_templ; - } - } - - if (!$template) { - $save = $/; undef($/); - $template = ; - $/ = $save; - close(TEMPL); - } - - print(&expandtemplate($template, - ('banner', \&bannerexpand), - ('thisurl', \&thisurl), - ('modes', \&modeexpand), - ('variables', \&varexpand)), - "\n"); -} - - -1; diff --git a/mozilla/webtools/lxr/lib/LXR/Config.pm b/mozilla/webtools/lxr/lib/LXR/Config.pm deleted file mode 100755 index 4b6dfa9c408..00000000000 --- a/mozilla/webtools/lxr/lib/LXR/Config.pm +++ /dev/null @@ -1,310 +0,0 @@ -# $Id: Config.pm,v 1.2 1998-06-16 00:51:27 jwz Exp $ - -package LXR::Config; - -use LXR::Common; - -require Exporter; -@ISA = qw(Exporter); -# @EXPORT = ''; - -$confname = 'lxr.conf'; - - -sub new { - my ($class, @parms) = @_; - my $self = {}; - bless($self); - $self->_initialize(@parms); - return($self); -} - - -sub makevalueset { - my $val = shift; - my @valset; - - if ($val =~ /^\s*\(([^\)]*)\)/) { - @valset = split(/\s*,\s*/,$1); - } elsif ($val =~ /^\s*\[\s*(\S*)\s*\]/) { - if (open(VALUESET, "$1")) { - $val = join('',); - close(VALUESET); - @valset = split("\n",$val); - } else { - @valset = (); - } - } else { - @valset = (); - } - return(@valset); -} - - -sub parseconf { - my $line = shift; - my @items = (); - my $item; - - foreach $item ($line =~ /\s*(\[.*?\]|\(.*?\)|\".*?\"|\S+)\s*(?:$|,)/g) { - if ($item =~ /^\[\s*(.*?)\s*\]/) { - if (open(LISTF, "$1")) { - $item = '('.join(',',).')'; - close(LISTF); - } else { - $item = ''; - } - } - if ($item =~ s/^\((.*)\)/$1/s) { - $item = join("\0",($item =~ /\s*(\S+)\s*(?:$|,)/gs)); - } - $item =~ s/^\"(.*)\"/$1/; - - push(@items, $item); - } - return(@items); -} - - -sub _initialize { - my ($self, $conf) = @_; - my ($dir, $arg); - - unless ($conf) { - ($conf = $0) =~ s#/[^/]+$#/#; - $conf .= $confname; - } - - unless (open(CONFIG, $conf)) { - &fatal("Couldn't open configuration file \"$conf\"."); - } - while () { - s/\#.*//; - next if /^\s*$/; - - if (($dir, $arg) = /^\s*(\S+):\s*(.*)/) { - if ($dir eq 'variable') { - @args = &parseconf($arg); - if (@args[0]) { - $self->{vardescr}->{$args[0]} = $args[1]; - push(@{$self->{variables}},$args[0]); - $self->{varrange}->{$args[0]} = [split(/\0/,$args[2])]; - $self->{vdefault}->{$args[0]} = $args[3]; - $self->{vdefault}->{$args[0]} ||= - $self->{varrange}->{$args[0]}->[0]; - $self->{variable}->{$args[0]} = - $self->{vdefault}->{$args[0]}; - } - } elsif ($dir eq 'sourceroot' || - $dir eq 'srcrootname' || - $dir eq 'virtroot' || - $dir eq 'baseurl' || - $dir eq 'incprefix' || - $dir eq 'dbdir' || - $dir eq 'glimpsebin' || - $dir eq 'htmlhead' || - $dir eq 'htmltail' || - $dir eq 'sourcehead' || - $dir eq 'sourcetail' || - $dir eq 'sourcedirhead' || - $dir eq 'sourcedirtail' || - $dir eq 'findhead' || - $dir eq 'findtail' || - $dir eq 'identhead' || - $dir eq 'identtail' || - $dir eq 'searchhead' || - $dir eq 'searchtail' || - $dir eq 'htmldir') { - if ($arg =~ /(\S+)/) { - $self->{$dir} = $1; - } - } elsif ($dir eq 'map') { - if ($arg =~ /(\S+)\s+(\S+)/) { - push(@{$self->{maplist}}, [$1,$2]); - } - } else { - &warning("Unknown config directive (\"$dir\")"); - } - next; - } - &warning("Noise in config file (\"$_\")"); - } -} - - -sub allvariables { - my $self = shift; - return(@{$self->{variables}}); -} - - -sub variable { - my ($self, $var, $val) = @_; - $self->{variable}->{$var} = $val if defined($val); - return($self->{variable}->{$var}); -} - - -sub vardefault { - my ($self, $var) = @_; - return($self->{vdefault}->{$var}); -} - - -sub vardescription { - my ($self, $var, $val) = @_; - $self->{vardescr}->{$var} = $val if defined($val); - return($self->{vardescr}->{$var}); -} - - -sub varrange { - my ($self, $var) = @_; - return(@{$self->{varrange}->{$var}}); -} - - -sub varexpand { - my ($self, $exp) = @_; - $exp =~ s/\$\{?(\w+)\}?/$self->{variable}->{$1}/g; - return($exp); -} - - -sub baseurl { - my $self = shift; - return($self->varexpand($self->{'baseurl'})); -} - - -sub sourceroot { - my $self = shift; - return($self->varexpand($self->{'sourceroot'})); -} - - -sub sourcerootname { - my $self = shift; - return($self->varexpand($self->{'srcrootname'})); -} - -sub virtroot{ - my $self = shift; - return($self->varexpand($self->{'virtroot'})); -} - - -sub incprefix { - my $self = shift; - return($self->varexpand($self->{'incprefix'})); -} - - -sub dbdir { - my $self = shift; - return($self->varexpand($self->{'dbdir'})); -} - - -sub glimpsebin { - my $self = shift; - return($self->varexpand($self->{'glimpsebin'})); -} - - -sub htmlhead { - my $self = shift; - return($self->varexpand($self->{'htmlhead'})); -} - - -sub htmltail { - my $self = shift; - return($self->varexpand($self->{'htmltail'})); -} - -sub sourcehead { - my $self = shift; - return($self->varexpand($self->{'sourcehead'})); -} - -sub sourcetail { - my $self = shift; - return($self->varexpand($self->{'sourcetail'})); -} - -sub sourcedirhead { - my $self = shift; - return($self->varexpand($self->{'sourcedirhead'})); -} - -sub sourcedirtail { - my $self = shift; - return($self->varexpand($self->{'sourcedirtail'})); -} - -sub findhead { - my $self = shift; - return($self->varexpand($self->{'findhead'})); -} - -sub findtail { - my $self = shift; - return($self->varexpand($self->{'findtail'})); -} - -sub identhead { - my $self = shift; - return($self->varexpand($self->{'identhead'})); -} - -sub identtail { - my $self = shift; - return($self->varexpand($self->{'identtail'})); -} - -sub searchhead { - my $self = shift; - return($self->varexpand($self->{'searchhead'})); -} - -sub searchtail { - my $self = shift; - return($self->varexpand($self->{'searchtail'})); -} - - -sub htmldir { - my $self = shift; - return($self->varexpand($self->{'htmldir'})); -} - - -sub mappath { - my ($self, $path, @args) = @_; - my (%oldvars) = %{$self->{variable}}; - my ($m); - - foreach $m (@args) { - $self->{variable}->{$1} = $2 if $m =~ /(.*?)=(.*)/; - } - - foreach $m (@{$self->{maplist}}) { - $path =~ s/$m->[0]/$self->varexpand($m->[1])/e; - } - - $self->{variable} = {%oldvars}; - return($path); -} - -#sub mappath { -# my ($self, $path) = @_; -# my ($m); -# -# foreach $m (@{$self->{maplist}}) { -# $path =~ s/$m->[0]/$self->varexpand($m->[1])/e; -# } -# return($path); -#} - -1; diff --git a/mozilla/webtools/lxr/lib/SimpleParse.pm b/mozilla/webtools/lxr/lib/SimpleParse.pm deleted file mode 100755 index c20a3ba4d2e..00000000000 --- a/mozilla/webtools/lxr/lib/SimpleParse.pm +++ /dev/null @@ -1,107 +0,0 @@ -# $Id: SimpleParse.pm,v 1.1 1998-06-11 23:56:20 jwz Exp $ - -use strict; - -package SimpleParse; - -require Exporter; - -use vars qw(@ISA @EXPORT); - -@ISA = qw(Exporter); -@EXPORT = qw(&doparse &untabify &init &nextfrag); - -my $INFILE; # Input file handle -my @frags; # Fragments in queue -my @bodyid; # Array of body type ids -my @open; # Fragment opening delimiters -my @term; # Fragment closing delimiters -my $split; # Fragmentation regexp -my $open; # Fragment opening regexp -my $tabwidth; # Tab width - -sub init { - my @blksep; - - ($INFILE, @blksep) = @_; - - while (@_ = splice(@blksep,0,3)) { - push(@bodyid, $_[0]); - push(@open, $_[1]); - push(@term, $_[2]); - } - - foreach (@open) { - $open .= "($_)|"; - $split .= "$_|"; - } - chop($open); - - foreach (@term) { - next if $_ eq ''; - $split .= "$_|"; - } - chop($split); - - $tabwidth = 8; -} - - -sub untabify { - my $t = $_[1] || 8; - - $_[0] =~ s/([^\t]*)\t/$1.(' ' x ($t - (length($1) % $t)))/ge; - return($_[0]); -} - - -sub nextfrag { - my $btype = undef; - my $frag = undef; - - while (1) { - if ($#frags < 0) { - my $line = <$INFILE>; - - if ($. == 1 && - $line =~ /^.*-[*]-.*?[ \t;]tab-width:[ \t]*([0-9]+).*-[*]-/) { - $tabwidth = $1; - } - - &untabify($line, $tabwidth); -# $line =~ s/([^\t]*)\t/ -# $1.(' ' x ($tabwidth - (length($1) % $tabwidth)))/ge; - - @frags = split(/($split)/o, $line); - } - - last if $#frags < 0; - - unless ($frags[0]) { - shift(@frags); - - } elsif (defined($frag)) { - if (defined($btype)) { - my $next = shift(@frags); - - $frag .= $next; - last if $next =~ /^$term[$btype]$/; - - } else { - last if $frags[0] =~ /^$open$/o; - $frag .= shift(@frags); - } - } else { - $frag = shift(@frags); - if (defined($frag) && (@_ = $frag =~ /^$open$/o)) { - my $i = 1; - $btype = grep { $i = ($i && !defined($_)) } @_; - } - } - } - $btype = $bodyid[$btype] if $btype; - - return($btype, $frag); -} - -1; diff --git a/mozilla/webtools/lxr/lxr.conf b/mozilla/webtools/lxr/lxr.conf deleted file mode 100644 index 5edc8759e9d..00000000000 --- a/mozilla/webtools/lxr/lxr.conf +++ /dev/null @@ -1,44 +0,0 @@ -# Configuration file. - -# Define typed variable "v", read valueset from file. -#variable: v, Version, [/usr/local/lxr/source/versions], [/usr/local/lxr/source/defversion] -#variable: v, Version, [/usr/local/src/dawn/mozilla/versions], [/usr/local/src/dawn/mozilla/defversion] - -# Define typed variable "a". First value is default. -#variable: a, Architecture, (-) - -# Define the base url for the LXR files. -baseurl: http://cvs-mirror.mozilla.org/webtools/lxr/ - -# These are the templates for the HTML heading, directory listing and -# footer, respectively. -htmlhead: template-head -htmltail: template-tail -htmldir: template-dir - -sourcehead: template-source-head -sourcedirhead: template-sourcedir-head - - -# The source is here. -sourceroot: /opt/lxr-data/mozilla/ -srcrootname: mozilla - -# prepend this to url -virtroot: /webtools/lxr - -# "#include " is mapped to this directory (in the LXR source -# tree) -incprefix: /include - -# The database files go here. -dbdir: /opt/lxr-data/db - -# Glimpse can be found here. -glimpsebin: /opt/local/bin/glimpse - -# The power of regexps. This is pretty Linux-specific, but quite -# useful. Tinker with it and see what it does. (How's that for -# documentation?) -#map: /include/asm[^\/]*/ /include/asm-$a/ -#map: /arch/[^\/]+/ /arch/$a/ diff --git a/mozilla/webtools/lxr/search b/mozilla/webtools/lxr/search deleted file mode 100755 index e4761f218e0..00000000000 --- a/mozilla/webtools/lxr/search +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bonsaitools/bin/perl -# $Id: search,v 1.4 1998-06-12 21:58:38 jwz Exp $ - -# search -- Freetext search -# -# Arne Georg Gleditsch -# Per Kristian Gjermshus -# -# -# 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. - -###################################################################### - -use lib 'lib/'; -use LXR::Common; -use LXR::Config; - -$maxhits = 1000; - -sub search { - print("

    \n", - "Free-text search through the source code, including comments.\n", - "
    (Need some Hints ", - "on performing searches?)\n"); - - print("

    \n"); - - foreach ($Conf->allvariables) { - if ($Conf->variable($_) ne $Conf->vardefault($_)) { - print("variable($_), "\">\n"); - } - } - - print("Search for: \n", - "\n", -# $Query->checkbox("case",0,0,"Case sensitive search"), -# $Query->checkbox("regexp",1,0,"Regular expression search"), -# $Query->popup_menu("fuzz",[0,1,2,3,4,5,6,7],0), - "
    \n"); - - $| = 1; print(''); - - if ($searchtext ne "") { - print("
    \n"); - unless (open(GLIMPSE, "-|")) { - open(STDERR, ">&STDOUT"); - $!=''; - exec($Conf->glimpsebin,"-i","-H".$Conf->dbdir,'-y','-n',$searchtext); - print("Glimpse subprocess died unexpextedly: $!\n"); - exit; - } - - $numlines = 0; - while () { - $numlines++; - push(@glimpselines,$_); - if ($numlines > $maxhits) { - last; - } - } - - close(GLIMPSE); - - $retval = $? >> 8; - - # The manpage for glimpse says that it returns 2 on syntax errors or - # inaccessible files. It seems this is not the case. - # We will have to work around it for the time being. - - if ($retval == 0) { - if (@glimpselines == 0) { - print("No matching files
    \n"); - } else { - if ($numlines > $maxhits) { - print(" Too many hits, displaying first $maxhits
    \n"); - } - print("

    $searchtext

    \n"); - $sourceroot = $Conf->sourceroot; - foreach $glimpseline (@glimpselines) { - - $glimpseline =~ s/$sourceroot//; - ($file, $line, $text) = - $glimpseline =~ /(.*?):\s*(\d+)\s*:(.*)/; - $text =~ s/&/&/g; - $text =~ s//>/g; - - print(&fileref("$file, line $line", "$file", $line), - " -- $text
    \n"); - } - } - } elsif ($retval == 1) { - $glimpsebin = $Conf->glimpsebin; - $glimpseresponse = join("
    ",@glimpselines); - $glimpseresponse =~ s/$glimpsebin/Reason/; - $glimpseresponse =~ s/glimpse: error in searching index//; - print("Search failed
    \n$glimpseresponse"); - } else { - print("Unexpected returnvalue $retval from Glimpse\n"); - } - } -} - -($Conf, $HTTP, $Path) = &init; -$searchtext = $HTTP->{'param'}->{'string'}; - -&makeheader('search'); -&search; -&makefooter('search'); - - diff --git a/mozilla/webtools/lxr/search-help.html b/mozilla/webtools/lxr/search-help.html deleted file mode 100644 index a709f1e2737..00000000000 --- a/mozilla/webtools/lxr/search-help.html +++ /dev/null @@ -1,166 +0,0 @@ - - -mozilla cross-reference: search help - - - - -
    - -

    search help
    - -for the
    -mozilla cross-reference -

    - -


    -

    - -This text is copied from the Glimpse manual page. I have tried to remove -things that do not apply to the lxr searcher, but beware, some things might -have slipped through. I'll try to put together something better when I get -the time. For more information on glimpse go to the -Glimpse homepage. - -
    - -

    Patterns

    -
      -glimpse supports a large variety of patterns, including simple -strings, strings with classes of characters, sets of strings, -wild cards, and regular expressions (see Limitations). - -
    -

    Strings

    -
      - -Strings are any sequence of characters, including the special symbols -`^' for beginning of line and `$' for end of line. The following -special characters (`$', `^', `*', `[', `^', `|', `(', `)', `!', and -`\' ) as well as the following meta characters special to glimpse (and -agrep): `;', `,', `#', `>', `<', `-', and `.', should be preceded by -`\\' if they are to be matched as regular characters. For example, -\\^abc\\\\ corresponds to the string ^abc\\, whereas ^abc corresponds -to the string abc at the beginning of a line. - -
    -

    Classes of characters

    -
      - -a list of characters inside [] (in order) corresponds to any character -from the list. For example, [a-ho-z] is any character between a and h -or between o and z. The symbol `^' inside [] complements the list. -For example, [^i-n] denote any character in the character set except -character 'i' to 'n'. -The symbol `^' thus has two meanings, but this is consistent with -egrep. -The symbol `.' (don't care) stands for any symbol (except for the -newline symbol). - -
    -

    Boolean operations

    -
      - -Glimpse -supports an `AND' operation denoted by the symbol `;' -an `OR' operation denoted by the symbol `,', -a limited version of a 'NOT' operation (starting at version 4.0B1) -denoted by the symbol `~', -or any combination. -For example, pizza;cheeseburger' will output all lines containing -both patterns. -'{political,computer};science' will match 'political science' -or 'science of computers'. - -
    -

    Wild cards

    -
      - -The symbol '#' is used to denote a sequence -of any number (including 0) -of arbitrary characters (see Limitations). -The symbol # is equivalent to .* in egrep. -In fact, .* will work too, because it is a valid regular expression -(see below), but unless this is part of an actual regular expression, -# will work faster. -(Currently glimpse is experiencing some problems with #.) - -
    -

    Combination of exact and approximate matching

    -
      - -Any pattern inside angle brackets <> must match the text exactly even -if the match is with errors. For example, <mathemat>ics matches -mathematical with one error (replacing the last s with an a), but -mathe<matics> does not match mathematical no matter how many errors are -allowed. (This option is buggy at the moment.) - -
    -

    Regular expressions

    -
      - -Since the index is word based, a regular expression must match words -that appear in the index for glimpse to find it. Glimpse first strips -the regular expression from all non-alphabetic characters, and -searches the index for all remaining words. It then applies the -regular expression matching algorithm to the files found in the index. -For example, glimpse 'abc.*xyz' will search the index for all files -that contain both 'abc' and 'xyz', and then search directly for -'abc.*xyz' in those files. (If you use glimpse -w 'abc.*xyz', then -'abcxyz' will not be found, because glimpse will think that abc and -xyz need to be matches to whole words.) The syntax of regular -expressions in glimpse is in general the same as that for agrep. The -union operation `|', Kleene closure `*', and parentheses () are all -supported. Currently '+' is not supported. Regular expressions are -currently limited to approximately 30 characters (generally excluding -meta characters). The maximal number of errors -for regular expressions that use '*' or '|' is 4. - -
    -

    Limitations

    -
      - -The index of glimpse is word based. A pattern that contains more than -one word cannot be found in the index. The way glimpse overcomes this -weakness is by splitting any multi-word pattern into its set of words -and looking for all of them in the index. -For example, 'linear programming' will first consult the index -to find all files containing both linear and programming, -and then apply agrep to find the combined pattern. -This is usually an effective solution, but it can be slow for -cases where both words are very common, but their combination is not. - -

      -As was mentioned in the section on Patterns above, some characters -serve as meta characters for glimpse and need to be -preceded by '\\' to search for them. The most common -examples are the characters '.' (which stands for a wild card), -and '*' (the Kleene closure). -So, "glimpse ab.de" will match abcde, but "glimpse ab\\.de" -will not, and "glimpse ab*de" will not match ab*de, but -"glimpse ab\\*de" will. -The meta character - is translated automatically to a hypen -unless it appears between [] (in which case it denotes a range of -characters). - -

      -There is no size limit for simple patterns and simple patterns -within Boolean expressions. -More complicated patterns, such as regular expressions, -are currently limited to approximately 30 characters. -Lines are limited to 1024 characters. - -

    -

    -


    - -
    - - Arne Georg Gleditsch and Per Kristian Gjermshus -
    - - - diff --git a/mozilla/webtools/lxr/source b/mozilla/webtools/lxr/source deleted file mode 100755 index f9ca8ca5508..00000000000 --- a/mozilla/webtools/lxr/source +++ /dev/null @@ -1,367 +0,0 @@ -#!/usr/bonsaitools/bin/perl -# $Id: source,v 1.10 1998-06-23 01:01:11 jwz Exp $ - -# source -- Present sourcecode as html, complete with references -# -# Arne Georg Gleditsch -# Per Kristian Gjermshus -# -# -# 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. - -###################################################################### - -use lib 'lib/'; -use SimpleParse; -use LXR::Common; -use LXR::Config; - - -# dme: Search the beginning of a source file for a short description -# to be displayed in directory listings. Not all files have -# them and the ones that do use different formats so there are -# lots of ways to end up with junk. The basic format is: a file -# name possibly followed by a colon or dash(es) with whitespace -# strewn in followed by the description and maybe some stray comment -# characters. Don't be confused by #includes or rcs comments -# at the beginning of the file. -# -dme -sub fdescexpand { - my $linecount=0; - local $desc= ""; - - #ignore files that aren't source code - if (!( - ($filename =~ /\.c$/) | - ($filename =~ /\.h$/) | - ($filename =~ /\.cc$/) | - ($filename =~ /\.cp$/) | - ($filename =~ /\.cpp$/) | - ($filename =~ /\.java$/) - )){ - return(""); - } - - if (open(FILE, $Path->{'real'}."/".$filename)) { - while(){ - if($linecount++ > 40) { - last; - }elsif (/Id: $filename/){ - #ignore cvs headers - }elsif (/^#/){ - #ignore cpp directives - }elsif (/$filename\s*- ?-*\s*/i){ - $desc = (split(/ $filename\s*- ?-*\s*/i))[1]; - if ($desc) {last}; - }elsif (/$filename\s*:\s*/i){ - $desc = (split(/ $filename\s*:\s*/i))[1]; - if ($desc) {last}; - }elsif (/$filename\s\s*/i){ - $desc = (split(/ $filename\s\s*/i))[1]; - if ($desc) {last}; - } - } - close(FILE); - } - if (!($desc)){ - return(""); - } - - #strip trailing asterisks and "*/" - $desc =~ s#\*/?\s*$##; - - #htmlify the comments making links to symbols and files - $desc = markupstring($desc, $Path->{'virt'}); - - return($desc); -} - -sub descexpand { - - $desc= ""; - if (open(DESC, $Path->{'real'}."/doc/".$filename.".short")) { - $desc=; - close(DESC); - } - return($desc); -} - - -sub diricon { - my $img, $link; - if ($filename eq '..') { - $img = "/icons/back.gif"; - $link = $parentdir; - } else { -# $img = "/icons/folder.gif"; - $img = "internal-gopher-menu"; - $link = $Path->{'virt'}.$filename; - } - return(&fileref("", $link)); -} - -sub dirname { - if ($filename eq '..') { - return(&fileref("Parent directory", $parentdir)); - } else { - return(&fileref($filename, $Path->{'virt'}.$filename)); - } -} - - -sub fileicon { - my $img; - - if ($filename =~ /^.*\.[ch]$/) { -# $img = "/icons/c.gif"; - $img = "internal-gopher-text"; - } elsif ($filename =~ /^.*\.(cpp|cc)$/) { - # TODO: Find a nice icon for c++ files (KDE?) -# $img = "/icons/c.gif"; - $img = "internal-gopher-text"; - } else { -# $img = "/icons/text.gif"; - $img = "internal-gopher-unknown"; - } - - return(&fileref("", - $Path->{'virt'}.$filename)); -} - - -sub filename { - return(&fileref($filename, $Path->{'virt'}.$filename)); -} - - -sub filesize { - my $templ = shift; - my $s = (-s $Path->{'real'}.$filename); - my $str; - if ($s < 1<<10) { - $str = "$s"; - } else { -# if ($s < 1<<20) { - $str = ($s>>10) . "k"; -# } else { -# $str = ($s>>20) . "M"; -# } - } - return(&expandtemplate($templ, - ('bytes', sub {return($str)}), - ('kbytes', sub {return($str)}), - ('mbytes', sub {return($str)}) - )); -} - - -sub modtime { - - my $current_time = time; - my $file_time = (stat($Path->{'real'}.$filename))[9]; - - my @t = gmtime($file_time); - - my @months = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); - my ($sec, $min, $hour, $mday, $mon, $year) = @t; - $year += 1900; - $mon = $months[$mon]; - - my $one_hour = (60 * 60); - my $six_months = $one_hour * 24 * int(365/2); - - if ($file_time <= ($current_time - $six_months) || - $file_time >= ($current_time + $one_hour)) { - return sprintf("%s %2d %04d", $mon, $mday, $year); - } else { - return sprintf("%s %2d %02d:%02d", $mon, $mday, $hour, $min); - } -} - -sub bgcolor { - if (!($line % 3)) { - $color = ($color eq "#EEEEEE")? "#FFFFFF": "#EEEEEE"; - } - return($color); -} - - -sub direxpand { - my $templ = shift; - my $direx = ''; - local $line = 0; - local $filename; - local $filestat; - local $color="#FFFFFF"; - - foreach $filename (@dirs) { - $line++; - $direx .= &expandtemplate($templ, - ('iconlink', \&diricon), - ('namelink', \&dirname), - ('filesize', sub {return('-')}), - ('modtime', \&modtime), - ('bgcolor', \&bgcolor), - ('description', \&descexpand)); - } - - foreach $filename (@files) { - $line++; - next if $filename =~ /^.*\.[oa]$|^core$|^00-INDEX$/; - $direx .= &expandtemplate($templ, - ('iconlink', \&fileicon), - ('namelink', \&filename), - ('filesize', \&filesize), - ('modtime', \&modtime), - ('bgcolor', \&bgcolor), - ('description', \&fdescexpand)); - } - - return($direx); -} - -sub printdir { - my $template; - my $index; - local %index; - local @dirs; - local @files; - local $parentdir; - - - $template = "
      \n\$files{\n
    • \$iconlink \$namelink\n}
    \n"; - if ($Conf->htmldir) { - unless (open(TEMPL, $Conf->htmldir)) { - &warning("Template ".$Conf->htmldir." does not exist."); - } else { - $save = $/; undef($/); - $template = ; - $/ = $save; - close(TEMPL); - } - } - - if (opendir(DIR, $Path->{'real'})) { - foreach $f (sort(grep/^[^\.]/,readdir(DIR))) { - if ($f eq "CVS") { - # skip it - } elsif (-d $Path->{'real'}.$f) { - push(@dirs,"$f/"); - } else { - push(@files,$f); - } - } - closedir(DIR); - } else { - print("

    \nThis directory does not exist.\n"); - if ($Path->{'real'} =~ m#(.+[^/])[/]*$#) { - if (-e $1) { - &warning("Unable to open ".$Path->{'real'}); - } - } - return; - } - - if (-f $Path->{'real'}."00-INDEX") { - open(INDEX,$Path->{'real'}."00-INDEX") || - &warning("Existing \"00-INDEX\" could not be opened."); - $save = $/; undef($/); - $index = ; - $/ = $save; - - %index = $index =~ /\n(\S*)\s*\n\t-\s*([^\n]*)/gs; - } - - if ($Path->{'virt'} =~ m#^(.*/)[^/]*/$#) { - $parentdir = $1; - unshift(@dirs, '..'); - } - - if (open(DESC, $Path->{'real'}."/doc/index.html")) { - print(); - print("\n

    \n"); - close(DESC); - } - - print(&expandtemplate($template, - ('files', \&direxpand))); -} - - -sub printfile { - - unless ($Path->{'file'}) { - &printdir; - - if ( (-f $Path->{'real'}.README) && - (open(SRCFILE, $Path->{'real'}.README)) ) { - print("


    ");
    -	    &markupfile(\*SRCFILE, $Path->{'virt'}, 'README', 
    -			sub { print shift });
    -	    print("
    "); - close(SRCFILE); - } - - } else { - if (open(SRCFILE, $Path->{'realf'})) { - if (($Path->{'file'} =~ /\.(html)$/)) { - print ; - } - else { - if(open(DESC, $Path->{'real'}."doc/".$Path->{'file'}.".long")){ - print(); - close(DESC); - } - print("
    ");
    -		&markupfile(\*SRCFILE, $Path->{'virt'}, $Path->{'file'},
    -                            sub { print shift });
    -		print("
    "); - } - close(SRCFILE); - } else { - print("

    \nThis file does not exist.\n"); - - if (-f $Path->{'real'}.$Path->{'file'}) { - &warning("Unable to open ".$Path->{'realf'}); - } - } - } -} - -($Conf, $HTTP, $Path) = &init($0); - -#if the file is html then don't print a header because the file -#has its own -dme -if (!($Path->{'file'} =~ /\.(html)$/)) { - if ($Path->{'file'}) { - &makeheader('source'); - } else { - &makeheader('sourcedir'); - } -} - -&printfile; - -if (!($Path->{'file'} =~ /\.(html)$/)) { - if ($Path->{'file'}) { - &makefooter('source'); - } else { - &makefooter('sourcedir'); - } -} - -#$len = length($file); -#print ("length is: ", $len) ; diff --git a/mozilla/webtools/lxr/template-dir b/mozilla/webtools/lxr/template-dir deleted file mode 100644 index 4d3ab502d03..00000000000 --- a/mozilla/webtools/lxr/template-dir +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - $files{ - - - - - - - - } -
     NameSizeDate (GMT)Description
    $iconlink$namelink $filesize{$kbytes} $modtime  $description{$desctext} -
    diff --git a/mozilla/webtools/lxr/template-head b/mozilla/webtools/lxr/template-head deleted file mode 100644 index 8ca9c35020b..00000000000 --- a/mozilla/webtools/lxr/template-head +++ /dev/null @@ -1,17 +0,0 @@ - - - - -$title - - - - - -
    - -

    Mozilla Cross Reference

    -

    diff --git a/mozilla/webtools/lxr/template-source-head b/mozilla/webtools/lxr/template-source-head deleted file mode 100644 index d120000e8fa..00000000000 --- a/mozilla/webtools/lxr/template-source-head +++ /dev/null @@ -1,59 +0,0 @@ - - - - -$title - - - - - -
    - - - - - - - - - - -
    - - Mozilla Cross Reference: - -
    $banner -
    - - - - -
    -
    - Full Change Log -

    -
    -
    - - - - -
    - - - - - -
    - changes to
    this file in
    the last: -
    - day
    - week
    - month
    -
    -
    -
    diff --git a/mozilla/webtools/lxr/template-sourcedir-head b/mozilla/webtools/lxr/template-sourcedir-head deleted file mode 100644 index 171bfd5db8f..00000000000 --- a/mozilla/webtools/lxr/template-sourcedir-head +++ /dev/null @@ -1,47 +0,0 @@ - - - - -$title - - - - - -
    - - - - - - - - -
    - - Mozilla Cross Reference: - -
    $banner -
    - - - - -
    - - - - - -
    - changes to
    this directory
    in the last: -
    - day
    - week
    - month
    -
    -
    -
    diff --git a/mozilla/webtools/lxr/template-tail b/mozilla/webtools/lxr/template-tail deleted file mode 100644 index 67324fc3690..00000000000 --- a/mozilla/webtools/lxr/template-tail +++ /dev/null @@ -1,19 +0,0 @@ -

    -
    - - - - - -
    - This page was automatically generated by the - LXR engine - written by - Arne Georg Gleditsch and - Per Kristian Gjermshus. - - Contact - Dawn Endico and - Jamie Zawinski - with any comments or questions about this site. -
    diff --git a/mozilla/webtools/lxr/update-search.sh b/mozilla/webtools/lxr/update-search.sh deleted file mode 100755 index 5a3a374e74e..00000000000 --- a/mozilla/webtools/lxr/update-search.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -# Run this from cron to update the glimpse database that lxr uses -# to do full-text searches. -# Created 12-Jun-98 by jwz. - -PATH=/opt/local/bin:/opt/cvs-tools/bin:/usr/ucb:$PATH -export PATH - -lxr_dir=. -db_dir=`sed -n 's@^dbdir:[ ]*\(.*\)@\1@p' < $lxr_dir/lxr.conf` -src_dir=`sed -n 's@^sourceroot:[ ]*\(.*\)@\1@p' < $lxr_dir/lxr.conf` -log=$db_dir/glimpseindex.log - -exec > $log 2>&1 -set -x - -date - -cd $db_dir/tmp - -set -e -time glimpseindex -H . $src_dir -chmod -R a+r . -mv .glimpse* ../ - -date - -exit 0 diff --git a/mozilla/webtools/lxr/update-src.sh b/mozilla/webtools/lxr/update-src.sh deleted file mode 100755 index 3dbb651714d..00000000000 --- a/mozilla/webtools/lxr/update-src.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh -# Run this from cron to update the source tree that lxr sees. -# Created 12-Jun-98 by jwz. - -CVSROOT=:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot -export CVSROOT - -PATH=/opt/local/bin:/opt/cvs-tools/bin:$PATH -export PATH - -lxr_dir=. -db_dir=`sed -n 's@^dbdir:[ ]*\(.*\)@\1@p' < $lxr_dir/lxr.conf` -src_dir=`sed -n 's@^sourceroot:[ ]*\(.*\)@\1@p' < $lxr_dir/lxr.conf` -log=$db_dir/cvs.log - -exec > $log 2>&1 -set -x - -date - -# update the lxr sources -pwd -time cvs -d $CVSROOT update -dP - -date - -# then update the Mozilla sources -cd $src_dir -cd .. - -# jwz: let's check out "mozilla" instead of merely "MozillaSource". -time cvs -Q -d $CVSROOT checkout -P mozilla - -date - -exit 0 diff --git a/mozilla/webtools/lxr/update-xref.sh b/mozilla/webtools/lxr/update-xref.sh deleted file mode 100755 index 962cb07e10c..00000000000 --- a/mozilla/webtools/lxr/update-xref.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# Run this from cron to update the identifier database that lxr uses -# to turn function names into clickable links. -# Created 12-Jun-98 by jwz. - -PATH=/opt/local/bin:/opt/cvs-tools/bin:$PATH -export PATH - -lxr_dir=. -db_dir=`sed -n 's@^dbdir:[ ]*\(.*\)@\1@p' < $lxr_dir/lxr.conf` -src_dir=`sed -n 's@^sourceroot:[ ]*\(.*\)@\1@p' < $lxr_dir/lxr.conf` -log=$db_dir/genxref.log - -exec > $log 2>&1 -set -x - -date - -lxr_dir=`pwd` -cd $db_dir/tmp - -set -e -time $lxr_dir/genxref $src_dir -chmod -R a+r . -mv xref fileidx ../ - -date - -exit 0 diff --git a/mozilla/webtools/registry/file.cgi b/mozilla/webtools/registry/file.cgi deleted file mode 100755 index 14e467dec5e..00000000000 --- a/mozilla/webtools/registry/file.cgi +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bonsaitools/bin/perl -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Application Registry. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -require 'lloydcgi.pl'; -$|=1; - -$filename= $form{"file"}; -$dirname= $form{"dir"}; -$branch= $form{"branch"}; -$cvsroot= $form{"cvsroot"}; -$rev= $form{"rev"}; -$prev_rev= $form{"prev_rev"}; -$linked_text= $form{"linked_text"}; -$linked_text = $filename if $linked_text eq ''; - -$branch = $rev if $branch eq '' && $rev =~ /[A-Za-z]/; - -@extra_url = (); -@extra_text = (); - -print "Content-type: text/html\n\n\n"; - -print "
    \n"; - -&load_extra_data; - - -$i = 0; -while( $i < @extra_text ){ - $t = $extra_text[$i]; - if( $u = $extra_url[$i] ){ - - print("
    $t\n"); - } - else { - print("
    $t\n"); - } - $i++; -} - -if( @extra_text ){ - print("
    \n"); -} - - -$dirname2 = $dirname; - -$dirname2 =~ s/^ns\///; - -print " -$linked_text - -
    - View Blame-Annotated Source -"; -if ($prev_rev ne '') { - print "
    View Diff $prev_rev vs. $rev"; -} else { - - print "
    " - ."View Diff's"; -} - -print "
    - View Logs -"; - -print " -
    "; - -sub load_extra_data { - local( $i, $u, $t ); - - $i = 0; - while( ($u = $form{"u${i}"}) ne "" || $form{"t${i}"} ne "" ) { - $t = $form{"t${i}"}; - if( $t eq "" ) {$t = $u }; - $extra_url[$i] = $u; - $extra_text[$i] = $t; - $i++; - } -} diff --git a/mozilla/webtools/registry/lloydcgi.pl b/mozilla/webtools/registry/lloydcgi.pl deleted file mode 100755 index 0f89cb46fa0..00000000000 --- a/mozilla/webtools/registry/lloydcgi.pl +++ /dev/null @@ -1,44 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Application Registry. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. -&split_cgi_args; -1; - -sub split_cgi_args { - local($i,$var,$value, $s); - - if( $ENV{"REQUEST_METHOD"} eq 'POST'){ - while(<> ){ - $s .= $_; - } - } - else { - $s = $ENV{"QUERY_STRING"}; - } - - @args= split(/\&/, $s ); - - for $i (@args) { - ($var, $value) = split(/=/, $i); - $var =~ tr/+/ /; - $var =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; - $value =~ tr/+/ /; - $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; - $form{$var} = $value; - } -} - diff --git a/mozilla/webtools/registry/who.cgi b/mozilla/webtools/registry/who.cgi deleted file mode 100755 index 82fac4d2b4e..00000000000 --- a/mozilla/webtools/registry/who.cgi +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bonsaitools/bin/perl -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Application Registry. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -require 'lloydcgi.pl'; -$|=1; - -$email= $form{"email"}; -$full_name = $email; -$enc_full_name = $email; #this should be url encoded - -@extra_url = (); -@extra_text = (); - -print "Content-type: text/html\n\n\n"; - -print "
    \n"; -print "$email\n"; -print "\n"; - -&load_extra_data; - - -$i = 0; -while( $i < @extra_text ){ - $t = $extra_text[$i]; - if( $u = $extra_url[$i] ){ - - print("
    $t\n"); - } - else { - print("
    $t\n"); - } - $i++; -} - -if( @extra_text ){ - print("
    \n"); -} - -print " -
    - Send Mail - - - -
    - Check-ins within 7 days - -
    - -

    -
    -"; - -sub load_extra_data { - local( $i, $u, $t ); - - $i = 0; - while( ($u = $form{"u${i}"}) ne "" || $form{"t${i}"} ne "" ) { - $t = $form{"t${i}"}; - if( $t eq "" ) {$t = $u }; - $extra_url[$i] = $u; - $extra_text[$i] = $t; - $i++; - } -} diff --git a/mozilla/webtools/tinderbox/1afi003r.gif b/mozilla/webtools/tinderbox/1afi003r.gif deleted file mode 100644 index 0b6bb07a36f7dcee1851c39115af49b22cfaccab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12967 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 diff --git a/mozilla/webtools/tinderbox/Empty.html b/mozilla/webtools/tinderbox/Empty.html deleted file mode 100644 index 388168653a4..00000000000 --- a/mozilla/webtools/tinderbox/Empty.html +++ /dev/null @@ -1 +0,0 @@ -Click on the filename and line number in the log and the source will appear in this window. diff --git a/mozilla/webtools/tinderbox/README b/mozilla/webtools/tinderbox/README deleted file mode 100644 index 1094c8dd1ca..00000000000 --- a/mozilla/webtools/tinderbox/README +++ /dev/null @@ -1,76 +0,0 @@ -This is Tinderbox. See . - - - ========== - DISCLAIMER - ========== - -This is not very well packaged code. It's not packaged at all. Don't -come here expecting something you plop in a directory, twiddle a few -things, and you're off and using it. Much work has to be done to get -there. We'd like to get there, but it wasn't clear when that would be, -and so we decided to let people see it first. - -Don't believe for a minute that you can use this stuff without first -understanding most of the code. - - - ============ - DEPENDENCIES - ============ - -To use tinderbox, you must first have bonsai up and running. -See . - -Be warned now that bonsai is not easily installed. - - - ==================================== - What's What in the Tinderbox sources: - ==================================== - -This is a rough first pass at cataloging and documenting the Tinderbox -sources. Many hands have been in this code over the years, and it has -accreted wildly. There is probably quite a lot of dead code in here. - - -1afi003r.gif The "flames" animation used by ??? - -Empty.html Document used for an empty frame by ??? - -addimage.cgi The form that lets you add a new image to the list of - images that Tinderbox picks from randomly. - -addnote.cgi Add a note to a build log. - -admintree.cgi Lets you perform various admin tasks on a Tinderbox tree. - This just prompts for a password and posts to doadmin.cgi. - -buildwho.pl ??? -clean.pl ??? -copydata.pl ??? - -doadmin.cgi Actually do the work to admin a tinderbox tree - -ep_mac.pl Knows how to parse Mac build error logs. Used by ??? -ep_unix.pl Knows how to parse Unix build error logs. Used by ??? -ep_windows.pl Knows how to parse Windows build error logs. Used by ??? - -faq.html Wildly out of date. - -fixupimages.pl ??? -globals.pl ??? -handlemail.pl ??? -imagelog.pl ??? -index.html ??? -processbuild.pl ??? -reledanim.gif ??? - -showbuilds.cgi The main Tinderbox page. Interesting params are: - express=1; hours=n; tree2=anothertree. - -showimages.cgi Show all the images in the Tinderbox list. Password-protected. - -showlog.cgi Show a build log (brief and full). - -star.gif The "star" image used to annotate builds by ??? diff --git a/mozilla/webtools/tinderbox/addimage.cgi b/mozilla/webtools/tinderbox/addimage.cgi deleted file mode 100755 index 8636fb51984..00000000000 --- a/mozilla/webtools/tinderbox/addimage.cgi +++ /dev/null @@ -1,402 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -use Socket; - -use lib "../bonsai"; -require 'header.pl'; - -print "Content-type: text/html\n\n"; - -EmitHtmlTitleAndHeader("tinderbox: add images", "add images"); - -$| = 1; - -require "globals.pl"; -require "imagelog.pl"; - -&split_cgi_args; - - -sub Error { - my ($msg) = @_; - print "


    "; - print "
      Something went wrong:

      "; - print "

        "; - print $msg; - print "
      "; - print "

      "; - print "Hit \`Back' and try again."; - print "

    "; - exit 1; -} - - -if( $url = $form{"url"} ){ - $quote = $form{"quote"}; - - $quote =~ s/[\r\n]/ /g; - $url =~ s/[\r\n]/ /g; - - $width = ""; - $height = ""; -# I think we don't want to allow this --jwz -# $width = $form{"width"}; -# $height = $form{"height"}; - - if ($width eq "" || $height eq "") { - $size = &URLsize($url); - if ($size =~ /WIDTH=([0-9]*)/) { - $width = $1; - } - if ($size =~ /HEIGHT=([0-9]*)/) { - $height = $1; - } - if ($width eq "" || $height eq "") { - Error "Couldn't get image size for \"$url\".\n"; - } - } - - print " - -


    -$quote

    -"; - - if( $form{"submit"} ne "Yes" ){ - my $u2 = $url; - my $q2 = $quote; - $u2 =~ s@&@&@g; $u2 =~ s@<@<@g; $u2 =~ s@\"@"@g; - $q2 =~ s@&@&@g; $q2 =~ s@<@<@g; $q2 =~ s@\"@"@g; - - print " -
    - - -
    - - - - - - - - - - - -
    Image URL:$u2
    Caption:$q2
    - - Does that look right? - - -
    (If not, hit \`Back' and fix it.) -
    -
    -
    -"; - } - else { - &add_imagelog( $url, $quote, $width, $height ); - print "

    - Has been added

    - Return to Log"; - } - -} -else { - print " -

    Add an image and a funny caption.

    - -
      -

      This is about fun, and making your daily excursion to -Tinderbox a -novel experience. Engineers spend a lot of time here; it might as well -have some entertainment value. - -

      Please play nice. We don't have the time or inclination to look at -everything you people submit, but if we get nastygrams or legalgrams -and have to take something down, we will curse your IP address, and you -might even make it so the whole thing goes away forever. Please don't -make us go there. You might also avoid links to big images or slow -servers. - -

        Thank you for playing nice.
      - -

      If you really find an image offensive, please -tell us -nicely before someone causes a stink. Be sure to include the URL of -the image. Remember, we don't screen these submissions and may not -have even seen it. -

    - -

    - - - - - - - - - - - -
    Image URL:
    Caption:
    - - - -
    - -
    -

    -"; -} - -sub split_cgi_args { - local($i,$var,$value, $s); - - $s = $ENV{"QUERY_STRING"}; - - @args= split(/\&/, $s ); - - for $i (@args) { - ($var, $value) = split(/=/, $i); - $value =~ tr/+/ /; - $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; - $form{$var} = $value; - } -} - - -#sub imgsize { -# local($file)= @_; -# -# #first try to open the file -# if( !open(STREAM, "<$file") ){ -# Error "Can't open IMG $file"; -## $size=""; -# } else { -# if ($file =~ /.jpg/i || $file =~ /.jpeg/i) { -# $size = &jpegsize(STREAM); -# } elsif($file =~ /.gif/i) { -# $size = &gifsize(STREAM); -# } elsif($file =~ /.xbm/i) { -# $size = &xbmsize(STREAM); -# } else { -# return ""; -# } -# $_ = $size; -# if( /\s*width\s*=\s*([0-9]*)\s*/i ){ -# ($newwidth)= /\s*width\s*=\s*(\d*)\s*/i; -# } -# if( /\s*height\s*=\s*([0-9]*)\s*/i ){ -# ($newheight)=/\s*height\s*=\s*(\d*)\s*/i; -# } -# close(STREAM); -# } -# return $size; -#} - -########################################################################### -# Subroutine gets the size of the specified GIF -########################################################################### - -# bug: it thinks that -# http://cvs1.mozilla.org/webtools/tinderbox/data/knotts.gif -# is 640x400, but it's really 200x245. -# giftrans says of that image: -# -# Header: "GIF87a" -# Logical Screen Descriptor: -# Logical Screen Width: 640 pixels -# Logical Screen Height: 480 pixels -# Image Descriptor: -# Image Width: 200 pixels -# Image Height: 245 pixels - - -sub gifsize { - local($GIF) = @_; - read($GIF, $type, 6); - if(!($type =~ /GIF8[7,9]a/) || - !(read($GIF, $s, 4) == 4) ){ - Error "Invalid or Corrupted GIF"; - $size=""; - } else { - ($a,$b,$c,$d)=unpack("C"x4,$s); - $size=join ("", 'WIDTH=', $b<<8|$a, ' HEIGHT=', $d<<8|$c); - } - return $size; -} - -sub xbmsize { - local($XBM) = @_; - local($input)=""; - - $input .= <$XBM>; - $input .= <$XBM>; - $_ = $input; - if( /#define\s*\S*\s*\d*\s*\n#define\s*\S*\s*\d*\s*\n/i ){ - ($a,$b)=/#define\s*\S*\s*(\d*)\s*\n#define\s*\S*\s*(\d*)\s*\n/i; - $size=join ("", 'WIDTH=', $a, ' HEIGHT=', $b ); - } else { - Error "Doesn't look like an XBM file"; - } - return $size; -} - -# jpegsize : gets the width and height (in pixels) of a jpeg file -# Andrew Tong, werdna@ugcs.caltech.edu February 14, 1995 -# modified slightly by alex@ed.ac.uk -sub jpegsize { - local($JPEG) = @_; - local($done)=0; - $size=""; - - read($JPEG, $c1, 1); read($JPEG, $c2, 1); - if( !((ord($c1) == 0xFF) && (ord($c2) == 0xD8))){ - my $s = sprintf "This is not a JPEG! (Codes %02X %02X)\n", ord($c1), ord($c2); - Error $s; - $done=1; - } - while (ord($ch) != 0xDA && !$done) { - # Find next marker (JPEG markers begin with 0xFF) - # This can hang the program!! - while (ord($ch) != 0xFF) { read($JPEG, $ch, 1); } - # JPEG markers can be padded with unlimited 0xFF's - while (ord($ch) == 0xFF) { read($JPEG, $ch, 1); } - # Now, $ch contains the value of the marker. - $marker=ord($ch); - - if (($marker >= 0xC0) && ($marker <= 0xCF) && - ($marker != 0xC4) && ($marker != 0xCC)) { # it's a SOFn marker - read ($JPEG, $junk, 3); read($JPEG, $s, 4); - ($a,$b,$c,$d)=unpack("C"x4,$s); - $size=join("", 'HEIGHT=',$a<<8|$b,' WIDTH=',$c<<8|$d ); - $done=1; - } else { - # We **MUST** skip variables, since FF's within variable - # names are NOT valid JPEG markers - read ($JPEG, $s, 2); - ($c1, $c2) = unpack("C"x2,$s); - $length = $c1<<8|$c2; - if( ($length < 2) ){ - Error "Bad JPEG file: erroneous marker length"; - $done=1; - } else { - read($JPEG, $junk, $length-2); - } - } - } - return $size; -} - -########################################################################### -# Subroutine grabs a gif from another server and gets its size -########################################################################### - - -sub URLsize { - my ($fullurl) = @_; - - $_ = $fullurl; - if ( ! m@^http://@ ) { - Error "HTTP URLs only, please: \"$_\" is no good."; - } - - my($dummy, $dummy, $serverstring, $url) = split(/\//, $fullurl, 4); - my($them,$port) = split(/:/, $serverstring); - my $port = 80 unless $port; - my $size=""; - - $_ = $them; - if ( m@^[^.]*$@ ) { - Error "Fully-qualified host names only, please: \"$_\" is no good."; - } - - $_=$url; - my ($remote, $iaddr, $paddr, $proto, $line); - $remote = $them; - if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') } - die "No port" unless $port; - $iaddr = inet_aton($remote) || die "no host: $remote"; - $paddr = sockaddr_in($port, $iaddr); - - $proto = getprotobyname('tcp'); - socket(S, PF_INET, SOCK_STREAM, $proto) || die "socket: $!"; - connect(S, $paddr) || die "connect: $!"; - select(S); $| = 1; select(STDOUT); - - print S "GET /$url HTTP/1.0\r\n"; - print S "Host: $them\r\n"; - print S "User-Agent: Tinderbox/0.0\r\n"; - print S "\r\n"; - - $_ = ; - if (! m@^HTTP/[0-9.]+ 200@ ) { - Error "$them responded:
    $_"; - } - - my $ctype = ""; - while () { - # print "read: $_
    \n"; - if ( m@^Content-Type:[ \t]*([^ \t\r\n]+)@io ) { - $ctype = $1; - } - last if (/^[\r\n]/); - } - - $_ = $ctype; - if ( $_ eq "" ) { - Error "Server returned no content-type for \"$fullurl\"?"; - } elsif ( m@image/jpeg@i || m@image/pjpeg@i ) { - $size = &jpegsize(S); - } elsif ( m@image/gif@i ) { - $size = &gifsize(S); - } elsif ( m@image/xbm@i || m@image/x-xbm@i || m@image/x-xbitmap@i ) { - $size = &xbmsize(S); - } else { - Error "Not a GIF, JPEG, or XBM: that was of type \"$ctype\"."; - } - - $_ = $size; - if( /\s*width\s*=\s*([0-9]*)\s*/i ){ - ($newwidth)= /\s*width\s*=\s*(\d*)\s*/i; - } - if( /\s*height\s*=\s*([0-9]*)\s*/i ){ - ($newheight)=/\s*height\s*=\s*(\d*)\s*/i; - } - - if ( $newwidth eq "" || $newheight eq "" ) { - return ""; - } else { - if ( $newwidth <= 5 || $newheight <= 5 ) { - Error "${newwidth}x${newheight} seems small, don't you think?"; - } elsif ( $newwidth >= 400 || $newheight >= 400 ) { - Error "${newwidth}x${newheight} is too big; please" . - " keep it under 400x400." - } - return $size; - } -} - -sub dokill { - kill 9,$child if $child; -} diff --git a/mozilla/webtools/tinderbox/addnote.cgi b/mozilla/webtools/tinderbox/addnote.cgi deleted file mode 100755 index c2f654ceac4..00000000000 --- a/mozilla/webtools/tinderbox/addnote.cgi +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -use lib "../bonsai"; - -require "globals.pl"; -require 'lloydcgi.pl'; - -$buildname = $form{'buildname'}; -$buildtime = $form{'buildtime'}; -$errorparser = $form{'errorparser'}; -$logfile = $form{'logfile'}; -$tree = $form{'tree'}; -$enc_buildname = &url_encode($buildname); -$note = $form{'note'}; -$who = $form{'who'}; -$now = time; -$now_str = &print_time($now); - -$|=1; - -print "Content-type: text/html\n\n\n"; - -if( $url = $form{"note"} ){ - - $enc_note = url_encode( $note ); - lock; - open( NOTES,">>$tree/notes.txt"); - print NOTES "$buildtime|$buildname|$who|$now|$enc_note\n"; - close(NOTES); - - print "

    The following comment has been added to the log

    \n"; - - #print "$buildname \n $buildtime \n $errorparser \n $logfile \n $tree \n $enc_buildname \n"; - print "
    \n[$who - $now_str]\n$note\n
    "; - - print" -

    -Go back to the Error Log - -
    Go back to the build Page
    -"; - -} -else { - if( $buildname eq '' || $buildtime == 0 ){ - print "

    Invalid parameters

    \n"; - die "\n"; - } - -#print "$buildname \n $buildtime \n $errorparser \n $logfile \n $tree \n $enc_buildname \n"; - - print " -Add a Comment to the log -

    Add a Comment to the log

    - -
    - -
    Your email address: - - - - - - - -
    -"; -} diff --git a/mozilla/webtools/tinderbox/admintree.cgi b/mozilla/webtools/tinderbox/admintree.cgi deleted file mode 100755 index b60bf8cb14b..00000000000 --- a/mozilla/webtools/tinderbox/admintree.cgi +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -use lib "../bonsai"; - -require 'lloydcgi.pl'; -require 'globals.pl'; -require 'header.pl'; - -$|=1; - -print "Content-type: text/html\n\n\n"; - -EmitHtmlHeader("administer tinderbox", "tree: $tree"); - -&load_data; - -if( -r "$tree/mod.pl" ){ - require "$tree/mod.pl"; -} -else { - $message_of_day = ""; -} - -print " -
    -Password: - - -
    Message of the Day -
    -
    - -
    -"; - - -print " -
    -Password: - - -
    Trim Logs to days. (Tinderbox -shows 2 days history by default. You can see more by clicking show all). -
    -
    -
    -
    -" ; - - -print " - -Password:
    - - - - - - - - - - - - - -
    tinderbox tree name:
    cvs module name:
    cvs branch:
    - -
    -
    -
    -If builds are behaving badly you can turn them off.
    Uncheck -the build that is misbehaving and click the button. You can still see all the -builds even if some are disabled by adding the parameter &noignore=1 to -the tinderbox URL.
    -Password:
    - - -"; - -@names = sort (@$build_name_names, keys %$ignore_builds) ; - -for $i (@names){ - if( $i ne "" ){ - $checked = ($ignore_builds->{$i} != 0 ? "": "CHECKED" ); - print ""; - print "$i
    \n"; - } -} - -print " - -
    -
    -"; - - - - - diff --git a/mozilla/webtools/tinderbox/buildwho.pl b/mozilla/webtools/tinderbox/buildwho.pl deleted file mode 100755 index 78a1856d748..00000000000 --- a/mozilla/webtools/tinderbox/buildwho.pl +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -use lib "../bonsai"; - -require 'globals.pl'; - -$F_DEBUG=1; - - -$tree = $ARGV[0]; - -open(SEMFILE, ">>$tree/buildwho.sem") || die "Couldn't open semaphore file!"; -if (!flock(SEMFILE, 2 + 4)) { # 2 means "lock"; 4 means "fail immediately if - # lock already taken". - print "buildwho.pl: Another process is currently building the database.\n"; - exit(0); -} - -require "$tree/treedata.pl"; - -if( $cvs_root eq '' ){ - $CVS_ROOT = '/m/src'; -} -else { - $CVS_ROOT = $cvs_root; -} - -$CVS_REPOS_SUFIX = $CVS_ROOT; -$CVS_REPOS_SUFIX =~ s/\//_/g; - -$CHECKIN_DATA_FILE = "/d/webdocs/projects/bonsai/data/checkinlog${CVS_REPOS_SUFIX}"; -$CHECKIN_INDEX_FILE = "/d/webdocs/projects/bonsai/data/index${CVS_REPOS_SUFIX}"; - -require 'cvsquery.pl'; - -print "cvsroot='$CVS_ROOT'\n"; - -&build_who; - -flock(SEMFILE, 8); # '8' is magic 'unlock' const. -close SEMFILE; - - -sub build_who { - open(BUILDLOG, "<$tree/build.dat" ); - $line = ; - close(BUILDLOG); - - #($j,$query_date_min) = split(/\|/, $line); - $query_date_min = time - (60 * 60 * 40); - - if( $F_DEBUG ){ - print "Minimum date: $query_date_min\n"; - } - - $query_module=$cvs_module; - $query_branch=$cvs_branch; - - $result = &query_checkins; - - - $last_who=''; - $last_date=0; - open(WHOLOG, ">$tree/who.dat" ); - for $ci (@$result) { - if( $ci->[$CI_DATE] != $last_date || $ci->[$CI_WHO] != $last_who ){ - print WHOLOG "$ci->[$CI_DATE]|$ci->[$CI_WHO]\n"; - } - $last_who=$ci->[$CI_WHO]; - $last_date=$ci->[$CI_DATE]; - } - close( WHOLOG ); -} diff --git a/mozilla/webtools/tinderbox/clean.pl b/mozilla/webtools/tinderbox/clean.pl deleted file mode 100755 index 75954f81bf2..00000000000 --- a/mozilla/webtools/tinderbox/clean.pl +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# Figure out which directory tinderbox is in by looking at argv[0] - -$tinderboxdir = $0; -$tinderboxdir =~ s:/[^/]*$::; # Remove last word, and slash before it. -if ($tinderboxdir eq "") { - $tinderboxdir = "."; -} - -#print "tinderbox = $tinderboxdir\n"; - -chdir $tinderboxdir || die "Couldn't chdir to $tinderboxdir"; - -#print "cd ok\n"; - -open FL, "find . -name \"*.gz\" -mtime +7 -print |"; - -#print "find ok\n"; - -while( ){ - chop(); - #print "unlink $_\n"; - unlink $_; -} diff --git a/mozilla/webtools/tinderbox/copydata.pl b/mozilla/webtools/tinderbox/copydata.pl deleted file mode 100755 index d732419720b..00000000000 --- a/mozilla/webtools/tinderbox/copydata.pl +++ /dev/null @@ -1,91 +0,0 @@ -#!/tools/ns/bin/perl5 -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# -# to run this script execute 'nohup copydata.pl &' from the tinderbox directory -# - -$start_dir = `pwd`; -chop($start_dir); -$scp_cmd = "scp -o 'User snapshot' -o'Port 22' -o 'UserKnownHostsFile /u/shaver/snapshot/known_hosts' -o 'IdentityFile /u/shaver/snapshot/identity'"; - - -$last_time = 0; - -$min_cycle_time = 3 * 60; # 3 minutes - -print "starting dir is :$start_dir\n"; - -while( 1 ){ - chdir("$start_dir"); - if( time - $last_time < $min_cycle_time ){ - $sleep_time = $min_cycle_time - (time - $last_time); - print "\n\nSleeping $sleep_time seconds ...\n"; - sleep( $sleep_time ); - } - - ©_data("Mozilla"); - ©_data("raptor"); - - chdir( "$start_dir"); - print "$scp_cmd * cvs1.mozilla.org:/e/webtools/tinderbox\n"; - system "$scp_cmd * cvs1.mozilla.org:/e/webtools/tinderbox"; - - chdir( "$start_dir/../bonsai"); - print "$scp_cmd * cvs1.mozilla.org:/e/webtools/bonsai\n"; - system "$scp_cmd * cvs1.mozilla.org:/e/webtools/bonsai"; - - - $last_time = time; -} - -1; - - -sub copy_data { - local($data_dir) = @_; - local($zips,$qry); - -chdir $data_dir || die "couldn't chdir to $data_dir"; - -system "echo hello >lastup.new"; - -if( -r 'lastup' ) { - $qry = '-newer lastup.old'; - rename 'lastup', 'lastup.old' -} -rename 'lastup.new', 'lastup'; - - -open( FINDER, "find . $qry -name \"*.gz\" -print|" ); -while(){ - print; - chop; - $zips .= "$_ "; -} -close( FINDER ); - -unlink 'lastup.old'; - -print "$scp_cmd *.txt $zips *.dat cvs1.mozilla.org:/e/webtools/tinderbox/$data_dir\n"; -system "$scp_cmd *.txt $zips *.dat cvs1.mozilla.org:/e/webtools/tinderbox/$data_dir"; - - -chdir $start_dir || die "couldn't chdir to $start_dir"; -} diff --git a/mozilla/webtools/tinderbox/doadmin.cgi b/mozilla/webtools/tinderbox/doadmin.cgi deleted file mode 100755 index a656307e70c..00000000000 --- a/mozilla/webtools/tinderbox/doadmin.cgi +++ /dev/null @@ -1,213 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -use lib "../bonsai"; -require 'lloydcgi.pl'; -require 'globals.pl'; - -umask O666; - - -$|=1; - -check_password(); - -print "Content-type: text/html\n\n\n"; - -$command = $form{'command'}; -$tree= $form{'tree'}; - -if( $command eq 'create_tree' ){ - &create_tree; -} -elsif( $command eq 'remove_build' ){ - &remove_build; -} -elsif( $command eq 'trim_logs' ){ - &trim_logs; -} -elsif( $command eq 'set_message' ){ - &set_message; -} -elsif( $command eq 'disable_builds' ){ - &disable_builds; -} else { - print "Unknown command: \"$command\"."; -} - -sub trim_logs { - $days = $form{'days'}; - $tree = $form{'tree'}; - - print "

    Trimming Log files for $tree...

    \n

    "; - - $min_date = time - (60*60*24 * $days); - - # - # Nuke the old log files - # - $i = 0; - opendir( D, 'DogbertTip' ); - while( $fn = readdir( D ) ){ - if( $fn =~ /\.gz$/ ){ - ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime, - $ctime,$blksize,$blocks) = stat("$tree/$fn"); - if( $mtime && ($mtime < $min_date) ){ - print "$fn\n"; - $tblocks += $blocks; - unlink( "$tree/$fn" ); - $i++; - } - } - } - closedir( D ); - $k = $tblocks*512/1024; - print "
    $i Logfiles ( $k K bytes ) removed
    \n"; - - # - # Trim build.dat - # - $builds_removed = 0; - open(BD, "<$tree/build.dat"); - open(NBD, ">$tree/build.dat.new"); - while( ){ - ($mailtime,$buildtime,$buildname) = split( /\|/ ); - if( $buildtime >= $min_date ){ - print NBD $_; - } - else { - $builds_removed++; - } - } - close( BD ); - close( NBD ); - - rename( "$tree/build.dat", "$tree/build.dat.old" ); - rename( "$tree/build.dat.new", "$tree/build.dat" ); - - print "

    $builds_removed Builds removed from build.dat

    \n"; -} - -sub create_tree { - $treename = $form{'treename'}; - $modulename = $form{'modulename'}; - $branchname = $form{'branchname'}; - - if( -r $treename ){ - chmod 0777, $treename; - } - else { - mkdir( $treename, 0777 ) || die "

    Cannot mkdir $treename

    "; - } - open( F, ">$treename/treedata.pl" ); - print F "\$cvs_module='$modulename';\n"; - print F "\$cvs_branch='$branchname';\n"; - close( F ); - - open( F, ">$treename/build.dat" ); - close( F ); - - open( F, ">$treename/who.dat" ); - close( F ); - - open( F, ">$treename/notes.txt" ); - close( F ); - - chmod 0777, "$treename/build.dat", "$treename/who.dat", "$treename/notes.txt", - "$treename/treedata.pl"; - - print "

    Tree created or modified

    \n"; -} - -sub remove_build { - $build_name = $form{'build'}; - - # - # Trim build.dat - # - $builds_removed = 0; - open(BD, "<$tree/build.dat"); - open(NBD, ">$tree/build.dat.new"); - while( ){ - ($mailtime,$buildtime,$bname) = split( /\|/ ); - if( $bname ne $build_name ){ - print NBD $_; - } - else { - $builds_removed++; - } - } - close( BD ); - close( NBD ); - chmod( 0777, "$tree/build.dat.new"); - - rename( "$tree/build.dat", "$tree/build.dat.old" ); - rename( "$tree/build.dat.new", "$tree/build.dat" ); - - print "

    - $builds_removed Builds removed from build.dat

    \n"; -} - -sub disable_builds { - my $i,%buildnames; - $build_name = $form{'build'}; - - # - # Trim build.dat - # - open(BD, "<$tree/build.dat"); - while( ){ - ($mailtime,$buildtime,$bname) = split( /\|/ ); - $buildnames{$bname} = 0; - } - close( BD ); - - for $i (keys %form) { - if ($i =~ /^build_/ ){ - $i =~ s/^build_//; - $buildnames{$i} = 1; - } - } - - open(IGNORE, ">$tree/ignorebuilds.pl"); - print IGNORE '$ignore_builds = {' . "\n"; - for $i ( sort keys %buildnames ){ - if( $buildnames{$i} == 0 ){ - print IGNORE "\t\t'$i' => 1,\n"; - } - } - print IGNORE "\t};\n"; - - chmod( 0777, "$tree/ignorebuilds.pl"); - print "

    Build state Changed

    \n"; -} - - -sub set_message { - $m = $form{'message'}; - $m =~ s/\"/\\\"/g; - open(MOD, ">$tree/mod.pl"); - print MOD "\$message_of_day = \"$m\""; - close(MOD); - chmod( 0777, "$tree/mod.pl"); - print "

    - Message Changed

    \n"; -} - diff --git a/mozilla/webtools/tinderbox/ep_mac.pl b/mozilla/webtools/tinderbox/ep_mac.pl deleted file mode 100755 index 161a4254108..00000000000 --- a/mozilla/webtools/tinderbox/ep_mac.pl +++ /dev/null @@ -1,45 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -1; -# -# Scan a line and see if it has an error -# -sub has_error { - $line =~ /fatal error/ # link error - || $line =~ /Error / # C error - || $line =~ /\[checkout aborted\]/ #cvs error - || $line =~ /Couldn\'t find project file / # CW project error -; -} - -sub has_warning { - $line =~ /^[A-Za-z0-9_]+\.[A-Za-z0-9]+\ line [0-9]+/ ; -} - -sub has_errorline { - local( $line ) = @_; - if( $line =~ /^(([A-Za-z0-9_]+\.[A-Za-z0-9]+) line ([0-9]+))/ ){ - $error_file = $1; - $error_file_ref = $2; - $error_line = $3; - $error_guess = 1; - return 1; - } - return 0; -} diff --git a/mozilla/webtools/tinderbox/ep_unix.pl b/mozilla/webtools/tinderbox/ep_unix.pl deleted file mode 100755 index 4308677d360..00000000000 --- a/mozilla/webtools/tinderbox/ep_unix.pl +++ /dev/null @@ -1,59 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -1; -# -# Scan a line and see if it has an error -# -sub has_error { - $line =~ /fatal error/ # link error - || $line =~ /^C / # cvs merge conflict - || $line =~ / Error: / # C error - || $line =~ / error\([0-9]*\)\:/ # C error - || ($line =~ /gmake/ && $line =~ / Error /) - || $line =~ /\[checkout aborted\]/ #cvs error - || $line =~ /\: cannot find module/ #cvs error - - ; -} - - -sub has_warning { - $line =~ /^[A-Za-z0-9_]+\.[A-Za-z0-9]+\:[0-9]+\:/ - || $line =~ /^\"[A-Za-z0-9_]+\.[A-Za-z0-9]+\"\, line [0-9]+\:/ -; -} - -sub has_errorline { - local( $line ) = @_; - if( $line =~ /^(([A-Za-z0-9_]+\.[A-Za-z0-9]+)\:([0-9]+)\:)/ ){ - $error_file = $1; - $error_file_ref = $2; - $error_line = $3; - $error_guess = 1; - return 1; - } - if ( $line =~ /^(\"([A-Za-z0-9_]+\.[A-Za-z0-9]+)\"\, line ([0-9]+)\:)/ ){ - $error_file = $1; - $error_file_ref = $2; - $error_line = $3; - $error_guess = 1; - return 1; - } - return 0; -} diff --git a/mozilla/webtools/tinderbox/ep_windows.pl b/mozilla/webtools/tinderbox/ep_windows.pl deleted file mode 100755 index 94832b7c358..00000000000 --- a/mozilla/webtools/tinderbox/ep_windows.pl +++ /dev/null @@ -1,73 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -1; -# -# Scan a line and see if it has an error -# -sub has_error { - $line =~ /fatal error/ # link error - || $line =~ / error / # C error - || $line =~ /^C / # cvs merge conflict - || $line =~ /error C/ # C error - || $line =~ /Creating new precompiled header/ # Wastes time. - || $line =~ /error:/ # java error - || $line =~ /jmake.MakerFailedException:/ # java error - || $line =~ /Unknown host / # cvs error - || $line =~ /: build failed\;/ # nmake error - || ($line =~ /gmake/ && $line =~ / Error /) - || $line =~ /\[checkout aborted\]/ #cvs error - || $line =~ /\: cannot find module/ #cvs error -; -} - - -sub has_warning { - $line =~ /: warning/ # link error - || $line =~ / error / # C error -; -} - -sub has_errorline { - local( $line ) = @_; - $error_file = ''; #'NS\CMD\WINFE\CXICON.cpp'; - $error_line = 0; - - if( $line =~ m@(ns([\\/][a-z0-9\._]+)*)@i ){ - $error_file = $1; - $error_file_ref = lc $error_file; - $error_file_ref =~ s@\\@/@g; - - $line =~ m/\(([0-9]+)\)/; - $error_line = $1; - return 1; - } - - if( $line =~ m@(^([A-Za-z0-9_]+\.[A-Za-z])+\(([0-9]+)\))@ ){ - $error_file = $1; - $error_file_ref = lc $2; - $error_line = $3; - $error_guess=1; - $error_file_ref =~ s@\\@/@g; - - return 1; - } - - return 0; -} - diff --git a/mozilla/webtools/tinderbox/faq.html b/mozilla/webtools/tinderbox/faq.html deleted file mode 100755 index cc95e162317..00000000000 --- a/mozilla/webtools/tinderbox/faq.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - -

    -FAQ on Tinderbox 

    -Q. What is Tinderbox. -
    A. Your very own automated build page.  It shows you how builds -are going on various platforms. fs -
    -
    Q. I just checked in some code.  How can I tell when -I'm OK. -
    A. You name will appear in the guilty column.  -When there are successful (green) builds in -all the columns in a row above your name, you know you are ok. -
    -
    Q. The tree is broken, how do I find out what is busted -(or who busted it). -
    A. Clicking 'L' in the first red box (first build to break) -above a green will show you a build log for the broken build.  You -can also click 'C' in this box and see what code was checked in. -
    -
    More Questions? Mail me ltabb@netscape.com -
    - - - diff --git a/mozilla/webtools/tinderbox/fixupimages.pl b/mozilla/webtools/tinderbox/fixupimages.pl deleted file mode 100755 index 8c04dfd2350..00000000000 --- a/mozilla/webtools/tinderbox/fixupimages.pl +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -use Socket; - -require 'globals.pl'; -require 'imagelog.pl'; - -# Port an old-style imagelog thing to a newstyle one - -open( IMAGELOG, "<$data_dir/imagelog.txt" ) || die "can't open file"; -open (OUT, ">$data_dir/newimagelog.txt") || die "can't open output file"; -select(OUT); $| = 1; select(STDOUT); - -while( ){ - chop; - ($url,$quote) = split(/\`/); - print "$url\n"; - $size = &URLsize($url); - $width = ""; - $height = ""; - if ($size =~ /WIDTH=([0-9]*)/) { - $width = $1; - } - if ($size =~ /HEIGHT=([0-9]*)/) { - $height = $1; - } - if ($width eq "" || $height eq "") { - print "Couldn't get image size; skipping.\n"; - } else { - print OUT "$url`$width`$height`$quote\n"; - } -} - - - - - - -sub imgsize { - local($file)= @_; - - #first try to open the file - if( !open(STREAM, "<$file") ){ - print "Can't open IMG $file"; - $size=""; - } else { - if ($file =~ /.jpg/i || $file =~ /.jpeg/i) { - $size = &jpegsize(STREAM); - } elsif($file =~ /.gif/i) { - $size = &gifsize(STREAM); - } elsif($file =~ /.xbm/i) { - $size = &xbmsize(STREAM); - } else { - return ""; - } - $_ = $size; - if( /\s*width\s*=\s*([0-9]*)\s*/i ){ - ($newwidth)= /\s*width\s*=\s*(\d*)\s*/i; - } - if( /\s*height\s*=\s*([0-9]*)\s*/i ){ - ($newheight)=/\s*height\s*=\s*(\d*)\s*/i; - } - close(STREAM); - } - return $size; -} - -########################################################################### -# Subroutine gets the size of the specified GIF -########################################################################### -sub gifsize { - local($GIF) = @_; - read($GIF, $type, 6); - if(!($type =~ /GIF8[7,9]a/) || - !(read($GIF, $s, 4) == 4) ){ - print "Invalid or Corrupted GIF"; - $size=""; - } else { - ($a,$b,$c,$d)=unpack("C"x4,$s); - $size=join ("", 'WIDTH=', $b<<8|$a, ' HEIGHT=', $d<<8|$c); - } - return $size; -} - -sub xbmsize { - local($XBM) = @_; - local($input)=""; - - $input .= <$XBM>; - $input .= <$XBM>; - $_ = $input; - if( /#define\s*\S*\s*\d*\s*\n#define\s*\S*\s*\d*\s*\n/i ){ - ($a,$b)=/#define\s*\S*\s*(\d*)\s*\n#define\s*\S*\s*(\d*)\s*\n/i; - $size=join ("", 'WIDTH=', $a, ' HEIGHT=', $b ); - } else { - print "Hmmm... Doesn't look like an XBM file"; - } - return $size; -} - -# jpegsize : gets the width and height (in pixels) of a jpeg file -# Andrew Tong, werdna@ugcs.caltech.edu February 14, 1995 -# modified slightly by alex@ed.ac.uk -sub jpegsize { - local($JPEG) = @_; - local($done)=0; - $size=""; - - read($JPEG, $c1, 1); read($JPEG, $c2, 1); - if( !((ord($c1) == 0xFF) && (ord($c2) == 0xD8))){ - printf "This is not a JPEG! (Codes %02X %02X)\n", ord($c1), ord($c2); - $done=1; - } - while (ord($ch) != 0xDA && !$done) { - # Find next marker (JPEG markers begin with 0xFF) - # This can hang the program!! - while (ord($ch) != 0xFF) { read($JPEG, $ch, 1); } - # JPEG markers can be padded with unlimited 0xFF's - while (ord($ch) == 0xFF) { read($JPEG, $ch, 1); } - # Now, $ch contains the value of the marker. - $marker=ord($ch); - - if (($marker >= 0xC0) && ($marker <= 0xCF) && - ($marker != 0xC4) && ($marker != 0xCC)) { # it's a SOFn marker - read ($JPEG, $junk, 3); read($JPEG, $s, 4); - ($a,$b,$c,$d)=unpack("C"x4,$s); - $size=join("", 'HEIGHT=',$a<<8|$b,' WIDTH=',$c<<8|$d ); - $done=1; - } else { - # We **MUST** skip variables, since FF's within variable - # names are NOT valid JPEG markers - read ($JPEG, $s, 2); - ($c1, $c2) = unpack("C"x2,$s); - $length = $c1<<8|$c2; - if( ($length < 2) ){ - print "Erroneous JPEG marker length"; - $done=1; - } else { - read($JPEG, $junk, $length-2); - } - } - } - return $size; -} - -########################################################################### -# Subroutine grabs a gif from another server and gets its size -########################################################################### - - -sub URLsize { - my ($fullurl) = @_; - my($dummy, $dummy, $serverstring, $url) = split(/\//, $fullurl, 4); - my($them,$port) = split(/:/, $serverstring); - my $port = 80 unless $port; - $them = 'localhost' unless $them; - my $size=""; - - $_=$url; - if( /gif/i || /jpeg/i || /jpg/i || /xbm/i ) { - my ($remote, $iaddr, $paddr, $proto, $line); - $remote = $them; - if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') } - die "No port" unless $port; - $iaddr = inet_aton($remote) || die "no host: $remote"; - $paddr = sockaddr_in($port, $iaddr); - - $proto = getprotobyname('tcp'); - socket(S, PF_INET, SOCK_STREAM, $proto) || return "socket: $!"; - connect(S, $paddr) || return "connect: $!"; - select(S); $| = 1; select(STDOUT); - - - - print S "GET /$url\n"; - if ($url =~ /.jpg/i || $url =~ /.jpeg/i) { - $size = &jpegsize(S); - } elsif($url =~ /.gif/i) { - $size = &gifsize(S); - } elsif($url =~ /.xbm/i) { - $size = &xbmsize(S); - } else { - return ""; - } - $_ = $size; - if( /\s*width\s*=\s*([0-9]*)\s*/i ){ - ($newwidth)= /\s*width\s*=\s*(\d*)\s*/i; - } - if( /\s*height\s*=\s*([0-9]*)\s*/i ){ - ($newheight)=/\s*height\s*=\s*(\d*)\s*/i; - } - } else { - $size=""; - } - return $size; -} - -sub dokill { - kill 9,$child if $child; -} diff --git a/mozilla/webtools/tinderbox/globals.pl b/mozilla/webtools/tinderbox/globals.pl deleted file mode 100755 index 599bf5643bf..00000000000 --- a/mozilla/webtools/tinderbox/globals.pl +++ /dev/null @@ -1,505 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# -# Global variabls and functions for tinderbox -# - -# -# Global variables -# - -$td1 = {}; -$td2 = {}; - -$build_list = []; # array of all build records -$build_name_index = {}; -$ignore_builds = {}; -$build_name_names = []; -$name_count = 0; - -$build_time_index = {}; -$build_time_times = []; -$time_count = 0; - -$build_table = []; -$who_list = []; -$who_list2 = []; -@note_array = (); - - -#$body_tag = ""; -#$body_tag = ""; -if( $ENV{'USERNAME'} eq 'ltabb' ){ - $gzip = 'gzip'; -} -else { - $gzip = '/usr/local/bin/gzip'; -} - -$data_dir='data'; - -$lock_count = 0; - -1; - -sub lock{ - #if( $lock_count == 0 ){ - # print "locking $tree/LOCKFILE.lck\n"; - # open( LOCKFILE_LOCK, ">$tree/LOCKFILE.lck" ); - # flock( LOCKFILE_LOCK, 2 ); - #} - #$lock_count++; - -} - -sub unlock{ - #$lock_count--; - #if( $lock_count == 0 ){ - # flock( LOCKFILE_LOCK, 8 ); - # close( LOCKFILE_LOCK ); - #} -} - -sub print_time { - local($t) = @_; - local($sec,$minute,$hour,$mday,$mon,$year); - ($sec,$minute,$hour,$mday,$mon,$year) = localtime( $t ); - sprintf("%02d/%02d %02d:%02d",$mon+1,$mday,$hour,$minute); -} - -sub url_encode { - local( $s ) = @_; - - $s =~ s/\%/\%25/g; - $s =~ s/\=/\%3d/g; - $s =~ s/\?/\%3f/g; - $s =~ s/ /\%20/g; - $s =~ s/\n/\%0a/g; - $s =~ s/\r//g; - $s =~ s/\"/\%22/g; - $s =~ s/\'/\%27/g; - $s =~ s/\|/\%7c/g; - $s =~ s/\&/\%26/g; - return $s; -} - -sub url_decode { - local($value) = @_; - $value =~ tr/+/ /; - $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; - return $value; -} - - -sub value_encode { - my($s) = @_; - $s =~ s@&@&@g; - $s =~ s@<@<@g; - $s =~ s@>@>@g; - $s =~ s@\"@"@g; - return $s; -} - - -sub load_data { - $tree2 = $form{'tree2'}; - if( $tree2 ne '' ){ - require "$tree2/treedata.pl"; - if( -r "$tree2/ignorebuilds.pl" ){ - require "$tree2/ignorebuilds.pl"; - } - - $td2 = {}; - $td2->{name} = $tree2; - $td2->{cvs_module} = $cvs_module; - $td2->{cvs_branch} = $cvs_branch; - $td2->{num} = 1; - $td2->{ignore_builds} = $ignore_builds; - if( $cvs_root eq '' ){ - $cvs_root = '/m/src'; - } - $td2->{cvs_root} = $cvs_root; - - $tree = $form{'tree'}; - require "$tree/treedata.pl"; - if( $cvs_root eq '' ){ - $cvs_root = '/m/src'; - } - } - - $tree = $form{'tree'}; - - die "the \"tree\" parameter must be provided\n" unless $tree; - - require "$tree/treedata.pl"; - $ignore_builds = {}; - if( -r "$tree/ignorebuilds.pl" ){ - require "$tree/ignorebuilds.pl"; - } - else { - } - - $td1 = {}; - $td1->{name} = $tree; - $td1->{num} = 0; - $td1->{cvs_module} = $cvs_module; - $td1->{cvs_branch} = $cvs_branch; - $td1->{ignore_builds} = $ignore_builds; - if( $cvs_root eq '' ){ - $cvs_root = '/m/src'; - } - $td1->{cvs_root} = $cvs_root; - - &lock; - &load_buildlog; - &unlock; - - &get_build_name_index; - &get_build_time_index; - - &load_who($who_list, $td1); - if( $tree2 ne "" ){ - &load_who($who_list2, $td2); - } - - &make_build_table; -} - -sub load_buildlog { - local($mailtime, $buildtime, $buildname, $errorparser, $buildstatus, $logfile,$binaryname); - local($buildrec, @treelist, $t); - - if( $tree2 ne '' ){ - @treelist = ($td1, $td2); - } - else { - @treelist = ($td1); - } - - for $t (@treelist) { - open(BUILDLOG, "<$t->{name}/build.dat" ); - while( ){ - chop; - ($mailtime, $buildtime, $buildname, $errorparser, $buildstatus, $logfile, $binaryname) = - split( /\|/ ); - - - $buildrec = { - mailtime => $mailtime, - buildtime => $buildtime, - buildname => ($tree2 ne "" ? $t->{name} . " " : "" ) . $buildname, - errorparser => $errorparser, - buildstatus => $buildstatus, - logfile => $logfile, - binaryname => $binaryname, - td => $t - }; - if( $mailtime > 0 - && $buildtime > $mindate - && ($form{noignore} || !($t->{ignore_builds}->{$buildname} != 0)) - ){ - push @{$build_list}, $buildrec; - } - } - close( BUILDLOG ); - } -} - -sub load_who { - local( $who_list, $td ) = @_; - local($d,$w,$i,$bfound); - - open(WHOLOG, "<$td->{name}/who.dat" ); - while( ){ - $i = $time_count; - chop; - ($d,$w) = split(/\|/); - $bfound = 0; - while( $i > 0 && !$bfound ){ - if( $d <= $build_time_times->[$i] ){ - - $who_list->[$i+1]->{$w} = 1; - $bfound = 1; - } - else { - $i--; - } - } - } - # - # Ignore the last one - # - if( $time_count > 0 ){ - $who_list->[$time_count] = {}; - } -} - -sub get_build_name_index { - local($i,$br); - - # - # Get all the unique build names. - # - for $br (@{$build_list}) { - $build_name_index->{$br->{buildname}} = 1; - } - - - $i = 1; - for $n (sort keys (%{$build_name_index})) { - $build_name_names->[$i] = $n; - $i++; - } - - $name_count = @{$build_name_names}-1; - - - # - # update the map so it points to the right index - # - $i = 1; - while( $i < $name_count+1 ){ - $build_name_index->{$build_name_names->[$i]} = $i; - #print "$name_count $build_name_names->[$i] $i
    \n"; - $i++; - } - - #for $i (@{$build_name_names}) { - # print "$build_name_names->[$i] $i
    \n"; - #&} -} - -sub get_build_time_index { - local($i,$br); - - # - # Get all the unique build names. - # - for $br (@{$build_list}) { - $build_time_index->{$br->{buildtime}} = 1; - #$build_time_index->{$br->{mailtime}} = 1; - } - - - $i = 1; - for $n (sort {$b <=> $a} keys (%{$build_time_index})) { - $build_time_times->[$i] = $n; - $i++; - } - - $time_count = @{$build_time_times}-1; - - - # - # update the map so it points to the right index - # - $i = 1; - while( $i < $time_count+1 ){ - $build_time_index->{$build_time_times->[$i]} = $i; - $i++; - } - - #for $i (@{$build_time_times}) { - # print $i . "\n"; - #} - - #while( ($k,$v) = each(%{$build_time_index})) { - # print "$k=$v\n"; - #} - -} - -sub make_build_table { - local($i,$ti,$bi,$ti1,$br); - $i = 1; - - # - # Create the build table - # - while( $i <= $time_count ){ - $build_table->[$i] = []; - $i++; - } - - # - # Populate the build table with build data - # - for $br (@{$build_list}) { - $ti = $build_time_index->{$br->{buildtime}}; - $bi = $build_name_index->{$br->{buildname}}; - $build_table->[$ti][$bi] = $br; - } - - &load_notes; - - $bi = $name_count; - while( $bi > 0 ){ - $ti = $time_count; - while( $ti > 0 ){ - if( defined( $br = $build_table->[$ti][$bi] ) - && !defined( $br->{rowspan} ) - ){ - # - # If the cell immediatley after us is defined, then we - # can have a previousbuildtime. - # - if( defined( $br1 = $build_table->[$ti+1][$bi] )){ - $br->{previousbuildtime} = $br1->{buildtime}; - } - - $ti1 = $ti-1; - while( $ti1 > 0 - && !defined( $build_table->[$ti1][$bi] ) - #&& $build_time_times->[$ti1] < $br->{mailtime} - ){ - $build_table->[$ti1][$bi] = -1; - $ti1--; - } - $br->{rowspan} = $ti - $ti1; - if( $br->{rowspan} != 1 ){ - $build_table->[$ti1+1][$bi] = $br; - $build_table->[$ti][$bi] = -1; - - } - }; - - $ti--; - } - $bi--; - } -} - -sub load_notes { - if( $tree2 ne '' ){ - @treelist = ($td1, $td2); - } - else { - @treelist = ($td1); - } - - for $t (@treelist) { - open(NOTES,"<$t->{name}/notes.txt") || print "

    warning: Couldn't open $t->{name}/notes.txt

    \n"; - while(){ - chop; - ($nbuildtime,$nbuildname,$nwho,$nnow,$nenc_note) = split(/\|/); - if( $tree2 ne "" ) { $nbuildname = $t->{name} . " " . $nbuildname; } - $ti = $build_time_index->{$nbuildtime}; - $bi = $build_name_index->{$nbuildname}; - #print "[ti = $ti][bi=$bi][buildname='$nbuildname' $_
    "; - if( $ti != 0 && $bi != 0 ){ - $build_table->[$ti][$bi]->{hasnote} = 1; - if( ! defined($build_table->[$ti][$bi]->{noteid}) ){ - $build_table->[$ti][$bi]->{noteid} = (0+@note_array); - } - $noteid = $build_table->[$ti][$bi]->{noteid}; - $now_str = &print_time($nnow); - $note = &url_decode($nenc_note); - $note_array[$noteid] .= - "
    \n[$nwho - $now_str]\n$note\n
    "; - } - } - close(NOTES); - } -} - -sub last_good_time { - local($row) = @_; - local($t,$currently_busted); - - $t = 1; - $isbusted = 0; - while( $t <= $time_count ){ - if( defined( $build_table->[$t][$row] )){ - if( $build_table->[$t][$row]->{buildstatus} eq 'success' ){ - return { - buildtime => - $build_time_times->[ $t + - $build_table->[$t][$row]->{rowspan} ], - isbusted => $isbusted }; - } - elsif( $build_table->[$t][$row]->{buildstatus} eq 'busted' ){ - $isbusted = 1; - } - else { - } - } - $t++; - } - return {buildtime => 0, isbusted => 1}; -} - - -sub check_password { - if ($form{'password'} eq "") { - if (defined $cookie_jar{'tinderbox_password'}) { - $form{'password'} = $cookie_jar{'tinderbox_password'}; - } - } - my $correct = ""; - if (open(REAL, "; - close REAL; - $correct =~ s/\s+$//; # Strip trailing whitespace. - } - if ($correct eq "") { - return; - } - $form{'password'} =~ s/\s+$//; # Strip trailing whitespace. - if ($form{'password'} ne "") { - open(TRAPDOOR, "../bonsai/data/trapdoor $form{'password'} |") || die "Can't run trapdoor func!"; - my $encoded = ; - close TRAPDOOR; - $encoded =~ s/\s+$//; # Strip trailing whitespace. - if ($encoded eq $correct) { - if ($form{'rememberpassword'} ne "") { - print "Set-Cookie: tinderbox_password=$form{'password'} ; path=/ ; expires = Sun, 1-Mar-2020 00:00:00 GMT\n"; - } - return; - } - } - - require 'header.pl'; - - print "Content-type: text/html\n"; - print "Set-Cookie: tinderbox_password= ; path=/ ; expires = Sun, 1-Mar-2020 00:00:00 GMT\n"; - print "\n"; - - EmitHtmlHeader("What's the magic word?", - "You need to know the magic word to use this page."); - - if ($form{'password'} ne "") { - print "Invalid password; try again.
    "; - } - print " -
    -Password: -
    - If correct, remember password as a cookie
    -"; - - while (my ($key,$value) = each %form) { - if ($key eq "password" || $key eq "rememberpassword") { - next; - } - my $enc = value_encode($value); - print "\n"; - } - print "
    \n"; - exit; -} diff --git a/mozilla/webtools/tinderbox/handlemail.pl b/mozilla/webtools/tinderbox/handlemail.pl deleted file mode 100755 index c3e1222a75f..00000000000 --- a/mozilla/webtools/tinderbox/handlemail.pl +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -# Figure out which directory tinderbox is in by looking at argv[0] - -$tinderboxdir = $0; -$tinderboxdir =~ s:/[^/]*$::; # Remove last word, and slash before it. -if ($tinderboxdir eq "") { - $tinderboxdir = "."; -} - -print "tinderbox = $tinderboxdir\n"; - -chdir $tinderboxdir || die "Couldn't chdir to $tinderboxdir"; - - -open(DF, ">data/tbx.$$") || die "could not open data/tbx.$$"; -while(){ - print DF $_; -} -close(DF); - -$err = system("./processbuild.pl data/tbx.$$"); - -if( $err ) { - die "processbuild.pl returned an error\n"; -} - diff --git a/mozilla/webtools/tinderbox/imagelog.pl b/mozilla/webtools/tinderbox/imagelog.pl deleted file mode 100755 index 6127da320ee..00000000000 --- a/mozilla/webtools/tinderbox/imagelog.pl +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -1; - -sub add_imagelog { - local($url,$quote,$width,$height) = @_; - open( IMAGELOG, ">>$data_dir/imagelog.txt" ) || die "Oops; can't open imagelog.txt"; - print IMAGELOG "$url`$width`$height`$quote\n"; - close( IMAGELOG ); -} - -sub get_image{ - local(@log,@ret,$i); - - open( IMAGELOG, "<$data_dir/imagelog.txt" ); - @log = ; - - # return a random line - srand; - @ret = split(/\`/,$log[rand @log]); - - close( IMAGELOG ); - @ret; -} - - diff --git a/mozilla/webtools/tinderbox/index.html b/mozilla/webtools/tinderbox/index.html deleted file mode 100755 index 50643e48ef5..00000000000 --- a/mozilla/webtools/tinderbox/index.html +++ /dev/null @@ -1,12 +0,0 @@ -tinderbox - - -
    -
    - -You're looking for -showbuilds.cgi. - -
    -
    diff --git a/mozilla/webtools/tinderbox/processbuild.pl b/mozilla/webtools/tinderbox/processbuild.pl deleted file mode 100755 index 7fcd0f5df77..00000000000 --- a/mozilla/webtools/tinderbox/processbuild.pl +++ /dev/null @@ -1,214 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -require 'globals.pl'; -require 'timelocal.pl'; - -umask 0; - -%MAIL_HEADER = (); -%tbx = (); -$logfile = ''; - - -&get_variables; -&check_required_vars; -&compress_log_file; -&unlink_log_file; - -$tree = $tbx{'tree'}; - -&lock; -&write_build_data; -&unlock; - -$err = system("./buildwho.pl $tbx{'tree'}"); - -# -# This routine will scan through log looking for 'tinderbox:' variables -# -sub get_variables{ - open( LOG, "<$ARGV[0]") || die "cant open $!"; - &parse_mail_header; - - #while( ($k,$v) = each( %MAIL_HEADER ) ){ - # print "$k='$v'\n"; - #} - - &parse_log_variables; - - #while( ($k,$v) = each( %tbx ) ){ - # print "$k='$v'\n"; - #} - close(LOG); -} - - -sub parse_log_variables { - while($line = ){ - chop($line); - if( $line =~ /^tinderbox\:/ ){ - if( $line =~ /^tinderbox\:[ \t]*([^:]*)\:[ \t]*([^\n]*)/ ){ - $tbx{$1} = $2; - } - } - } -} - -sub parse_mail_header { - while($line = ){ - chop($line); - - if( $line eq '' ){ - return; - } - - if( $line =~ /([^ :]*)\:[ \t]+([^\n]*)/ ){ - $name = $1; - $MAIL_HEADER{$name} = $2; - #print "$name $2\n"; - } - elsif( $name ne '' ){ - $MAIL_HEADER{$name} .= $2; - } - } - -} - -sub check_required_vars { - $err_string = ''; - if( $tbx{'tree'} eq ''){ - $err_string .= "Variable 'tinderbox:tree' not set.\n"; - } - elsif( ! -r $tbx{'tree'} ){ - $err_string .= "Variable 'tinderbox:tree' not set to a valid tree.\n"; - } - if( $tbx{'build'} eq ''){ - $err_string .= "Variable 'tinderbox:build' not set.\n"; - } - if( $tbx{'errorparser'} eq ''){ - $err_string .= "Variable 'tinderbox:errorparser' not set.\n"; - } - - # - # Grab the date in the form of mm/dd/yy hh:mm:ss - # - # Or a GMT unix date - # - if( $tbx{'builddate'} eq ''){ - $err_string .= "Variable 'tinderbox:builddate' not set.\n"; - } - else { - if( $tbx{'builddate'} =~ - /([0-9]*)\/([0-9]*)\/([0-9]*)[ \t]*([0-9]*)\:([0-9]*)\:([0-9]*)/ ){ - - $builddate = timelocal($6,$5,$4,$2,$1-1,$3); - - } - elsif( $tbx{'builddate'} > 7000000 ){ - $builddate = $tbx{'builddate'}; - } - else { - $err_string .= "Variable 'tinderbox:builddate' not of the form MM/DD/YY HH:MM:SS or unix date\n"; - } - - } - - # - # Build Status - # - if( $tbx{'status'} eq ''){ - $err_string .= "Variable 'tinderbox:status' not set.\n"; - } - elsif( ! $tbx{'status'} =~ /success|busted|building/ ){ - $err_string .= "Variable 'tinderbox:status' must be 'success', 'busted' or 'building'\n"; - } - - # - # Report errors - # - if( $err_string ne '' ){ - die $err_string; - } -} - -sub write_build_data { - $t = time; - open( BUILDDATA, ">>$tbx{'tree'}/build.dat" )|| die "can't open $! for writing"; - print BUILDDATA "$t|$builddate|$tbx{'build'}|$tbx{'errorparser'}|$tbx{'status'}|$logfile|$tbx{binaryname}\n"; - close( BUILDDATA ); -} - -sub compress_log_file { - local( $done, $line); - - if( $tbx{'status'} =~ /building/ ){ - return; - } - - open( LOG2, "<$ARGV[0]") || die "cant open $!"; - - # - # Skip past the the RFC822.HEADER - # - $done = 0; - while( !$done && ($line = ) ){ - chop($line); - $done = ($line eq ''); - } - - $logfile = "$$.gz"; - - open( ZIPLOG, "| $gzip -c > $tbx{'tree'}/$logfile" ) || die "can't open $! for writing"; - $inBinary = 0; - $hasBinary = ($tbx{'binaryname'} ne ''); - while( $line = ){ - if( !$inBinary ){ - print ZIPLOG $line; - if( $hasBinary ){ - $inBinary = ($line =~ /^begin [0-7][0-7][0-7] /); - } - } - else { - if( $line =~ /^end\n/ ){ - $inBinary = 0; - } - } - } - close( ZIPLOG ); - close( LOG2 ); - - # - # If a uuencoded binary is part of the build, unpack it. - # - if( $hasBinary ){ - $bin_dir = "$tbx{'tree'}/bin/$builddate/$tbx{'build'}"; - $bin_dir =~ s/ //g; - - system("mkdir -m 0777 -p $bin_dir"); - - # LTNOTE: I'm not sure this is cross platform. - system("/tools/ns/bin/uudecode --output-file=$bin_dir/$tbx{binaryname} < $ARGV[0]"); - } -} - - -sub unlink_log_file { - unlink( $ARGV[0] ); -} diff --git a/mozilla/webtools/tinderbox/reledanim.gif b/mozilla/webtools/tinderbox/reledanim.gif deleted file mode 100644 index 2d6c9685191c2f4e06bb93aaf6f2012cddc5079b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1685 zcmbu8YfzMB6vq#OiWb490V@}m7vw6aJZh#cBl>a^G+0;+N6clGM^REkkrd4kgatuZ zLGaB9LDVS*7$gLeF(Yw>dTc~dk&7ajB_*Rdd6}}e^X%uo^?W;f&iS9;`JZ>gB0?9v zr*j5pcmW{u$7ETOWh%==mVrl%$xM}{5C%9EsZk7}krJ^mhl5cYrBMr;fiJ{kd{mN% zBmv(K$6`dOM2SR!uZt9zBvc|qB7oZ?6xK>WB_I;udgupYVmI1>`y&Kyh}0;C&`61; z$bo}V8>LYTxN|&>F+M^ma3gU)9E%YllmPmQ>mmgvDG&v95@)YQ5yJ(cr~Um#s_#YG!pm2u^18H9|!l& z3A*hEYm9%HnwREV_qYf8zWvs^jv}|n@~o~?^B+w!UO4cw?dias%aIPsctMjBLGP{J zW{7|D_wX}YOcjf5b@~L&nRluuyr1@)snI7<3>sg!As`_ajBXuVuROAU-g67*`Ear3V!Kd?qVYs{kxxxJ})0uZ*@vI z5;KtY?4EeIa%^IiaI!|+`|jE)iw8FZRknGJSl$_2f1~nz!t=eoHj4D@TVJ%RgMNtd z-*(&e;+1{P$Nv81sPc8?-m>BiLAgFV_RzX#-k~SX`Ii}1SS{RT8=?)~d29cWYUgo% zy}J3t0iVa7r61VF9~;(a51KyLoObCg-R5;RzIx4mt;gNy^s}8#8y!^))neKHAz=!@MtPZ*?#jzh%mIB=rg`ckIfAlTaZy=;n!Q59Bg4> zzE|LX-m9u3d%|P&b(2npY{Zc3 zMb;14hi`~Ht?`L3^M0yNDk^T6aBa=Qt)@`YQPhexT*?O@5j-znig diff --git a/mozilla/webtools/tinderbox/showbuilds.cgi b/mozilla/webtools/tinderbox/showbuilds.cgi deleted file mode 100755 index e0063e9da8e..00000000000 --- a/mozilla/webtools/tinderbox/showbuilds.cgi +++ /dev/null @@ -1,552 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -use lib "../bonsai"; - -require 'globals.pl'; -require 'lloydcgi.pl'; -require 'imagelog.pl'; -require 'header.pl'; -$|=1; - -print "Content-type: text/html\n\n\n"; - - -# -# show 36 hours by default -# -if($form{'showall'} != 0 ){ - $mindate = 0; -} -else { - $hours = 36; - if( $form{hours} ne "" ){ - $hours = $form{hours}; - } - $mindate = time - ($hours*60*60); -} - -$colormap = { - success => '00ff00', - busted => 'red', - building => 'yellow' - }; - -# -# Debug hack -# -#$form{'tree'} = DogbertTip; -$tree = $form{'tree'}; - -if( $form{'tree'} eq '' ){ - &show_tree_selector; -} -else { - if( $form{'express'} ) { - &do_express; - } - else { - &load_data; - &load_javascript; - &display_page_head; - &display_build_table; - } -} - - -sub show_tree_selector { - - EmitHtmlHeader("tinderbox"); - - print "

    "; - print ""; - print "
    Select one of the following trees:
    \n"; - print "
      \n"; - - while(<*>) { - if( -d $_ && $_ ne 'data' && $_ ne 'CVS' ){ - print "
    • $_\n"; - } - } - print "
    "; -} - - - -sub display_page_head { - - my ($imageurl,$imagewidth,$imageheight,$quote) = &get_image; - - -# srand; -# $when = 60*10 + int rand(60*40); -# - - -if( -r "$tree/mod.pl" ){ - require "$tree/mod.pl"; -} -else { - $message_of_day = ""; -} - -$treename = $tree . ($tree2 ne "" ? " and $tree2" : "" ); - - EmitHtmlTitleAndHeader("tinderbox: $treename", "tinderbox", - "tree: $treename"); - - - print "$script_str\n"; - print "$message_of_day\n"; - - print ""; - print ""; - print "
    "; - print "


    "; - print "$quote

    "; - print "
    "; - print "

    "; - print "

    "; - print "
    "; - print "L = Show Build Log
    "; - print "L = Show Log comments
    "; - print "C = Show changes that occured since the last build
    "; - print "B = Download binary generated by the build
    "; - print ""; - print "
    Currently Building"; - print "
    Built successfully"; - print "
    Build failed"; - print "
    "; - print "
    "; - print "
    "; - - if( $form{'tree'} eq 'MercuryTip' || $form{'tree'} eq 'FreeSource'){ - print "

    The tree is currently "; - if( &tree_open ){ - print "OPEN"; - } - else { - print "CLOSED"; - } - print "\n"; - } -} - -sub display_build_table { - &display_build_table_header; - &display_build_table_body; - &display_build_table_footer; - -} - -sub display_build_table_body { - local($t); - - $t = 1; - while( $t <= $time_count ){ - display_build_table_row( $t ); - $t++; - } -} - -sub display_build_table_row { - local($t) = @_; - local($tt); - $tt = &print_time($build_time_times->[$t]); - - if( $tree2 ne "" ){ - $qr = ""; - $er = ""; - } - else { - $qr = &query_ref( $td1, $build_time_times->[$t]); - $er = ""; - } - - if ($build_time_times->[$t] % 7200 > 3600) { - $color = "white"; - } else { - $color = "beige"; - } - - print "\n"; - print "${qr}\n${tt}${er}\n"; - - - if( $tree2 ne "" ){ - print "\n"; - $qr = &query_ref( $td1, $build_time_times->[$t]); - print "${qr}X\n"; - } - - print "\n"; - - for $who (sort keys %{$who_list->[$t]} ){ - #$qr = &query_ref( $td1, $build_time_times->[$t],$build_time_times->[$t-1],$who); - $qr = &who_menu( $td1, $build_time_times->[$t],$build_time_times->[$t-1],$who); - print " ${qr}$who\n"; - } - - if( $tree2 ne "" ){ - print "\n"; - $qr = &query_ref( $td2, $build_time_times->[$t]); - print "${qr}X\n"; - - print "\n"; - - for $who (sort keys %{$who_list2->[$t]} ){ - #$qr = &query_ref( $td2, $build_time_times->[$t],$build_time_times->[$t-1],$who); - $qr = &who_menu( $td2, $build_time_times->[$t],$build_time_times->[$t-1],$who); - print " ${qr}$who\n"; - } - } - - $bn = 1; - while( $bn <= $name_count ){ - if( defined($br = $build_table->[$t][$bn])){ - if( $br != -1 ){ - - $hasnote = $br->{hasnote}; - $noteid = $hasnote ? $br->{noteid} : 0; - $rowspan = $br->{rowspan}; - $color = $colormap->{$br->{buildstatus}}; - $status = $br->{buildstatus}; - print "\n"; - - $logfile = $br->{logfile}; - $errorparser = $br->{errorparser}; - $buildname = $br->{buildname}; - if( $tree2 ne "" ){ - $buildname =~ s/^[^ ]* //; - } - $buildname = &url_encode($buildname); - $buildtime = $br->{buildtime}; - $buildtree = $br->{td}->{name}; - - print "\n"; - - if( $hasnote ){ - print ""; - print "\n"; - } - print "\n"; - print "L\n"; - - #print "Build Summary
    \n"; - - if( $br->{previousbuildtime} ){ - $qr = &query_ref($br->{td}, $br->{previousbuildtime},$br->{buildtime}); - print "$qr\n"; - print " C\n"; - #print "What Changed
    \n"; - } - - if( $br->{binaryname} ne '' ){ - $binfile = "$buildtree/bin/$buildtime/$br->{buildname}/$br->{binaryname}"; - $binfile =~ s/ //g; - print " B"; - } - print "
    \n"; - - - } - } - else { - print " \n"; - } - $bn++; - } - - - print "\n"; -} - - -sub display_build_table_header { - local($i,$nspan); - - print "\n"; - - print "\n"; - print "\n"; - - - #print "\n"; - $i = 1; - while ($i <= $name_count){ - - $bn = $build_name_names->[$i]; - $bn =~ s/Clobber/Clbr/g; - $bn =~ s/Depend/Dep/g; - $t = &last_good_time($i); - - if( $form{'narrow'} ){ - $bn =~ s/([^:])/$1
    /g; - $bn = "$bn"; - } - else { - $bn = "$bn"; - - } - - if( $t->{isbusted} ){ - print "\n"; - - print "\n"; - print "\n"; - -} - -sub display_build_table_footer { - print "
    Click time to
    see changes
    since time
    "; - $nspan = ( $tree2 ne "" ? 4 : 1); - print "
    Click name to see what they did"; - #print "Burning builds are busted"; - #print "
    "; - print "$bn\n"; - #print "\n"; - } - else { - print ""; - print "$bn\n"; - } - $i++; - } - print "
    Build Time\n"; - if( $tree2 ne "" ){ - print "$td1->{name}\n"; - print "$td2->{name}\n"; - } - else { - print "Guilty\n"; - } - print "
    \n"; - print "Show more checkin history

    \n"; - - if (open(FOOTER, "<$data_dir/footer.html")) { - while (

    ) { - print $_; - } - close FOOTER; - } - print "Administrate Tinderbox Trees
    "; - - print "

    "; -} - - -sub query_ref { - local( $td, $mindate, $maxdate, $who ) = @_; - - return "{cvs_module}&branch=$td->{cvs_branch}&cvsroot=$td->{cvs_root}&date=explicit&mindate=$mindate&maxdate=$maxdate&who=$who>"; -} - -sub query_ref2 { - local( $td, $mindate, $maxdate, $who ) = @_; - return "../bonsai/cvsquery.cgi?module=$td->{cvs_module}&branch=$td->{cvs_branch}&cvsroot=$td->{cvs_root}&date=explicit&mindate=$mindate&maxdate=$maxdate&who=$who"; -} - - -sub who_menu { - local( $td, $mindate, $maxdate, $who ) = @_; - my $treeflag; - #$qr="../bonsai/cvsquery.cgi?module=$td->{cvs_module}&branch=$td->{cvs_branch}&cvsroot=$td->{cvs_root}&date=explicit&mindate=$mindate&maxdate=$maxdate&who=$who"; - $qr = "../registry/who.cgi?email=$who" - . "&t0=" . &url_encode("What did $who check into the source tree" ) - . "&u0=" . &url_encode( &query_ref2($td,$mindate,$maxdate,$who) ) - . "&t1=" . &url_encode("What has $who been checking in in the last day" ) - . "&u1=" . &url_encode( &query_ref2($td,$mindate,$maxdate,$who) ); - - return "{num},'$who',event,$mindate,$maxdate);\" >"; -} - - -sub tree_open { - open( BID, "<../bonsai/data/batchid") || print "can't open batchid
    "; - ($a,$b,$bid) = split(/ /,); - close( BID ); - open( BATCH, "<../bonsai/data/batch-${bid}") || print "can't open batch-${bid}
    ";; - $done = 0; - while( ($line = ) && !$done ){ - if($line =~ /^set treeopen/) { - chop( $line ); - ($a,$b,$treestate) = split(/ /, $line ); - $done = 1; - } - } - close( BATCH ); - return $treestate; -} - -sub load_javascript { - -$script_str =<<'ENDJS'; - - - - - -ENDJS - -$script_str .= " -\n"; - -} - - -sub do_express { - local($mailtime, $buildtime, $buildname, $errorparser, $buildstatus, $logfile); - local($buildrec); - local(%build); - - open(BUILDLOG, "<$form{'tree'}/build.dat" ) || die ; - while( ){ - chop; - ($mailtime, $buildtime, $buildname, $errorparser, $buildstatus, $logfile) = - split( /\|/ ); - if( $buildstatus eq 'success' || $buildstatus eq 'busted'){ - $build{$buildname} = $buildstatus; - } - } - close( BUILDLOG ); - - @keys = sort keys %build; - $keycount = @keys; - $treename = $form{tree}; - $tm = &print_time(time); - print "" - ."\n"; - for $buildname (@keys ){ - if( $build{$buildname} eq 'success' ){ - print "
    $tree as of $tm
    "; - } - else { - print ""; - print "\n"; - } - print "$buildname"; - } - print "
    \n"; -} diff --git a/mozilla/webtools/tinderbox/showimages.cgi b/mozilla/webtools/tinderbox/showimages.cgi deleted file mode 100755 index b5373b1dc88..00000000000 --- a/mozilla/webtools/tinderbox/showimages.cgi +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - - -$| = 1; - -use lib "../bonsai"; - -require 'globals.pl'; -require 'imagelog.pl'; -require 'lloydcgi.pl'; -require 'header.pl'; - -check_password(); - -print "Content-type: text/html\n\n"; - -@url = (); -@quote = (); -@width = (); -@height = (); -$i = 0; - -EmitHtmlHeader("tinderbox: all images"); - -print '
      -

      These are all of the images currently in -Tinderbox. -

      Please don\'t give out this URL: this is only here for our debugging -needs, and isn\'t linked to by the rest of Tinderbox: because looking at -all the images at once would be be cheating! you\'re supposed to let them -surprise you over time. What, do you read ahead in your desktop calendar, -too? Where\'s your sense of mystery and anticipation? - -

      -

    -'; - - - - -if ($form{'url'} ne "") { - $oldname = "$data_dir/imagelog.txt"; - open (OLD, "<$oldname") || die "Oops; can't open imagelog.txt"; - $newname = "$oldname-$$"; - open (NEW, ">$newname") || die "Can't open $newname"; - $foundit = 0; - while () { - chop; - ($url, $width, $height, $quote) = split(/\`/); - if ($url eq $form{'url'} && $quote eq $form{'origquote'}) { - $foundit = 1; - if ($form{'nukeit'} ne "") { - next; - } - $quote = $form{'quote'}; - } - print NEW "$url`$width`$height`$quote\n"; - } - close OLD; - close NEW; - if (!$foundit) { - print "Hey, couldn't find it! Did someone\n"; - print "else already edit it?

    \n"; - unlink $newname; - } else { - print "Change made.

    "; - rename ($newname, $oldname) || die "Couldn't rename $newname to $oldname"; - } - $form{'doedit'} = "1"; -} - - - - -$doedit = ($form{'doedit'} ne ""); - -if (!$doedit) { - print " -

    - - - -

    "; -} - - - -open( IMAGELOG, "<$data_dir/imagelog.txt" ) || die "can't open file"; -while( ){ - chop; - ($url[$i],$width[$i],$height[$i],$quote[$i]) = split(/\`/); - $i++; -} -close( IMAGELOG ); - -$i--; -print "

    "; -while( $i >= 0 ){ - $qurl = value_encode($url[$i]); - $qquote = value_encode($quote[$i]); - print " -
    -$quote[$i]"; - if ($doedit) { - print " -
    -
    -
    -
    - - - -
    "; - } - print "

    \n"; - $i--; -} - - diff --git a/mozilla/webtools/tinderbox/showlog.cgi b/mozilla/webtools/tinderbox/showlog.cgi deleted file mode 100755 index 84e1fce23b2..00000000000 --- a/mozilla/webtools/tinderbox/showlog.cgi +++ /dev/null @@ -1,282 +0,0 @@ -#!/usr/bonsaitools/bin/perl -- -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS IS" -# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -# License for the specific language governing rights and limitations -# under the License. -# -# The Original Code is the Tinderbox build tool. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are Copyright (C) 1998 -# Netscape Communications Corporation. All Rights Reserved. - -use lib "../bonsai"; - -require 'globals.pl'; -require 'lloydcgi.pl'; -require 'header.pl'; - - -$|=1; - -$LINES_AFTER_ERROR = 5; -$LINES_BEFORE_ERROR = 30; - -$error_file = ''; -$error_file_ref = ''; -$error_line = 0; -$error_guess = 0; - -print "Content-type: text/html\n\n"; - -$error_count = 0; - -$next_err = 0; - -@log_errors = (); -$log_ln = 0; - -if (1) { - $tree = $form{'tree'}; - $errorparser = $form{'errorparser'}; - $logfile = $form{'logfile'}; - $summary = $form{'summary'}; - $buildname = $form{'buildname'}; - $buildtime = $form{'buildtime'}; - $enc_buildname = &url_encode($buildname); - $frames = $form{'frames'}; - $fulltext = $form{'fulltext'}; - $mainframe = $form{'mainframe'}; - #print "$buildname \n $buildtime \n $errorparser \n $logfile \n $tree \n $enc_buildname \n"; -} -else { - $tree = 'FreeSource'; - $errorparser = 'windows'; - $logfile = '19692.gz'; -} - -die "the \"tree\" parameter must be provided\n" unless $tree; -require "$tree/treedata.pl"; - -if( $mainframe ){ - print " - - - - - - -"; - exit 0; -} - -if( $frames ){ - $source_target = "target=SOURCEFRAME"; -} - - -# -# Dynamically load the error parser -# -die "the \"errorparser\" parameter must be provided\n" unless $errorparser; -require "ep_${errorparser}.pl"; - -$time_str = print_time( $form{'buildtime'} ); - -if( $fulltext ){ - $s = 'Show Brief Log'; - $s1 = ''; - $s2 = 'Full'; -} -else { - $s = 'Show Full Log'; - $s1 = 1; - $s2 = 'Brief'; -} - -print "\n"; - -my $heading = "Build Log ($s2)"; -my $subheading = "$form{'buildname'} on $time_str"; -my $title = "$heading - $subheading"; - -EmitHtmlTitleAndHeader($title, $heading, $subheading); - -print " - -
    $s -
    Return to the Build Page -
    -Add a Comment to the Log - -"; - -# -# Print notes -# -$found_note = 0; -open(NOTES,"<$tree/notes.txt") || print "

    warning: Couldn't open $tree/notes.txt

    \n"; -while(){ - chop; - ($nbuildtime,$nbuildname,$nwho,$nnow,$nenc_note) = split(/\|/); - #print "$_
    \n"; - if( $nbuildtime == $buildtime && $nbuildname eq $buildname ){ - if( !$found_note ){ - print "

    Build Comments

    \n"; - $found_note = 1; - } - $now_str = &print_time($nnow); - $note = &url_decode($nenc_note); - print "
    \n[$nwho - $now_str]\n$note\n
    "; - } -} -close(NOTES); - -# -# Print the summery fisrt -# -print " -

    Build Error Summary

    -

    Click error to take you to the error in the log. -

    -";
    -$log_ln = 0;
    -open( BUILD_IN, "$gzip -d -c $tree/$logfile|" );
    -while( $line =  ){
    -    &output_summary_line( $line );
    -}
    -close( BUILD_IN );
    -push @log_errors, 9999999;        
    -
    -print "
    \n"; - -# -# reset the error counter -# -$next_err = 0; - - -print "

    Build Error Log

    \n
    ";
    -$log_ln = 0;
    -open( BUILD_IN, "$gzip -d -c $tree/$logfile|" );
    -while( $line =  ){
    -    &output_log_line( $line );
    -}
    -close( BUILD_IN );
    -
    -
    -print
    -"
    - -

    -No More Errors -
    -
    -
    -"; - - -sub output_summary_line { - local( $line ) = @_; - local( $has_error ); - - $has_error = &has_error( $line ); - - $line =~ s/&/&/g; - $line =~ s/$line"; - $next_err++; - } - $last_was_error = 1; - } - else { - $last_was_error = 0; - } - - $log_ln++; -} - - - -sub output_log_line { - local( $line, $bSummary ) = @_; - local( $has_error, $dur, $dur_min,$dur_sec, $dur_str, $logline ); - - $has_error = &has_error( $line ); - $has_warning = &has_warning( $line ); - - $line =~ s/&/&/g; - $line =~ s/ $error_line - 10 : 1 ); - $goto_line = ($error_line > 10 ? $error_line - 10 : 1 ); - $cvsblame = ($error_guess ? "cvsguess.cgi" : "cvsblame.cgi"); - $line =~ s@$q@$error_file@ - } - - - if( $has_error ){ - if( ! $last_was_error ) { - $logline .= ""; - $next_err++; - $logline .= "NEXT "; - } - else { - $logline .= " "; - } - - $logline .= "$line"; - - $last_was_error = 1; - } - elsif( $has_warning ){ - $logline .= " "; - $logline .= "$line"; - } - else { - $logline .= " $line"; - $last_was_error = 0; - } - - &push_log_line( $logline ); -} - - -sub push_log_line { - local( $ln ) = @_; - if( $fulltext ){ - print $ln; - return; - } - - if( $log_ln > $log_errors[$cur_error] ){ - $cur_error++; - } - - if( $log_ln >= $log_errors[$cur_error] - $LINES_BEFORE_ERROR ){ - if( $log_skip != 0 ){ - print "\n Skipping $log_skip Lines...\n\n"; - $log_skip = 0; - } - print $ln; - } - else { - $log_skip++; - } - $log_ln++; -} diff --git a/mozilla/webtools/tinderbox/star.gif b/mozilla/webtools/tinderbox/star.gif deleted file mode 100644 index b079be2c501f965e2afd106c2d979c43938a6616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmZ?wbhEHb6k!lz_`(1J^LkxAUyr!7H|Y80{P)))zFmvhz1nZzdcTji(iTj0J9T8? zgVSNp&xe1!8oqn`oPDcejvQL^=5oP~CBC0;Ccio#v20ez)&0S5E{B5+Lnjn}vM_?g zbU*~iP6pNl1%y!>J5=h(g?BE%bOz99kIcu4&01dGQ-e$)GA|4+74o55Y zn9gi=)jTj)MEY!_#8KV&BN<_lf(Q8GVpyAQx12tmd(gX3-};NTSP_SE38!{*bgp(w JimD=mH2?(KSy2E0 diff --git a/mozilla/widget/Makefile b/mozilla/widget/Makefile deleted file mode 100644 index 646e5af8b7a..00000000000 --- a/mozilla/widget/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = .. - -DIRS= public src tests - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/widget/build.bat b/mozilla/widget/build.bat deleted file mode 100755 index 7dde3ca897a..00000000000 --- a/mozilla/widget/build.bat +++ /dev/null @@ -1,21 +0,0 @@ -rem -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -rem -rem The contents of this file are subject to the Netscape Public License -rem Version 1.0 (the "NPL"); you may not use this file except in -rem compliance with the NPL. You may obtain a copy of the NPL at -rem http://www.mozilla.org/NPL/ -rem -rem Software distributed under the NPL is distributed on an "AS IS" basis, -rem WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -rem for the specific language governing rights and limitations under the -rem NPL. -rem -rem The Initial Developer of this code under the NPL is Netscape -rem Communications Corporation. Portions created by Netscape are -rem Copyright (C) 1998 Netscape Communications Corporation. All Rights -rem Reserved. -rem - -del s:\ns\raptor\ui\src\windows\win32_d.obj\%1.obj -del s:\ns\raptor\ui\tests\windows\win32_d.obj\winmain.obj -nmake -f makefile.win diff --git a/mozilla/widget/makefile.win b/mozilla/widget/makefile.win deleted file mode 100644 index b7f84e8a5a2..00000000000 --- a/mozilla/widget/makefile.win +++ /dev/null @@ -1,23 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=.. -IGNORE_MANIFEST=1 - -DIRS=public src tests - -include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/widget/public/MANIFEST b/mozilla/widget/public/MANIFEST deleted file mode 100644 index 1f533ef7a18..00000000000 --- a/mozilla/widget/public/MANIFEST +++ /dev/null @@ -1,27 +0,0 @@ -# -# This is a list of local files which get copied to the mozilla:dist:widget directory -# - -nsui.h -nsIWidget.h -nsIButton.h -nsICheckButton.h -nsIListWidget.h -nsIComboBox.h -nsITextWidget.h -nsITextAreaWidget.h -nsIComboBox.h -nsIListBox.h -nsIFileWidget.h -nsIScrollbar.h -nsGUIEvent.h -nsIRadioButton.h -nsIRadioGroup.h -nsIMouseListener.h -nsIEventListener.h -nsIToolkit.h -nsWidgetsCID.h -nsITabWidget.h -nsITooltipWidget.h -nsIAppShell.h -nsStringUtil.h diff --git a/mozilla/widget/public/Makefile b/mozilla/widget/public/Makefile deleted file mode 100644 index 9902ee87e50..00000000000 --- a/mozilla/widget/public/Makefile +++ /dev/null @@ -1,52 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../.. - -DEFINES = -D_IMPL_NS_UI - -EXPORTS = \ - nsStringUtil.h \ - nsui.h \ - nsITabWidget.h \ - nsIWidget.h \ - nsIButton.h \ - nsICheckButton.h\ - nsIListWidget.h \ - nsIComboBox.h \ - nsITextWidget.h \ - nsITextAreaWidget.h \ - nsIComboBox.h \ - nsIListBox.h \ - nsIFileWidget.h \ - nsIScrollbar.h \ - nsGUIEvent.h \ - nsIRadioButton.h\ - nsIRadioGroup.h \ - nsIMouseListener.h \ - nsIEventListener.h \ - nsIToolkit.h \ - nsWidgetsCID.h \ - nsITooltipWidget.h \ - nsIAppShell.h \ - $(NULL) - -MODULE = raptor - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/widget/public/makefile.win b/mozilla/widget/public/makefile.win deleted file mode 100644 index 2d62f975833..00000000000 --- a/mozilla/widget/public/makefile.win +++ /dev/null @@ -1,32 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\.. -IGNORE_MANIFEST=1 - -DEFINES=-D_IMPL_NS_UI -MODULE=raptor - -EXPORTS=nsui.h nsIWidget.h nsIButton.h nsICheckButton.h nsIListWidget.h \ - nsIComboBox.h nsITextWidget.h nsITextAreaWidget.h nsIComboBox.h \ - nsIListBox.h nsIFileWidget.h nsIScrollbar.h nsGUIEvent.h \ - nsIRadioButton.h nsIRadioGroup.h nsIMouseListener.h \ - nsIEventListener.h nsIToolkit.h nsWidgetsCID.h nsITabWidget.h \ - nsITooltipWidget.h nsIAppShell.h nsStringUtil.h - -include <$(DEPTH)\config\rules.mak> - diff --git a/mozilla/widget/public/nsGUIEvent.h b/mozilla/widget/public/nsGUIEvent.h deleted file mode 100644 index e6959ae9974..00000000000 --- a/mozilla/widget/public/nsGUIEvent.h +++ /dev/null @@ -1,322 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsGUIEvent_h__ -#define nsGUIEvent_h__ - -#include "nsPoint.h" -#include "nsRect.h" - -class nsIRenderingContext; -class nsIWidget; - -/** - * Return status for event processors. - */ - -enum nsEventStatus { - /// The event is ignored, do default processing - nsEventStatus_eIgnore, - /// The event is consumed, don't do default processing - nsEventStatus_eConsumeNoDefault, - /// The event is consumed, but do default processing - nsEventStatus_eConsumeDoDefault -}; - -/** - * General graphic user interface event - */ - -struct nsGUIEvent { - /// See GUI MESSAGES, - PRUint32 message; - /// Originator of the event - nsIWidget* widget; - /// in widget relative coordinates - nsISupports* widgetSupports; - /// nsISupports of widget XXX remove the one above and rename this - nsPoint point; - /// elapsed time, in milliseconds, from the time the system was started to the time the message was created - PRUint32 time; - /// Internal platform specific message. - void* nativeMsg; -}; - -/** - * Window resize event - */ - -struct nsSizeEvent : public nsGUIEvent { - /// x,y width, height in pixels - nsRect *windowSize; -}; - -/** - * Window repaint event - */ - -struct nsPaintEvent : public nsGUIEvent { - /// Context to paint in. - nsIRenderingContext *renderingContext; - /// x,y, width, height in pixels of area to paint - nsRect *rect; -}; - -/** - * Scrollbar event - */ - -struct nsScrollbarEvent : public nsGUIEvent { - /// ranges between scrollbar 0 and (maxRange - thumbSize). See nsIScrollbar - PRUint32 position; -}; - - -struct nsInputEvent : public nsGUIEvent { - /// PR_TRUE indicates the shift key in down - PRBool isShift; - /// PR_TRUE indicates the control key in down - PRBool isControl; - /// PR_TRUE indicates the alt key in down - PRBool isAlt; -}; - -/** - * Mouse event - */ - -struct nsMouseEvent : public nsInputEvent { - /// The number of mouse clicks - PRUint32 clickCount; -}; - -/** - * Keyboard event - */ - -struct nsKeyEvent : public nsInputEvent { - /// see NS_VK codes - PRUint32 keyCode; -}; - -/** - * Tooltip event - */ - -struct nsTooltipEvent : public nsGUIEvent { - /// Index of tooltip area which generated the event. @see SetTooltips in nsIWidget - PRUint32 tipIndex; -}; - -/** - * MenuItem event - */ - -struct nsMenuEvent : public nsGUIEvent { - /// Index of the selected menu item - PRUint32 menuItem; -}; - - -/** - * GUI MESSAGES - */ - //@{ - -#define NS_WINDOW_START 100 - -// Widget is being created -#define NS_CREATE (NS_WINDOW_START) -// Widget is being destroyed -#define NS_DESTROY (NS_WINDOW_START + 1) -// Widget was resized -#define NS_SIZE (NS_WINDOW_START + 2) -// Widget gained focus -#define NS_GOTFOCUS (NS_WINDOW_START + 3) -// Widget lost focus -#define NS_LOSTFOCUS (NS_WINDOW_START + 4) -// Widget needs to be repainted -#define NS_PAINT (NS_WINDOW_START + 30) -// Key is pressed down within a window -#define NS_KEY_UP (NS_WINDOW_START + 32) -// Key is released within a window -#define NS_KEY_DOWN (NS_WINDOW_START + 33) -// Window has been moved to a new location. -// The events point contains the x, y location in screen coordinates -#define NS_MOVE (NS_WINDOW_START + 34) - -// Tab control's selected tab has changed -#define NS_TABCHANGE (NS_WINDOW_START + 35) - -// Tooltip should be shown -#define NS_SHOW_TOOLTIP (NS_WINDOW_START + 36) -// Tooltip should be hidden -#define NS_HIDE_TOOLTIP (NS_WINDOW_START + 37) -// Menu item selected -#define NS_MENU_SELECTED (NS_WINDOW_START + 38) - - -#define NS_MOUSE_MESSAGE_START 300 -#define NS_MOUSE_MOVE (NS_MOUSE_MESSAGE_START) -#define NS_MOUSE_LEFT_BUTTON_UP (NS_MOUSE_MESSAGE_START + 1) -#define NS_MOUSE_LEFT_BUTTON_DOWN (NS_MOUSE_MESSAGE_START + 2) -#define NS_MOUSE_MIDDLE_BUTTON_UP (NS_MOUSE_MESSAGE_START + 10) -#define NS_MOUSE_MIDDLE_BUTTON_DOWN (NS_MOUSE_MESSAGE_START + 11) -#define NS_MOUSE_RIGHT_BUTTON_UP (NS_MOUSE_MESSAGE_START + 20) -#define NS_MOUSE_RIGHT_BUTTON_DOWN (NS_MOUSE_MESSAGE_START + 21) -#define NS_MOUSE_ENTER (NS_MOUSE_MESSAGE_START + 22) -#define NS_MOUSE_EXIT (NS_MOUSE_MESSAGE_START + 23) -#define NS_MOUSE_LEFT_DOUBLECLICK (NS_MOUSE_MESSAGE_START + 24) -#define NS_MOUSE_RIGHT_DOUBLECLICK (NS_MOUSE_MESSAGE_START + 25) - -#define NS_SCROLLBAR_MESSAGE_START 1000 -#define NS_SCROLLBAR_POS (NS_SCROLLBAR_MESSAGE_START) -#define NS_SCROLLBAR_PAGE_NEXT (NS_SCROLLBAR_MESSAGE_START + 1) -#define NS_SCROLLBAR_PAGE_PREV (NS_SCROLLBAR_MESSAGE_START + 2) -#define NS_SCROLLBAR_LINE_NEXT (NS_SCROLLBAR_MESSAGE_START + 3) -#define NS_SCROLLBAR_LINE_PREV (NS_SCROLLBAR_MESSAGE_START + 4) -//@} - -/* - * Virtual key bindings for keyboard events - * NOTE: These are repeated in nsIDOMEvent.h and must be kept in sync - */ - -#define NS_VK_CANCEL 0x03 -#define NS_VK_BACK 0x08 -#define NS_VK_TAB 0x09 -#define NS_VK_CLEAR 0x0C -#define NS_VK_RETURN 0x0D -#define NS_VK_SHIFT 0x10 -#define NS_VK_CONTROL 0x11 -#define NS_VK_ALT 0x12 -#define NS_VK_PAUSE 0x13 -#define NS_VK_CAPS_LOCK 0x14 -#define NS_VK_ESCAPE 0x1B -#define NS_VK_SPACE 0x20 -#define NS_VK_PAGE_UP 0x21 -#define NS_VK_PAGE_DOWN 0x22 -#define NS_VK_END 0x23 -#define NS_VK_HOME 0x24 -#define NS_VK_LEFT 0x25 -#define NS_VK_UP 0x26 -#define NS_VK_RIGHT 0x27 -#define NS_VK_DOWN 0x28 -#define NS_VK_PRINTSCREEN 0x2C -#define NS_VK_INSERT 0x2D -#define NS_VK_DELETE 0x2E - -// NS_VK_0 - NS_VK_9 match their ascii values -#define NS_VK_0 0x30 -#define NS_VK_1 0x31 -#define NS_VK_2 0x32 -#define NS_VK_3 0x33 -#define NS_VK_4 0x34 -#define NS_VK_5 0x35 -#define NS_VK_6 0x36 -#define NS_VK_7 0x37 -#define NS_VK_8 0x38 -#define NS_VK_9 0x39 - -#define NS_VK_SEMICOLON 0x3B -#define NS_VK_EQUALS 0x3D - -// NS_VK_A - NS_VK_Z match their ascii values -#define NS_VK_A 0x41 -#define NS_VK_B 0x42 -#define NS_VK_C 0x43 -#define NS_VK_D 0x44 -#define NS_VK_E 0x45 -#define NS_VK_F 0x46 -#define NS_VK_G 0x47 -#define NS_VK_H 0x48 -#define NS_VK_I 0x49 -#define NS_VK_J 0x4A -#define NS_VK_K 0x4B -#define NS_VK_L 0x4C -#define NS_VK_M 0x4D -#define NS_VK_N 0x4E -#define NS_VK_O 0x4F -#define NS_VK_P 0x50 -#define NS_VK_Q 0x51 -#define NS_VK_R 0x52 -#define NS_VK_S 0x53 -#define NS_VK_T 0x54 -#define NS_VK_U 0x55 -#define NS_VK_V 0x56 -#define NS_VK_W 0x57 -#define NS_VK_X 0x58 -#define NS_VK_Y 0x59 -#define NS_VK_Z 0x5A - -#define NS_VK_NUMPAD0 0x60 -#define NS_VK_NUMPAD1 0x61 -#define NS_VK_NUMPAD2 0x62 -#define NS_VK_NUMPAD3 0x63 -#define NS_VK_NUMPAD4 0x64 -#define NS_VK_NUMPAD5 0x65 -#define NS_VK_NUMPAD6 0x66 -#define NS_VK_NUMPAD7 0x67 -#define NS_VK_NUMPAD8 0x68 -#define NS_VK_NUMPAD9 0x69 -#define NS_VK_MULTIPLY 0x6A -#define NS_VK_ADD 0x6B -#define NS_VK_SEPARATOR 0x6C -#define NS_VK_SUBTRACT 0x6D -#define NS_VK_DECIMAL 0x6E -#define NS_VK_DIVIDE 0x6F -#define NS_VK_F1 0x70 -#define NS_VK_F2 0x71 -#define NS_VK_F3 0x72 -#define NS_VK_F4 0x73 -#define NS_VK_F5 0x74 -#define NS_VK_F6 0x75 -#define NS_VK_F7 0x76 -#define NS_VK_F8 0x77 -#define NS_VK_F9 0x78 -#define NS_VK_F10 0x79 -#define NS_VK_F11 0x7A -#define NS_VK_F12 0x7B -#define NS_VK_F13 0x7C -#define NS_VK_F14 0x7D -#define NS_VK_F15 0x7E -#define NS_VK_F16 0x7F -#define NS_VK_F17 0x80 -#define NS_VK_F18 0x81 -#define NS_VK_F19 0x82 -#define NS_VK_F20 0x83 -#define NS_VK_F21 0x84 -#define NS_VK_F22 0x85 -#define NS_VK_F23 0x86 -#define NS_VK_F24 0x87 - -#define NS_VK_NUM_LOCK 0x90 -#define NS_VK_SCROLL_LOCK 0x91 - -#define NS_VK_COMMA 0xBC -#define NS_VK_PERIOD 0xBE -#define NS_VK_SLASH 0xBF -#define NS_VK_BACK_QUOTE 0xC0 -#define NS_VK_OPEN_BRACKET 0xDB -#define NS_VK_BACK_SLASH 0xDC -#define NS_VK_CLOSE_BRACKET 0xDD -#define NS_VK_QUOTE 0xDE - - -#endif // nsGUIEvent_h__ - diff --git a/mozilla/widget/public/nsIAppShell.h b/mozilla/widget/public/nsIAppShell.h deleted file mode 100644 index 38877aba487..00000000000 --- a/mozilla/widget/public/nsIAppShell.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIAppShell_h__ -#define nsIAppShell_h__ - -#include "nsString.h" - -/** - * Flags for the getNativeData function. - * See GetNativeData() - */ -#define NS_NATIVE_SHELL 0 - - -#define NS_IAPPSHELL_IID \ -{ 0xa0757c31, 0xeeac, 0x11d1, { 0x9e, 0xc1, 0x0, 0xaa, 0x0, 0x2f, 0xb8, 0x21 } }; - - -/** - * During the nsIAppShell Run method notify this listener - * after each message dispatch. - * @see SetDispatchListener member function of nsIAppShell - */ - -class nsDispatchListener { - public: - virtual void AfterDispatch() = 0; -}; - - -/** - * Application shell used for Test applications - */ - -class nsIAppShell : public nsISupports -{ - -public: - - /** - * Creates an application shell - */ - - virtual void Create(int* argc, char ** argv) = 0; - - /** - * Enter an event loop. - * Don't leave until application exits. - */ - - virtual nsresult Run() = 0; - - /** - * After event dispatch execute app specific code - */ - - virtual void SetDispatchListener(nsDispatchListener* aDispatchListener) = 0; - - /** - * Exit the handle event loop - */ - - virtual void Exit() = 0; - - /** - * Returns Native Data - */ - - virtual void* GetNativeData(PRUint32 aDataType) = 0; - - -}; - -#endif // nsIAppShell_h__ - - diff --git a/mozilla/widget/public/nsIButton.h b/mozilla/widget/public/nsIButton.h deleted file mode 100644 index f7ec5cb650e..00000000000 --- a/mozilla/widget/public/nsIButton.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIButton_h__ -#define nsIButton_h__ - -#include "nsIWidget.h" -#include "nsString.h" - -// {18032AD0-B265-11d1-AA2A-000000000000} -#define NS_IBUTTON_IID \ -{ 0x18032ad0, 0xb265, 0x11d1, \ - { 0xaa, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } } - -/** - * Push button widget. - * Automatically shows itself as depressed when clicked on. - */ -class nsIButton : public nsIWidget { - - public: - - /** - * Set the button label - * - * @param aText button label - */ - - virtual void SetLabel(const nsString &aText) = 0; - - /** - * Get the button label - * - * @param aBuffer contains label upon return - */ - - virtual void GetLabel(nsString &aBuffer) = 0; - -}; - -#endif diff --git a/mozilla/widget/public/nsICheckButton.h b/mozilla/widget/public/nsICheckButton.h deleted file mode 100644 index b1177b966b3..00000000000 --- a/mozilla/widget/public/nsICheckButton.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsICheckButton_h__ -#define nsICheckButton_h__ - -#include "nsIButton.h" - -// {961085F5-BD28-11d1-97EF-00609703C14E} -#define NS_ICHECKBUTTON_IID \ -{ 0x961085f5, 0xbd28, 0x11d1, { 0x97, 0xef, 0x0, 0x60, 0x97, 0x3, 0xc1, 0x4e } }; - -/** - * Checkbox widget. - * Can show itself in a checked or unchecked state. - * The checkbox widget does not automatically show itself checked or unchecked when clicked on. - */ -class nsICheckButton : public nsIButton { - -public: - - /** - * Set the check state. - * @param aState PR_TRUE show as checked. PR_FALSE show unchecked. - */ - - virtual void SetState(PRBool aState) = 0; - - /** - * Get the check state. - * @return PR_TRUE if checked. PR_FALSE if unchecked. - */ - - virtual PRBool GetState() = 0; - -}; - -#endif // nsICheckButton_h__ - diff --git a/mozilla/widget/public/nsIComboBox.h b/mozilla/widget/public/nsIComboBox.h deleted file mode 100644 index bd56e3a4738..00000000000 --- a/mozilla/widget/public/nsIComboBox.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIComboBox_h__ -#define nsIComboBox_h__ - -#include "nsIListWidget.h" -#include "nsString.h" - -// {961085F6-BD28-11d1-97EF-00609703C14E} -#define NS_ICOMBOBOX_IID \ -{ 0x961085f6, 0xbd28, 0x11d1, { 0x97, 0xef, 0x0, 0x60, 0x97, 0x3, 0xc1, 0x4e } }; - - -/** - * Initialize combobox data - */ - -struct nsComboBoxInitData : public nsWidgetInitData { - PRUint32 mDropDownHeight; // in pixels -}; - -/** - * Single selection drop down list. See nsIListWidget for capabilities - */ - -class nsIComboBox : public nsIListWidget { -}; - - -#endif // nsIComboBox_h__ - - - diff --git a/mozilla/widget/public/nsIEventListener.h b/mozilla/widget/public/nsIEventListener.h deleted file mode 100644 index e2546316db5..00000000000 --- a/mozilla/widget/public/nsIEventListener.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIEventListener_h__ -#define nsIEventListener_h__ - -#include "nsGUIEvent.h" - -/** - * Event listener interface. - * Alternative to a callback for recieving events. - */ - -class nsIEventListener { - -public: - - /** - * Processes all events. - * If a mouse listener is registered this method will not process mouse events. - * @param anEvent the event to process. See nsGUIEvent.h for event types. - */ - - virtual nsEventStatus ProcessEvent(const nsGUIEvent & anEvent) = 0; - -}; - -#endif // nsIEventListener_h__ diff --git a/mozilla/widget/public/nsIFileWidget.h b/mozilla/widget/public/nsIFileWidget.h deleted file mode 100644 index 37b1d01e75f..00000000000 --- a/mozilla/widget/public/nsIFileWidget.h +++ /dev/null @@ -1,98 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIFileWidget_h__ -#define nsIFileWidget_h__ - -#include "nsString.h" - -// {F8030015-C342-11d1-97F0-00609703C14E} -#define NS_IFILEWIDGET_IID \ -{ 0xf8030015, 0xc342, 0x11d1, { 0x97, 0xf0, 0x0, 0x60, 0x97, 0x3, 0xc1, 0x4e } }; - - -/** - * File selector mode - */ - -enum nsMode { - /// Load a file or directory - eMode_load, - /// Save a file or directory - eMode_save }; - -/** - * File selector widget. - * Modally selects files for loading or saving from a list. - */ - -class nsIFileWidget : public nsISupports -{ - -public: - - /** - * Creates a file widget with the specified title and mode. - * @param aParent the owner of the widget - * @param aTitle the title of the widget - * @param aMode the mode of the widget - * @param aContext context for displaying widget - * @param aToolkit toolkit associated with file widget - * @param aInitData data that is used for widget initialization - */ - - virtual void Create( nsIWidget *aParent, - nsString& aTitle, - nsMode aMode, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - void *aInitData = 0) = 0; - - /** - * Set the list of file filters - * - * @param aNumberOfFilter number of filters. - * @param aTitle array of filter titles - * @param aFilter array of filters to associate with titles - * @return void - * - */ - - virtual void SetFilterList(PRUint32 aNumberOfFilters,const nsString aTitles[],const nsString aFilters[]) = 0; - - /** - * Show File Dialog. The dialog is displayed modally. - * - * @return PR_TRUE if user selects OK, PR_FALSE if user selects CANCEL - * - */ - - virtual PRBool Show() = 0; - - /** - * Get the file or directory including the full path. - * - * @param aFile on exit it contains the file or directory selected - */ - - virtual void GetFile(nsString& aFile) = 0; - -}; - -#endif // nsIFileWidget_h__ - diff --git a/mozilla/widget/public/nsIListBox.h b/mozilla/widget/public/nsIListBox.h deleted file mode 100644 index e87d5962eb3..00000000000 --- a/mozilla/widget/public/nsIListBox.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIListBox_h__ -#define nsIListBox_h__ - -#include "nsIListWidget.h" -#include "nsString.h" - -// {F8030014-C342-11d1-97F0-00609703C14E} -#define NS_ILISTBOX_IID \ -{ 0xf8030014, 0xc342, 0x11d1, { 0x97, 0xf0, 0x0, 0x60, 0x97, 0x3, 0xc1, 0x4e } }; - - -/** - * Initialize list box data - */ - -struct nsListBoxInitData : public nsWidgetInitData { - PRBool mMultiSelect; -}; - -/** - * Single or multi selection list of items. - * Unlike a nsIWidget, The the list widget must automatically clear - * itself to the background color when paint messages are generated. - * The listbox always has a vertical scrollbar. It never has a - * horizontal scrollbar. - */ - -class nsIListBox : public nsIListWidget { - -public: - - /** - * Set the listbox to be multi-select. - * @param aMultiple PR_TRUE can have multiple selections. PR_FALSE single - * selections only. - * @return void - * - */ - - virtual void SetMultipleSelection(PRBool aMultipleSelections) = 0; - - /** - * Return the number of selected items. For single selection list box this - * @return the number of selected items - * can be 1 or 0. - * - */ - virtual PRInt32 GetSelectedCount() = 0; - - /** - * Retrieves the indices of the selected items. - * @param aIndices Array to hold the selected items. Use GetSelectedCount to - * determine how large the array needs to be. - * @param aSize Size of the aIndices array - * - */ - virtual void GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) = 0; - - /** - * Sets the indices of the selected items. - * @param aIndices Array to hold the selected items. Use GetSelectedCount to - * determine how large the array needs to be. - * @param aSize Size of the aIndices array - * - */ - virtual void SetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) = 0; - -}; - -#endif // nsIListBox_h__ - - - diff --git a/mozilla/widget/public/nsIListWidget.h b/mozilla/widget/public/nsIListWidget.h deleted file mode 100644 index a2121bdd859..00000000000 --- a/mozilla/widget/public/nsIListWidget.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIListWidget_h__ -#define nsIListWidget_h__ - -#include "nsIWidget.h" -#include "nsString.h" - -// {F8030013-C342-11d1-97F0-00609703C14E} -#define NS_ILISTWIDGET_IID \ -{ 0xf8030013, 0xc342, 0x11d1, { 0x97, 0xf0, 0x0, 0x60, 0x97, 0x3, 0xc1, 0x4e } }; - -/** - * - * Base class for nsIListBox and nsIComboBox - * - */ - -class nsIListWidget : public nsIWidget { - -public: - - /** - * Set an item at the specific position - * - * @param aItem the item name. The item has to be null terminated - * @param aPosition the position the item should be inserted at - * 0 is at the top of the list - * -1 is at the end of the list - */ - virtual void AddItemAt(nsString &aItem, PRInt32 aPosition) = 0; - - /** - * Finds the first occurrence of the specified item - * - * @param aItem the string to be filled - * @param aStartPos the starting position (index) - * @return PR_TRUE if successful, PR_FALSE otherwise - * - */ - virtual PRInt32 FindItem(nsString &aItem, PRInt32 aStartPos) = 0; - - /** - * Returns the number of items in the list - * - * @return the number of items - * - */ - virtual PRInt32 GetItemCount() = 0; - - /** - * Remove the first occurrence of the specified item - * - * @param aPosition the item position - * 0 is at the top of the list - * -1 is at the end of the list - * - * @return PR_TRUE if successful, PR_FALSE otherwise - * - */ - virtual PRBool RemoveItemAt(PRInt32 aPosition) = 0; - - /** - * Gets an item at a specific location - * - * @param anItem on return contains the string of the item at that position - * @param aPosition the Position of the item - * - */ - virtual PRBool GetItemAt(nsString& anItem, PRInt32 aPosition) = 0; - - /** - * Gets the selected item for a single selection list - * - * @param aItem on return contains the string of the selected item - * - */ - virtual void GetSelectedItem(nsString &aItem) = 0; - - /** - * Returns with the index of the selected item - * - * @return PRInt32, index of selected item - * - */ - virtual PRInt32 GetSelectedIndex() = 0; - - /** - * Select the item at the specified position - * - * @param PRInt32, the item position - * 0 is at the top of the list - * -1 is at the end of the list - * - */ - virtual void SelectItem(PRInt32 aPosition) = 0; - - /** - * Deselects all the items in the list - * - */ - virtual void Deselect() = 0; - -}; - -#endif // nsIListWidget_h__ - - - diff --git a/mozilla/widget/public/nsIMouseListener.h b/mozilla/widget/public/nsIMouseListener.h deleted file mode 100644 index 8a56f3c0ec6..00000000000 --- a/mozilla/widget/public/nsIMouseListener.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - - -#ifndef nsIMouseListener_h__ -#define nsIMouseListener_h__ - -#include "nsGUIEvent.h" - -/** - * - * Mouse up/down/move event listener - * - */ - -class nsIMouseListener { - - public: - - /** - * Processes a mouse pressed event - * @param aMouseEvent See nsGUIEvent.h - * @return whether the event was consumed or ignored. See nsEventStatus - */ - virtual nsEventStatus MousePressed(const nsGUIEvent & aMouseEvent) = 0; - - /** - * Processes a mouse release event - * @param aMouseEvent See nsGUIEvent.h - * @return whether the event was consumed or ignored. See nsEventStatus - */ - virtual nsEventStatus MouseReleased(const nsGUIEvent & aMouseEvent) = 0; - - /** - * Processes a mouse clicked event - * @param aMouseEvent See nsGUIEvent.h - * @return whether the event was consumed or ignored. See nsEventStatus - * - */ - virtual nsEventStatus MouseClicked(const nsGUIEvent & aMouseEvent) = 0; - - /** - * Processes a mouse moved event - * @param aMouseEvent See nsGUIEvent.h - * @return whether the event was consumed or ignored. See nsEventStatus - */ - virtual nsEventStatus MouseMoved(const nsGUIEvent & aMouseEvent) = 0; - -}; - -#endif // nsIMouseListener_h__ diff --git a/mozilla/widget/public/nsIRadioButton.h b/mozilla/widget/public/nsIRadioButton.h deleted file mode 100644 index 4f69e12065f..00000000000 --- a/mozilla/widget/public/nsIRadioButton.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIRadioButton_h__ -#define nsIRadioButton_h__ - -#include "nsIButton.h" - -#define NS_IRADIOBUTTON_IID \ -{ 0x18032ad4, 0xb265, 0x11d2, \ -{ 0xaa, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } } - -class nsIRadioGroup; - -/** - * RadioButton widget. Can show itself in a checked or unchecked state. - * The RadioButton widget automatically shows itself checked or unchecked when clicked on. - */ - -class nsIRadioButton : public nsIButton { - - public: - - /** - * Set the radio state. - * @param aState PR_TRUE sets the RadioButton and unsets all siblings, PR_FALSE unsets it - * - */ - virtual void SetState(PRBool aState) = 0; - - /** - * Gets the state the RadioButton - * - * @return PR_TRUE if set, PR_FALSE if unset - * - */ - virtual PRBool GetState() = 0; - -}; - -#endif // nsIRadioButton_h__ - - diff --git a/mozilla/widget/public/nsIRadioGroup.h b/mozilla/widget/public/nsIRadioGroup.h deleted file mode 100644 index b7b41dfcccb..00000000000 --- a/mozilla/widget/public/nsIRadioGroup.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsIRadioGroup_h__ -#define nsIRadioGroup_h__ - -#include "nsString.h" - -#define NS_IRADIOGROUP_IID \ -{ 0x961085f1, 0xbd28, 0x11d1, \ -{ 0x97, 0xef, 0x0, 0x60, 0x97, 0x3, 0xc1, 0x4e } } - - -class nsIRadioGroup; -class nsIRadioButton; -class nsIEnumerator; - -/** - * Helper class for implementing a "group" of radio buttons - * - */ -class nsIRadioGroup : public nsISupports -{ - -public: - - /** - * Adds a RadioButton to the group - * @param aRadioBtn the radio button to be added - * - */ - virtual void Add(nsIRadioButton * aRadioBtn) = 0; - - /** - * Removes a RadioButton from the group - * @param aRadioBtn the radio button to be removed - * - */ - virtual void Remove(nsIRadioButton * aRadioBtn) = 0; - - /** - * Sets the name of the RadioGroup - * @param aName The new name of the radio group - * - */ - virtual void SetName(const nsString &aName) = 0; - - /** - * Tells the RadioGroup that a child RadioButton has been clicked and it should set - * the approproate state on the other buttons - * @param aChild The RadioButton that was clicked - * - */ - virtual void Clicked(nsIRadioButton * aChild) = 0; - - /** - * Gets the enumeration of children - * @return The enumeration of children (radio buttons) in the RadioGroup - * - */ - virtual nsIEnumerator* GetChildren() = 0; -}; - -#endif // nsIRadioGroup_h__ - diff --git a/mozilla/widget/public/nsIScrollbar.h b/mozilla/widget/public/nsIScrollbar.h deleted file mode 100644 index 9ce2308ca50..00000000000 --- a/mozilla/widget/public/nsIScrollbar.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIScrollbar_h__ -#define nsIScrollbar_h__ - -#include "nsIWidget.h" - -// {18032AD2-B265-11d1-AA2A-000000000000} -#define NS_ISCROLLBAR_IID \ -{ 0x18032ad2, 0xb265, 0x11d1, \ -{ 0xaa, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } } - - -/** - * - * Scrollbar, converts mouse input into values that can be used - * to shift the contents of a window. - * - */ - - -class nsIScrollbar : public nsIWidget -{ -public: - - /** - * Set the scrollbar range - * @param aEndRange set range for scrollbar from 0 to aEndRange - * - */ - virtual void SetMaxRange(PRUint32 aEndRange) = 0; - - /** - * Get the scrollbar range - * @return the upper end of the scrollbar range - */ - virtual PRUint32 GetMaxRange() = 0; - - /** - * Set the thumb position. - * @param aPos a value between (startRange) and (endRange - thumbSize) - * - */ - virtual void SetPosition(PRUint32 aPos) = 0; - - /** - * Get the thumb position. - * @return a value between (startRange) and (endRange - thumbSize) - * - */ - virtual PRUint32 GetPosition() = 0; - - /** - * Set the thumb size. - * @param aSize size of the thumb. Must be a value between - * startRange and endRange - */ - virtual void SetThumbSize(PRUint32 aSize) = 0; - - /** - * Get the thumb size. - * @return size of the thumb. The value is between - * startRange and endRange - */ - virtual PRUint32 GetThumbSize() = 0; - - /** - * Set the line increment. - * @param aSize size of the line increment. The value must - * be between startRange and endRange - */ - virtual void SetLineIncrement(PRUint32 aSize) = 0; - - /** - * Get the line increment. - * @return size of the line increment. The value is - * between startRange and endRange - */ - virtual PRUint32 GetLineIncrement() = 0; - - /** - * Set all scrollbar parameters at once - * @param aMaxRange set range for scrollbar from 0 to aMaxRange - * @param aThumbSize size of the thumb. Must be a value between - * startRange and endRange - * @param aPosition a value between (startRange) and (endRange - thumbSize) - * @param aLineIncrement size of the line increment. The value must - * be between startRange and endRange - */ - virtual void SetParameters(PRUint32 aMaxRange, PRUint32 aThumbSize, - PRUint32 aPosition, PRUint32 aLineIncrement) = 0; -}; - -#endif // nsIScrollbar_h__ diff --git a/mozilla/widget/public/nsITabWidget.h b/mozilla/widget/public/nsITabWidget.h deleted file mode 100644 index 3a48a15714f..00000000000 --- a/mozilla/widget/public/nsITabWidget.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsITabWidget_h__ -#define nsITabWidget_h__ - -#include "nsIWidget.h" -#include "nsString.h" - -#define NS_ITABWIDGET_IID \ -{ 0xf05ba6e0, 0xd4a7, 0x11d1, { 0x9e, 0xc0, 0x0, 0xaa, 0x0, 0x2f, 0xb8, 0x21 } }; - -/** - * Tab widget. - * Presents a lists of tabs to be clicked on. - */ -class nsITabWidget : public nsIWidget { - - public: - - /** - * Setup the tabs - * - * @param aNumberOfTabs The number of tabs in aTabLabels and aTabID - * @param aTabLabels title displayed in the tab - */ - - virtual void SetTabs(PRUint32 aNumberOfTabs, const nsString aTabLabels[]) = 0; - - /** - * Get selected tab - * - * @return the index of the selected tab. Index ranges between 0 and (NumberOfTabs - 1) - */ - - virtual PRUint32 GetSelectedTab() = 0; - -}; - -#endif diff --git a/mozilla/widget/public/nsITextAreaWidget.h b/mozilla/widget/public/nsITextAreaWidget.h deleted file mode 100644 index 3a4309b76e2..00000000000 --- a/mozilla/widget/public/nsITextAreaWidget.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsITextAreaWidget_h__ -#define nsITextAreaWidget_h__ - -#include "nsIWidget.h" -#include "nsITextWidget.h" -#include "nsString.h" - -// {F8030012-C342-11d1-97F0-00609703C14E} -#define NS_ITEXTAREAWIDGET_IID \ -{ 0xf8030012, 0xc342, 0x11d1, { 0x97, 0xf0, 0x0, 0x60, 0x97, 0x3, 0xc1, 0x4e } }; - -/** - * Multi-line text editor. - * See nsITextWidget for capabilities. - * Displays a scrollbar when the text content exceeds the number of lines - * displayed. - * Unlike a nsIWidget, The textarea must automatically clear - * itself to the background color when paint messages are generated. - */ - -class nsITextAreaWidget : public nsITextWidget -{ -}; - -#endif // nsITextAreaWidget_h__ - diff --git a/mozilla/widget/public/nsITextWidget.h b/mozilla/widget/public/nsITextWidget.h deleted file mode 100644 index 712dc311dbf..00000000000 --- a/mozilla/widget/public/nsITextWidget.h +++ /dev/null @@ -1,155 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsITextWidget_h__ -#define nsITextWidget_h__ - -#include "nsIWidget.h" -#include "nsString.h" - -// {F8030011-C342-11d1-97F0-00609703C14E} -#define NS_ITEXTWIDGET_IID \ -{ 0xf8030011, 0xc342, 0x11d1, { 0x97, 0xf0, 0x0, 0x60, 0x97, 0x3, 0xc1, 0x4e } }; - - -struct nsTextWidgetInitData : public nsWidgetInitData { - PRBool mIsPassword; -}; - - -/** - * - * Single line text editor. - * Unlike a nsIWidget, The text editor must automatically clear - * itself to the background color when paint messages are generated. - * - */ - -class nsITextWidget : public nsIWidget -{ - - public: - - /** - * Get the text of this component. - * - * @param aTextBuffer on return contains the text of this component - * @param aBufferSize the size of the buffer passed in - * @return the number of char copied - * - */ - - virtual PRUint32 GetText(nsString &aTextBuffer, PRUint32 aBufferSize) = 0; - - /** - * Set the text of this component. - * - * @param aTextBuffer on return it contains the text contents. - * @return the number of chars in the text string - * - */ - - virtual PRUint32 SetText(const nsString &aText) = 0; - - /** - * Insert text into this component. - * When aStartPos and aEndPos are a valid range this function performs a replace. - * When aStartPos and aEndPos are equal this function performs an insert. - * When aStartPos and aEndPos are both -1 (0xFFFFFFFF) this function performs an append. - * If aStartPos and aEndPos are out of range they are rounded to the closest end. - * - * @param aText the text to set - * @param aStartPos starting position for inserting text - * @param aEndPos ending position for inserting text - */ - - virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) = 0; - - /** - * Remove any content from this text widget - */ - - virtual void RemoveText() = 0; - - /** - * Indicates a password will be entered. - * - * @param aIsPassword PR_TRUE shows contents as asterisks. PR_FALSE shows - * contents as normal text. - */ - - virtual void SetPassword(PRBool aIsPassword) = 0; - - /** - * Sets the maximum number of characters the widget can hold - * - * @param aChars maximum number of characters for this widget. if 0 then there isn't any limit - */ - - virtual void SetMaxTextLength(PRUint32 aChars) = 0; - - - /** - * Set the text widget to be read-only - * - * @param aReadOnlyFlag PR_TRUE the widget is read-only, - * PR_FALSE indicates the widget is writable. - * @return PR_TRUE if it was read only. PR_FALSE if it was writable - */ - - virtual PRBool SetReadOnly(PRBool aReadOnlyFlag) = 0; - - /** - * Select all of the contents - */ - - virtual void SelectAll() = 0; - - /** - * Set the selection in this text component - * @param aStartSel starting selection position in characters - * @param aEndSel ending selection position in characters - */ - - virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) = 0; - - /** - * Get the selection in this text component - * @param aStartSel starting selection position in characters - * @param aEndSel ending selection position in characters - */ - - virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) = 0; - - /** - * Set the caret position - * @param aPosition caret position in characters - */ - - virtual void SetCaretPosition(PRUint32 aPosition) = 0; - - /** - * Get the caret position - * @return caret position in characters - */ - - virtual PRUint32 GetCaretPosition() = 0; - -}; - -#endif // nsITextWidget_h__ - diff --git a/mozilla/widget/public/nsIToolkit.h b/mozilla/widget/public/nsIToolkit.h deleted file mode 100644 index 74c0a12d28a..00000000000 --- a/mozilla/widget/public/nsIToolkit.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIToolkit_h__ -#define nsIToolkit_h__ - -#include "nsISupports.h" -#include "prthread.h" - -// {18032BD0-B265-11d1-AA2A-000000000000} -#define NS_ITOOLKIT_IID \ -{ 0x18032bd0, 0xb265, 0x11d1, \ - { 0xaa, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } } - - -/** - * - * Toolkit to associate with widgets. - * Each widget that is created must belong to a specific toolkit - * The toolkit is used to switch to the appropriate thread when - * the message pump for the widget is processed. - */ - -class nsIToolkit : public nsISupports { - - public: - - /** - * Initialize this toolkit with aThread. - * @param aThread The thread passed in runs the message pump. - * NULL can be passed in, in which case a new thread gets created - * and a message pump will run in that thread - * - */ - virtual void Init(PRThread *aThread) = 0; - -}; - -#endif diff --git a/mozilla/widget/public/nsITooltipWidget.h b/mozilla/widget/public/nsITooltipWidget.h deleted file mode 100644 index fb5f08cdf27..00000000000 --- a/mozilla/widget/public/nsITooltipWidget.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsITooltipWidget_h__ -#define nsITooltipWidget_h__ - -#include "nsIWidget.h" -#include "nsString.h" - -#define NS_ITOOLTIPWIDGET_IID \ -{ 0x2910c191, 0xe38a, 0x11d1, { 0x9e, 0xc1, 0x0, 0xaa, 0x0, 0x2f, 0xb8, 0x21 } }; - -/** - * - * Tool tip display widget - * - */ - -class nsITooltipWidget : public nsIWidget -{ - public: - -}; - -#endif // nsITooltipWidget_h__ - diff --git a/mozilla/widget/public/nsIWidget.h b/mozilla/widget/public/nsIWidget.h deleted file mode 100644 index e61029753fa..00000000000 --- a/mozilla/widget/public/nsIWidget.h +++ /dev/null @@ -1,469 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsIWidget_h__ -#define nsIWidget_h__ - -#include "nsISupports.h" -#include "nsColor.h" -#include "nsIMouseListener.h" -#include "nsIImage.h" - -#include "prthread.h" -#include "nsGUIEvent.h" - -// forward declarations -class nsIToolkit; -class nsIFontMetrics; -class nsIToolkit; -class nsIRenderingContext; -class nsIEnumerator; -class nsIDeviceContext; -struct nsRect; -struct nsFont; - -/** - * Callback function that processes events. - * The argument is actually a subtype (subclass) of nsEvent which carries - * platform specific information about the event. Platform specific code knows - * how to deal with it. - * The return value determines whether or not the default action should take place. - */ - -typedef nsEventStatus (*PR_CALLBACK EVENT_CALLBACK)(nsGUIEvent *event); - -/** - * Flags for the getNativeData function. - * See getNativeData() - */ -#define NS_NATIVE_WINDOW 0 -#define NS_NATIVE_GRAPHIC 1 -#define NS_NATIVE_COLORMAP 2 -#define NS_NATIVE_WIDGET 3 -#define NS_NATIVE_DISPLAY 4 - -// {18032AD5-B265-11d1-AA2A-000000000000} -#define NS_IWIDGET_IID \ -{ 0x18032ad5, 0xb265, 0x11d1, \ -{ 0xaa, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } } - - -// Hide the native window systems real window type so as to avoid -// including native window system types and api's. This is necessary -// to ensure cross-platform code. -typedef void* nsNativeWidget; - -/** - * Border styles - */ - -enum nsBorderStyle { - ///no border - eBorderStyle_none, - ///dialog box border + title area - eBorderStyle_dialog - }; - -/** - * Cursor types. - */ - -enum nsCursor { ///(normal cursor, usually rendered as an arrow) - eCursor_standard, - ///(system is busy, usually rendered as a hourglass or watch) - eCursor_wait, - ///(Selecting something, usually rendered as an IBeam) - eCursor_select, - ///(can hyper-link, usually rendered as a human hand) - eCursor_hyperlink }; - - -/** - * Basic struct for widget initialization data. - * @see Create member function of nsIWidget - */ - -struct nsWidgetInitData { }; - -/** - * The base class for all the widgets. It provides the interface for - * all basic and necessary functionality. - */ -class nsIWidget : public nsISupports { - - public: - - /** - * Create and initialize a widget. - * - * The widget represents a window that can be drawn into. It also is the - * base class for user-interface widgets such as buttons and text boxes. - * - * All the arguments can be NULL in which case a top level window - * with size 0 is created. The event callback function has to be - * provided only if the caller wants to deal with the events this - * widget receives. The event callback is basically a preprocess - * hook called synchronously. The return value determines whether - * the event goes to the default window procedure or it is hidden - * to the os. The assumption is that if the event handler returns - * false the widget does not see the event. The widget should not - * automatically clear the window to the background color. The - * calling code must handle paint messages and clear the background - * itself. - * - * @param parent or null if it's a top level window - * @param aRect the widget dimension - * @param aHandleEventFunction the event handler callback function - * @param aInitData data that is used for widget initialization - * - */ - virtual void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull) = 0; - - /** - * Create and initialize a widget with a native window parent - * - * The widget represents a window that can be drawn into. It also is the - * base class for user-interface widgets such as buttons and text boxes. - * - * All the arguments can be NULL in which case a top level window - * with size 0 is created. The event callback function has to be - * provided only if the caller wants to deal with the events this - * widget receives. The event callback is basically a preprocess - * hook called synchronously. The return value determines whether - * the event goes to the default window procedure or it is hidden - * to the os. The assumption is that if the event handler returns - * false the widget does not see the event. - * - * @param aParent native window. - * @param aRect the widget dimension - * @param aHandleEventFunction the event handler callback function - */ - virtual void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull) = 0; - - /** - * Close and destroy the internal native window. - * This method does not delete the widget. - */ - - virtual void Destroy(void) = 0; - - /** - * Return the parent Widget of this Widget or nsnull if this is a - * top level window - * - * @return the parent widget or nsnull if it does not have a parent - * - */ - virtual nsIWidget* GetParent(void) = 0; - - /** - * Return an nsEnumerator over the children of this widget. - * - * @return an enumerator over the list of children or nsnull if it does not - * have any children - * - */ - virtual nsIEnumerator* GetChildren(void) = 0; - - /** - * Show or hide this widget - * - * @param aState PR_TRUE to show the Widget, PR_FALSE to hide it - * - */ - virtual void Show(PRBool aState) = 0; - - /** - * Move this widget. - * - * @param aX the new x position expressed in the parent's coordinate system - * @param aY the new y position expressed in the parent's coordinate system - * - **/ - virtual void Move(PRUint32 aX, PRUint32 aY) = 0; - - /** - * Resize this widget. - * - * @param aWidth the new width expressed in the parent's coordinate system - * @param aHeight the new height expressed in the parent's coordinate system - * @param aRepaint whether the widget should be repainted - * - */ - virtual void Resize(PRUint32 aWidth, - PRUint32 aHeight, - PRBool aRepaint) = 0; - - /** - * Move or resize this widget. - * - * @param aX the new x position expressed in the parent's coordinate system - * @param aY the new y position expressed in the parent's coordinate system - * @param aWidth the new width expressed in the parent's coordinate system - * @param aHeight the new height expressed in the parent's coordinate system - * @param aRepaint whether the widget should be repainted if the size changes - * - */ - virtual void Resize(PRUint32 aX, - PRUint32 aY, - PRUint32 aWidth, - PRUint32 aHeight, - PRBool aRepaint) = 0; - - /** - * Enable or disable this Widget - * - * @param aState PR_TRUE to enable the Widget, PR_FALSE to disable it. - * - */ - virtual void Enable(PRBool aState) = 0; - - /** - * Give focus to this widget. - */ - virtual void SetFocus(void) = 0; - - /** - * Get this widget's dimension - * - * @param aRect on return it holds the x. y, width and height of this widget - * - */ - virtual void GetBounds(nsRect &aRect) = 0; - - /** - * Get the foreground color for this widget - * - * @return this widget's foreground color - * - */ - virtual nscolor GetForegroundColor(void) = 0; - - /** - * Set the foreground color for this widget - * - * @param aColor the new foreground color - * - */ - - virtual void SetForegroundColor(const nscolor &aColor) = 0; - - /** - * Get the background color for this widget - * - * @return this widget's background color - * - */ - - virtual nscolor GetBackgroundColor(void) = 0; - - /** - * Set the background color for this widget - * - * @param aColor the new background color - * - */ - - virtual void SetBackgroundColor(const nscolor &aColor) = 0; - - /** - * Get the font for this widget - * - * @return the font metrics - */ - - virtual nsIFontMetrics* GetFont(void) = 0; - - /** - * Set the font for this widget - * - * @param aFont font to display. See nsFont for allowable fonts - */ - - virtual void SetFont(const nsFont &aFont) = 0; - - /** - * Get the cursor for this widget. - * - * @return this widget's cursor. - */ - - virtual nsCursor GetCursor(void) = 0; - - /** - * Set the cursor for this widget - * - * @param aCursor the new cursor for this widget - */ - - virtual void SetCursor(nsCursor aCursor) = 0; - - /** - * Invalidate the widget and repaint it. - * - * @param aIsSynchronouse PR_TRUE then repaint synchronously. If PR_FALSE repaint later. - * - */ - - virtual void Invalidate(PRBool aIsSynchronous) = 0; - - - /** - * Adds a mouse listener to this widget - * Any existing mouse listener is replaced - * - * @param aListener mouse listener to add to this widget. - */ - - virtual void AddMouseListener(nsIMouseListener * aListener) = 0; - - /** - * Return the widget's toolkit - * - * @return the toolkit this widget was created in. See nsToolkit. - */ - - virtual nsIToolkit* GetToolkit() = 0; - - /** - * Set the color map for this widget - * - * @param aColorMap color map for displaying this widget - * - */ - - virtual void SetColorMap(nsColorMap *aColorMap) = 0; - - /** - * Scroll this widget. - * - * @param aDx amount to scroll along the x-axis - * @param aDy amount to scroll along the y-axis. - * @param aClipRect clipping rectangle to limit the scroll to. - * - */ - - virtual void Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect) = 0; - - /** - * Internal methods - */ - - //@{ - virtual void AddChild(nsIWidget* aChild) = 0; - virtual void RemoveChild(nsIWidget* aChild) = 0; - virtual void* GetNativeData(PRUint32 aDataType) = 0; - virtual nsIRenderingContext* GetRenderingContext() = 0; - virtual nsIDeviceContext* GetDeviceContext() = 0; - //@} - - /** - * Set border style - * Must be called before Create. - * @param aBorderStyle @see nsBorderStyle - */ - - virtual void SetBorderStyle(nsBorderStyle aBorderStyle) = 0; - - /** - * Set the widget's title. - * Must be called after Create. - * - * @param aTitle string displayed as the title of the widget - */ - - virtual void SetTitle(const nsString& aTitle) = 0; - - /** - * Set the collection of tooltip rectangles. - * A NS_SHOW_TOOLTIP event is generated when the mouse hovers over one - * of the rectangles. a NS_HIDE_TOOLTIP event is generated when the mouse - * is moved or a new tooltip is displayed. - * - * @param aNumberOfTips number of tooltip areas. - * @param aTooltipArea array of x,y,width,height rectangles specifying hot areas - * - */ - - virtual void SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]) = 0; - - /** - * Update the collection of tooltip rectangles. The number of tooltips must - * match the original number of tooltips specified in SetTooltips. Must be called - * after calling SetTooltips. - * - * @param aNewTips array of x,y,width,height rectangles specifying the new hot areas - * - */ - - virtual void UpdateTooltips(nsRect* aNewTips[]) = 0; - - /** - * Remove the collection of tooltip rectangles. - */ - - virtual void RemoveTooltips() = 0; - - /** - * Convert from this widget coordinates to screen coordinates. - * - * @param aOldRect widget coordinates stored in the x,y members - * @param aNewRect screen coordinates stored in the x,y members - */ - - virtual void WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) = 0; - - /** - * Convert from screen coordinates to this widget's coordinates. - * - * @param aOldRect screen coordinates stored in the x,y members - * @param aNewRect widget's coordinates stored in the x,y members - */ - - virtual void ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) = 0; - - /** - * When adjustments are to made to a whole set of child widgets, call this - * before resizing/positioning the child windows to minimize repaints. Must - * be followed by EndResizingChildren() after child windows have been - * adjusted. - * - */ - - virtual void BeginResizingChildren(void) = 0; - - /** - * Call this when finished adjusting child windows. Must be preceded by - * BeginResizingChildren(). - * - */ - - virtual void EndResizingChildren(void) = 0; -}; - -#endif // nsIWidget_h__ diff --git a/mozilla/widget/public/nsStringUtil.h b/mozilla/widget/public/nsStringUtil.h deleted file mode 100644 index 5cadae4c96a..00000000000 --- a/mozilla/widget/public/nsStringUtil.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -// Convience macros for converting nsString's to chars + -// creating temporary char[] bufs. - -#ifndef NS_STR_UTIL_H -#define NS_STR_UTIL_H - -// nsString to temporary char[] macro - -// Convience MACROS to convert an nsString to a char * which use a -// static char array if possible to reduce memory fragmentation, -// otherwise they allocate a char[] which must be freed. -// REMEMBER to always use the NS_FREE_STR_BUF after using the -// NS_ALLOC_STR_BUF. You can not nest NS_ALLOC_STR_BUF's. - -#define NS_ALLOC_STR_BUF(varName, strName, tempSize) \ - static const int _ns_kSmallBufferSize = tempSize; \ - char* varName = 0; \ - int _ns_smallBufUsed = 0; \ - char _ns_smallBuffer[_ns_kSmallBufferSize]; \ - if (strName.Length() < (_ns_kSmallBufferSize - 1)) { \ - strName.ToCString(_ns_smallBuffer, _ns_kSmallBufferSize); \ - _ns_smallBuffer[_ns_kSmallBufferSize - 1] = '\0'; \ - _ns_smallBufUsed = 1; \ - varName = _ns_smallBuffer; \ - } \ - else { \ - varName = strName.ToNewCString(); \ - } - -#define NS_FREE_STR_BUF(varName) \ - if (! _ns_smallBufUsed) \ - delete varName; - -// Create temporary char[] macro -// -// Create a temporary buffer for storing chars. -// If the actual size is > size then the buffer -// is allocated from the heap, otherwise the buffer -// is a stack variable. REMEMBER: use NS_FREE_BUF -// when finished with the buffer allocated, and do -// NOT nest INSERT_BUF'S. - -#define NS_ALLOC_CHAR_BUF(aBuf, aSize, aActualSize) \ - char *aBuf; \ - int _ns_smallBufUsed = 0; \ - static const int _ns_kSmallBufferSize = aSize; \ - if (aActualSize < _ns_kSmallBufferSize) { \ - char _ns_smallBuffer[_ns_kSmallBufferSize]; \ - aBuf = _ns_smallBuffer; \ - _ns_smallBufUsed = 1; \ - } \ - else { \ - aBuf = new char[aActualSize]; \ - } - -#define NS_FREE_CHAR_BUF(aBuf) \ -if (! _ns_smallBufUsed) \ - delete aBuf; - - -#endif // NSStringUtil diff --git a/mozilla/widget/public/nsWidgetsCID.h b/mozilla/widget/public/nsWidgetsCID.h deleted file mode 100644 index ee81d3128e3..00000000000 --- a/mozilla/widget/public/nsWidgetsCID.h +++ /dev/null @@ -1,98 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -/* 2d96b3d0-c051-11d1-a827-0040959a28c9 */ -#define NS_WINDOW_CID \ -{ 0x2d96b3d0, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9}} - -/* 2d96b3d1-c051-11d1-a827-0040959a28c9 */ -#define NS_CHILD_CID \ -{ 0x2d96b3d1, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3d2-c051-11d1-a827-0040959a28c9 */ -#define NS_BUTTON_CID \ -{ 0x2d96b3d2, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3d3-c051-11d1-a827-0040959a28c9 */ -#define NS_CHECKBUTTON_CID \ -{ 0x2d96b3d3, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3d4-c051-11d1-a827-0040959a28c9 */ -#define NS_COMBOBOX_CID \ -{ 0x2d96b3d4, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3d5-c051-11d1-a827-0040959a28c9 */ -#define NS_FILEWIDGET_CID \ -{ 0x2d96b3d5, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3d6-c051-11d1-a827-0040959a28c9 */ -#define NS_LISTBOX_CID \ -{ 0x2d96b3d6, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3d7-c051-11d1-a827-0040959a28c9 */ -#define NS_RADIOBUTTON_CID \ -{ 0x2d96b3d7, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3d8-c051-11d1-a827-0040959a28c9 */ -#define NS_RADIOGROUP_CID \ -{ 0x2d96b3d8, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3d9-c051-11d1-a827-0040959a28c9 */ -#define NS_HORZSCROLLBAR_CID \ -{ 0x2d96b3d9, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3da-c051-11d1-a827-0040959a28c9 */ -#define NS_VERTSCROLLBAR_CID \ -{ 0x2d96b3da, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3db-c051-11d1-a827-0040959a28c9 */ -#define NS_TEXTAREA_CID \ -{ 0x2d96b3db, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3dc-c051-11d1-a827-0040959a28c9 */ -#define NS_TEXTFIELD_CID \ -{ 0x2d96b3dc, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3dd-c051-11d1-a827-0040959a28c9 */ -#define NS_TABWIDGET_CID \ -{ 0x2d96b3dd, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3de-c051-11d1-a827-0040959a28c9 */ -#define NS_TOOLTIPWIDGET_CID \ -{ 0x2d96b3de, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - -/* 2d96b3df-c051-11d1-a827-0040959a28c9 */ -#define NS_APPSHELL_CID \ -{ 0x2d96b3df, 0xc051, 0x11d1, \ - {0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9} } - diff --git a/mozilla/widget/public/nsui.h b/mozilla/widget/public/nsui.h deleted file mode 100644 index 6fdc3cb089b..00000000000 --- a/mozilla/widget/public/nsui.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsui_h___ -#define nsui_h___ - -#ifdef _IMPL_NS_UI -#define NS_UI NS_EXPORT -#else -#define NS_UI NS_IMPORT -#endif - -#endif /* nsui_h___ */ diff --git a/mozilla/widget/src/Makefile b/mozilla/widget/src/Makefile deleted file mode 100644 index 1a85930d5af..00000000000 --- a/mozilla/widget/src/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../.. - -DIRS = motif - -include $(DEPTH)/config/config.mk - -TARGET = $(LIBRARY) - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/widget/src/mac/nsDeviceContextMac.cpp b/mozilla/widget/src/mac/nsDeviceContextMac.cpp deleted file mode 100644 index eee1a17dc5d..00000000000 --- a/mozilla/widget/src/mac/nsDeviceContextMac.cpp +++ /dev/null @@ -1,532 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsDeviceContextMac.h" -#include "nsRenderingContextMac.h" -//XXX#include "../nsGfxCIID.h" - -#include "math.h" -#include "nspr.h" - -static NS_DEFINE_IID(kDeviceContextIID, NS_IDEVICE_CONTEXT_IID); - - -#define NS_TO_X_COMPONENT(a) ((a << 8) | (a)) - -#define NS_TO_X_RED(a) (((NS_GET_R(a) >> (8 - mRedBits)) << mRedOffset) & mRedMask) -#define NS_TO_X_GREEN(a) (((NS_GET_G(a) >> (8 - mGreenBits)) << mGreenOffset) & mGreenMask) -#define NS_TO_X_BLUE(a) (((NS_GET_B(a) >> (8 - mBlueBits)) << mBlueOffset) & mBlueMask) - -#define NS_TO_X(a) (NS_TO_X_RED(a) | NS_TO_X_GREEN(a) | NS_TO_X_BLUE(a)) - - -nsDeviceContextMac :: nsDeviceContextMac() -{ - NS_INIT_REFCNT(); - - /*mFontCache = nsnull; - mSurface = nsnull; - - mTwipsToPixels = 1.0; - mPixelsToTwips = 1.0; - - mDevUnitsToAppUnits = 1.0f; - mAppUnitsToDevUnits = 1.0f; - - mGammaValue = 1.0f; - mGammaTable = new PRUint8[256]; - - mZoom = 1.0f; - - mVisual = nsnull; - - mRedMask = 0; - mGreenMask = 0; - mBlueMask = 0; - - mRedBits = 0; - mGreenBits = 0; - mBlueBits = 0; - - mRedOffset = 0; - mGreenOffset = 0; - mBlueOffset = 0; - - mNativeWidget = nsnull; - - mDepth = 0 ; - mColormap = 0 ;*/ -} - -nsDeviceContextMac :: ~nsDeviceContextMac() -{ - // XXX Does the Mac have gamma stuff in quickdraw so we don't have to write our own? - - /*if (nsnull != mGammaTable) - { - delete mGammaTable; - mGammaTable = nsnull; - } - - NS_IF_RELEASE(mFontCache); - - if (mSurface) delete mSurface;*/ -} - -NS_IMPL_QUERY_INTERFACE(nsDeviceContextMac, kDeviceContextIID) -NS_IMPL_ADDREF(nsDeviceContextMac) -NS_IMPL_RELEASE(nsDeviceContextMac) - -nsresult nsDeviceContextMac :: Init(nsNativeWidget aNativeWidget) -{ - NS_ASSERTION(!(aNativeWidget == nsnull), "attempt to init devicecontext with null widget"); - - /*for (PRInt32 cnt = 0; cnt < 256; cnt++) - mGammaTable[cnt] = cnt;*/ - - // XXX We really need to have Display passed to us since it could be specified - // not from the environment, which is the one we use here. - -/* XXX rewrite for mac - mNativeWidget = aNativeWidget; - - if (nsnull != mNativeWidget) - { - mTwipsToPixels = (((float)::XDisplayWidth(XtDisplay((Widget)mNativeWidget), DefaultScreen(XtDisplay((Widget)mNativeWidget)))) / - ((float)::XDisplayWidthMM(XtDisplay((Widget)mNativeWidget),DefaultScreen(XtDisplay((Widget)mNativeWidget)) )) * 25.4) / - NS_POINTS_TO_TWIPS_FLOAT(72.0f); - - mPixelsToTwips = 1.0f / mTwipsToPixels; - }*/ - - return NS_OK; -} - -float nsDeviceContextMac :: GetTwipsToDevUnits() const -{ - //return mTwipsToPixels; - return 0.0; -} - -float nsDeviceContextMac :: GetDevUnitsToTwips() const -{ -// return mPixelsToTwips; - return 0.0; -} - - -void nsDeviceContextMac :: SetAppUnitsToDevUnits(float aAppUnits) -{ -// mAppUnitsToDevUnits = aAppUnits; -} - -void nsDeviceContextMac :: SetDevUnitsToAppUnits(float aDevUnits) -{ -// mDevUnitsToAppUnits = aDevUnits; -} - -float nsDeviceContextMac :: GetAppUnitsToDevUnits() const -{ - //return mAppUnitsToDevUnits; - return 0.0; -} - -float nsDeviceContextMac :: GetDevUnitsToAppUnits() const -{ -// return mDevUnitsToAppUnits; - return 0.0; -} - -float nsDeviceContextMac :: GetScrollBarWidth() const -{ - // XXX Should we push this to widget library - return 240.0; -} - -float nsDeviceContextMac :: GetScrollBarHeight() const -{ - // XXX Should we push this to widget library - return 240.0; -} - -nsIRenderingContext * nsDeviceContextMac :: CreateRenderingContext(nsIView *aView) -{ - /*nsIRenderingContext *pContext = nsnull; - nsIWidget *win = aView->GetWidget(); - nsresult rv; - - static NS_DEFINE_IID(kRCCID, NS_RENDERING_CONTEXT_CID); - static NS_DEFINE_IID(kRCIID, NS_IRENDERING_CONTEXT_IID); - - rv = NSRepository::CreateInstance(kRCCID, nsnull, kRCIID, (void **)&pContext); - - if (NS_OK == rv) { - rv = InitRenderingContext(pContext, win); - if (NS_OK != rv) { - NS_RELEASE(pContext); - } - } - - NS_IF_RELEASE(win); - return pContext;*/ - return nsnull; /// XXX need something reasonable here -} - -nsresult nsDeviceContextMac :: InitRenderingContext(nsIRenderingContext *aContext, nsIWidget *aWin) -{ - return (aContext->Init(this, aWin)); -} - -nsIFontCache* nsDeviceContextMac::GetFontCache() -{ - /*if (nsnull == mFontCache) { - if (NS_OK != CreateFontCache()) { - return nsnull; - } - } - NS_ADDREF(mFontCache); - return mFontCache;*/ - return nsnull; -} - -nsresult nsDeviceContextMac::CreateFontCache() -{ - /*nsresult rv = NS_NewFontCache(&mFontCache); - if (NS_OK != rv) { - return rv; - } - mFontCache->Init(this);*/ - return NS_OK; -} - -void nsDeviceContextMac::FlushFontCache() -{ - //NS_RELEASE(mFontCache); -} - - -nsIFontMetrics* nsDeviceContextMac::GetMetricsFor(const nsFont& aFont) -{ - /*if (nsnull == mFontCache) { - if (NS_OK != CreateFontCache()) { - return nsnull; - } - } - return mFontCache->GetMetricsFor(aFont);*/ - return nsnull; -} - -void nsDeviceContextMac :: SetZoom(float aZoom) -{ - // mZoom = aZoom; -} - -float nsDeviceContextMac :: GetZoom() const -{ - //return mZoom; - return 0.0; // should be 1.0 perhaps? -} - -nsDrawingSurface nsDeviceContextMac :: GetDrawingSurface(nsIRenderingContext &aContext) -{ - //return aContext.CreateDrawingSurface(nsnull); - return nsnull; -} - -float nsDeviceContextMac :: GetGamma(void) -{ - //return mGammaValue; - return 1.0; -} - -void nsDeviceContextMac :: SetGamma(float aGamma) -{/* - if (aGamma != mGammaValue) - { - //we don't need to-recorrect existing images for this case - //so pass in 1.0 for the current gamma regardless of what it - //really happens to be. existing images will get a one time - //re-correction when they're rendered the next time. MMP - - SetGammaTable(mGammaTable, 1.0f, aGamma); - - mGammaValue = aGamma; - }*/ -} - -PRUint8 * nsDeviceContextMac :: GetGammaTable(void) -{ - //XXX we really need to ref count this somehow. MMP - - return nsnull; -} - -void nsDeviceContextMac :: SetGammaTable(PRUint8 * aTable, float aCurrentGamma, float aNewGamma) -{ - /*double fgval = (1.0f / aCurrentGamma) * (1.0f / aNewGamma); - - for (PRInt32 cnt = 0; cnt < 256; cnt++) - aTable[cnt] = (PRUint8)(pow((double)cnt * (1. / 256.), fgval) * 255.99999999);*/ -} - -nsNativeWidget nsDeviceContextMac :: GetNativeWidget(void) -{ - //XXX return mNativeWidget; - return nsnull; -} - -PRUint32 nsDeviceContextMac :: ConvertPixel(nscolor aColor) -{ - PRUint32 newcolor = 0; - - /* - For now, we assume anything in 12 planes or more is a TrueColor visual. - If it is not (like older IRIS GL graphics boards, we'll look stupid for now. - */ - - /* switch (mDepth) { - - case 8: - { - - if (mWriteable == PR_FALSE) { - - Status rc ; - XColor colorcell; - - colorcell.red = NS_TO_X_COMPONENT(NS_GET_R(aColor)); - colorcell.green = NS_TO_X_COMPONENT(NS_GET_G(aColor)); - colorcell.blue = NS_TO_X_COMPONENT(NS_GET_B(aColor)); - - colorcell.pixel = 0; - colorcell.flags = 0; - colorcell.pad = 0; - - // On static displays, this will return closest match - rc = ::XAllocColor(mSurface->display, - mColormap, - &colorcell); - - if (rc == 0) { - // Punt ... this cannot happen! - fprintf(stderr,"WHOA! IT FAILED!\n"); - } else { - newcolor = colorcell.pixel; - } // rc == 0 - } else { - - // Check to see if this exact color is present. If not, add it ourselves. - // If there are no unallocated cells left, do our own closest match lookup - //since X doesn't provide us with one. - - Status rc ; - XColor colorcell; - - colorcell.red = NS_TO_X_COMPONENT(NS_GET_R(aColor)); - colorcell.green = NS_TO_X_COMPONENT(NS_GET_G(aColor)); - colorcell.blue = NS_TO_X_COMPONENT(NS_GET_B(aColor)); - - colorcell.pixel = 0; - colorcell.flags = 0; - colorcell.pad = 0; - - // On non-static displays, this may fail - rc = ::XAllocColor(mSurface->display, - mColormap, - &colorcell); - - if (rc == 0) { - - // The color does not already exist AND we do not have any unallocated colorcells left - // At his point we need to implement our own lookup matching algorithm. - - unsigned long pixel; - - rc = ::XAllocColorCells(mSurface->display, - mColormap, - False,0,0, - &pixel, - 1); - - if (rc == 0){ - - fprintf(stderr, "Failed to allocate Color cells...this sux\n"); - - } else { - - colorcell.pixel = pixel; - colorcell.pad = 0 ; - colorcell.flags = DoRed | DoGreen | DoBlue ; - colorcell.red = NS_TO_X_COMPONENT(NS_GET_R(aColor)); - colorcell.green = NS_TO_X_COMPONENT(NS_GET_G(aColor)); - colorcell.blue = NS_TO_X_COMPONENT(NS_GET_B(aColor)); - - ::XStoreColor(mSurface->display, mColormap, &colorcell); - - newcolor = colorcell.pixel; - - } // rc == 0 - } else { - newcolor = colorcell.pixel; - } // rc == 0 - } // mWriteable == FALSE - } // 8 - break; - - case 12: - { - newcolor = (PRUint32)NS_TO_X(aColor); - } // 12 - break; - - case 15: - { - newcolor = (PRUint32)NS_TO_X(aColor); - } // 15 - break; - - case 16: - { - newcolor = (PRUint32)NS_TO_X(aColor); - } // 16 - break; - - case 24: - { - newcolor = (PRUint32)NS_TO_X(aColor); - //newcolor = (PRUint32)NS_TO_X24(aColor); - } // 24 - break; - - default: - { - newcolor = (PRUint32)NS_TO_X(aColor); - // newcolor = (PRUint32) aColor; - } // default - break; - - } // switch(mDepth) - */ - return (newcolor); -} - -void nsDeviceContextMac :: InstallColormap() -{ -#if 0 - /* - Unfortunately, we don't have control of the visual created for this display. - That should be managed at an application level, since the gfx only cares that all - values be passed in as 32 bit RGBA quantites. - - This means we have to write lots and lots of code to support the fact that any - number of visuals may be the one associated with this device context. - */ - - //XWindowAttributes wa; - - - /* Already installed? */ - if (0 != mColormap) - return; - - // Find the depth of this visual - ::XGetWindowAttributes(mSurface->display, - mSurface->drawable, - &wa); - - mDepth = wa.depth; - - // Check to see if the colormap is writable - mVisual = wa.visual; - - if (mVisual->c_class == GrayScale || mVisual->c_class == PseudoColor || mVisual->c_class == DirectColor) - mWriteable = PR_TRUE; - else // We have StaticGray, StaticColor or TrueColor - mWriteable = PR_FALSE; - - mNumCells = pow(2, mDepth); - - mColormap = wa.colormap; - - // if the colormap is writeable ..... - if (mWriteable) { - - // XXX We should check the XExtensions to see if this hardware supports multiple - // hardware colormaps. If so, change this colormap to be a RGB ramp. - if (mDepth == 8) { - - } - } - - // Compute rgb masks and number of bits for each - mRedMask = mVisual->red_mask; - mGreenMask = mVisual->green_mask; - mBlueMask = mVisual->blue_mask; - - PRUint32 i = mRedMask; - - while (i) { - - if ((i & 0x1) != 0) { - mRedBits++; - } else { - mRedOffset++; - } - - i = i >> 1; - - } - - i = mGreenMask; - - while (i) { - - if ((i & 0x1) != 0) - mGreenBits++; - else - mGreenOffset++; - - i = i >> 1; - - } - - i = mBlueMask; - - while (i) { - - if ((i & 0x1) != 0) - mBlueBits++; - else - mBlueOffset++; - - i = i >> 1; - - } -#endif -} - -nsDrawingSurface nsDeviceContextMac :: GetDrawingSurface() -{ - return nsnull; -} - - - - - - diff --git a/mozilla/widget/src/mac/nsDeviceContextMac.h b/mozilla/widget/src/mac/nsDeviceContextMac.h deleted file mode 100644 index 8a6dcb6d6bb..00000000000 --- a/mozilla/widget/src/mac/nsDeviceContextMac.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsDeviceContextMac_h___ -#define nsDeviceContextMac_h___ - -#include "nsIDeviceContext.h" -#include "nsUnitConversion.h" -#include "nsIFontCache.h" -#include "nsIWidget.h" -#include "nsIView.h" -#include "nsIRenderingContext.h" - -/* nsDrawingSurface is actually the following struct */ -struct nsDrawingSurfaceMac { -/* Display *display ; - Drawable drawable ; - GC gc ; - Visual * visual ; - PRUint32 depth ; */ -}; - -class nsDeviceContextMac : public nsIDeviceContext -{ -public: - nsDeviceContextMac(); - - NS_DECL_ISUPPORTS - - virtual nsresult Init(nsNativeWidget aNativeWidget); - - virtual nsIRenderingContext * CreateRenderingContext(nsIView *aView); - virtual nsresult InitRenderingContext(nsIRenderingContext *aContext, nsIWidget *aWidget); - - virtual float GetTwipsToDevUnits() const; - virtual float GetDevUnitsToTwips() const; - - virtual void SetAppUnitsToDevUnits(float aAppUnits); - virtual void SetDevUnitsToAppUnits(float aDevUnits); - - virtual float GetAppUnitsToDevUnits() const; - virtual float GetDevUnitsToAppUnits() const; - - virtual float GetScrollBarWidth() const; - virtual float GetScrollBarHeight() const; - - virtual nsIFontCache * GetFontCache(); - virtual void FlushFontCache(); - - virtual nsIFontMetrics* GetMetricsFor(const nsFont& aFont); - - virtual void SetZoom(float aZoom); - virtual float GetZoom() const; - - virtual nsDrawingSurface GetDrawingSurface(nsIRenderingContext &aContext); - - //functions for handling gamma correction of output device - virtual float GetGamma(void); - virtual void SetGamma(float aGamma); - - //XXX the return from this really needs to be ref counted somehow. MMP - virtual PRUint8 * GetGammaTable(void); - - virtual nsNativeWidget GetNativeWidget(void); - - virtual PRUint32 ConvertPixel(nscolor aColor); - -protected: - ~nsDeviceContextMac(); - nsresult CreateFontCache(); - - //nsIFontCache *mFontCache; - //nsDrawingSurfaceMac * mSurface ; - - /*PRUint32 mDepth; - Visual * mVisual; - PRBool mWriteable; - PRUint32 mNumCells; - Colormap mColormap;*/ - // XXX There should be a nsIColormap interface - - /*float mTwipsToPixels; - float mPixelsToTwips; - float mAppUnitsToDevUnits; - float mDevUnitsToAppUnits; - float mZoom; - float mGammaValue; - PRUint8 *mGammaTable;*/ - -public: - void InstallColormap(void); - void SetDrawingSurface(nsDrawingSurfaceMac * aSurface); - void SetGammaTable(PRUint8 * aTable, float aCurrentGamma, float aNewGamma); - nsDrawingSurface GetDrawingSurface(); - -//private: - /*PRUint32 mRedMask; - PRUint32 mGreenMask; - PRUint32 mBlueMask; - PRUint32 mRedBits; - PRUint32 mGreenBits; - PRUint32 mBlueBits; - PRUint32 mRedOffset; - PRUint32 mGreenOffset; - PRUint32 mBlueOffset; - - nsNativeWidget mNativeWidget;*/ -}; - -#endif /* nsDeviceContextMac_h___ */ diff --git a/mozilla/widget/src/makefile.win b/mozilla/widget/src/makefile.win deleted file mode 100644 index f0f7579ab74..00000000000 --- a/mozilla/widget/src/makefile.win +++ /dev/null @@ -1,23 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\.. -IGNORE_MANIFEST=1 - -DIRS=windows - -include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/widget/src/motif/Makefile b/mozilla/widget/src/motif/Makefile deleted file mode 100644 index cdd798a857c..00000000000 --- a/mozilla/widget/src/motif/Makefile +++ /dev/null @@ -1,92 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - - -DEPTH = ../../.. - -include $(DEPTH)/config/config.mk - -LIBRARY_NAME = widgetunix - -MODULE=raptor - -REQUIRES=util img xpcom raptor netlib - -DEFINES = -D_IMPL_NS_WIDGET - -EXTRA_DSO_LDOPTS+=\ - $(DIST)/bin/libxpcom.so \ - $(DIST)/bin/libraptorbase.so \ - $(DIST)/bin/libreg.so \ - $(LIBNSPR)\ - $(DIST)/lib/libplc21.a - -# This should really be done properly in 'config' -ifeq ($(OS_ARCH),Linux) -EXTRA_DSO_LDOPTS+=\ - -L/usr/X11R6/lib -lX11 -lm -else -EXTRA_DSO_LDOPTS+= -lXm -lXt -lX11 -lm -endif - -CPPSRCS= \ - nsComboBox.cpp \ - nsTextAreaWidget.cpp \ - nsListBox.cpp \ - nsRadioButton.cpp \ - nsFileWidget.cpp \ - nsTextHelper.cpp \ - nsTextWidget.cpp \ - nsCheckButton.cpp \ - nsScrollbar.cpp \ - nsButton.cpp \ - nsAppShell.cpp \ - nsWidgetFactory.cpp \ - nsWindow.cpp \ - nsXtEventHandler.cpp \ - nsToolkit.cpp - -CPP_OBJS= \ - ./$(OBJDIR)/nsComboBox.o \ - ./$(OBJDIR)/nsTextAreaWidget.o \ - ./$(OBJDIR)/nsListBox.o \ - ./$(OBJDIR)/nsRadioButton.o \ - ./$(OBJDIR)/nsFileWidget.o \ - ./$(OBJDIR)/nsTextHelper.o \ - ./$(OBJDIR)/nsTextWidget.o \ - ./$(OBJDIR)/nsCheckButton.o \ - ./$(OBJDIR)/nsButton.o \ - ./$(OBJDIR)/nsScrollbar.o \ - ./$(OBJDIR)/nsAppShell.o \ - ./$(OBJDIR)/nsWidgetFactory.o \ - ./$(OBJDIR)/nsWindow.o \ - ./$(OBJDIR)/nsToolkit.o \ - ./$(OBJDIR)/nsXtEventHandler.o \ - $(NULL) - -include $(DEPTH)/config/config.mk - -TARGETS = $(LIBRARY) - -include $(DEPTH)/config/rules.mk - - - - - - - diff --git a/mozilla/widget/src/motif/nsAppShell.cpp b/mozilla/widget/src/motif/nsAppShell.cpp deleted file mode 100644 index a3ea25c396f..00000000000 --- a/mozilla/widget/src/motif/nsAppShell.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsAppShell.h" -#include "nsIAppShell.h" -#include - -XtAppContext gAppContext; - -//------------------------------------------------------------------------- -// -// nsISupports implementation macro -// -//------------------------------------------------------------------------- -NS_DEFINE_IID(kIAppShellIID, NS_IAPPSHELL_IID); -NS_IMPL_ISUPPORTS(nsAppShell,kIAppShellIID); - -void nsAppShell::SetDispatchListener(nsDispatchListener* aDispatchListener) -{ - mDispatchListener = aDispatchListener; -} - -//------------------------------------------------------------------------- -// -// Create the application shell -// -//------------------------------------------------------------------------- - -void nsAppShell::Create(int* argc, char ** argv) -{ - XtSetLanguageProc(NULL, NULL, NULL); - mTopLevel = XtVaAppInitialize(&mAppContext, "nsAppShell", NULL, - 0, argc, argv, NULL, NULL); - gAppContext = mAppContext; -} - -//------------------------------------------------------------------------- -// -// Enter a message handler loop -// -//------------------------------------------------------------------------- - -nsresult nsAppShell::Run() -{ - XtRealizeWidget(mTopLevel); - -// XtAppMainLoop(mAppContext); - XEvent event; - for (;;) { - XtAppNextEvent(mAppContext, &event); - XtDispatchEvent(&event); - if (mDispatchListener) - mDispatchListener->AfterDispatch(); - } - - return NS_OK; -} - -//------------------------------------------------------------------------- -// -// Exit a message handler loop -// -//------------------------------------------------------------------------- - -void nsAppShell::Exit() -{ - exit(0); -} - -//------------------------------------------------------------------------- -// -// nsAppShell constructor -// -//------------------------------------------------------------------------- -nsAppShell::nsAppShell() -{ - mDispatchListener = 0; -} - -//------------------------------------------------------------------------- -// -// nsAppShell destructor -// -//------------------------------------------------------------------------- -nsAppShell::~nsAppShell() -{ -} - -//------------------------------------------------------------------------- -// -// GetNativeData -// -//------------------------------------------------------------------------- -void* nsAppShell::GetNativeData(PRUint32 aDataType) -{ - if (aDataType == NS_NATIVE_SHELL) { - return mTopLevel; - } - return nsnull; -} - - diff --git a/mozilla/widget/src/motif/nsAppShell.h b/mozilla/widget/src/motif/nsAppShell.h deleted file mode 100644 index c41768dbce2..00000000000 --- a/mozilla/widget/src/motif/nsAppShell.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsAppShell_h__ -#define nsAppShell_h__ - -#include "nsIAppShell.h" - -#include - -/** - * Native MOTIF Application shell wrapper - */ - -class nsAppShell : public nsIAppShell -{ - private: - Widget mTopLevel; - XtAppContext mAppContext; - nsDispatchListener* mDispatchListener; - - public: - nsAppShell(); - virtual ~nsAppShell(); - - NS_DECL_ISUPPORTS - - // nsIAppShellInterface - - virtual void Create(int* argc, char ** argv); - virtual nsresult Run(); - virtual void Exit(); - - virtual void SetDispatchListener(nsDispatchListener* aDispatchListener); - - virtual void* GetNativeData(PRUint32 aDataType); - -}; - -#endif // nsAppShell_h__ - diff --git a/mozilla/widget/src/motif/nsButton.cpp b/mozilla/widget/src/motif/nsButton.cpp deleted file mode 100644 index 144c669cb33..00000000000 --- a/mozilla/widget/src/motif/nsButton.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsButton.h" -#include "nsIButton.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" - -#include "nsXtEventHandler.h" - -#include - -#define DBG 0 -//------------------------------------------------------------------------- -// -// nsButton constructor -// -//------------------------------------------------------------------------- -nsButton::nsButton(nsISupports *aOuter) : nsWindow(aOuter) -{ -} - -void nsButton::Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - Widget parentWidget = nsnull; - - if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); - - if (aParent) { - parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); - } else { - parentWidget = (Widget) aInitData ; - } - - if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); - - mWidget = ::XtVaCreateManagedWidget("button", - xmPushButtonWidgetClass, - parentWidget, - XmNwidth, aRect.width, - XmNheight, aRect.height, - XmNrecomputeSize, False, - XmNhighlightOnEnter, False, - XmNx, aRect.x, - XmNy, aRect.y, - nsnull); - - if (DBG) fprintf(stderr, "Button 0x%x this 0x%x\n", mWidget, this); - - // save the event callback function - mEventCallback = aHandleEventFunction; - - InitCallbacks("nsButton"); - -} - -void nsButton::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ -} - -//------------------------------------------------------------------------- -// -// nsButton destructor -// -//------------------------------------------------------------------------- -nsButton::~nsButton() -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsButton::QueryObject(REFNSIID aIID, void** aInstancePtr) -{ - static NS_DEFINE_IID(kIButtonIID, NS_IBUTTON_IID); - - if (aIID.Equals(kIButtonIID)) { - AddRef(); - *aInstancePtr = (void**) &mAggWidget; - return NS_OK; - } - return nsWindow::QueryObject(aIID, aInstancePtr); -} - - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -void nsButton::SetLabel(const nsString& aText) -{ - NS_ALLOC_STR_BUF(label, aText, 256); - XmString str; - str = XmStringCreate(label, XmFONTLIST_DEFAULT_TAG); - XtVaSetValues(mWidget, XmNlabelString, str, nsnull); - NS_FREE_STR_BUF(label); - XmStringFree(str); - -} - -//------------------------------------------------------------------------- -// -// Get this button label -// -//------------------------------------------------------------------------- -void nsButton::GetLabel(nsString& aBuffer) -{ - XmString str; - XtVaGetValues(mWidget, XmNlabelString, &str, nsnull); - char * text; - if (XmStringGetLtoR(str, XmFONTLIST_DEFAULT_TAG, &text)) { - aBuffer.SetLength(0); - aBuffer.Append(text); - XtFree(text); - } - - XmStringFree(str); - -} - -//------------------------------------------------------------------------- -// -// paint message. Don't send the paint out -// -//------------------------------------------------------------------------- -PRBool nsButton::OnPaint(nsPaintEvent &aEvent) -{ - //printf("** nsButton::OnPaint **\n"); - return PR_FALSE; -} - -PRBool nsButton::OnResize(nsSizeEvent &aEvent) -{ - return PR_FALSE; -} - - -#define GET_OUTER() ((nsButton*) ((char*)this - nsButton::GetOuterOffset())) - -void nsButton::AggButton::GetLabel(nsString& aBuffer) -{ - GET_OUTER()->GetLabel(aBuffer); -} - -void nsButton::AggButton::SetLabel(const nsString& aText) -{ - GET_OUTER()->SetLabel(aText); -} - -//---------------------------------------------------------------------- - -BASE_IWIDGET_IMPL(nsButton, AggButton); - - diff --git a/mozilla/widget/src/motif/nsButton.h b/mozilla/widget/src/motif/nsButton.h deleted file mode 100644 index 8fdec63d474..00000000000 --- a/mozilla/widget/src/motif/nsButton.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsButton_h__ -#define nsButton_h__ - -//#include "nsdefs.h" -#include "nsWindow.h" -#include "nsIButton.h" - -/** - * Native Motif button wrapper - */ - -class nsButton : public nsWindow -{ - -public: - nsButton(nsISupports *aOuter); - virtual ~nsButton(); - - NS_IMETHOD QueryObject(const nsIID& aIID, void** aInstancePtr); - - void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - - // nsIButton part - virtual void SetLabel(const nsString& aText); - virtual void GetLabel(nsString& aBuffer); - virtual PRBool OnPaint(nsPaintEvent & aEvent); - virtual PRBool OnResize(nsSizeEvent &aEvent); - -private: - - // this should not be public - static PRInt32 GetOuterOffset() { - return offsetof(nsButton,mAggWidget); - } - - - // Aggregator class and instance variable used to aggregate in the - // nsIButton interface to nsButton w/o using multiple - // inheritance. - class AggButton : public nsIButton { - public: - AggButton(); - virtual ~AggButton(); - - AGGREGATE_METHOD_DEF - - // nsIButton - virtual void SetLabel(const nsString &aText); - virtual void GetLabel(nsString &aBuffer); - - }; - AggButton mAggWidget; - friend class AggButton; - - -}; - -#endif // nsButton_h__ diff --git a/mozilla/widget/src/motif/nsCheckButton.cpp b/mozilla/widget/src/motif/nsCheckButton.cpp deleted file mode 100644 index f708c05d7b7..00000000000 --- a/mozilla/widget/src/motif/nsCheckButton.cpp +++ /dev/null @@ -1,307 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsCheckButton.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" - -#include "nsXtEventHandler.h" -#include - -#define DBG 0 -//------------------------------------------------------------------------- -// -// nsCheckButton constructor -// -//------------------------------------------------------------------------- -nsCheckButton::nsCheckButton(nsISupports *aOuter) : - nsWindow(aOuter), - mIsArmed(PR_FALSE) -{ - mLowerLeft = PR_TRUE; -} - -//------------------------------------------------------------------------- -// -// nsCheckButton destructor -// -//------------------------------------------------------------------------- -nsCheckButton::~nsCheckButton() -{ -} - -//------------------------------------------------------------------------- -// -// nsCheckButton Creator -// -//------------------------------------------------------------------------- -void nsCheckButton::Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - - Widget parentWidget = nsnull; - - if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); - - if (aParent) { - parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); - } else { - parentWidget = (Widget) aInitData ; - } - - if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); - - - mWidget = ::XtVaCreateManagedWidget("", - xmToggleButtonWidgetClass, - parentWidget, - XmNwidth, aRect.width, - XmNheight, aRect.height, - XmNrecomputeSize, False, - XmNhighlightOnEnter, False, - XmNx, aRect.x, - XmNy, aRect.y, - XmNresizeHeight, False, - XmNresizeWidth, False, - XmNmarginHeight, 0, - XmNmarginWidth, 0, - XmNadjustMargin, False, - XmNspacing, 0, - XmNisAligned, False, - XmNentryBorder, 0, - XmNborderWidth, 0, - 0); - - if (DBG) fprintf(stderr, "Button 0x%x this 0x%x\n", mWidget, this); - - // save the event callback function - mEventCallback = aHandleEventFunction; - - InitCallbacks(); - - /*XtAddCallback(mWidget, - XmNvalueChangedCallback, - nsXtWidget_Toggle_Callback, - this);*/ - - XtAddCallback(mWidget, - XmNarmCallback, - nsXtWidget_Toggle_ArmCallback, - this); - - XtAddCallback(mWidget, - XmNdisarmCallback, - nsXtWidget_Toggle_DisArmCallback, - this); - - - -} - -//------------------------------------------------------------------------- -// -// nsCheckButton Creator -// -//------------------------------------------------------------------------- -void nsCheckButton::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsCheckButton::QueryObject(REFNSIID aIID, void** aInstancePtr) -{ - static NS_DEFINE_IID(kICheckButtonIID, NS_ICHECKBUTTON_IID); - - if (aIID.Equals(kICheckButtonIID)) { - AddRef(); - *aInstancePtr = (void**) &mAggWidget; - return NS_OK; - } - return nsWindow::QueryObject(aIID, aInstancePtr); -} - -//------------------------------------------------------------------------- -// -// Armed -// -//------------------------------------------------------------------------- -void nsCheckButton::Armed() -{ - mIsArmed = PR_TRUE; - mValueWasSet = PR_FALSE; - mInitialState = XmToggleButtonGetState(mWidget); - if (DBG) printf("Arm: InitialValue: %d\n", mInitialState); -} - -//------------------------------------------------------------------------- -// -// DisArmed -// -//------------------------------------------------------------------------- -void nsCheckButton::DisArmed() -{ - if (DBG) printf("DisArm: InitialValue: %d\n", mInitialState); - if (DBG) printf("DisArm: ActualValue: %d\n", XmToggleButtonGetState(mWidget)); - if (DBG) printf("DisArm: mValueWasSet %d\n", mValueWasSet); - if (DBG) printf("DisArm: mNewValue %d\n", mNewValue); - - if (mValueWasSet) { - XmToggleButtonSetState(mWidget, mNewValue, TRUE); - } else { - XmToggleButtonSetState(mWidget, mInitialState, TRUE); - } - mIsArmed = PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -void nsCheckButton::SetState(PRBool aState) -{ - int state = aState; - if (mIsArmed) { - mNewValue = aState; - mValueWasSet = PR_TRUE; - } - XmToggleButtonSetState(mWidget, aState, TRUE); -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -PRBool nsCheckButton::GetState() -{ - int state = XmToggleButtonGetState(mWidget); - if (mIsArmed) { - if (mValueWasSet) { - return mNewValue; - } else { - return state; - } - } else { - return state; - } -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -void nsCheckButton::SetLabel(const nsString& aText) -{ - NS_ALLOC_STR_BUF(label, aText, 256); - XmString str; - str = XmStringCreate(label, XmFONTLIST_DEFAULT_TAG); - XtVaSetValues(mWidget, XmNlabelString, str, nsnull); - NS_FREE_STR_BUF(label); - XmStringFree(str); -} - - -//------------------------------------------------------------------------- -// -// Get this button label -// -//------------------------------------------------------------------------- -void nsCheckButton::GetLabel(nsString& aBuffer) -{ - XmString str; - XtVaGetValues(mWidget, XmNlabelString, &str, nsnull); - char * text; - if (XmStringGetLtoR(str, XmFONTLIST_DEFAULT_TAG, &text)) { - aBuffer.SetLength(0); - aBuffer.Append(text); - XtFree(text); - } - XmStringFree(str); - -} - -//------------------------------------------------------------------------- -// -// move, paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsCheckButton::OnMove(PRInt32, PRInt32) -{ - return PR_FALSE; -} - -PRBool nsCheckButton::OnPaint(nsPaintEvent &aEvent) -{ - return PR_FALSE; -} - -PRBool nsCheckButton::OnResize(nsSizeEvent &aEvent) -{ - return PR_FALSE; -} - -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- - -#define GET_OUTER() \ - ((nsCheckButton*) ((char*)this - nsCheckButton::GetOuterOffset())) - -PRBool nsCheckButton::AggCheckButton::GetState() -{ - return GET_OUTER()->GetState(); -} - -void nsCheckButton::AggCheckButton::SetState(PRBool aState) -{ - GET_OUTER()->SetState(aState); -} - -void nsCheckButton::AggCheckButton::SetLabel(const nsString& aText) -{ - GET_OUTER()->SetLabel(aText); -} - -void nsCheckButton::AggCheckButton::GetLabel(nsString& aText) -{ - GET_OUTER()->GetLabel(aText); -} - - - -//---------------------------------------------------------------------- - -BASE_IWIDGET_IMPL(nsCheckButton, AggCheckButton); - diff --git a/mozilla/widget/src/motif/nsCheckButton.h b/mozilla/widget/src/motif/nsCheckButton.h deleted file mode 100644 index 7af3e2e7ac8..00000000000 --- a/mozilla/widget/src/motif/nsCheckButton.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsCheckButton_h__ -#define nsCheckButton_h__ - -#include "nsWindow.h" -#include "nsICheckButton.h" - -/** - * Native Motif Checkbox wrapper - */ - -class nsCheckButton : public nsWindow - -{ - -public: - - nsCheckButton(nsISupports *aOuter); - virtual ~nsCheckButton(); - - NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); - - void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - // nsICheckButton part - virtual void SetLabel(const nsString& aText); - virtual void GetLabel(nsString& aBuffer); - - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnPaint(nsPaintEvent &aEvent); - virtual PRBool OnResize(nsSizeEvent &aEvent); - - virtual void SetState(PRBool aState); - virtual PRBool GetState(); - - // These are needed to Override the auto check behavior - void Armed(); - void DisArmed(); - -private: - - // this should not be public - static PRInt32 GetOuterOffset() { - return offsetof(nsCheckButton,mAggWidget); - } - - Boolean mInitialState; - Boolean mNewValue; - Boolean mValueWasSet; - Boolean mIsArmed; - - // Aggregator class and instance variable used to aggregate in the - // nsIButton interface to nsCheckButton w/o using multiple - // inheritance. - class AggCheckButton : public nsICheckButton { - public: - AggCheckButton(); - virtual ~AggCheckButton(); - - AGGREGATE_METHOD_DEF - - // nsICheckButton - virtual void SetLabel(const nsString &aText); - virtual void GetLabel(nsString &aBuffer); - virtual void SetState(PRBool aState); - virtual PRBool GetState(); - - - }; - AggCheckButton mAggWidget; - friend class AggCheckButton; - -}; - -#endif // nsCheckButton_h__ diff --git a/mozilla/widget/src/motif/nsComboBox.cpp b/mozilla/widget/src/motif/nsComboBox.cpp deleted file mode 100644 index ba6f6bf577f..00000000000 --- a/mozilla/widget/src/motif/nsComboBox.cpp +++ /dev/null @@ -1,573 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsComboBox.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" - -#include -#include - -#define DBG 0 - -#define INITIAL_MAX_ITEMS 128 -#define ITEMS_GROWSIZE 128 - - -//------------------------------------------------------------------------- -// -// nsComboBox constructor -// -//------------------------------------------------------------------------- -nsComboBox::nsComboBox(nsISupports *aOuter) : nsWindow(aOuter) -{ - mMultiSelect = PR_FALSE; - mBackground = NS_RGB(124, 124, 124); - - mMaxNumItems = INITIAL_MAX_ITEMS; - mItems = (Widget *)new long[INITIAL_MAX_ITEMS]; - mNumItems = 0; -} - -//------------------------------------------------------------------------- -// -// nsComboBox:: destructor -// -//------------------------------------------------------------------------- -nsComboBox::~nsComboBox() -{ - if (mItems != nsnull) { - delete[] mItems; - } -} - -//------------------------------------------------------------------------- -// -// initializer -// -//------------------------------------------------------------------------- - -void nsComboBox::SetMultipleSelection(PRBool aMultipleSelections) -{ - mMultiSelect = aMultipleSelections; -} - - -//------------------------------------------------------------------------- -// -// AddItemAt -// -//------------------------------------------------------------------------- - -void nsComboBox::AddItemAt(nsString &aItem, PRInt32 aPosition) -{ - NS_ALLOC_STR_BUF(val, aItem, 256); - - XmString str; - - Arg args[30]; - int argc = 0; - - str = XmStringCreateLocalized(val); - XtSetArg(args[argc], XmNlabelString, str); argc++; - - Widget btn = XmCreatePushButton(mPullDownMenu, val, args, argc); - XtManageChild(btn); - - if (mNumItems == mMaxNumItems) { - // [TODO] Grow array here by ITEMS_GROWSIZE - } - mItems[mNumItems++] = btn; - - NS_FREE_STR_BUF(val); -} - -//------------------------------------------------------------------------- -// -// Finds an item at a postion -// -//------------------------------------------------------------------------- -PRInt32 nsComboBox::FindItem(nsString &aItem, PRInt32 aStartPos) -{ - NS_ALLOC_STR_BUF(val, aItem, 256); - - int i; - PRInt32 index = -1; - for (i=0;i= 0 && aPosition < mNumItems) { - XtUnmanageChild(mItems[aPosition]); - XtDestroyWidget(mItems[aPosition]); - int i; - for (i=aPosition ; i < mNumItems-1; i++) { - mItems[i] = mItems[i+1]; - } - mItems[mNumItems-1] = NULL; - mNumItems--; - return PR_TRUE; - } - return PR_FALSE; - -} - -//------------------------------------------------------------------------- -// -// Removes an Item at a specified location -// -//------------------------------------------------------------------------- -PRBool nsComboBox::GetItemAt(nsString& anItem, PRInt32 aPosition) -{ - PRBool result = PR_FALSE; - - if (aPosition < 0 || aPosition >= mNumItems) { - return result; - } - - XmString str; - XtVaGetValues(mItems[aPosition], XmNlabelString, &str, nsnull); - char * text; - if (XmStringGetLtoR(str, XmFONTLIST_DEFAULT_TAG, &text)) { - anItem = text; - XtFree(text); - } - - return result; -} - -//------------------------------------------------------------------------- -// -// Gets the selected of selected item -// -//------------------------------------------------------------------------- -void nsComboBox::GetSelectedItem(nsString& aItem) -{ - Widget w; - XtVaGetValues(mWidget, XmNmenuHistory, &w, NULL); - int i; - for (i=0;i= 0 && aPosition < mNumItems) { - XtVaSetValues(mWidget, - XmNmenuHistory, mItems[aPosition], - NULL); - } - } else { - // this is an error - } -} - -//------------------------------------------------------------------------- -// -// GetSelectedCount -// -//------------------------------------------------------------------------- -PRInt32 nsComboBox::GetSelectedCount() -{ - if (!mMultiSelect) { - PRInt32 inx = GetSelectedIndex(); - return (inx == -1? 0 : 1); - } else { - return 0;//::SendMessage(mWnd, LB_GETSELCOUNT, (int)0, (LPARAM)0); - } -} - -//------------------------------------------------------------------------- -// -// GetSelectedIndices -// -//------------------------------------------------------------------------- -void nsComboBox::GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) -{ - // this is an error -} - -//------------------------------------------------------------------------- -// -// Deselect -// -//------------------------------------------------------------------------- -void nsComboBox::Deselect() -{ - if (!mMultiSelect) { - //::SendMessage(mWnd, LB_SETCURSEL, (WPARAM)-1, (LPARAM)0); - } else { - // this is an error - } - -} - - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsComboBox::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kIComboBoxIID, NS_ICOMBOBOX_IID); - static NS_DEFINE_IID(kIListWidgetIID, NS_ILISTWIDGET_IID); - if (result == NS_NOINTERFACE) { - if (aIID.Equals(kIComboBoxIID)) { - *aInstancePtr = (void*) ((nsIComboBox*)&mAggWidget); - AddRef(); - result = NS_OK; - } - else if (aIID.Equals(kIListWidgetIID)) { - *aInstancePtr = (void*) ((nsIListWidget*)&mAggWidget); - AddRef(); - result = NS_OK; - } - } - - return result; -} - -//------------------------------------------------------------------------- -// -// nsComboBox Creator -// -//------------------------------------------------------------------------- -void nsComboBox::Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - Widget parentWidget = nsnull; - - if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); - - if (aParent) { - parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); - } else { - parentWidget = (Widget) aInitData ; - } - - if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); - - /*mWidget = ::XtVaCreateManagedWidget("", - xmListWidgetClass, - parentWidget, - XmNitemCount, 0, - XmNwidth, aRect.width, - XmNheight, aRect.height, - XmNx, aRect.x, - XmNy, aRect.y, - nsnull); - */ - Arg args[30]; - int argc; - - argc = 0; - XtSetArg(args[argc], XmNx, 0); argc++; - XtSetArg(args[argc], XmNy, 0); argc++; - mPullDownMenu = XmCreatePulldownMenu(parentWidget, "pulldown", args, argc); - - argc = 0; - XtSetArg(args[argc], XmNmarginHeight, 0); argc++; - XtSetArg(args[argc], XmNmarginWidth, 0); argc++; - XtSetArg(args[argc], XmNrecomputeSize, False); argc++; - XtSetArg(args[argc], XmNresizeHeight, False); argc++; - XtSetArg(args[argc], XmNresizeWidth, False); argc++; - XtSetArg(args[argc], XmNspacing, False); argc++; - XtSetArg(args[argc], XmNborderWidth, 0); argc++; - XtSetArg(args[argc], XmNnavigationType, XmTAB_GROUP); argc++; - XtSetArg(args[argc], XmNtraversalOn, True); argc++; - XtSetArg(args[argc], XmNorientation, XmVERTICAL); argc++; - XtSetArg(args[argc], XmNadjustMargin, False); argc++; - XtSetArg(args[argc], XmNsubMenuId, mPullDownMenu); argc++; - XtSetArg(args[argc], XmNuserData, (XtPointer)this); argc++; - XtSetArg(args[argc], XmNx, aRect.x); argc++; - XtSetArg(args[argc], XmNy, aRect.y); argc++; - XtSetArg(args[argc], XmNwidth, aRect.width); argc++; - XtSetArg(args[argc], XmNheight, aRect.height); argc++; - mWidget = XmCreateOptionMenu(parentWidget, "", args, argc); - - mOptionMenu = XmOptionLabelGadget(mWidget); - XtUnmanageChild(mOptionMenu); - - /*XtVaSetValues(mWidget, - XmNx, aRect.x, - XmNy, aRect.y, - XmNwidth, aRect.width, - XmNheight, aRect.height, - nsnull);*/ - //XtManageChild(mPullDownMenu); - //XtManageChild(mOptionMenu); - - //XtSetMappedWhenManaged(mOptionMenu, False); - //XtManageChild(mOptionMenu); - - - //if (DBG) - - // save the event callback function - mEventCallback = aHandleEventFunction; - - //InitCallbacks(); - -} - -//------------------------------------------------------------------------- -// -// nsComboBox Creator -// -//------------------------------------------------------------------------- -void nsComboBox::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ -} - -//------------------------------------------------------------------------- -// -// move, paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsComboBox::OnMove(PRInt32, PRInt32) -{ - return PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// paint message. Don't send the paint out -// -//------------------------------------------------------------------------- -PRBool nsComboBox::OnPaint(nsPaintEvent &aEvent) -{ - return PR_FALSE; -} - -PRBool nsComboBox::OnResize(nsSizeEvent &aEvent) -{ - return PR_FALSE; -} - - -//------------------------------------------------------------------------- -//------------------------------------------------------------------------- -//------------------------------------------------------------------------- -//------------------------------------------------------------------------- -#define GET_OUTER() ((nsComboBox*) ((char*)this - nsComboBox::GetOuterOffset())) - - -//------------------------------------------------------------------------- -// -// SetMultipleSelection -// -//------------------------------------------------------------------------- - -void nsComboBox::AggComboBox::SetMultipleSelection(PRBool aMultipleSelections) -{ - GET_OUTER()->SetMultipleSelection(aMultipleSelections); -} - - -//------------------------------------------------------------------------- -// -// AddItemAt -// -//------------------------------------------------------------------------- - -void nsComboBox::AggComboBox::AddItemAt(nsString &aItem, PRInt32 aPosition) -{ - GET_OUTER()->AddItemAt(aItem, aPosition); -} - -//------------------------------------------------------------------------- -// -// Finds an item at a postion -// -//------------------------------------------------------------------------- -PRInt32 nsComboBox::AggComboBox::FindItem(nsString &aItem, PRInt32 aStartPos) -{ - return GET_OUTER()->FindItem(aItem, aStartPos); -} - -//------------------------------------------------------------------------- -// -// CountItems - Get Item Count -// -//------------------------------------------------------------------------- -PRInt32 nsComboBox::AggComboBox::GetItemCount() -{ - return GET_OUTER()->GetItemCount(); -} - -//------------------------------------------------------------------------- -// -// Removes an Item at a specified location -// -//------------------------------------------------------------------------- -PRBool nsComboBox::AggComboBox::RemoveItemAt(PRInt32 aPosition) -{ - return GET_OUTER()->RemoveItemAt(aPosition); -} - -//------------------------------------------------------------------------- -// -// Removes an Item at a specified location -// -//------------------------------------------------------------------------- -PRBool nsComboBox::AggComboBox::GetItemAt(nsString& anItem, PRInt32 aPosition) -{ - return GET_OUTER()->GetItemAt(anItem, aPosition); -} - -//------------------------------------------------------------------------- -// -// Gets the selected of selected item -// -//------------------------------------------------------------------------- -void nsComboBox::AggComboBox::GetSelectedItem(nsString& aItem) -{ - GET_OUTER()->GetSelectedItem(aItem); -} - -//------------------------------------------------------------------------- -// -// Gets the list of selected otems -// -//------------------------------------------------------------------------- -PRInt32 nsComboBox::AggComboBox::GetSelectedIndex() -{ - return GET_OUTER()->GetSelectedIndex(); -} - -//------------------------------------------------------------------------- -// -// SelectItem -// -//------------------------------------------------------------------------- -void nsComboBox::AggComboBox::SelectItem(PRInt32 aPosition) -{ - GET_OUTER()->SelectItem(aPosition); -} - -//------------------------------------------------------------------------- -// -// GetSelectedCount -// -//------------------------------------------------------------------------- -PRInt32 nsComboBox::AggComboBox::GetSelectedCount() -{ - return GET_OUTER()->GetSelectedCount(); -} - -//------------------------------------------------------------------------- -// -// GetSelectedIndices -// -//------------------------------------------------------------------------- -void nsComboBox::AggComboBox::GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) -{ - GET_OUTER()->GetSelectedIndices(aIndices, aSize); -} - -//------------------------------------------------------------------------- -// -// Deselect -// -//------------------------------------------------------------------------- -void nsComboBox::AggComboBox::Deselect() -{ - GET_OUTER()->Deselect(); -} - - -//---------------------------------------------------------------------- - -BASE_IWIDGET_IMPL(nsComboBox, AggComboBox); - - diff --git a/mozilla/widget/src/motif/nsComboBox.h b/mozilla/widget/src/motif/nsComboBox.h deleted file mode 100644 index 0f395c3c8ee..00000000000 --- a/mozilla/widget/src/motif/nsComboBox.h +++ /dev/null @@ -1,119 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsComboBox_h__ -#define nsComboBox_h__ - -#include "nsWindow.h" -#include "nsIComboBox.h" - -/** - * Native Motif Listbox wrapper - */ - -class nsComboBox : public nsWindow -{ - -public: - nsComboBox(nsISupports *aOuter); - virtual ~nsComboBox(); - - // nsISupports. Forward to the nsObject base class - NS_IMETHOD QueryObject(const nsIID& aIID, void** aInstancePtr); - - void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnPaint(nsPaintEvent & aEvent); - virtual PRBool OnResize(nsSizeEvent &aEvent); - - // nsIComboBox interface - void SetMultipleSelection(PRBool aMultipleSelections); - void AddItemAt(nsString &aItem, PRInt32 aPosition); - PRInt32 FindItem(nsString &aItem, PRInt32 aStartPos); - PRInt32 GetItemCount(); - PRBool RemoveItemAt(PRInt32 aPosition); - PRBool GetItemAt(nsString& anItem, PRInt32 aPosition); - void GetSelectedItem(nsString& aItem); - PRInt32 GetSelectedIndex(); - PRInt32 GetSelectedCount(); - void GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize); - void SelectItem(PRInt32 aPosition); - void Deselect() ; - -protected: - Widget mPullDownMenu; - Widget mOptionMenu; - PRBool mMultiSelect; - - Widget * mItems; // an array of Widgets - int mMaxNumItems; - int mNumItems; - -private: - - // this should not be public - static PRInt32 GetOuterOffset() { - return offsetof(nsComboBox,mAggWidget); - } - - - // Aggregator class and instance variable used to aggregate in the - // nsIComboBox interface to nsComboBox w/o using multiple - // inheritance. - class AggComboBox : public nsIComboBox { - public: - AggComboBox(); - virtual ~AggComboBox(); - - AGGREGATE_METHOD_DEF - - // nsIComboBox - void SetMultipleSelection(PRBool aMultipleSelections); - void AddItemAt(nsString &aItem, PRInt32 aPosition); - PRInt32 FindItem(nsString &aItem, PRInt32 aStartPos); - PRInt32 GetItemCount(); - PRBool RemoveItemAt(PRInt32 aPosition); - PRBool GetItemAt(nsString& anItem, PRInt32 aPosition); - void GetSelectedItem(nsString& aItem); - PRInt32 GetSelectedIndex(); - PRInt32 GetSelectedCount(); - void GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize); - void SelectItem(PRInt32 aPosition); - void Deselect() ; - - }; - AggComboBox mAggWidget; - friend class AggComboBox; - -}; - -#endif // nsComboBox_h__ diff --git a/mozilla/widget/src/motif/nsFileWidget.cpp b/mozilla/widget/src/motif/nsFileWidget.cpp deleted file mode 100644 index 6f161cd7ecd..00000000000 --- a/mozilla/widget/src/motif/nsFileWidget.cpp +++ /dev/null @@ -1,329 +0,0 @@ -/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsFileWidget.h" -#include -#include "nsXtEventHandler.h" -#include "nsStringUtil.h" - -#define DBG 0 -extern XtAppContext gAppContext; - -//------------------------------------------------------------------------- -// -// nsFileWidget constructor -// -//------------------------------------------------------------------------- -nsFileWidget::nsFileWidget(nsISupports *aOuter) : nsWindow(aOuter), - mIOwnEventLoop(PR_FALSE) -{ - //mWnd = NULL; - mNumberOfFilters = 0; -} - -void nsFileWidget::Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - nsString title("Load"); - Create(aParent, title, eMode_load, aContext, aToolkit, aInitData); -} - - -//------------------------------------------------------------------------- -void nsFileWidget:: Create(nsIWidget *aParent, - nsString& aTitle, - nsMode aMode, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - void *aInitData) -{ - //mWnd = (aParent) ? aParent->GetNativeData(NS_NATIVE_WINDOW) : 0; - mTitle.SetLength(0); - mTitle.Append(aTitle); - mMode = aMode; - - Widget parentWidget = nsnull; - - if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); - - if (aParent) { - parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); - } else { - parentWidget = (Widget) aInitData ; - } - - if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); - - mWidget = XmCreateFileSelectionDialog(parentWidget, "filesb", NULL, 0); - - NS_ALLOC_STR_BUF(title, aTitle, 256); - XmString str; - str = XmStringCreate(title, XmFONTLIST_DEFAULT_TAG); - XtVaSetValues(mWidget, XmNdialogTitle, str, nsnull); - NS_FREE_STR_BUF(title); - XmStringFree(str); - - - XtAddCallback(mWidget, XmNcancelCallback, nsXtWidget_FSBCancel_Callback, this); - XtAddCallback(mWidget, XmNokCallback, nsXtWidget_FSBOk_Callback, this); - - //XtManageChild(mWidget); -} - -void nsFileWidget::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsFileWidget::QueryObject(REFNSIID aIID, void** aInstancePtr) -{ - static NS_DEFINE_IID(kIFileWidgetIID, NS_IFILEWIDGET_IID); - - if (aIID.Equals(kIFileWidgetIID)) { - AddRef(); - *aInstancePtr = (void**) &mAggWidget; - return NS_OK; - } - return nsWindow::QueryObject(aIID, aInstancePtr); -} - - -//------------------------------------------------------------------------- -// -// Ok's the dialog -// -//------------------------------------------------------------------------- -void nsFileWidget::OnOk() -{ - XtUnmanageChild(mWidget); - mWasCancelled = PR_FALSE; - mIOwnEventLoop = PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// Cancel the dialog -// -//------------------------------------------------------------------------- -void nsFileWidget::OnCancel() -{ - XtUnmanageChild(mWidget); - mWasCancelled = PR_TRUE; - mIOwnEventLoop = PR_FALSE; -} - - -//------------------------------------------------------------------------- -// -// Show - Display the file dialog -// -//------------------------------------------------------------------------- -void nsFileWidget::Show(PRBool bState) -{ - nsresult result = nsEventStatus_eIgnore; - XtManageChild(mWidget); - - // XXX Kludge: gAppContext is a global set in nsAppShell - XEvent event; - mIOwnEventLoop = PR_TRUE; - while (mIOwnEventLoop) { - XtAppNextEvent(gAppContext, &event); - XtDispatchEvent(&event); - } - - if (!mWasCancelled) { - XmString str; - char * fileBuf; - XtVaGetValues(mWidget, XmNdirSpec, &str, nsnull); - if (XmStringGetLtoR(str, XmFONTLIST_DEFAULT_TAG, &fileBuf)) { - // Set user-selected location of file or directory - mFile.SetLength(0); - mFile.Append(fileBuf); - XmStringFree(str); - XtFree(fileBuf); - } - } - - /*char fileBuffer[MAX_PATH]; - fileBuffer[0] = '\0'; - OPENFILENAME ofn; - memset(&ofn, 0, sizeof(ofn)); - - ofn.lStructSize = sizeof(ofn); - - nsString filterList; - GetFilterListArray(filterList); - char *filterBuffer = filterList.ToNewCString(); - char *title = mTitle.ToNewCString(); - ofn.lpstrTitle = title; - ofn.lpstrFilter = filterBuffer; - ofn.nFilterIndex = 1; - ofn.hwndOwner = mWnd; - ofn.lpstrFile = fileBuffer; - ofn.nMaxFile = MAX_PATH; - ofn.Flags = OFN_SHAREAWARE | OFN_NOCHANGEDIR | OFN_LONGNAMES | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; - - BOOL result; - - // Save current directory, so we can reset if it changes. - char* currentDirectory = new char[MAX_PATH+1]; - VERIFY(::GetCurrentDirectory(MAX_PATH, currentDirectory) > 0); - - if (mMode == eMode_load) { - result = GetOpenFileName(&ofn); - } - else if (mMode == eMode_save) { - result = GetSaveFileName(&ofn); - } - else { - NS_ASSERTION(0, "Only load and save are supported modes"); - } - - VERIFY(::SetCurrentDirectory(currentDirectory)); - - // Clean up filter buffers - delete filterBuffer; - delete title; - - // Set user-selected location of file or directory - mFile.SetLength(0); - if (result==PR_TRUE) { - mFile.Append(fileBuffer); - } - */ -} - -//------------------------------------------------------------------------- -// -// Convert filter titles + filters into a Windows filter string -// -//------------------------------------------------------------------------- - -void nsFileWidget::GetFilterListArray(nsString& aFilterList) -{ - aFilterList.SetLength(0); - for (PRUint32 i = 0; i < mNumberOfFilters; i++) { - const nsString& title = mTitles[i]; - const nsString& filter = mFilters[i]; - - aFilterList.Append(title); - aFilterList.Append('\0'); - aFilterList.Append(filter); - aFilterList.Append('\0'); - } - aFilterList.Append('\0'); -} - -//------------------------------------------------------------------------- -// -// Set the list of filters -// -//------------------------------------------------------------------------- - -void nsFileWidget::SetFilterList(PRUint32 aNumberOfFilters,const nsString aTitles[],const nsString aFilters[]) -{ - mNumberOfFilters = aNumberOfFilters; - mTitles = aTitles; - mFilters = aFilters; -} - -//------------------------------------------------------------------------- -// -// Get the file + path -// -//------------------------------------------------------------------------- - -void nsFileWidget::GetFile(nsString& aFile) -{ - aFile.SetLength(0); - aFile.Append(mFile); -} - - -//------------------------------------------------------------------------- -// -// nsFileWidget destructor -// -//------------------------------------------------------------------------- -nsFileWidget::~nsFileWidget() -{ -} - -#define GET_OUTER() ((nsFileWidget*) ((char*)this - nsFileWidget::GetOuterOffset())) - -//---------------------------------------------------------------------- - -BASE_IWIDGET_IMPL_NO_SHOW(nsFileWidget, AggFileWidget); - -void nsFileWidget::AggFileWidget::Create( nsIWidget *aParent, - nsString& aTitle, - nsMode aMode, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - void *aInitData) -{ - GET_OUTER()->Create(aParent, aTitle, aMode, aContext, aToolkit, aInitData); -} - -void nsFileWidget::AggFileWidget::OnOk() -{ - GET_OUTER()->OnOk(); -} - -void nsFileWidget::AggFileWidget::OnCancel() -{ - GET_OUTER()->OnCancel(); -} - -void nsFileWidget::AggFileWidget::Show(PRBool bState) -{ - GET_OUTER()->Show(bState); -} - -void nsFileWidget::AggFileWidget::GetFile(nsString& aFile) -{ - GET_OUTER()->GetFile(aFile); -} - -void nsFileWidget::AggFileWidget::SetFilterList(PRUint32 aNumberOfFilters, - const nsString aTitles[], - const nsString aFilters[]) -{ - GET_OUTER()->SetFilterList(aNumberOfFilters, aTitles, aFilters); -} - -PRBool nsFileWidget::AggFileWidget::Show() -{ - GET_OUTER()->Show(PR_TRUE); - return PR_TRUE; -} - - diff --git a/mozilla/widget/src/motif/nsFileWidget.h b/mozilla/widget/src/motif/nsFileWidget.h deleted file mode 100644 index a4b9df926cc..00000000000 --- a/mozilla/widget/src/motif/nsFileWidget.h +++ /dev/null @@ -1,122 +0,0 @@ -/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsFileWidget_h__ -#define nsFileWidget_h__ - -#include "nsToolkit.h" -#include "nsIWidget.h" -#include "nsIFileWidget.h" -#include "nsWindow.h" - -/** - * Native Motif FileSelector wrapper - */ - -class nsFileWidget : public nsWindow -{ - public: - nsFileWidget(nsISupports *aOuter); - virtual ~nsFileWidget(); - NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); - - void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - // nsIWidget interface - - virtual void Create( nsIWidget *aParent, - nsString& aTitle, - nsMode aMode, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - void *aInitData = nsnull); - - // nsIFileWidget part - virtual void Show(PRBool bState); - virtual void GetFile(nsString& aFile); - virtual void SetFilterList(PRUint32 aNumberOfFilters, - const nsString aTitles[], - const nsString aFilters[]); - virtual void OnOk(); - virtual void OnCancel(); - - protected: - PRBool mIOwnEventLoop; - PRBool mWasCancelled; - nsString mTitle; - nsMode mMode; - nsString mFile; - PRUint32 mNumberOfFilters; - const nsString* mTitles; - const nsString* mFilters; - - void GetFilterListArray(nsString& aFilterList); - - private: - - // this should not be public - static PRInt32 GetOuterOffset() { - return offsetof(nsFileWidget,mAggWidget); - } - - - // Aggregator class and instance variable used to aggregate in the - // nsIFileWidget interface to nsFileWidget w/o using multiple - // inheritance. - class AggFileWidget : public nsIFileWidget { - public: - AggFileWidget(); - virtual ~AggFileWidget(); - - AGGREGATE_METHOD_DEF - - // nsIFileWidget - virtual void Create( nsIWidget *aParent, - nsString& aTitle, - nsMode aMode, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - void *aInitData = nsnull); - - virtual void GetFile(nsString& aFile); - virtual void SetFilterList(PRUint32 aNumberOfFilters, - const nsString aTitles[], - const nsString aFilters[]); - - virtual PRBool Show(); - virtual void OnOk(); - virtual void OnCancel(); - }; - AggFileWidget mAggWidget; - friend class AggFileWidget; - -}; - -#endif // nsFileWidget_h__ diff --git a/mozilla/widget/src/motif/nsListBox.cpp b/mozilla/widget/src/motif/nsListBox.cpp deleted file mode 100644 index 759ca8f48b0..00000000000 --- a/mozilla/widget/src/motif/nsListBox.cpp +++ /dev/null @@ -1,550 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsListBox.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" - -#include - -#define DBG 0 - -//------------------------------------------------------------------------- -// -// initializer -// -//------------------------------------------------------------------------- - -void nsListBox::SetMultipleSelection(PRBool aMultipleSelections) -{ - mMultiSelect = aMultipleSelections; -} - - -//------------------------------------------------------------------------- -// -// AddItemAt -// -//------------------------------------------------------------------------- - -void nsListBox::AddItemAt(nsString &aItem, PRInt32 aPosition) -{ - NS_ALLOC_STR_BUF(val, aItem, 256); - - XmString str; - - str = XmStringCreateLocalized(val); - - XmListAddItem(mWidget, str, (int)aPosition+1); - NS_FREE_STR_BUF(val); -} - -//------------------------------------------------------------------------- -// -// Finds an item at a postion -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::FindItem(nsString &aItem, PRInt32 aStartPos) -{ - NS_ALLOC_STR_BUF(val, aItem, 256); - - XmString str = XmStringCreate(val, XmFONTLIST_DEFAULT_TAG); - - int index = XmListItemPos(mWidget, str)-1; - if (index < aStartPos) { - index = -1; - } - NS_FREE_STR_BUF(val); - XmStringFree(str); - - return index; -} - -//------------------------------------------------------------------------- -// -// CountItems - Get Item Count -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::GetItemCount() -{ - int count = 0; - XtVaGetValues(mWidget, XmNitemCount, &count, nsnull); - - return (PRInt32)count; -} - -//------------------------------------------------------------------------- -// -// Removes an Item at a specified location -// -//------------------------------------------------------------------------- -PRBool nsListBox::RemoveItemAt(PRInt32 aPosition) -{ - int count = 0; - XtVaGetValues(mWidget, XmNitemCount, &count, nsnull); - if (aPosition >= 0 && aPosition < count) { - XmListDeletePos(mWidget, aPosition+1); - return PR_TRUE; - } - return PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// -// -//------------------------------------------------------------------------- -PRBool nsListBox::GetItemAt(nsString& anItem, PRInt32 aPosition) -{ - PRBool result = PR_FALSE; - XmStringTable list; - - int count = 0; - XtVaGetValues(mWidget, XmNitems, &list, XmNitemCount, &count, nsnull); - - if (aPosition >= 0 && aPosition < count) { - char * text; - if (XmStringGetLtoR(list[aPosition], XmFONTLIST_DEFAULT_TAG, &text)) { - anItem.SetLength(0); - anItem.Append(text); - XtFree(text); - result = PR_TRUE; - } - } - - return result; -} - -//------------------------------------------------------------------------- -// -// Gets the selected of selected item -// -//------------------------------------------------------------------------- -void nsListBox::GetSelectedItem(nsString& aItem) -{ - int * list; - int count; - - if (XmListGetSelectedPos(mWidget, &list, &count)) { - GetItemAt(aItem, list[0]-1); - XtFree((char *)list); - } -} - -//------------------------------------------------------------------------- -// -// Gets the list of selected otems -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::GetSelectedIndex() -{ - if (!mMultiSelect) { - int * list; - int count; - - if (XmListGetSelectedPos(mWidget, &list, &count)) { - int index = -1; - if (count > 0) { - index = list[0]-1; - } - XtFree((char *)list); - return index; - } - } else { - NS_ASSERTION(0, "Multi selection list box does not support GetSlectedIndex()"); - } - return -1; -} - -//------------------------------------------------------------------------- -// -// SelectItem -// -//------------------------------------------------------------------------- -void nsListBox::SelectItem(PRInt32 aPosition) -{ - int count = 0; - XtVaGetValues(mWidget, XmNitemCount, &count, nsnull); - if (aPosition >= 0 && aPosition < count) { - XmListSelectPos(mWidget, aPosition+1, FALSE); - } -} - -//------------------------------------------------------------------------- -// -// GetSelectedCount -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::GetSelectedCount() -{ - int count = 0; - XtVaGetValues(mWidget, XmNselectedItemCount, &count, nsnull); - return (PRInt32)count; -} - -//------------------------------------------------------------------------- -// -// GetSelectedIndices -// -//------------------------------------------------------------------------- -void nsListBox::GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) -{ - int * list; - int count; - - if (XmListGetSelectedPos(mWidget, &list, &count)) { - int num = aSize > count?count:aSize; - int i; - for (i=0;i 0) { - XtVaSetValues(mWidget, XmNselectedItemCount, 0, NULL); - } - int i; - for (i=0;iGetNativeData(NS_NATIVE_WIDGET); - } else { - parentWidget = (Widget) aInitData ; - } - - if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); - - unsigned char selectionPolicy; - - Boolean autoSelection; - if (mMultiSelect) { - //selectionPolicy = XmEXTENDED_SELECT; - selectionPolicy = XmMULTIPLE_SELECT; - autoSelection = TRUE; - } else { - selectionPolicy = XmBROWSE_SELECT; - autoSelection = FALSE; - } - - mWidget = ::XtVaCreateManagedWidget("", - xmListWidgetClass, - parentWidget, - XmNitemCount, 0, - XmNx, aRect.x, - XmNy, aRect.y, - XmNwidth, aRect.width, - XmNheight, aRect.height, - XmNrecomputeSize, False, - XmNselectionPolicy, selectionPolicy, - XmNautomaticSelection, autoSelection, - XmNscrollBarDisplayPolicy, XmAS_NEEDED, - XmNlistSizePolicy, XmCONSTANT, - XmNmarginTop, 0, - XmNmarginBottom, 0, - XmNmarginLeft, 0, - XmNmarginRight, 0, - XmNmarginHeight, 0, - XmNmarginWidth, 0, - XmNlistMarginHeight, 0, - XmNlistMarginWidth, 0, - XmNscrolledWindowMarginWidth, 0, - XmNscrolledWindowMarginHeight, 0, - nsnull); - if (DBG) fprintf(stderr, "Button 0x%x this 0x%x\n", mWidget, this); - - // save the event callback function - mEventCallback = aHandleEventFunction; - - //InitCallbacks(); - -} - -//------------------------------------------------------------------------- -// -// nsListBox Creator -// -//------------------------------------------------------------------------- -void nsListBox::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ -} - -//------------------------------------------------------------------------- -// -// move, paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsListBox::OnMove(PRInt32, PRInt32) -{ - return PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// paint message. Don't send the paint out -// -//------------------------------------------------------------------------- -PRBool nsListBox::OnPaint(nsPaintEvent &aEvent) -{ - return PR_FALSE; -} - -PRBool nsListBox::OnResize(nsSizeEvent &aEvent) -{ - return PR_FALSE; -} - - -//------------------------------------------------------------------------- -//------------------------------------------------------------------------- -//------------------------------------------------------------------------- -//------------------------------------------------------------------------- -#define GET_OUTER() ((nsListBox*) ((char*)this - nsListBox::GetOuterOffset())) - - -//------------------------------------------------------------------------- -// -// SetMultipleSelection -// -//------------------------------------------------------------------------- - -void nsListBox::AggListBox::SetMultipleSelection(PRBool aMultipleSelections) -{ - GET_OUTER()->SetMultipleSelection(aMultipleSelections); -} - - -//------------------------------------------------------------------------- -// -// AddItemAt -// -//------------------------------------------------------------------------- - -void nsListBox::AggListBox::AddItemAt(nsString &aItem, PRInt32 aPosition) -{ - GET_OUTER()->AddItemAt(aItem, aPosition); -} - -//------------------------------------------------------------------------- -// -// Finds an item at a postion -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::AggListBox::FindItem(nsString &aItem, PRInt32 aStartPos) -{ - return GET_OUTER()->FindItem(aItem, aStartPos); -} - -//------------------------------------------------------------------------- -// -// CountItems - Get Item Count -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::AggListBox::GetItemCount() -{ - return GET_OUTER()->GetItemCount(); -} - -//------------------------------------------------------------------------- -// -// Removes an Item at a specified location -// -//------------------------------------------------------------------------- -PRBool nsListBox::AggListBox::RemoveItemAt(PRInt32 aPosition) -{ - return GET_OUTER()->RemoveItemAt(aPosition); -} - -//------------------------------------------------------------------------- -// -// Removes an Item at a specified location -// -//------------------------------------------------------------------------- -PRBool nsListBox::AggListBox::GetItemAt(nsString& anItem, PRInt32 aPosition) -{ - return GET_OUTER()->GetItemAt(anItem, aPosition); -} - -//------------------------------------------------------------------------- -// -// Gets the selected of selected item -// -//------------------------------------------------------------------------- -void nsListBox::AggListBox::GetSelectedItem(nsString& aItem) -{ - GET_OUTER()->GetSelectedItem(aItem); -} - -//------------------------------------------------------------------------- -// -// Gets the list of selected otems -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::AggListBox::GetSelectedIndex() -{ - return GET_OUTER()->GetSelectedIndex(); -} - -//------------------------------------------------------------------------- -// -// SelectItem -// -//------------------------------------------------------------------------- -void nsListBox::AggListBox::SelectItem(PRInt32 aPosition) -{ - GET_OUTER()->SelectItem(aPosition); -} - -//------------------------------------------------------------------------- -// -// GetSelectedCount -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::AggListBox::GetSelectedCount() -{ - return GET_OUTER()->GetSelectedCount(); -} - -//------------------------------------------------------------------------- -// -// GetSelectedIndices -// -//------------------------------------------------------------------------- -void nsListBox::AggListBox::GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) -{ - GET_OUTER()->GetSelectedIndices(aIndices, aSize); -} - -//------------------------------------------------------------------------- -// -// GetSelectedIndices -// -//------------------------------------------------------------------------- -void nsListBox::AggListBox::SetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) -{ - GET_OUTER()->SetSelectedIndices(aIndices, aSize); -} - -//------------------------------------------------------------------------- -// -// Deselect -// -//------------------------------------------------------------------------- -void nsListBox::AggListBox::Deselect() -{ - GET_OUTER()->Deselect(); -} - - -//---------------------------------------------------------------------- - -BASE_IWIDGET_IMPL(nsListBox, AggListBox); - - diff --git a/mozilla/widget/src/motif/nsListBox.h b/mozilla/widget/src/motif/nsListBox.h deleted file mode 100644 index be804c97f70..00000000000 --- a/mozilla/widget/src/motif/nsListBox.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsListBox_h__ -#define nsListBox_h__ - -#include "nsWindow.h" -#include "nsIListBox.h" - -/** - * Native Motif Listbox wrapper - */ - -class nsListBox : public nsWindow -{ - -public: - nsListBox(nsISupports *aOuter); - virtual ~nsListBox(); - - // nsISupports. Forward to the nsObject base class - NS_IMETHOD QueryObject(const nsIID& aIID, void** aInstancePtr); - - void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnPaint(nsPaintEvent & aEvent); - virtual PRBool OnResize(nsSizeEvent &aEvent); - - - // nsIListBox interface - void SetMultipleSelection(PRBool aMultipleSelections); - void AddItemAt(nsString &aItem, PRInt32 aPosition); - PRInt32 FindItem(nsString &aItem, PRInt32 aStartPos); - PRInt32 GetItemCount(); - PRBool RemoveItemAt(PRInt32 aPosition); - PRBool GetItemAt(nsString& anItem, PRInt32 aPosition); - void GetSelectedItem(nsString& aItem); - PRInt32 GetSelectedIndex(); - PRInt32 GetSelectedCount(); - void GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize); - void SetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize); - void SelectItem(PRInt32 aPosition); - void Deselect() ; - -protected: - PRBool mMultiSelect; - -private: - - // this should not be public - static PRInt32 GetOuterOffset() { - return offsetof(nsListBox,mAggWidget); - } - - - // Aggregator class and instance variable used to aggregate in the - // nsIListBox interface to nsListBox w/o using multiple - // inheritance. - class AggListBox : public nsIListBox { - public: - AggListBox(); - virtual ~AggListBox(); - - AGGREGATE_METHOD_DEF - - // nsIListBox - void SetMultipleSelection(PRBool aMultipleSelections); - void AddItemAt(nsString &aItem, PRInt32 aPosition); - PRInt32 FindItem(nsString &aItem, PRInt32 aStartPos); - PRInt32 GetItemCount(); - PRBool RemoveItemAt(PRInt32 aPosition); - PRBool GetItemAt(nsString& anItem, PRInt32 aPosition); - void GetSelectedItem(nsString& aItem); - PRInt32 GetSelectedIndex(); - PRInt32 GetSelectedCount(); - void GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize); - void SetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize); - void SelectItem(PRInt32 aPosition); - void Deselect() ; - - }; - AggListBox mAggWidget; - friend class AggListBox; - -}; - -#endif // nsListBox_h__ diff --git a/mozilla/widget/src/motif/nsRadioButton.cpp b/mozilla/widget/src/motif/nsRadioButton.cpp deleted file mode 100644 index 4742d37c665..00000000000 --- a/mozilla/widget/src/motif/nsRadioButton.cpp +++ /dev/null @@ -1,326 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsRadioButton.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" - -#include "nsXtEventHandler.h" -#include -#include - -#define DBG 0 -//------------------------------------------------------------------------- -// -// nsRadioButton constructor -// -//------------------------------------------------------------------------- -nsRadioButton::nsRadioButton(nsISupports *aOuter) : - nsWindow(aOuter), - mIsArmed(PR_FALSE) -{ -} - -//------------------------------------------------------------------------- -// -// nsRadioButton destructor -// -//------------------------------------------------------------------------- -nsRadioButton::~nsRadioButton() -{ -} - -//------------------------------------------------------------------------- -// -// nsRadioButton Creator -// -//------------------------------------------------------------------------- -void nsRadioButton::Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - Widget parentWidget = nsnull; - - if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); - - if (aParent) { - parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); - } else { - parentWidget = (Widget) aInitData ; - } - - if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); - - mWidget = ::XmCreateRadioBox(parentWidget, "radio", nsnull, 0); - XtVaSetValues(mWidget, XmNwidth, aRect.width, - XmNheight, aRect.height, - XmNx, aRect.x, - XmNy, aRect.y, - XmNrecomputeSize, False, - XmNresizeHeight, False, - XmNresizeWidth, False, - XmNradioAlwaysOne, False, - XmNmarginHeight, 0, - XmNmarginWidth, 0, - XmNadjustMargin, False, - XmNspacing, 0, -// XmNentryAlignment, XmALIGNMENT_CENTER, -// XmNentryVerticalAlignment, XmALIGNMENT_CENTER, - XmNisAligned, False, - XmNentryBorder, 0, - XmNorientation, XmVERTICAL, - XmNborderWidth, 0, - 0); - - mRadioBtn = ::XmCreateToggleButton(mWidget, "", nsnull, 0); - - XtVaSetValues(mRadioBtn, - XmNwidth, aRect.width, - XmNheight, aRect.height, - XmNx, 0, - XmNy, 0, - XmNrecomputeSize, False, - XmNresizeHeight, False, - XmNresizeWidth, False, - XmNmarginHeight, 0, - XmNmarginWidth, 0, - XmNadjustMargin, False, - XmNspacing, 0, - XmNisAligned, False, - XmNentryBorder, 0, - XmNborderWidth, 0, - 0); - - XtManageChild(mRadioBtn); - - if (DBG) fprintf(stderr, "Button 0x%x this 0x%x\n", mWidget, this); - - // save the event callback function - mEventCallback = aHandleEventFunction; - - InitCallbacks(); - - XtAddCallback(mRadioBtn, - XmNarmCallback, - nsXtWidget_RadioButton_ArmCallback, - this); - - XtAddCallback(mRadioBtn, - XmNdisarmCallback, - nsXtWidget_RadioButton_DisArmCallback, - this); - - /*XtAddCallback(mRadioBtn, - XmNvalueChangedCallback, - nsXtWidget_Toggle_ValueChangedCallback, - this);*/ - - - -} - -//------------------------------------------------------------------------- -// -// nsRadioButton Creator -// -//------------------------------------------------------------------------- -void nsRadioButton::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsRadioButton::QueryObject(REFNSIID aIID, void** aInstancePtr) -{ - static NS_DEFINE_IID(kIRadioButtonIID, NS_IRADIOBUTTON_IID); - - if (aIID.Equals(kIRadioButtonIID)) { - AddRef(); - *aInstancePtr = (void**) &mAggWidget; - return NS_OK; - } - return nsWindow::QueryObject(aIID, aInstancePtr); -} - -//------------------------------------------------------------------------- -// -// Armed -// -//------------------------------------------------------------------------- -void nsRadioButton::Armed() -{ - mIsArmed = PR_TRUE; - mValueWasSet = PR_FALSE; - mInitialState = XmToggleButtonGetState(mRadioBtn); - if (DBG) printf("Arm: InitialValue: %d\n", mInitialState); -} - -//------------------------------------------------------------------------- -// -// DisArmed -// -//------------------------------------------------------------------------- -void nsRadioButton::DisArmed() -{ - if (DBG) printf("DisArm: InitialValue: %d\n", mInitialState); - if (DBG) printf("DisArm: ActualValue: %d\n", XmToggleButtonGetState(mRadioBtn)); - if (DBG) printf("DisArm: mValueWasSet %d\n", mValueWasSet); - if (DBG) printf("DisArm: mNewValue %d\n", mNewValue); - - if (mValueWasSet) { - XmToggleButtonSetState(mRadioBtn, mNewValue, TRUE); - } else { - XmToggleButtonSetState(mRadioBtn, mInitialState, TRUE); - } - mIsArmed = PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -void nsRadioButton::SetState(PRBool aState) -{ - int state = aState; - if (mIsArmed) { - mNewValue = aState; - mValueWasSet = PR_TRUE; - } - XmToggleButtonSetState(mRadioBtn, aState, TRUE); -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -PRBool nsRadioButton::GetState() -{ - int state = XmToggleButtonGetState(mRadioBtn); - if (mIsArmed) { - if (mValueWasSet) { - return mNewValue; - } else { - return state; - } - } else { - return state; - } -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -void nsRadioButton::SetLabel(const nsString& aText) -{ - NS_ALLOC_STR_BUF(label, aText, 256); - XmString str; - str = XmStringCreate(label, XmFONTLIST_DEFAULT_TAG); - XtVaSetValues(mRadioBtn, XmNlabelString, str, nsnull); - NS_FREE_STR_BUF(label); - XmStringFree(str); -} - - -//------------------------------------------------------------------------- -// -// Get this button label -// -//------------------------------------------------------------------------- -void nsRadioButton::GetLabel(nsString& aBuffer) -{ - XmString str; - XtVaGetValues(mRadioBtn, XmNlabelString, &str, nsnull); - char * text; - if (XmStringGetLtoR(str, XmFONTLIST_DEFAULT_TAG, &text)) { - aBuffer.SetLength(0); - aBuffer.Append(text); - XtFree(text); - } - XmStringFree(str); - -} - -//------------------------------------------------------------------------- -// -// move, paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsRadioButton::OnMove(PRInt32, PRInt32) -{ - return PR_FALSE; -} - -PRBool nsRadioButton::OnPaint(nsPaintEvent &aEvent) -{ - return PR_FALSE; -} - -PRBool nsRadioButton::OnResize(nsSizeEvent &aEvent) -{ - return PR_FALSE; -} - -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- - -#define GET_OUTER() \ - ((nsRadioButton*) ((char*)this - nsRadioButton::GetOuterOffset())) - -PRBool nsRadioButton::AggRadioButton::GetState() -{ - return GET_OUTER()->GetState(); -} - -void nsRadioButton::AggRadioButton::SetState(PRBool aState) -{ - GET_OUTER()->SetState(aState); -} - -void nsRadioButton::AggRadioButton::SetLabel(const nsString& aText) -{ - GET_OUTER()->SetLabel(aText); -} - -void nsRadioButton::AggRadioButton::GetLabel(nsString& aText) -{ - GET_OUTER()->GetLabel(aText); -} - - -//---------------------------------------------------------------------- - -BASE_IWIDGET_IMPL(nsRadioButton, AggRadioButton); - diff --git a/mozilla/widget/src/motif/nsRadioButton.h b/mozilla/widget/src/motif/nsRadioButton.h deleted file mode 100644 index afb5c1bd41c..00000000000 --- a/mozilla/widget/src/motif/nsRadioButton.h +++ /dev/null @@ -1,104 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsRadioButton_h__ -#define nsRadioButton_h__ - -#include "nsWindow.h" -#include "nsIRadioButton.h" - -/** - * Native Motif Radiobutton wrapper - */ - -class nsRadioButton : public nsWindow - -{ - -public: - - nsRadioButton(nsISupports *aOuter); - virtual ~nsRadioButton(); - - NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); - - void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - // nsIRadioButton part - virtual void SetLabel(const nsString& aText); - virtual void GetLabel(nsString& aBuffer); - - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnPaint(nsPaintEvent &aEvent); - virtual PRBool OnResize(nsSizeEvent &aEvent); - - virtual void SetState(PRBool aState); - virtual PRBool GetState(); - - // These are needed to Override the auto check behavior - void Armed(); - void DisArmed(); - -private: - - // this should not be public - static PRInt32 GetOuterOffset() { - return offsetof(nsRadioButton,mAggWidget); - } - - Widget mRadioBtn; - Boolean mInitialState; - Boolean mNewValue; - Boolean mValueWasSet; - Boolean mIsArmed; - - // Aggregator class and instance variable used to aggregate in the - // nsIButton interface to nsRadioButton w/o using multiple - // inheritance. - class AggRadioButton : public nsIRadioButton { - public: - AggRadioButton(); - virtual ~AggRadioButton(); - - AGGREGATE_METHOD_DEF - - // nsIRadioButton - virtual void SetLabel(const nsString &aText); - virtual void GetLabel(nsString &aBuffer); - virtual void SetState(PRBool aState); - virtual PRBool GetState(); - - }; - AggRadioButton mAggWidget; - friend class AggRadioButton; - -}; - -#endif // nsRadioButton_h__ diff --git a/mozilla/widget/src/motif/nsScrollbar.cpp b/mozilla/widget/src/motif/nsScrollbar.cpp deleted file mode 100644 index 9e1f747a735..00000000000 --- a/mozilla/widget/src/motif/nsScrollbar.cpp +++ /dev/null @@ -1,482 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsScrollbar.h" -#include "nsToolkit.h" -#include "nsGUIEvent.h" -#include "nsUnitConversion.h" -#include - -#include "nsXtEventHandler.h" - -#define DBG 0 - -//------------------------------------------------------------------------- -// -// nsScrollbar constructor -// -//------------------------------------------------------------------------- -nsScrollbar::nsScrollbar(nsISupports *aOuter, PRBool aIsVertical) : nsWindow(aOuter) -{ - strcpy(gInstanceClassName, "nsScrollbar"); - mOrientation = (aIsVertical) ? XmVERTICAL : XmHORIZONTAL; - mLineIncrement = 0; - -} -//------------------------------------------------------------------------- -// -// Create -// -//------------------------------------------------------------------------- -void nsScrollbar::Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - Widget parentWidget = nsnull; - strcpy(gInstanceClassName, "nsScrollbar"); - - if (aParent) { - parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); - } else { - parentWidget = (Widget) aInitData ; - } - - int procDir = mOrientation == XmVERTICAL? XmMAX_ON_BOTTOM:XmMAX_ON_RIGHT; - - mWidget = ::XtVaCreateManagedWidget("scrollbar", - xmScrollBarWidgetClass, - parentWidget, - XmNorientation, mOrientation, - XmNprocessingDirection, procDir, - XmNwidth, aRect.width, - XmNheight, aRect.height, - XmNrecomputeSize, False, - XmNhighlightOnEnter, False, - XmNminimum, 0, - XmNmaximum, 100, - XmNx, aRect.x, - XmNy, aRect.y, - nsnull); - - // save the event callback function - mEventCallback = aHandleEventFunction; - - //InitCallbacks(); - XtAddCallback(mWidget, - XmNdragCallback, - nsXtWidget_Scrollbar_Callback, - this); - - XtAddCallback(mWidget, - XmNdecrementCallback, - nsXtWidget_Scrollbar_Callback, - this); - - XtAddCallback(mWidget, - XmNincrementCallback, - nsXtWidget_Scrollbar_Callback, - this); - - XtAddCallback(mWidget, - XmNvalueChangedCallback, - nsXtWidget_Scrollbar_Callback, - this); - - /*XtAddCallback(mWidget, - XmNresizeCallback, - nsXtWidget_Resize_Callback, - this);*/ - -} - -//------------------------------------------------------------------------- -// -// Create -// -//------------------------------------------------------------------------- -void nsScrollbar::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ -} - -//------------------------------------------------------------------------- -// -// nsScrollbar destructor -// -//------------------------------------------------------------------------- -nsScrollbar::~nsScrollbar() -{ -} - - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsScrollbar::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - static NS_DEFINE_IID(kInsScrollbarIID, NS_ISCROLLBAR_IID); - - if (aIID.Equals(kInsScrollbarIID)) { - AddRef(); - *aInstancePtr = (void**) &mAggWidget; - return NS_OK; - } - return nsWindow::QueryObject(aIID, aInstancePtr); - -} - - -//------------------------------------------------------------------------- -// -// Define the range settings -// -//------------------------------------------------------------------------- -void nsScrollbar::SetMaxRange(PRUint32 aEndRange) -{ - int max = aEndRange; - XtVaGetValues(mWidget, XmNmaximum, &max, nsnull); - if (DBG) printf("SetMaxRange %d\n", max); - -} - - -//------------------------------------------------------------------------- -// -// Return the range settings -// -//------------------------------------------------------------------------- -PRUint32 nsScrollbar::GetMaxRange() -{ - int maxRange = 0; - XtVaGetValues(mWidget, XmNmaximum, &maxRange, nsnull); - return (PRUint32)maxRange; -} - - -//------------------------------------------------------------------------- -// -// Set the thumb position -// -//------------------------------------------------------------------------- -void nsScrollbar::SetPosition(PRUint32 aPos) -{ - int pos = aPos; - XtVaSetValues(mWidget, XmNvalue, pos, nsnull); - if (DBG) printf("SetPosition %d\n", pos); -} - - -//------------------------------------------------------------------------- -// -// Get the current thumb position. -// -//------------------------------------------------------------------------- -PRUint32 nsScrollbar::GetPosition() -{ - int pagePos = 0; - XtVaGetValues(mWidget, XmNvalue, &pagePos, nsnull); - - return (PRUint32)pagePos; -} - - -//------------------------------------------------------------------------- -// -// Set the thumb size -// -//------------------------------------------------------------------------- -void nsScrollbar::SetThumbSize(PRUint32 aSize) -{ - if (aSize > 0) { - XtVaSetValues(mWidget, XmNpageIncrement, (int)aSize, nsnull); - XtVaSetValues(mWidget, XmNsliderSize, (int)aSize, nsnull); - } - if (DBG) printf("SetThumbSize %d\n", aSize); -} - - -//------------------------------------------------------------------------- -// -// Get the thumb size -// -//------------------------------------------------------------------------- -PRUint32 nsScrollbar::GetThumbSize() -{ - int pageSize = 0; - XtVaGetValues(mWidget, XmNpageIncrement, &pageSize, nsnull); - - return (PRUint32)pageSize; -} - - -//------------------------------------------------------------------------- -// -// Set the line increment for this scrollbar -// -//------------------------------------------------------------------------- -void nsScrollbar::SetLineIncrement(PRUint32 aLineIncrement) -{ - mLineIncrement = aLineIncrement; - XtVaSetValues(mWidget, XmNincrement, aLineIncrement, nsnull); - - if (DBG) printf("SetLineIncrement %d\n", aLineIncrement); -} - - -//------------------------------------------------------------------------- -// -// Get the line increment for this scrollbar -// -//------------------------------------------------------------------------- -PRUint32 nsScrollbar::GetLineIncrement() -{ - return mLineIncrement; -} - - -//------------------------------------------------------------------------- -// -// Set all scrolling parameters -// -//------------------------------------------------------------------------- -void nsScrollbar::SetParameters(PRUint32 aMaxRange, PRUint32 aThumbSize, - PRUint32 aPosition, PRUint32 aLineIncrement) -{ - - int thumbSize = (aThumbSize > 0?aThumbSize:1); - - XtVaSetValues(mWidget, - XmNincrement, (aLineIncrement > 0?aLineIncrement:1), - XmNminimum, 0, - XmNmaximum, (aMaxRange > 0?aMaxRange:10), - XmNsliderSize, thumbSize, - XmNpageIncrement, thumbSize, - XmNvalue, aPosition, - nsnull); - - mLineIncrement = aLineIncrement; - if (DBG) printf("SetParameters %d %d %d %d \n", aMaxRange, aThumbSize, - aPosition, aLineIncrement); -} - - -//------------------------------------------------------------------------- -// -// paint message. Don't send the paint out -// -//------------------------------------------------------------------------- -PRBool nsScrollbar::OnPaint(nsPaintEvent & aEvent) -{ - return PR_FALSE; -} - - -PRBool nsScrollbar::OnResize(nsSizeEvent &aEvent) -{ -printf("Scrollbar onresize\n"); - if (DBG) printf("*&*&*&*&*&*&*()()()()(((( nsScrollbar::OnResize\n"); - return nsWindow::OnResize(aEvent); - //return PR_FALSE; -} - - -//------------------------------------------------------------------------- -// -// Deal with scrollbar messages (actually implemented only in nsScrollbar) -// -//------------------------------------------------------------------------- -PRBool nsScrollbar::OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos) -{ - PRBool result = PR_TRUE; - int newPosition; - - switch (aEvent.message) { - - // scroll one line right or down - case NS_SCROLLBAR_LINE_NEXT: - { - XtVaGetValues(mWidget, XmNvalue, &newPosition, nsnull); - newPosition += mLineIncrement; - PRUint32 max = GetMaxRange() - GetThumbSize(); - if (newPosition > (int)max) - newPosition = (int)max; - - // if an event callback is registered, give it the chance - // to change the increment - if (mEventCallback) { - aEvent.position = newPosition; - result = ConvertStatus((*mEventCallback)(&aEvent)); - newPosition = aEvent.position; - } - XtVaSetValues(mWidget, XmNvalue, newPosition, nsnull); - break; - } - - - // scroll one line left or up - case NS_SCROLLBAR_LINE_PREV: - { - XtVaGetValues(mWidget, XmNvalue, &newPosition, nsnull); - - newPosition -= mLineIncrement; - if (newPosition < 0) - newPosition = 0; - - // if an event callback is registered, give it the chance - // to change the decrement - if (mEventCallback) { - aEvent.position = newPosition; - - result = ConvertStatus((*mEventCallback)(&aEvent)); - newPosition = aEvent.position; - } - - XtVaSetValues(mWidget, XmNvalue, newPosition, nsnull); - - break; - } - - // Scrolls one page right or down - case NS_SCROLLBAR_PAGE_NEXT: - { - XtVaGetValues(mWidget, XmNvalue, &newPosition, nsnull); - PRUint32 max = GetMaxRange() - GetThumbSize(); - if (newPosition > (int)max) - newPosition = (int)max; - - // if an event callback is registered, give it the chance - // to change the increment - if (mEventCallback) { - aEvent.position = newPosition; - result = ConvertStatus((*mEventCallback)(&aEvent)); - newPosition = aEvent.position; - } - XtVaSetValues(mWidget, XmNvalue, newPosition + 10, nsnull); - break; - } - - // Scrolls one page left or up. - case NS_SCROLLBAR_PAGE_PREV: - { - XtVaGetValues(mWidget, XmNvalue, &newPosition, nsnull); - if (newPosition < 0) - newPosition = 0; - - // if an event callback is registered, give it the chance - // to change the increment - if (mEventCallback) { - aEvent.position = newPosition; - result = ConvertStatus((*mEventCallback)(&aEvent)); - newPosition = aEvent.position; - } - - XtVaSetValues(mWidget, XmNvalue, newPosition - 10, nsnull); - break; - } - - - // Scrolls to the absolute position. The current position is specified by - // the cPos parameter. - case NS_SCROLLBAR_POS: - { - newPosition = cPos; - - // if an event callback is registered, give it the chance - // to change the increment - if (mEventCallback) { - aEvent.position = newPosition; - result = ConvertStatus((*mEventCallback)(&aEvent)); - newPosition = aEvent.position; - } - - XtVaSetValues(mWidget, XmNvalue, newPosition, nsnull); - - break; - } - } - return result; -} - -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -#define GET_OUTER() ((nsScrollbar*) ((char*)this - nsScrollbar::GetOuterOffset())) - -// nsIScrollbar part -void nsScrollbar::AggScrollbar::SetMaxRange(PRUint32 aEndRange) -{ - GET_OUTER()->SetMaxRange(aEndRange); -} - -PRUint32 nsScrollbar::AggScrollbar::GetMaxRange() -{ - return GET_OUTER()->GetMaxRange(); -} - -void nsScrollbar::AggScrollbar::SetPosition(PRUint32 aPos) -{ - GET_OUTER()->SetPosition(aPos); -} - -PRUint32 nsScrollbar::AggScrollbar::GetPosition() -{ - return GET_OUTER()->GetPosition(); -} - -void nsScrollbar::AggScrollbar::SetThumbSize(PRUint32 aSize) -{ - GET_OUTER()->SetThumbSize(aSize); -} - -PRUint32 nsScrollbar::AggScrollbar::GetThumbSize() -{ - return GET_OUTER()->GetThumbSize(); -} - -void nsScrollbar::AggScrollbar::SetLineIncrement(PRUint32 aSize) -{ - GET_OUTER()->SetLineIncrement(aSize); -} - -PRUint32 nsScrollbar::AggScrollbar::GetLineIncrement() -{ - return GET_OUTER()->GetLineIncrement(); -} - -void nsScrollbar::AggScrollbar::SetParameters(PRUint32 aMaxRange, - PRUint32 aThumbSize, - PRUint32 aPosition, - PRUint32 aLineIncrement) -{ - GET_OUTER()->SetParameters(aMaxRange, aThumbSize, aPosition, aLineIncrement); -} - -//---------------------------------------------------------------------- - -BASE_IWIDGET_IMPL(nsScrollbar, AggScrollbar); - diff --git a/mozilla/widget/src/motif/nsScrollbar.h b/mozilla/widget/src/motif/nsScrollbar.h deleted file mode 100644 index 9b967f8ca85..00000000000 --- a/mozilla/widget/src/motif/nsScrollbar.h +++ /dev/null @@ -1,108 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsScrollbar_h__ -#define nsScrollbar_h__ - -#include "nsWindow.h" - -#include "nsIScrollbar.h" - -/** - * Native Motif scrollbar wrapper. - */ - -class nsScrollbar : public nsWindow -{ - -public: - nsScrollbar(nsISupports *aOuter, PRBool aIsVertical); - virtual ~nsScrollbar(); - - NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); - - void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - - // nsIScrollbar part - virtual void SetMaxRange(PRUint32 aEndRange); - virtual PRUint32 GetMaxRange(); - virtual void SetPosition(PRUint32 aPos); - virtual PRUint32 GetPosition(); - virtual void SetThumbSize(PRUint32 aSize); - virtual PRUint32 GetThumbSize(); - virtual void SetLineIncrement(PRUint32 aSize); - virtual PRUint32 GetLineIncrement(); - virtual void SetParameters(PRUint32 aMaxRange, PRUint32 aThumbSize, - PRUint32 aPosition, PRUint32 aLineIncrement); - - virtual PRBool OnPaint(nsPaintEvent & aEvent); - virtual PRBool OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos); - virtual PRBool OnResize(nsSizeEvent &aEvent); - -private: - - PRUint32 mLineIncrement; - int mOrientation; - - // this should not be public - static PRInt32 GetOuterOffset() { - return offsetof(nsScrollbar,mAggWidget); - } - - // Aggregator class and instance variable used to aggregate in the - // nsIButton interface to nsButton w/o using multiple - // inheritance. - class AggScrollbar : public nsIScrollbar { - public: - AggScrollbar(); - virtual ~AggScrollbar(); - - AGGREGATE_METHOD_DEF - - // nsIScrollbar part - virtual void SetMaxRange(PRUint32 aEndRange); - virtual PRUint32 GetMaxRange(); - virtual void SetPosition(PRUint32 aPos); - virtual PRUint32 GetPosition(); - virtual void SetThumbSize(PRUint32 aSize); - virtual PRUint32 GetThumbSize(); - virtual void SetLineIncrement(PRUint32 aSize); - virtual PRUint32 GetLineIncrement(); - virtual void SetParameters(PRUint32 aMaxRange, PRUint32 aThumbSize, - PRUint32 aPosition, PRUint32 aLineIncrement); - }; - AggScrollbar mAggWidget; - friend class AggScrollbar; - - -}; - -#endif // nsScrollbar_ diff --git a/mozilla/widget/src/motif/nsTextAreaWidget.cpp b/mozilla/widget/src/motif/nsTextAreaWidget.cpp deleted file mode 100644 index 77bb8839bbb..00000000000 --- a/mozilla/widget/src/motif/nsTextAreaWidget.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsTextAreaWidget.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsXtEventHandler.h" - -#include - -#define DBG 0 - -//------------------------------------------------------------------------- -// -// nsTextAreaWidget constructor -// -//------------------------------------------------------------------------- -nsTextAreaWidget::nsTextAreaWidget(nsISupports *aOuter) : nsWindow(aOuter), - mMakeReadOnly(PR_FALSE) -{ - //mBackground = NS_RGB(124, 124, 124); -} - -//------------------------------------------------------------------------- -// -// nsTextAreaWidget destructor -// -//------------------------------------------------------------------------- -nsTextAreaWidget::~nsTextAreaWidget() -{ -} - -//------------------------------------------------------------------------- -void nsTextAreaWidget::Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - Widget parentWidget = nsnull; - - if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); - - if (aParent) { - parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); - } else { - parentWidget = (Widget) aInitData ; - } - - if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); - - mWidget = ::XtVaCreateManagedWidget("button", - xmTextWidgetClass, - parentWidget, - XmNwidth, aRect.width, - XmNheight, aRect.height, - XmNrecomputeSize, False, - XmNhighlightOnEnter, False, - XmNeditMode, XmMULTI_LINE_EDIT, - XmNeditable, mMakeReadOnly?False:True, - XmNx, aRect.x, - XmNy, aRect.y, - nsnull); - mHelper = new nsTextHelper(mWidget); - if (DBG) fprintf(stderr, "Button 0x%x this 0x%x\n", mWidget, this); - - // save the event callback function - mEventCallback = aHandleEventFunction; - - InitCallbacks("nsTextAreaWidget"); - - if (mMakeReadOnly) { - SetReadOnly(PR_TRUE); - } - -} - -//------------------------------------------------------------------------- -void nsTextAreaWidget::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ -} - - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsTextAreaWidget::QueryObject(REFNSIID aIID, void** aInstancePtr) -{ - static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID); - static NS_DEFINE_IID(kITextAreaWidgetIID, NS_ITEXTAREAWIDGET_IID); - - if (aIID.Equals(kITextWidgetIID)) { - AddRef(); - *aInstancePtr = (void**) &mAggWidget; - return NS_OK; - } - if (aIID.Equals(kITextAreaWidgetIID)) { - AddRef(); - *aInstancePtr = (void**) &mAggWidget; - return NS_OK; - } - return nsWindow::QueryObject(aIID, aInstancePtr); -} - - -//------------------------------------------------------------------------- -// -// paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsTextAreaWidget::OnPaint(nsPaintEvent & aEvent) -{ - return PR_FALSE; -} - - -//-------------------------------------------------------------- -PRBool nsTextAreaWidget::OnResize(nsSizeEvent &aEvent) -{ - return PR_FALSE; -} - -//-------------------------------------------------------------- -void nsTextAreaWidget::SetPassword(PRBool aIsPassword) -{ -} - -//-------------------------------------------------------------- -PRBool nsTextAreaWidget::SetReadOnly(PRBool aReadOnlyFlag) -{ - if (mWidget == nsnull && aReadOnlyFlag) { - mMakeReadOnly = PR_TRUE; - return PR_TRUE; - } - return mHelper->SetReadOnly(aReadOnlyFlag); -} - -//-------------------------------------------------------------- -void nsTextAreaWidget::SetMaxTextLength(PRUint32 aChars) -{ - mHelper->SetMaxTextLength(aChars); -} - -//-------------------------------------------------------------- -PRUint32 nsTextAreaWidget::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) { - return mHelper->GetText(aTextBuffer, aBufferSize); -} - -//-------------------------------------------------------------- -PRUint32 nsTextAreaWidget::SetText(const nsString& aText) -{ - return mHelper->SetText(aText); -} - -//-------------------------------------------------------------- -PRUint32 nsTextAreaWidget::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) -{ - return mHelper->InsertText(aText, aStartPos, aEndPos); -} - -//-------------------------------------------------------------- -void nsTextAreaWidget::RemoveText() -{ - mHelper->RemoveText(); -} - -//-------------------------------------------------------------- -void nsTextAreaWidget::SelectAll() -{ - mHelper->SelectAll(); -} - - -//-------------------------------------------------------------- -void nsTextAreaWidget::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) -{ - mHelper->SetSelection(aStartSel, aEndSel); -} - - -//-------------------------------------------------------------- -void nsTextAreaWidget::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) -{ - mHelper->GetSelection(aStartSel, aEndSel); -} - -//-------------------------------------------------------------- -void nsTextAreaWidget::SetCaretPosition(PRUint32 aPosition) -{ - mHelper->SetCaretPosition(aPosition); -} - -//-------------------------------------------------------------- -PRUint32 nsTextAreaWidget::GetCaretPosition() -{ - return mHelper->GetCaretPosition(); -} - -//-------------------------------------------------------------- -PRBool nsTextAreaWidget::AutoErase() -{ - return mHelper->AutoErase(); -} - - - -//-------------------------------------------------------------- -#define GET_OUTER() ((nsTextAreaWidget*) ((char*)this - nsTextAreaWidget::GetOuterOffset())) - - -//-------------------------------------------------------------- -void nsTextAreaWidget::AggTextAreaWidget::SetMaxTextLength(PRUint32 aChars) -{ - GET_OUTER()->SetMaxTextLength(aChars); -} - -//-------------------------------------------------------------- -PRUint32 nsTextAreaWidget::AggTextAreaWidget::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) { - return GET_OUTER()->GetText(aTextBuffer, aBufferSize); -} - -//-------------------------------------------------------------- -PRUint32 nsTextAreaWidget::AggTextAreaWidget::SetText(const nsString& aText) -{ - return GET_OUTER()->SetText(aText); -} - -//-------------------------------------------------------------- -PRUint32 nsTextAreaWidget::AggTextAreaWidget::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) -{ - return GET_OUTER()->InsertText(aText, aStartPos, aEndPos); -} - -//-------------------------------------------------------------- -void nsTextAreaWidget::AggTextAreaWidget::RemoveText() -{ - GET_OUTER()->RemoveText(); -} - -//-------------------------------------------------------------- -void nsTextAreaWidget::AggTextAreaWidget::SetPassword(PRBool aIsPassword) -{ - GET_OUTER()->SetPassword(aIsPassword); -} - -//-------------------------------------------------------------- -PRBool nsTextAreaWidget::AggTextAreaWidget::SetReadOnly(PRBool aReadOnlyFlag) -{ - return GET_OUTER()->SetReadOnly(aReadOnlyFlag); -} - -//-------------------------------------------------------------- -void nsTextAreaWidget::AggTextAreaWidget::SelectAll() -{ - GET_OUTER()->SelectAll(); -} - - -//-------------------------------------------------------------- -void nsTextAreaWidget::AggTextAreaWidget::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) -{ - GET_OUTER()->SetSelection(aStartSel, aEndSel); -} - - -//-------------------------------------------------------------- -void nsTextAreaWidget::AggTextAreaWidget::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) -{ - GET_OUTER()->GetSelection(aStartSel, aEndSel); -} - -//-------------------------------------------------------------- -void nsTextAreaWidget::AggTextAreaWidget::SetCaretPosition(PRUint32 aPosition) -{ - GET_OUTER()->SetCaretPosition(aPosition); -} - -//-------------------------------------------------------------- -PRUint32 nsTextAreaWidget::AggTextAreaWidget::GetCaretPosition() -{ - return GET_OUTER()->GetCaretPosition(); -} - -PRBool nsTextAreaWidget::AggTextAreaWidget::AutoErase() -{ - return GET_OUTER()->AutoErase(); -} - - -//---------------------------------------------------------------------- - -BASE_IWIDGET_IMPL(nsTextAreaWidget, AggTextAreaWidget); - diff --git a/mozilla/widget/src/motif/nsTextAreaWidget.h b/mozilla/widget/src/motif/nsTextAreaWidget.h deleted file mode 100644 index 8bdcce12be4..00000000000 --- a/mozilla/widget/src/motif/nsTextAreaWidget.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsTextAreaWidget_h__ -#define nsTextAreaWidget_h__ - -#include "nsWindow.h" -#include "nsTextHelper.h" - -#include "nsITextAreaWidget.h" - -/** - * Native Motif single line edit control wrapper. - */ - -class nsTextAreaWidget : public nsWindow -{ - -public: - nsTextAreaWidget(nsISupports *aOuter); - virtual ~nsTextAreaWidget(); - - NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); - - void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - - virtual PRBool OnPaint(nsPaintEvent & aEvent); - virtual PRBool OnResize(nsSizeEvent &aEvent); - - // nsTextHelper Interface - virtual void SelectAll(); - virtual void SetMaxTextLength(PRUint32 aChars); - virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); - virtual PRUint32 SetText(const nsString& aText); - virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); - virtual void RemoveText(); - virtual void SetPassword(PRBool aIsPassword); - virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); - virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); - virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); - virtual void SetCaretPosition(PRUint32 aPosition); - virtual PRUint32 GetCaretPosition(); - virtual PRBool AutoErase(); - -protected: - nsTextHelper *mHelper; - -private: - PRBool mMakeReadOnly; - - // this should not be public - static PRInt32 GetOuterOffset() { - return offsetof(nsTextAreaWidget,mAggWidget); - } - - - // Aggregator class and instance variable used to aggregate in the - // nsIText interface to nsText w/o using multiple - // inheritance. - class AggTextAreaWidget : public nsITextAreaWidget { - public: - AggTextAreaWidget(); - virtual ~AggTextAreaWidget(); - - AGGREGATE_METHOD_DEF - - virtual void SelectAll(); - virtual void SetMaxTextLength(PRUint32 aChars); - virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); - virtual PRUint32 SetText(const nsString& aText); - virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); - virtual void RemoveText(); - virtual void SetPassword(PRBool aIsPassword); - virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); - virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); - virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); - virtual void SetCaretPosition(PRUint32 aPosition); - virtual PRUint32 GetCaretPosition(); - virtual PRBool AutoErase(); - - }; - AggTextAreaWidget mAggWidget; - friend class AggTextAreaWidget; - -}; - -#endif // nsTextAreaWidget_h__ diff --git a/mozilla/widget/src/motif/nsTextHelper.cpp b/mozilla/widget/src/motif/nsTextHelper.cpp deleted file mode 100644 index e3a751a0d08..00000000000 --- a/mozilla/widget/src/motif/nsTextHelper.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsTextHelper.h" -#include "nsTextWidget.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" - -#include - -#define DBG 0 - -//------------------------------------------------------------------------- -// -// nsTextHelper constructor -// -//------------------------------------------------------------------------- - -nsTextHelper::nsTextHelper(Widget aWidget) -{ - mWidget = aWidget; - mIsReadOnly = PR_FALSE; - mIsPassword = PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// nsTextHelper destructor -// -//------------------------------------------------------------------------- -nsTextHelper::~nsTextHelper() -{ -} - -//------------------------------------------------------------------------- -void nsTextHelper::SetMaxTextLength(PRUint32 aChars) -{ - XmTextSetMaxLength(mWidget, (int)aChars); -} - -//------------------------------------------------------------------------- -PRUint32 nsTextHelper::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) -{ - if (!mIsPassword) { - char * str = XmTextGetString(mWidget); - aTextBuffer.SetLength(0); - aTextBuffer.Append(str); - PRUint32 len = (PRUint32)strlen(str); - XtFree(str); - return len; - } else { - PasswordData * data; - XtVaGetValues(mWidget, XmNuserData, &data, NULL); - aTextBuffer = data->mPassword; - return aTextBuffer.Length(); - } -} - -//------------------------------------------------------------------------- -PRUint32 nsTextHelper::SetText(const nsString& aText) -{ - //printf("SetText Password %d\n", mIsPassword); - if (!mIsPassword) { - NS_ALLOC_STR_BUF(buf, aText, 512); - XmTextSetString(mWidget, buf); - NS_FREE_STR_BUF(buf); - } else { - PasswordData * data; - XtVaGetValues(mWidget, XmNuserData, &data, NULL); - data->mPassword = aText; - data->mIgnore = True; - char * buf = new char[aText.Length()+1]; - memset(buf, '*', aText.Length()); - buf[aText.Length()] = 0; - //printf("SetText [%s] [%s]\n", data->mPassword.ToNewCString(), buf); - XmTextSetString(mWidget, buf); - data->mIgnore = False; - } - return(aText.Length()); -} - -//------------------------------------------------------------------------- -PRUint32 nsTextHelper::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) -{ - - if (!mIsPassword) { - NS_ALLOC_STR_BUF(buf, aText, 512); - XmTextInsert(mWidget, aStartPos, buf); - NS_FREE_STR_BUF(buf); - } else { - PasswordData * data; - XtVaGetValues(mWidget, XmNuserData, &data, NULL); - data->mIgnore = True; - nsString newText(aText); - data->mPassword.Insert(newText, aStartPos, aText.Length()); - char * buf = new char[data->mPassword.Length()+1]; - memset(buf, '*', data->mPassword.Length()); - buf[data->mPassword.Length()] = 0; - //printf("SetText [%s] [%s]\n", data->mPassword.ToNewCString(), buf); - XmTextInsert(mWidget, aStartPos, buf); - data->mIgnore = False; - } - return(aText.Length()); - -} - -//------------------------------------------------------------------------- -void nsTextHelper::RemoveText() -{ - char blank[2]; - blank[0] = 0; - - XmTextSetString(mWidget, blank); -} - -//------------------------------------------------------------------------- -void nsTextHelper::SetPassword(PRBool aIsPassword) -{ - mIsPassword = aIsPassword; -} - -//------------------------------------------------------------------------- -PRBool nsTextHelper::SetReadOnly(PRBool aReadOnlyFlag) -{ - NS_ASSERTION(mWidget != nsnull, - "SetReadOnly - Widget is NULL, Create may not have been called!"); - PRBool oldSetting = mIsReadOnly; - mIsReadOnly = aReadOnlyFlag; - XmTextSetEditable(mWidget, aReadOnlyFlag?False:True); - - return(oldSetting); -} - - -//------------------------------------------------------------------------- -void nsTextHelper::SelectAll() -{ - nsString text; - PRUint32 numChars = GetText(text, 0); - SetSelection(0, numChars); -} - - -//------------------------------------------------------------------------- -void nsTextHelper::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) -{ - XmTextPosition left = (XmTextPosition)aStartSel; - XmTextPosition right = (XmTextPosition)aEndSel; - - Time time; -printf("SetSel %d %d\n", left, right); - XmTextSetSelection(mWidget, left, right, 0); -} - - -//------------------------------------------------------------------------- -void nsTextHelper::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) -{ - XmTextPosition left; - XmTextPosition right; - - if (XmTextGetSelectionPosition(mWidget, &left, &right)) { - printf("left %d right %d\n", left, right); - *aStartSel = (PRUint32)left; - *aEndSel = (PRUint32)right; - } else { - printf("nsTextHelper::GetSelection Error getting positions\n"); - } -} - -//------------------------------------------------------------------------- -void nsTextHelper::SetCaretPosition(PRUint32 aPosition) -{ - XmTextSetInsertionPosition(mWidget, (XmTextPosition)aPosition); -} - -//------------------------------------------------------------------------- -PRUint32 nsTextHelper::GetCaretPosition() -{ - return (PRUint32)XmTextGetInsertionPosition(mWidget); -} - - -//------------------------------------------------------------------------- -PRBool nsTextHelper::AutoErase() -{ - return(PR_TRUE); -} - - diff --git a/mozilla/widget/src/motif/nsTextHelper.h b/mozilla/widget/src/motif/nsTextHelper.h deleted file mode 100644 index b565cacca52..00000000000 --- a/mozilla/widget/src/motif/nsTextHelper.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsTextHelper_h__ -#define nsTextHelper_h__ - -#include "nsITextWidget.h" -#include "nsWindow.h" -#include - -/** - * Base class for nsTextAreaWidget and nsTextWidget - */ - -class nsTextHelper -{ - -public: - nsTextHelper(Widget aWidget); - virtual ~nsTextHelper(); - - virtual void SelectAll(); - virtual void SetMaxTextLength(PRUint32 aChars); - virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); - virtual PRUint32 SetText(const nsString& aText); - virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); - virtual void RemoveText(); - virtual void SetPassword(PRBool aIsPassword); - virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); - virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); - virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); - virtual void SetCaretPosition(PRUint32 aPosition); - virtual PRUint32 GetCaretPosition(); - //virtual void PreCreateWidget(nsWidgetInitData *aInitData); - virtual PRBool AutoErase(); - -protected: - Widget mWidget; - PRBool mIsPassword; - PRBool mIsReadOnly; - -}; - -#endif // nsTextHelper_h__ diff --git a/mozilla/widget/src/motif/nsTextWidget.cpp b/mozilla/widget/src/motif/nsTextWidget.cpp deleted file mode 100644 index 784d356e4b4..00000000000 --- a/mozilla/widget/src/motif/nsTextWidget.cpp +++ /dev/null @@ -1,353 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsTextWidget.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsXtEventHandler.h" - -#include - -#define DBG 0 - -extern int mIsPasswordCallBacksInstalled; - -//------------------------------------------------------------------------- -// -// nsTextWidget constructor -// -//------------------------------------------------------------------------- -nsTextWidget::nsTextWidget(nsISupports *aOuter) : nsWindow(aOuter), - mIsPasswordCallBacksInstalled(PR_FALSE), - mMakeReadOnly(PR_FALSE), - mMakePassword(PR_FALSE) -{ - //mBackground = NS_RGB(124, 124, 124); -} - -//------------------------------------------------------------------------- -// -// nsTextWidget destructor -// -//------------------------------------------------------------------------- -nsTextWidget::~nsTextWidget() -{ -} - -//------------------------------------------------------------------------- -void nsTextWidget::Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - Widget parentWidget = nsnull; - - if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); - - if (aParent) { - parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); - } else { - parentWidget = (Widget) aInitData ; - } - - if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); - - mWidget = ::XtVaCreateManagedWidget("button", - xmTextWidgetClass, - parentWidget, - XmNwidth, aRect.width, - XmNheight, aRect.height, - XmNrecomputeSize, False, - XmNhighlightOnEnter, False, - XmNeditable, mMakeReadOnly?False:True, - XmNx, aRect.x, - XmNy, aRect.y, - nsnull); - mHelper = new nsTextHelper(mWidget); - if (DBG) fprintf(stderr, "Button 0x%x this 0x%x\n", mWidget, this); - - // save the event callback function - mEventCallback = aHandleEventFunction; - - InitCallbacks("nsTextWidget"); - - XtAddCallback(mWidget, - XmNfocusCallback, - nsXtWidget_Focus_Callback, - this); - - XtAddCallback(mWidget, - XmNlosingFocusCallback, - nsXtWidget_Focus_Callback, - this); - - if (mMakeReadOnly) { - SetReadOnly(PR_TRUE); - } - if (mMakePassword) { - SetPassword(PR_TRUE); - PasswordData * data = new PasswordData(); - data->mPassword = ""; - XtVaSetValues(mWidget, XmNuserData, data, NULL); - } - - - - -} - -//------------------------------------------------------------------------- -void nsTextWidget::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ -} - - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsTextWidget::QueryObject(REFNSIID aIID, void** aInstancePtr) -{ - static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID); - - if (aIID.Equals(kITextWidgetIID)) { - AddRef(); - *aInstancePtr = (void**) &mAggWidget; - return NS_OK; - } - return nsWindow::QueryObject(aIID, aInstancePtr); -} - - -//------------------------------------------------------------------------- -// -// paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsTextWidget::OnPaint(nsPaintEvent & aEvent) -{ - return PR_FALSE; -} - - -//-------------------------------------------------------------- -PRBool nsTextWidget::OnResize(nsSizeEvent &aEvent) -{ - return PR_FALSE; -} - -//-------------------------------------------------------------- -void nsTextWidget::SetPassword(PRBool aIsPassword) -{ - if (mWidget == nsnull && aIsPassword) { - mMakePassword = PR_TRUE; - return; - } - - if (aIsPassword) { - if (!mIsPasswordCallBacksInstalled) { - XtAddCallback(mWidget, XmNmodifyVerifyCallback, nsXtWidget_Text_Callback, NULL); - XtAddCallback(mWidget, XmNactivateCallback, nsXtWidget_Text_Callback, NULL); - mIsPasswordCallBacksInstalled = PR_TRUE; - } - } else { - if (mIsPasswordCallBacksInstalled) { - XtRemoveCallback(mWidget, XmNmodifyVerifyCallback, nsXtWidget_Text_Callback, NULL); - XtRemoveCallback(mWidget, XmNactivateCallback, nsXtWidget_Text_Callback, NULL); - mIsPasswordCallBacksInstalled = PR_FALSE; - } - } - mHelper->SetPassword(aIsPassword); -} - -//-------------------------------------------------------------- -PRBool nsTextWidget::SetReadOnly(PRBool aReadOnlyFlag) -{ - if (mWidget == nsnull && aReadOnlyFlag) { - mMakeReadOnly = PR_TRUE; - return PR_TRUE; - } - return mHelper->SetReadOnly(aReadOnlyFlag); -} - -//-------------------------------------------------------------- -void nsTextWidget::SetMaxTextLength(PRUint32 aChars) -{ - mHelper->SetMaxTextLength(aChars); -} - -//-------------------------------------------------------------- -PRUint32 nsTextWidget::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) { - return mHelper->GetText(aTextBuffer, aBufferSize); -} - -//-------------------------------------------------------------- -PRUint32 nsTextWidget::SetText(const nsString& aText) -{ - return mHelper->SetText(aText); -} - -//-------------------------------------------------------------- -PRUint32 nsTextWidget::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) -{ - return mHelper->InsertText(aText, aStartPos, aEndPos); -} - -//-------------------------------------------------------------- -void nsTextWidget::RemoveText() -{ - mHelper->RemoveText(); -} - -//-------------------------------------------------------------- -void nsTextWidget::SelectAll() -{ - mHelper->SelectAll(); -} - - -//-------------------------------------------------------------- -void nsTextWidget::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) -{ - mHelper->SetSelection(aStartSel, aEndSel); -} - - -//-------------------------------------------------------------- -void nsTextWidget::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) -{ - mHelper->GetSelection(aStartSel, aEndSel); -} - -//-------------------------------------------------------------- -void nsTextWidget::SetCaretPosition(PRUint32 aPosition) -{ - mHelper->SetCaretPosition(aPosition); -} - -//-------------------------------------------------------------- -PRUint32 nsTextWidget::GetCaretPosition() -{ - return mHelper->GetCaretPosition(); -} - -//-------------------------------------------------------------- -PRBool nsTextWidget::AutoErase() -{ - return mHelper->AutoErase(); -} - - - -//-------------------------------------------------------------- -#define GET_OUTER() ((nsTextWidget*) ((char*)this - nsTextWidget::GetOuterOffset())) - - -//-------------------------------------------------------------- -void nsTextWidget::AggTextWidget::SetMaxTextLength(PRUint32 aChars) -{ - GET_OUTER()->SetMaxTextLength(aChars); -} - -//-------------------------------------------------------------- -PRUint32 nsTextWidget::AggTextWidget::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) { - return GET_OUTER()->GetText(aTextBuffer, aBufferSize); -} - -//-------------------------------------------------------------- -PRUint32 nsTextWidget::AggTextWidget::SetText(const nsString& aText) -{ - return GET_OUTER()->SetText(aText); -} - -//-------------------------------------------------------------- -PRUint32 nsTextWidget::AggTextWidget::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) -{ - return GET_OUTER()->InsertText(aText, aStartPos, aEndPos); -} - -//-------------------------------------------------------------- -void nsTextWidget::AggTextWidget::RemoveText() -{ - GET_OUTER()->RemoveText(); -} - -//-------------------------------------------------------------- -void nsTextWidget::AggTextWidget::SetPassword(PRBool aIsPassword) -{ - GET_OUTER()->SetPassword(aIsPassword); -} - -//-------------------------------------------------------------- -PRBool nsTextWidget::AggTextWidget::SetReadOnly(PRBool aReadOnlyFlag) -{ - return GET_OUTER()->SetReadOnly(aReadOnlyFlag); -} - -//-------------------------------------------------------------- -void nsTextWidget::AggTextWidget::SelectAll() -{ - GET_OUTER()->SelectAll(); -} - - -//-------------------------------------------------------------- -void nsTextWidget::AggTextWidget::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) -{ - GET_OUTER()->SetSelection(aStartSel, aEndSel); -} - - -//-------------------------------------------------------------- -void nsTextWidget::AggTextWidget::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) -{ - GET_OUTER()->GetSelection(aStartSel, aEndSel); -} - -//-------------------------------------------------------------- -void nsTextWidget::AggTextWidget::SetCaretPosition(PRUint32 aPosition) -{ - GET_OUTER()->SetCaretPosition(aPosition); -} - -//-------------------------------------------------------------- -PRUint32 nsTextWidget::AggTextWidget::GetCaretPosition() -{ - return GET_OUTER()->GetCaretPosition(); -} - -PRBool nsTextWidget::AggTextWidget::AutoErase() -{ - return GET_OUTER()->AutoErase(); -} - - -//---------------------------------------------------------------------- - -BASE_IWIDGET_IMPL(nsTextWidget, AggTextWidget); - diff --git a/mozilla/widget/src/motif/nsTextWidget.h b/mozilla/widget/src/motif/nsTextWidget.h deleted file mode 100644 index a08b71a1dc2..00000000000 --- a/mozilla/widget/src/motif/nsTextWidget.h +++ /dev/null @@ -1,122 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsTextWidget_h__ -#define nsTextWidget_h__ - -#include "nsWindow.h" -#include "nsTextHelper.h" - -#include "nsITextWidget.h" - -typedef struct _PasswordData { - nsString mPassword; - Boolean mIgnore; -} PasswordData; - -/** - * Native Motif single line edit control wrapper. - */ - -class nsTextWidget : public nsWindow -{ - -public: - nsTextWidget(nsISupports *aOuter); - virtual ~nsTextWidget(); - - NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); - - void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - - - virtual PRBool OnPaint(nsPaintEvent & aEvent); - virtual PRBool OnResize(nsSizeEvent &aEvent); - - // nsTextHelper Interface - virtual void SelectAll(); - virtual void SetMaxTextLength(PRUint32 aChars); - virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); - virtual PRUint32 SetText(const nsString& aText); - virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); - virtual void RemoveText(); - virtual void SetPassword(PRBool aIsPassword); - virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); - virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); - virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); - virtual void SetCaretPosition(PRUint32 aPosition); - virtual PRUint32 GetCaretPosition(); - virtual PRBool AutoErase(); - -protected: - PRBool mIsPasswordCallBacksInstalled; - nsTextHelper *mHelper; - -private: - PRBool mMakeReadOnly; - PRBool mMakePassword; - - // this should not be public - static PRInt32 GetOuterOffset() { - return offsetof(nsTextWidget,mAggWidget); - } - - - // Aggregator class and instance variable used to aggregate in the - // nsIText interface to nsText w/o using multiple - // inheritance. - class AggTextWidget : public nsITextWidget { - public: - AggTextWidget(); - virtual ~AggTextWidget(); - - AGGREGATE_METHOD_DEF - - virtual void SelectAll(); - virtual void SetMaxTextLength(PRUint32 aChars); - virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); - virtual PRUint32 SetText(const nsString& aText); - virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); - virtual void RemoveText(); - virtual void SetPassword(PRBool aIsPassword); - virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); - virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); - virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); - virtual void SetCaretPosition(PRUint32 aPosition); - virtual PRUint32 GetCaretPosition(); - virtual PRBool AutoErase(); - - }; - AggTextWidget mAggWidget; - friend class AggTextWidget; - -}; - -#endif // nsTextWidget_h__ diff --git a/mozilla/widget/src/motif/nsToolkit.cpp b/mozilla/widget/src/motif/nsToolkit.cpp deleted file mode 100644 index 912e5b7fd62..00000000000 --- a/mozilla/widget/src/motif/nsToolkit.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsToolkit.h" -#include "nsWindow.h" -//#include "prmon.h" -//#include "prtime.h" -#include "nsGUIEvent.h" - - - -void RunPump(void* arg) -{ -} - -//------------------------------------------------------------------------- -// -// constructor -// -//------------------------------------------------------------------------- -nsToolkit::nsToolkit() -{ - NS_INIT_REFCNT(); -} - - -//------------------------------------------------------------------------- -// -// destructor -// -//------------------------------------------------------------------------- -nsToolkit::~nsToolkit() -{ -} - - -//------------------------------------------------------------------------- -// -// nsISupports implementation macro -// -//------------------------------------------------------------------------- -NS_DEFINE_IID(kIToolkitIID, NS_ITOOLKIT_IID); -NS_IMPL_ISUPPORTS(nsToolkit,kIToolkitIID); - - - -//------------------------------------------------------------------------- -// -// -//------------------------------------------------------------------------- -void nsToolkit::Init(PRThread *aThread) -{ -} - -void nsToolkit::SetSharedGC(GC aGC) -{ - mSharedGC = aGC; -} - -GC nsToolkit::GetSharedGC() -{ - return (mSharedGC); -} diff --git a/mozilla/widget/src/motif/nsToolkit.h b/mozilla/widget/src/motif/nsToolkit.h deleted file mode 100644 index 226cdf673e6..00000000000 --- a/mozilla/widget/src/motif/nsToolkit.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef TOOLKIT_H -#define TOOLKIT_H - -#include "nsIToolkit.h" -#include "X11/Xlib.h" - -struct MethodInfo; - -/** - * Wrapper around the thread running the message pump. - * The toolkit abstraction is necessary because the message pump must - * execute within the same thread that created the widget under Win32. - */ - -class nsToolkit : public nsIToolkit -{ - -public: - nsToolkit(); - virtual ~nsToolkit(); - - NS_DECL_ISUPPORTS - - virtual void Init(PRThread *aThread); - -public: - NS_IMETHOD_(GC) GetSharedGC(); - NS_IMETHOD_(void) SetSharedGC(GC aGC); - -private: - GC mSharedGC; - -}; - - - -#endif // TOOLKIT_H diff --git a/mozilla/widget/src/motif/nsWidgetFactory.cpp b/mozilla/widget/src/motif/nsWidgetFactory.cpp deleted file mode 100644 index 176b9c897fc..00000000000 --- a/mozilla/widget/src/motif/nsWidgetFactory.cpp +++ /dev/null @@ -1,229 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsIFactory.h" -#include "nsISupports.h" -#include "nsIButton.h" -#include "nsITextWidget.h" -#include "nsWidgetsCID.h" - -#include "nsToolkit.h" -#include "nsWindow.h" -#include "nsAppShell.h" -#include "nsButton.h" -#include "nsScrollbar.h" -#include "nsCheckButton.h" -#include "nsRadioButton.h" -#include "nsTextWidget.h" -#include "nsTextAreaWidget.h" -#include "nsFileWidget.h" -#include "nsListBox.h" -#include "nsComboBox.h" - -static NS_DEFINE_IID(kCWindow, NS_WINDOW_CID); -static NS_DEFINE_IID(kCChild, NS_CHILD_CID); -static NS_DEFINE_IID(kCAppShell, NS_APPSHELL_CID); -static NS_DEFINE_IID(kCHorzScrollbarCID, NS_HORZSCROLLBAR_CID); -static NS_DEFINE_IID(kCVertScrollbarCID, NS_VERTSCROLLBAR_CID); -static NS_DEFINE_IID(kCCheckButtonCID, NS_CHECKBUTTON_CID); -static NS_DEFINE_IID(kCRadioButtonCID, NS_RADIOBUTTON_CID); -static NS_DEFINE_IID(kCTextWidgetCID, NS_TEXTFIELD_CID); -static NS_DEFINE_IID(kCTextAreaWidgetCID, NS_TEXTAREA_CID); -static NS_DEFINE_IID(kCFileWidgetCID, NS_FILEWIDGET_CID); -static NS_DEFINE_IID(kCButtonCID, NS_BUTTON_CID); -static NS_DEFINE_IID(kCListBoxCID, NS_LISTBOX_CID); -static NS_DEFINE_IID(kCComboBoxCID, NS_COMBOBOX_CID); - - -static NS_DEFINE_IID(kIWidget, NS_IWIDGET_IID); -static NS_DEFINE_IID(kIAppShellIID, NS_IAPPSHELL_IID); -static NS_DEFINE_IID(kIButton, NS_IBUTTON_IID); -static NS_DEFINE_IID(kICheckButton, NS_ICHECKBUTTON_IID); -static NS_DEFINE_IID(kIScrollbar, NS_ISCROLLBAR_IID); -static NS_DEFINE_IID(kIFileWidget, NS_IFILEWIDGET_IID); -static NS_DEFINE_IID(kIListBox, NS_ILISTBOX_IID); - -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); - - -class nsWidgetFactory : public nsIFactory -{ -public: - - NS_DECL_ISUPPORTS - - // nsIFactory methods - NS_IMETHOD CreateInstance(nsISupports *aOuter, - const nsIID &aIID, - void **aResult); - - NS_IMETHOD LockFactory(PRBool aLock); - - nsWidgetFactory(const nsCID &aClass); - ~nsWidgetFactory(); -private: - nsCID mClassID; - -}; - - - -nsWidgetFactory::nsWidgetFactory(const nsCID &aClass) -{ - mClassID = aClass; -} - -nsWidgetFactory::~nsWidgetFactory() -{ -} - -nsresult nsWidgetFactory::QueryInterface(const nsIID &aIID, - void **aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - - if (aIID.Equals(kIFactoryIID)) { - *aInstancePtr = (void*)(nsWidgetFactory*)this; - AddRef(); - return NS_OK; - } - - if (aIID.Equals(kISupportsIID)) { - *aInstancePtr = (void*)(nsISupports*)(nsWidgetFactory*)this; - AddRef(); - return NS_OK; - } - - return NS_NOINTERFACE; -} - -NS_IMPL_ADDREF(nsWidgetFactory) -NS_IMPL_RELEASE(nsWidgetFactory) - -nsresult nsWidgetFactory::CreateInstance(nsISupports *aOuter, - const nsIID &aIID, - void **aResult) -{ - if (aResult == NULL) { - return NS_ERROR_NULL_POINTER; - } - - *aResult = NULL; - - if (nsnull != aOuter && !aIID.Equals(kISupportsIID)) { - // aggregation with IID != nsISupports - return NS_ERROR_ILLEGAL_VALUE; - } - - nsWindow *inst = nsnull; - if (aIID.Equals(kCWindow)) { - inst = new nsWindow(aOuter); - } - else if ( mClassID.Equals(kCCheckButtonCID)) { - inst = new nsCheckButton(aOuter); - } - else if ( mClassID.Equals(kCButtonCID)) { - inst = new nsButton(aOuter); - } - else if (mClassID.Equals(kCVertScrollbarCID)) { - inst = new nsScrollbar(aOuter, PR_TRUE); - } - else if (mClassID.Equals(kCHorzScrollbarCID)) { - inst = new nsScrollbar(aOuter, PR_FALSE); - } - else if (aIID.Equals(kIScrollbar)) { - inst = nsnull; - fprintf(stderr, "------ NOT CreatingkIScrollbar Scrollbar\n"); - } - else if (mClassID.Equals(kCTextWidgetCID)) { - inst = new nsTextWidget(aOuter); - } - else if (mClassID.Equals(kCTextAreaWidgetCID)) { - inst = new nsTextAreaWidget(aOuter); - } - else if ( mClassID.Equals(kCRadioButtonCID)) { - inst = new nsRadioButton(aOuter); - } - else if (mClassID.Equals(kCListBoxCID)) { - inst = new nsListBox(aOuter); - } - else if (mClassID.Equals(kCComboBoxCID)) { - inst = new nsComboBox(aOuter); - } - else if (mClassID.Equals(kCFileWidgetCID)) { - inst = new nsFileWidget(aOuter); - } - else if (aIID.Equals(kIWidget)) { - inst = new nsWindow(aOuter); - } - else if (mClassID.Equals(kCChild)) { - inst = new ChildWindow(aOuter); - } - - else if (aIID.Equals(kIAppShellIID)) { - nsIAppShell *appInst = (nsIAppShell*)new nsAppShell(); - if (appInst == NULL) { - return NS_ERROR_OUT_OF_MEMORY; - } - nsresult res = appInst->QueryInterface(aIID, aResult); - if (res != NS_OK) { - delete appInst ; - } - return res; - } - - if (inst == NULL) { - return NS_ERROR_OUT_OF_MEMORY; - } - - - nsresult res = inst->QueryObject(aIID, aResult); - - if (res != NS_OK) { - delete inst ; - } - - return res; -} - -nsresult nsWidgetFactory::LockFactory(PRBool aLock) -{ - // Not implemented in simplest case. - return NS_OK; -} - -// return the proper factory to the caller -extern "C" NS_WIDGET nsresult NSGetFactory(const nsCID &aClass, nsIFactory **aFactory) -{ - if (nsnull == aFactory) { - return NS_ERROR_NULL_POINTER; - } - - *aFactory = new nsWidgetFactory(aClass); - - if (nsnull == aFactory) { - return NS_ERROR_OUT_OF_MEMORY; - } - - return (*aFactory)->QueryInterface(kIFactoryIID, (void**)aFactory); -} - - diff --git a/mozilla/widget/src/motif/nsWindow.cpp b/mozilla/widget/src/motif/nsWindow.cpp deleted file mode 100644 index dafdf20811e..00000000000 --- a/mozilla/widget/src/motif/nsWindow.cpp +++ /dev/null @@ -1,1239 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsWindow.h" -#include "nsIFontMetrics.h" -#include "nsIFontCache.h" -#include "nsGUIEvent.h" -#include "nsIRenderingContext.h" -#include "nsIDeviceContext.h" -#include "nsRect.h" -#include "nsTransform2D.h" -#include "nsGfxCIID.h" - -#include "nsXtEventHandler.h" - -#include "X11/Xlib.h" -#include "Xm/Xm.h" -#include "Xm/Xm.h" -#include "Xm/MainW.h" -#include "Xm/Frame.h" -#include "Xm/XmStrDefs.h" -#include "Xm/DrawingA.h" - -#include "X11/Intrinsic.h" - -#include "stdio.h" - -#include "Xm/DialogS.h" -#include "Xm/RowColumn.h" -#include "Xm/Form.h" - -#define DBG 0 - -Widget gFirstTopLevelWindow = 0; - -static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID); - -//NS_IMPL_QUERY_INTERFACE(nsWindow, kIWidgetIID) -//NS_IMPL_ADDREF(nsWindow) -//NS_IMPL_RELEASE(nsWindow) - -/** - * - */ -nsrefcnt nsWindow::AddRefObject(void) { - return ++mRefCnt; -} - -/** - * - */ -nsrefcnt nsWindow::ReleaseObject(void) { - return (--mRefCnt) ? mRefCnt : (delete this, 0); -} - - -/** - * - */ -nsresult nsWindow::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - - static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID); - if (aIID.Equals(kIWidgetIID)) { - *aInstancePtr = (void*) ((nsISupports*)this); - AddRef(); - return NS_OK; - } - - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - if (aIID.Equals(kISupportsIID)) { - *aInstancePtr = (void*) ((nsISupports*)&mInner); - AddRef(); - return NS_OK; - } - - return NS_NOINTERFACE; -} - -/** - * nsISupports methods - */ -nsresult nsWindow::QueryInterface(const nsIID& aIID, void** aInstancePtr) -{ - return mOuter->QueryInterface(aIID, aInstancePtr); -} - -/** - * - */ -nsrefcnt nsWindow::AddRef(void) -{ - return mOuter->AddRef(); -} - -/** - * - */ -nsrefcnt nsWindow::Release(void) -{ - return mOuter->Release(); -} - - -void nsWindow::WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) -{ -} - -void nsWindow::ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) -{ -} - -//------------------------------------------------------------------------- -// -// Setup initial tooltip rectangles -// -//------------------------------------------------------------------------- -void nsWindow::SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]) -{ -} - -//------------------------------------------------------------------------- -// -// Update all tooltip rectangles -// -//------------------------------------------------------------------------- - -void nsWindow::UpdateTooltips(nsRect* aNewTips[]) -{ -} - -//------------------------------------------------------------------------- -// -// Remove all tooltip rectangles -// -//------------------------------------------------------------------------- - -void nsWindow::RemoveTooltips() -{ -} - - -//------------------------------------------------------------------------- -// -// nsWindow constructor -// -//------------------------------------------------------------------------- -nsWindow::nsWindow(nsISupports *aOuter): - mEventListener(nsnull), - mMouseListener(nsnull), - mToolkit(nsnull), - mFontMetrics(nsnull), - mContext(nsnull), - mWidget(nsnull), - mEventCallback(nsnull), - mIgnoreResize(PR_FALSE) -{ - strcpy(gInstanceClassName, "nsWindow"); - // XXX Til can deal with ColorMaps! - SetForegroundColor(1); - SetBackgroundColor(2); - mBounds.x = 0; - mBounds.y = 0; - mBounds.width = 0; - mBounds.height = 0; - mResized = PR_FALSE; - - // Setup for possible aggregation - if (aOuter) - mOuter = aOuter; - else - mOuter = &mInner; - mRefCnt = 1; - - mGC = nsnull ; - mShown = PR_FALSE; - mVisible = PR_FALSE; - mDisplayed = PR_FALSE; - mLowerLeft = PR_FALSE; - -} - - -//------------------------------------------------------------------------- -// -// nsWindow destructor -// -//------------------------------------------------------------------------- -nsWindow::~nsWindow() -{ - XtDestroyWidget(mWidget); - if (nsnull != mGC) { - ::XFreeGC((Display *)GetNativeData(NS_NATIVE_DISPLAY),mGC); - mGC = nsnull; - } -} - - -//------------------------------------------------------------------------- -// -// Create a window. -// -// Note: aNativeParent is always non-null if aWidgetParent is non-null. -// aNativeaParent is set regardless if the parent for the Create() was an -// nsIWidget or a Native widget. -// aNativeParent is equal to aWidgetParent->GetNativeData(NS_NATIVE_WIDGET) -//------------------------------------------------------------------------- - -void nsWindow::CreateWindow(nsNativeWidget aNativeParent, - nsIWidget *aWidgetParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - Widget mainWindow = 0, frame = 0; - Widget parentWidget = 0; - mBounds = aRect; - - if (nsnull == mToolkit) { - if (nsnull != aToolkit) { - mToolkit = (nsToolkit*)aToolkit; - mToolkit->AddRef(); - } - else { - if (nsnull != aWidgetParent) { - mToolkit = (nsToolkit*)(aWidgetParent->GetToolkit()); // the call AddRef's, we don't have to - } - // it's some top level window with no toolkit passed in. - // Create a default toolkit with the current thread - else { - mToolkit = new nsToolkit(); - mToolkit->AddRef(); - mToolkit->Init(PR_GetCurrentThread()); - - // Create a shared GC for all widgets - ((nsToolkit *)mToolkit)->SetSharedGC((GC)GetNativeData(NS_NATIVE_GRAPHIC)); - } - } - - } - - // save the event callback function - mEventCallback = aHandleEventFunction; - - if (0==aNativeParent) { - parentWidget = (Widget) aInitData ; - } - else - parentWidget = (Widget)aNativeParent; - - // keep a reference to the toolkit object - if (aContext) { - mContext = aContext; - mContext->AddRef(); - } - else { - nsresult res; - - static NS_DEFINE_IID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID); - static NS_DEFINE_IID(kDeviceContextIID, NS_IDEVICE_CONTEXT_IID); - - //res = !NS_OK; - res = NSRepository::CreateInstance(kDeviceContextCID, - nsnull, - kDeviceContextIID, - (void **)&mContext); - if (NS_OK == res) { - mContext->Init(parentWidget); - } - } - - Widget frameParent = 0; - if (!aNativeParent) { - - if (gFirstTopLevelWindow == 0) { - mainWindow = ::XtVaCreateManagedWidget("mainWindow", - xmMainWindowWidgetClass, - parentWidget, - nsnull); - gFirstTopLevelWindow = mainWindow; - } - else { - Widget shell = ::XtVaCreatePopupShell(" ", - xmDialogShellWidgetClass, - parentWidget, 0); - XtVaSetValues(shell, - XmNwidth, aRect.width, XmNheight, aRect.height, nsnull); - mainWindow = ::XtVaCreateManagedWidget("mainWindow", - xmMainWindowWidgetClass, - shell, - nsnull); - XtVaSetValues(mainWindow, XmNwidth, aRect.width, XmNheight, aRect.height, nsnull); - - } - - frameParent = mainWindow; - - } - else - frameParent = (Widget)aNativeParent; - - frame = ::XtVaCreateManagedWidget("frame", - xmDrawingAreaWidgetClass, - frameParent, - XmNwidth, aRect.width, - XmNheight, aRect.height, - XmNmarginHeight, 0, - XmNmarginWidth, 0, - nsnull); - - - mWidget = frame ; - - if (mainWindow) { - XmMainWindowSetAreas (mainWindow, nsnull, nsnull, nsnull, nsnull, frame); - } - - if (aWidgetParent) { - aWidgetParent->AddChild(this); - } - - // Force cursor to default setting - mCursor = eCursor_select; - SetCursor(eCursor_standard); - - InitCallbacks(); - - XtAddCallback(mWidget, - XmNresizeCallback, - nsXtWidget_Resize_Callback, - this); - - - /*XtAddCallback(mWidget, - XmNexposeCallback, - nsXtWidget_Expose_Callback, - this);*/ - - - // Create a Writeable GC for this Widget. Unfortunatley, - // the Window for the Widget is not created properly at this point and - // we Need the GC prior to the Rendering Context getting created, so - // we create a small dummy window of the default depth as our dummy Drawable - // to create a compatible GC - - if (nsnull == mGC) { - - XGCValues values; - Window w; - Display * d = XtDisplay(mWidget); - - w = ::XCreateSimpleWindow(d, - RootWindow(d,DefaultScreen(d)), - 0,0,1,1,0, - BlackPixel(d,DefaultScreen(d)), - WhitePixel(d,DefaultScreen(d))); - mGC = ::XCreateGC(d, w, nsnull, &values); - - ::XDestroyWindow(d,w); - } - -} - - - -//------------------------------------------------------------------------- -// -// Initialize all the Callbacks -// -//------------------------------------------------------------------------- -void nsWindow::InitCallbacks(char * aName) -{ - if (DBG) fprintf(stderr, "Setting Up Callbacks 0x%x [%s]\n", this, (aName != nsnull?aName:"")); - // setup the event Handlers - XtAddEventHandler(mWidget, - ButtonPressMask, - PR_FALSE, - nsXtWidget_ButtonPressMask_EventHandler, - this); - - XtAddEventHandler(mWidget, - ButtonReleaseMask, - PR_FALSE, - nsXtWidget_ButtonReleaseMask_EventHandler, - this); - - XtAddEventHandler(mWidget, - ButtonMotionMask, - PR_FALSE, - nsXtWidget_ButtonMotionMask_EventHandler, - this); - - XtAddEventHandler(mWidget, - PointerMotionMask, - PR_FALSE, - nsXtWidget_MotionMask_EventHandler, - this); - - XtAddEventHandler(mWidget, - EnterWindowMask, - PR_FALSE, - nsXtWidget_EnterMask_EventHandler, - this); - - XtAddEventHandler(mWidget, - LeaveWindowMask, - PR_FALSE, - nsXtWidget_LeaveMask_EventHandler, - this); - - XtAddEventHandler(mWidget, - ExposureMask, - PR_TRUE, - nsXtWidget_ExposureMask_EventHandler, - this); - - - /*XtAddEventHandler(mWidget, - ResizeRedirectMask, - PR_FALSE, - nsXtWidget_ResizeRedirectMask_EventHandler, - this);*/ - - /*XtAddCallback(mWidget, - XmNresizeCallback, - nsXtWidget_Resize_Callback, - NULL);*/ - - -} - - -//------------------------------------------------------------------------- -// -// create with nsIWidget parent -// -//------------------------------------------------------------------------- - -void nsWindow::Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - CreateWindow((nsNativeWidget)((aParent) ? aParent->GetNativeData(NS_NATIVE_WIDGET) : 0), aParent, aRect, aHandleEventFunction, aContext, aToolkit, aInitData); -} - -//------------------------------------------------------------------------- -// -// create with a native parent -// -//------------------------------------------------------------------------- -void nsWindow::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - CreateWindow(aParent, 0, aRect, aHandleEventFunction, aContext, aToolkit, aInitData); -} - - -//------------------------------------------------------------------------- -// -// Close this nsWindow -// -//------------------------------------------------------------------------- -void nsWindow::Destroy() -{ -} - - -//------------------------------------------------------------------------- -// -// Get this nsWindow parent -// -//------------------------------------------------------------------------- -nsIWidget* nsWindow::GetParent(void) -{ - return nsnull; -} - - -//------------------------------------------------------------------------- -// -// Get this nsWindow's list of children -// -//------------------------------------------------------------------------- -nsIEnumerator* nsWindow::GetChildren() -{ - return nsnull; -} - - -//------------------------------------------------------------------------- -// -// Add a child to the list of children -// -//------------------------------------------------------------------------- -void nsWindow::AddChild(nsIWidget* aChild) -{ -} - - -//------------------------------------------------------------------------- -// -// Remove a child from the list of children -// -//------------------------------------------------------------------------- -void nsWindow::RemoveChild(nsIWidget* aChild) -{ -} - - -//------------------------------------------------------------------------- -// -// Hide or show this component -// -//------------------------------------------------------------------------- -void nsWindow::Show(PRBool bState) -{ - mShown = bState; - UpdateVisibilityFlag(); - UpdateDisplay(); -} - -//------------------------------------------------------------------------- -// -// Move this component -// -//------------------------------------------------------------------------- -void nsWindow::Move(PRUint32 aX, PRUint32 aY) -{ - mBounds.x = aX; - mBounds.y = aY; - UpdateVisibilityFlag(); - UpdateDisplay(); - XtVaSetValues(mWidget, XmNx, aX, XmNy, GetYCoord(aY), nsnull); -} - -//------------------------------------------------------------------------- -// -// Resize this component -// -//------------------------------------------------------------------------- -void nsWindow::Resize(PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint) -{ - if (DBG) printf("$$$$$$$$$ %s::Resize %d %d Repaint: %s\n", - gInstanceClassName, aWidth, aHeight, (aRepaint?"true":"false")); - mBounds.width = aWidth; - mBounds.height = aHeight; - UpdateVisibilityFlag(); - UpdateDisplay(); - XtVaSetValues(mWidget, XmNwidth, aWidth, XmNheight, aHeight, nsnull); -} - - -//------------------------------------------------------------------------- -// -// Resize this component -// -//------------------------------------------------------------------------- -void nsWindow::Resize(PRUint32 aX, PRUint32 aY, PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint) -{ - mBounds.x = aX; - mBounds.y = aY; - mBounds.width = aWidth; - mBounds.height = aHeight; - UpdateVisibilityFlag(); - UpdateDisplay(); - XtVaSetValues(mWidget, XmNx, aX, XmNy, GetYCoord(aY), - XmNwidth, aWidth, XmNheight, aHeight, nsnull); -} - - -//------------------------------------------------------------------------- -// -// Enable/disable this component -// -//------------------------------------------------------------------------- -void nsWindow::Enable(PRBool bState) -{ -} - - -//------------------------------------------------------------------------- -// -// Give the focus to this component -// -//------------------------------------------------------------------------- -void nsWindow::SetFocus(void) -{ -} - - -//------------------------------------------------------------------------- -// -// Get this component dimension -// -//------------------------------------------------------------------------- -void nsWindow::SetBounds(const nsRect &aRect) -{ - mBounds = aRect; -} - -//------------------------------------------------------------------------- -// -// Get this component dimension -// -//------------------------------------------------------------------------- -void nsWindow::GetBounds(nsRect &aRect) -{ - - /*XWindowAttributes attrs ; - Window w = nsnull; - - if (mWidget) - w = ::XtWindow(mWidget); - - if (mWidget && w) { - - XWindowAttributes attrs ; - - Display * d = ::XtDisplay(mWidget); - - XGetWindowAttributes(d, w, &attrs); - - aRect.x = attrs.x ; - aRect.y = attrs.y ; - aRect.width = attrs.width ; - aRect.height = attrs.height; - - } else { - //printf("Bad bounds computed for nsIWidget\n"); - - // XXX If this code gets hit, one should question why and how - // and fix it there. - aRect = mBounds; - - } - */ - aRect = mBounds; -} - - -//------------------------------------------------------------------------- -// -// Get the foreground color -// -//------------------------------------------------------------------------- -nscolor nsWindow::GetForegroundColor(void) -{ - return (mForeground); -} - - -//------------------------------------------------------------------------- -// -// Set the foreground color -// -//------------------------------------------------------------------------- -void nsWindow::SetForegroundColor(const nscolor &aColor) -{ - mForeground = aColor; -} - - -//------------------------------------------------------------------------- -// -// Get the background color -// -//------------------------------------------------------------------------- -nscolor nsWindow::GetBackgroundColor(void) -{ - return (mBackground); -} - - -//------------------------------------------------------------------------- -// -// Set the background color -// -//------------------------------------------------------------------------- -void nsWindow::SetBackgroundColor(const nscolor &aColor) -{ - mBackground = aColor ; - //XtVaSetValues(mWidget, -} - - -//------------------------------------------------------------------------- -// -// Get this component font -// -//------------------------------------------------------------------------- -nsIFontMetrics* nsWindow::GetFont(void) -{ - NS_NOTYETIMPLEMENTED("GetFont not yet implemented"); // to be implemented - return nsnull; -} - - -//------------------------------------------------------------------------- -// -// Set this component font -// -//------------------------------------------------------------------------- -void nsWindow::SetFont(const nsFont &aFont) -{ -#if 0 - if (mContext == nsnull) { - return; - } - - nsIFontCache* fontCache = mContext->GetFontCache(); - if (fontCache != nsnull) { - nsIFontMetrics* metrics = fontCache->GetMetricsFor(aFont); - if (metrics != nsnull) { - //HFONT hfont = metrics->GetFontHandle(); - - // Draw in the new font - //XtVaSetValues(mWidget, XmNfont, metrics->GetFontHandle(), NULL); - - NS_RELEASE(metrics); - } else { - printf("****** Error: Metrics is NULL!\n"); - } - NS_RELEASE(fontCache); - } else { - printf("****** Error: FontCache is NULL!\n"); - } -#endif -} - - -//------------------------------------------------------------------------- -// -// Get this component cursor -// -//------------------------------------------------------------------------- -nsCursor nsWindow::GetCursor() -{ -} - - -//------------------------------------------------------------------------- -// -// Set this component cursor -// -//------------------------------------------------------------------------- - -void nsWindow::SetCursor(nsCursor aCursor) -{ -} - -//------------------------------------------------------------------------- -// -// Invalidate this component visible area -// -//------------------------------------------------------------------------- -void nsWindow::Invalidate(PRBool aIsSynchronous) -{ - if (mWidget == nsnull) { - return; - } - - Window win = XtWindow(mWidget); - Display *display = XtDisplay(mWidget); - - - XEvent evt; - evt.xgraphicsexpose.type = GraphicsExpose; - evt.xgraphicsexpose.send_event = False; - evt.xgraphicsexpose.display = display; - evt.xgraphicsexpose.drawable = win; - evt.xgraphicsexpose.x = 0; - evt.xgraphicsexpose.y = 0; - evt.xgraphicsexpose.width = mBounds.width; - evt.xgraphicsexpose.height = mBounds.height; - evt.xgraphicsexpose.count = 0; - XSendEvent(display, win, False, ExposureMask, &evt); - XFlush(display); - - -} - - -//------------------------------------------------------------------------- -// -// Return some native data according to aDataType -// -//------------------------------------------------------------------------- -void* nsWindow::GetNativeData(PRUint32 aDataType) -{ - switch(aDataType) { - - case NS_NATIVE_WINDOW: - return (void*)XtWindow(mWidget); - case NS_NATIVE_DISPLAY: - return (void*)XtDisplay(mWidget); - case NS_NATIVE_WIDGET: - return (void*)(mWidget); - case NS_NATIVE_GRAPHIC: - // We Cache a Read-Only Shared GC in the Toolkit. If we don't - // have one ourselves (because it needs to be writeable) grab the - // the shared GC - if (nsnull == mGC) - return (((nsToolkit *)mToolkit)->GetSharedGC()); - return ((void*)mGC); - case NS_NATIVE_COLORMAP: - default: - break; - } - - return NULL; -} - - -//------------------------------------------------------------------------- -// -// Create a rendering context from this nsWindow -// -//------------------------------------------------------------------------- -nsIRenderingContext* nsWindow::GetRenderingContext() -{ - nsIRenderingContext * ctx = nsnull; - - if (GetNativeData(NS_NATIVE_WIDGET)) { - - nsresult res; - - static NS_DEFINE_IID(kRenderingContextCID, NS_RENDERING_CONTEXT_CID); - static NS_DEFINE_IID(kRenderingContextIID, NS_IRENDERING_CONTEXT_IID); - - res = NSRepository::CreateInstance(kRenderingContextCID, nsnull, kRenderingContextIID, (void **)&ctx); - - if (NS_OK == res) - ctx->Init(mContext, this); - - NS_ASSERTION(NULL != ctx, "Null rendering context"); - } - - return ctx; - -} - -//------------------------------------------------------------------------- -// -// Return the toolkit this widget was created on -// -//------------------------------------------------------------------------- -nsIToolkit* nsWindow::GetToolkit() -{ -} - - -//------------------------------------------------------------------------- -// -// Set the colormap of the window -// -//------------------------------------------------------------------------- -void nsWindow::SetColorMap(nsColorMap *aColorMap) -{ -} - -//------------------------------------------------------------------------- -// -// Return the used device context -// -//------------------------------------------------------------------------- -nsIDeviceContext* nsWindow::GetDeviceContext() -{ - return mContext; -} - - -//------------------------------------------------------------------------- -// -// Scroll the bits of a window -// -//------------------------------------------------------------------------- -void nsWindow::Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect) -{ - if (mWidget == nsnull) { - return; - } - - Window win = XtWindow(mWidget); - Display *display = XtDisplay(mWidget); - - XCopyArea(display, win, win, XDefaultGC(display, 0), - aClipRect->x, aClipRect->y, - aClipRect->XMost(), aClipRect->YMost(), aDx, aDy); - -#if 1 - XEvent evt; - evt.xgraphicsexpose.type = GraphicsExpose; - evt.xgraphicsexpose.send_event = False; - evt.xgraphicsexpose.display = display; - evt.xgraphicsexpose.drawable = win; - if (aDy < 0) { - evt.xgraphicsexpose.x = 0; - evt.xgraphicsexpose.y = mBounds.height+aDy; - evt.xgraphicsexpose.width = mBounds.width; - evt.xgraphicsexpose.height = -aDy; - } else { - evt.xgraphicsexpose.x = 0; - evt.xgraphicsexpose.y = 0; - evt.xgraphicsexpose.width = mBounds.width; - evt.xgraphicsexpose.height = aDy; - } - evt.xgraphicsexpose.count = 0; - if (DBG) printf("Forcing repaint %d %d %d %d\n", evt.xgraphicsexpose.x, - evt.xgraphicsexpose.y, - evt.xgraphicsexpose.width, - evt.xgraphicsexpose.height); - - XSendEvent(display, win, False, ExposureMask, &evt); - XFlush(display); -#endif -} - - - - - -void nsWindow::SetBorderStyle(nsBorderStyle aBorderStyle) -{ -} - -void nsWindow::SetTitle(const nsString& aTitle) -{ -} - - -/** - * Processes a mouse pressed event - * - **/ -void nsWindow::AddMouseListener(nsIMouseListener * aListener) -{ -} - -/** - * Processes a mouse pressed event - * - **/ -void nsWindow::AddEventListener(nsIEventListener * aListener) -{ -} - -PRBool nsWindow::ConvertStatus(nsEventStatus aStatus) -{ - switch(aStatus) { - case nsEventStatus_eIgnore: - return(PR_FALSE); - case nsEventStatus_eConsumeNoDefault: - return(PR_TRUE); - case nsEventStatus_eConsumeDoDefault: - return(PR_FALSE); - default: - NS_ASSERTION(0, "Illegal nsEventStatus enumeration value"); - break; - } - return(PR_FALSE); -} - -//------------------------------------------------------------------------- -// -// Invokes callback and ProcessEvent method on Event Listener object -// -//------------------------------------------------------------------------- - -PRBool nsWindow::DispatchEvent(nsGUIEvent* event) -{ - PRBool result = PR_FALSE; - event->widgetSupports = mOuter; - - if (nsnull != mEventCallback) { - result = ConvertStatus((*mEventCallback)(event)); - } - // Dispatch to event listener if event was not consumed - if ((result != PR_TRUE) && (nsnull != mEventListener)) { - return ConvertStatus(mEventListener->ProcessEvent(*event)); - } - else { - return(result); - } -} - -//------------------------------------------------------------------------- -// -// Deal with all sort of mouse event -// -//------------------------------------------------------------------------- -PRBool nsWindow::DispatchMouseEvent(nsMouseEvent aEvent) -{ - PRBool result = PR_FALSE; - if (nsnull == mEventCallback && nsnull == mMouseListener) { - return result; - } - - - // call the event callback - if (nsnull != mEventCallback) { - result = DispatchEvent(&aEvent); - - return result; - } - - if (nsnull != mMouseListener) { - switch (aEvent.message) { - case NS_MOUSE_MOVE: { - /*result = ConvertStatus(mMouseListener->MouseMoved(event)); - nsRect rect; - GetBounds(rect); - if (rect.Contains(event.point.x, event.point.y)) { - if (mCurrentWindow == NULL || mCurrentWindow != this) { - //printf("Mouse enter"); - mCurrentWindow = this; - } - } else { - //printf("Mouse exit"); - }*/ - - } break; - - case NS_MOUSE_LEFT_BUTTON_DOWN: - case NS_MOUSE_MIDDLE_BUTTON_DOWN: - case NS_MOUSE_RIGHT_BUTTON_DOWN: - result = ConvertStatus(mMouseListener->MousePressed(aEvent)); - break; - - case NS_MOUSE_LEFT_BUTTON_UP: - case NS_MOUSE_MIDDLE_BUTTON_UP: - case NS_MOUSE_RIGHT_BUTTON_UP: - result = ConvertStatus(mMouseListener->MouseReleased(aEvent)); - result = ConvertStatus(mMouseListener->MouseClicked(aEvent)); - break; - } // switch - } - return result; -} - - -/** - * Processes an Expose Event - * - **/ -PRBool nsWindow::OnPaint(nsPaintEvent &event) -{ - nsresult result ; - - // call the event callback - if (mEventCallback) { - - nsRect rr ; - - GetBounds(rr); - - event.rect = &rr; - - event.renderingContext = nsnull; - static NS_DEFINE_IID(kRenderingContextCID, NS_RENDERING_CONTEXT_CID); - static NS_DEFINE_IID(kRenderingContextIID, NS_IRENDERING_CONTEXT_IID); - - if (NS_OK == NSRepository::CreateInstance(kRenderingContextCID, - nsnull, - kRenderingContextIID, - (void **)&event.renderingContext)) - { - event.renderingContext->Init(mContext, this); - result = DispatchEvent(&event); - NS_RELEASE(event.renderingContext); - } - else - { - result = PR_FALSE; - } - } - return result; -} - - -void nsWindow::BeginResizingChildren(void) -{ -} - -void nsWindow::EndResizingChildren(void) -{ -} - - -void nsWindow::OnDestroy() -{ -} - -PRBool nsWindow::OnResize(nsSizeEvent &aEvent) -{ - nsRect* size = aEvent.windowSize; - /*if (mWidget) { - Arg arg[3]; - printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Setting to 600,800\n"); - XtSetArg(arg[0], XtNwidth, 600); - XtSetArg(arg[1], XtNheight,800); - - XtSetValues(mWidget, arg, 2); - - }*/ - - if (mEventCallback && !mIgnoreResize) { -printf("IN ON Resize %d %d %d %d\n",size->x, size->y, size->width, size->height); - return(DispatchEvent(&aEvent)); - } - return FALSE; -} - -PRBool nsWindow::OnKey(PRUint32 aEventType, PRUint32 aKeyCode) -{ - return FALSE; -} - - -PRBool nsWindow::DispatchFocus(nsGUIEvent &aEvent) -{ - if (mEventCallback) { - return(DispatchEvent(&aEvent)); - } - - return FALSE; -} - -PRBool nsWindow::OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos) -{ - return FALSE; -} - -void nsWindow::SetIgnoreResize(PRBool aIgnore) -{ - mIgnoreResize = aIgnore; -} - -PRBool nsWindow::IgnoreResize() -{ - return mIgnoreResize; -} - -void nsWindow::SetResizeRect(nsRect& aRect) -{ - mResizeRect = aRect; -} - -void nsWindow::GetResizeRect(nsRect* aRect) -{ - aRect->x = mResizeRect.x; - aRect->y = mResizeRect.y; - aRect->width = mResizeRect.width; - aRect->height = mResizeRect.height; -} - -void nsWindow::SetResized(PRBool aResized) -{ - mResized = aResized; -} - -PRBool nsWindow::GetResized() -{ - return(mResized); -} - -void nsWindow::UpdateVisibilityFlag() -{ - Widget parent = XtParent(mWidget); - - if (parent) { - PRUint32 pWidth = 0; - PRUint32 pHeight = 0; - XtVaGetValues(parent, XmNwidth, &pWidth, XmNheight, &pHeight, nsnull); - if ((mBounds.y + mBounds.height) > pHeight) { - mVisible = PR_FALSE; - return; - } - - if (mBounds.y < 0) - mVisible = PR_FALSE; - } - - mVisible = PR_TRUE; -} - -void nsWindow::UpdateDisplay() -{ - // If not displayed and needs to be displayed - if ((PR_FALSE==mDisplayed) && - (PR_TRUE==mShown) && - (PR_TRUE==mVisible)) { - XtManageChild(mWidget); - mDisplayed = PR_TRUE; - } - - // Displayed and needs to be removed - if (PR_TRUE==mDisplayed) { - if ((PR_FALSE==mShown) || (PR_FALSE==mVisible)) { - XtUnmanageChild(mWidget); - mDisplayed = PR_FALSE; - } - } -} - -PRUint32 nsWindow::GetYCoord(PRUint32 aNewY) -{ - if (PR_TRUE==mLowerLeft) { - return(aNewY - 12 /*KLUDGE fix this later mBounds.height */); - } - return(aNewY); -} - diff --git a/mozilla/widget/src/motif/nsWindow.h b/mozilla/widget/src/motif/nsWindow.h deleted file mode 100644 index cb589d56cfe..00000000000 --- a/mozilla/widget/src/motif/nsWindow.h +++ /dev/null @@ -1,519 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef Window_h__ -#define Window_h__ - -#include "nsISupports.h" - -#include "nsToolkit.h" - -#include "nsIWidget.h" -#include "nsIEnumerator.h" - -#include "nsIMouseListener.h" -#include "nsIEventListener.h" -#include "nsString.h" - -#include "Xm/Xm.h" - -#define NSRGB_2_COLOREF(color) \ - RGB(NS_GET_R(color),NS_GET_G(color),NS_GET_B(color)) - - -/** - * Native Motif window wrapper. - */ - -class nsWindow : public nsIWidget -{ - -public: - nsWindow(nsISupports *aOuter); - virtual ~nsWindow(); - - NS_DECL_ISUPPORTS - - - NS_IMETHOD QueryObject(const nsIID& aIID, void** aInstancePtr); - nsrefcnt AddRefObject(void); - nsrefcnt ReleaseObject(void); - - // nsIWidget interface - virtual void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - virtual void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - virtual void Destroy(); - virtual nsIWidget* GetParent(void); - virtual nsIEnumerator* GetChildren(); - virtual void AddChild(nsIWidget* aChild); - virtual void RemoveChild(nsIWidget* aChild); - virtual void Show(PRBool bState); - virtual void Move(PRUint32 aX, PRUint32 aY); - virtual void Resize(PRUint32 aWidth, - PRUint32 aHeight, PRBool aRepaint); - virtual void Resize(PRUint32 aX, - PRUint32 aY, - PRUint32 aWidth, - PRUint32 aHeight, PRBool aRepaint); - virtual void Enable(PRBool bState); - virtual void SetFocus(void); - virtual void GetBounds(nsRect &aRect); - virtual void SetBounds(const nsRect &aRect); - virtual nscolor GetForegroundColor(void); - virtual void SetForegroundColor(const nscolor &aColor); - virtual nscolor GetBackgroundColor(void); - virtual void SetBackgroundColor(const nscolor &aColor); - virtual nsIFontMetrics* GetFont(void); - virtual void SetFont(const nsFont &aFont); - virtual nsCursor GetCursor(); - virtual void SetCursor(nsCursor aCursor); - virtual void Invalidate(PRBool aIsSynchronous); - virtual void* GetNativeData(PRUint32 aDataType); - virtual nsIRenderingContext* GetRenderingContext(); - virtual void SetColorMap(nsColorMap *aColorMap); - virtual nsIDeviceContext* GetDeviceContext(); - virtual void Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect); - virtual nsIToolkit* GetToolkit(); - virtual void SetBorderStyle(nsBorderStyle aBorderStyle); - virtual void SetTitle(const nsString& aTitle); - virtual void SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]); - - virtual void RemoveTooltips(); - virtual void UpdateTooltips(nsRect* aNewTips[]); - virtual void WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect); - virtual void ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect); - virtual void AddMouseListener(nsIMouseListener * aListener); - virtual void AddEventListener(nsIEventListener * aListener); - virtual void BeginResizingChildren(void); - virtual void EndResizingChildren(void); - - static PRBool ConvertStatus(nsEventStatus aStatus); - virtual PRBool DispatchEvent(nsGUIEvent* event); - virtual PRBool DispatchMouseEvent(nsMouseEvent aEvent); - - virtual void OnDestroy(); - virtual PRBool OnPaint(nsPaintEvent &event); - virtual PRBool OnResize(nsSizeEvent &aEvent); - virtual PRBool OnKey(PRUint32 aEventType, PRUint32 aKeyCode); - - virtual PRBool DispatchFocus(nsGUIEvent &aEvent); - virtual PRBool OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos); - - virtual void SetIgnoreResize(PRBool aIgnore); - virtual PRBool IgnoreResize(); - - virtual PRUint32 GetYCoord(PRUint32 aNewY); - - // Resize event management - void SetResizeRect(nsRect& aRect); - void SetResized(PRBool aResized); - void GetResizeRect(nsRect* aRect); - PRBool GetResized(); - - char gInstanceClassName[256]; -protected: - void InitCallbacks(char * aName = nsnull); - void CreateWindow(nsNativeWidget aNativeParent, nsIWidget *aWidgetParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData); - - virtual void UpdateVisibilityFlag(); - virtual void UpdateDisplay(); - - Widget mWidget; - EVENT_CALLBACK mEventCallback; - nsIDeviceContext *mContext; - nsIFontMetrics *mFontMetrics; - nsToolkit *mToolkit; - - nsIMouseListener * mMouseListener; - nsIEventListener * mEventListener; - - nscolor mBackground; - nscolor mForeground; - nsCursor mCursor; - nsBorderStyle mBorderStyle; - nsRect mBounds; - - PRBool mIgnoreResize; - PRBool mShown; - PRBool mVisible; - PRBool mDisplayed; - - // Resize event management - nsRect mResizeRect; - int mResized; - PRBool mLowerLeft; - - nsISupports* mOuter; - - class InnerSupport : public nsISupports { - public: - InnerSupport() {} - -#define INNER_OUTER \ - ((nsWindow*)((char*)this - offsetof(nsWindow, mInner))) - - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr) - { return INNER_OUTER->QueryObject(aIID, aInstancePtr); } - NS_IMETHOD_(nsrefcnt) AddRef(void) - { return INNER_OUTER->AddRefObject(); } - NS_IMETHOD_(nsrefcnt) Release(void) - { return INNER_OUTER->ReleaseObject(); } - } mInner; - friend InnerSupport; - -private: - GC mGC; -}; - -// -// A child window is a window with different style -// -class ChildWindow : public nsWindow { - -public: - ChildWindow(nsISupports *aOuter) : nsWindow(aOuter) {} - -}; - -#define AGGREGATE_METHOD_DEF \ -public: \ - NS_IMETHOD QueryInterface(REFNSIID aIID, \ - void** aInstancePtr); \ - NS_IMETHOD_(nsrefcnt) AddRef(void); \ - NS_IMETHOD_(nsrefcnt) Release(void); \ -protected: \ - nsrefcnt mRefCnt; \ -public: \ - virtual void Create(nsIWidget *aParent, \ - const nsRect &aRect, \ - EVENT_CALLBACK aHandleEventFunction, \ - nsIDeviceContext *aContext, \ - nsIToolkit *aToolkit = nsnull, \ - nsWidgetInitData *aInitData = nsnull); \ - virtual void Create(nsNativeWidget aParent, \ - const nsRect &aRect, \ - EVENT_CALLBACK aHandleEventFunction, \ - nsIDeviceContext *aContext, \ - nsIToolkit *aToolkit = nsnull, \ - nsWidgetInitData *aInitData = nsnull); \ - virtual void Destroy(); \ - virtual nsIWidget* GetParent(void); \ - virtual nsIEnumerator* GetChildren(); \ - virtual void AddChild(nsIWidget* aChild); \ - virtual void RemoveChild(nsIWidget* aChild); \ - virtual void Show(PRBool bState); \ - virtual void Move(PRUint32 aX, PRUint32 aY); \ - virtual void Resize(PRUint32 aWidth, \ - PRUint32 aHeight, PRBool aRepaint); \ - virtual void Resize(PRUint32 aX, \ - PRUint32 aY, \ - PRUint32 aWidth, \ - PRUint32 aHeight, PRBool aRepaint); \ - virtual void Enable(PRBool bState); \ - virtual void SetFocus(void); \ - virtual void GetBounds(nsRect &aRect); \ - virtual void SetBounds(const nsRect &aRect); \ - virtual nscolor GetForegroundColor(void); \ - virtual void SetForegroundColor(const nscolor &aColor); \ - virtual nscolor GetBackgroundColor(void); \ - virtual void SetBackgroundColor(const nscolor &aColor); \ - virtual nsIFontMetrics* GetFont(void); \ - virtual void SetFont(const nsFont &aFont); \ - virtual nsCursor GetCursor(); \ - virtual void SetCursor(nsCursor aCursor); \ - virtual void Invalidate(PRBool aIsSynchronous); \ - virtual void* GetNativeData(PRUint32 aDataType); \ - virtual nsIRenderingContext* GetRenderingContext(); \ - virtual void SetColorMap(nsColorMap *aColorMap); \ - virtual nsIDeviceContext* GetDeviceContext(); \ - virtual void Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect); \ - virtual nsIToolkit* GetToolkit(); \ - virtual void SetBorderStyle(nsBorderStyle aBorderStyle); \ - virtual void SetTitle(const nsString& aTitle); \ - virtual void SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]); \ - virtual void RemoveTooltips(); \ - virtual void UpdateTooltips(nsRect* aNewTips[]); \ - virtual void WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect); \ - virtual void ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect); \ - virtual void AddMouseListener(nsIMouseListener * aListener); \ - virtual void AddEventListener(nsIEventListener * aListener); \ - virtual void BeginResizingChildren(void); \ - virtual void EndResizingChildren(void); \ - virtual PRBool DispatchEvent(nsGUIEvent* event); \ - virtual PRBool DispatchMouseEvent(nsMouseEvent aEvent); \ - virtual void OnDestroy(); \ - virtual PRBool OnPaint(nsPaintEvent & event); \ - virtual PRBool OnResize(nsSizeEvent &aEvent); \ - virtual PRBool OnKey(PRUint32 aEventType, PRUint32 aKeyCode); \ - virtual PRBool DispatchFocus(nsGUIEvent &aEvent); \ - virtual PRBool OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos); - - -#define BASE_IWIDGET_IMPL_NO_SHOW(_classname, _aggname) \ - _classname::_aggname::_aggname() \ - { \ - } \ - _classname::_aggname::~_aggname() \ - { \ - } \ - nsrefcnt _classname::_aggname::AddRef() \ - { \ - return GET_OUTER()->AddRef(); \ - } \ - nsrefcnt _classname::_aggname::Release() \ - { \ - return GET_OUTER()->Release(); \ - } \ - nsresult _classname::_aggname::QueryInterface(REFNSIID aIID, void** aInstancePtr) \ - { \ - return GET_OUTER()->QueryInterface(aIID, aInstancePtr); \ - } \ - void _classname::_aggname::Create(nsIWidget *aParent, \ - const nsRect &aRect, \ - EVENT_CALLBACK aHandleEventFunction, \ - nsIDeviceContext *aContext, \ - nsIToolkit *aToolkit, \ - nsWidgetInitData *aInitData) \ - { \ - GET_OUTER()->Create(aParent, aRect, aHandleEventFunction, aContext, aToolkit, aInitData); \ - } \ - void _classname::_aggname::Create(nsNativeWidget aParent, \ - const nsRect &aRect, \ - EVENT_CALLBACK aHandleEventFunction, \ - nsIDeviceContext *aContext, \ - nsIToolkit *aToolkit, \ - nsWidgetInitData *aInitData) \ - { \ - GET_OUTER()->Create(aParent, aRect, aHandleEventFunction, aContext, aToolkit, aInitData); \ - } \ - void _classname::_aggname::Destroy() \ - { \ - GET_OUTER()->Destroy(); \ - } \ - nsIWidget* _classname::_aggname::GetParent(void) \ - { \ - return GET_OUTER()->GetParent(); \ - } \ - nsIEnumerator* _classname::_aggname::GetChildren() \ - { \ - return GET_OUTER()->GetChildren(); \ - } \ - void _classname::_aggname::AddChild(nsIWidget* aChild) \ - { \ - GET_OUTER()->AddChild(aChild); \ - } \ - void _classname::_aggname::RemoveChild(nsIWidget* aChild) \ - { \ - GET_OUTER()->RemoveChild(aChild); \ - } \ - void _classname::_aggname::Move(PRUint32 aX, PRUint32 aY) \ - { \ - GET_OUTER()->Move(aX, aY); \ - } \ - void _classname::_aggname::Resize(PRUint32 aWidth, \ - PRUint32 aHeight, PRBool aRepaint) \ - { \ - GET_OUTER()->Resize(aWidth, aHeight, aRepaint); \ - } \ - void _classname::_aggname::Resize(PRUint32 aX, \ - PRUint32 aY, \ - PRUint32 aWidth, \ - PRUint32 aHeight, PRBool aRepaint) \ - { \ - GET_OUTER()->Resize(aX, aY, aWidth, aHeight, aRepaint); \ - } \ - void _classname::_aggname::Enable(PRBool bState) \ - { \ - GET_OUTER()->Enable(bState); \ - } \ - void _classname::_aggname::SetFocus(void) \ - { \ - GET_OUTER()->SetFocus(); \ - } \ - void _classname::_aggname::GetBounds(nsRect &aRect) \ - { \ - GET_OUTER()->GetBounds(aRect); \ - } \ - void _classname::_aggname::SetBounds(const nsRect &aRect) \ - { \ - GET_OUTER()->SetBounds(aRect); \ - } \ - nscolor _classname::_aggname::GetForegroundColor(void) \ - { \ - return GET_OUTER()->GetForegroundColor(); \ - } \ - void _classname::_aggname::SetForegroundColor(const nscolor &aColor) \ - { \ - GET_OUTER()->SetForegroundColor(aColor); \ - } \ - nscolor _classname::_aggname::GetBackgroundColor(void) \ - { \ - return GET_OUTER()->GetBackgroundColor(); \ - } \ - void _classname::_aggname::SetBackgroundColor(const nscolor &aColor) \ - { \ - GET_OUTER()->SetBackgroundColor(aColor); \ - } \ - nsIFontMetrics* _classname::_aggname::GetFont(void) \ - { \ - return GET_OUTER()->GetFont(); \ - } \ - void _classname::_aggname::SetFont(const nsFont &aFont) \ - { \ - GET_OUTER()->SetFont(aFont); \ - } \ - nsCursor _classname::_aggname::GetCursor() \ - { \ - return GET_OUTER()->GetCursor(); \ - } \ - void _classname::_aggname::SetCursor(nsCursor aCursor) \ - { \ - GET_OUTER()->SetCursor(aCursor); \ - } \ - void _classname::_aggname::Invalidate(PRBool aIsSynchronous) \ - { \ - GET_OUTER()->Invalidate(aIsSynchronous); \ - } \ - void* _classname::_aggname::GetNativeData(PRUint32 aDataType) \ - { \ - return GET_OUTER()->GetNativeData(aDataType); \ - } \ - nsIRenderingContext* _classname::_aggname::GetRenderingContext() \ - { \ - return GET_OUTER()->GetRenderingContext(); \ - } \ - nsIDeviceContext* _classname::_aggname::GetDeviceContext() \ - { \ - return GET_OUTER()->GetDeviceContext(); \ - } \ - void _classname::_aggname::Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect) \ - { \ - GET_OUTER()->Scroll(aDx, aDy, aClipRect); \ - } \ - nsIToolkit* _classname::_aggname::GetToolkit() \ - { \ - return GET_OUTER()->GetToolkit(); \ - } \ - void _classname::_aggname::SetColorMap(nsColorMap *aColorMap) \ - { \ - GET_OUTER()->SetColorMap(aColorMap); \ - } \ - void _classname::_aggname::AddMouseListener(nsIMouseListener * aListener) \ - { \ - GET_OUTER()->AddMouseListener(aListener); \ - } \ - void _classname::_aggname::AddEventListener(nsIEventListener * aListener) \ - { \ - GET_OUTER()->AddEventListener(aListener); \ - } \ - void _classname::_aggname::SetBorderStyle(nsBorderStyle aBorderStyle) \ - { \ - GET_OUTER()->SetBorderStyle(aBorderStyle); \ - } \ - void _classname::_aggname::SetTitle(const nsString& aTitle) \ - { \ - GET_OUTER()->SetTitle(aTitle); \ - } \ - void _classname::_aggname::SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]) \ - { \ - GET_OUTER()->SetTooltips(aNumberOfTips, aTooltipAreas); \ - } \ - void _classname::_aggname::UpdateTooltips(nsRect* aNewTips[]) \ - { \ - GET_OUTER()->UpdateTooltips(aNewTips); \ - } \ - void _classname::_aggname::RemoveTooltips() \ - { \ - GET_OUTER()->RemoveTooltips(); \ - } \ - void _classname::_aggname::WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) \ - { \ - GET_OUTER()->WidgetToScreen(aOldRect, aNewRect); \ - } \ - void _classname::_aggname::ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) \ - { \ - GET_OUTER()->ScreenToWidget(aOldRect, aNewRect); \ - } \ - PRBool _classname::_aggname::DispatchEvent(nsGUIEvent* event) \ - { \ - return GET_OUTER()->DispatchEvent(event); \ - } \ - PRBool _classname::_aggname::DispatchMouseEvent(nsMouseEvent event) \ - { \ - return GET_OUTER()->DispatchMouseEvent(event); \ - } \ - PRBool _classname::_aggname::OnPaint(nsPaintEvent &event) \ - { \ - return GET_OUTER()->OnPaint(event); \ - } \ - void _classname::_aggname::BeginResizingChildren() \ - { \ - GET_OUTER()->BeginResizingChildren(); \ - } \ - void _classname::_aggname::EndResizingChildren() \ - { \ - GET_OUTER()->EndResizingChildren(); \ - } \ - void _classname::_aggname::OnDestroy() \ - { \ - GET_OUTER()->OnDestroy(); \ - } \ - PRBool _classname::_aggname::OnResize(nsSizeEvent &aEvent) \ - { \ - return GET_OUTER()->OnResize(aEvent); \ - } \ - PRBool _classname::_aggname::OnKey(PRUint32 aEventType, PRUint32 aKeyCode) \ - { \ - return GET_OUTER()->OnKey(aEventType, aKeyCode); \ - } \ - PRBool _classname::_aggname::DispatchFocus(nsGUIEvent &aEvent) \ - { \ - return GET_OUTER()->DispatchFocus(aEvent); \ - } \ - PRBool _classname::_aggname::OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos) \ - { \ - return GET_OUTER()->OnScroll(aEvent, cPos); \ - } - -#define BASE_IWIDGET_IMPL_SHOW(_classname, _aggname) \ - void _classname::_aggname::Show(PRBool bState) \ - { \ - GET_OUTER()->Show(bState); \ - } - -#define BASE_IWIDGET_IMPL(_classname, _aggname) \ - BASE_IWIDGET_IMPL_NO_SHOW(_classname, _aggname) \ - BASE_IWIDGET_IMPL_SHOW(_classname, _aggname) - - - -#endif // Window_h__ diff --git a/mozilla/widget/src/motif/nsXtEventHandler.cpp b/mozilla/widget/src/motif/nsXtEventHandler.cpp deleted file mode 100644 index 21518f1b3cd..00000000000 --- a/mozilla/widget/src/motif/nsXtEventHandler.cpp +++ /dev/null @@ -1,738 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "Xm/Xm.h" -#include "nsXtEventHandler.h" - -#include "nsWindow.h" -#include "nsTextWidget.h" -#include "nsCheckButton.h" -#include "nsRadioButton.h" -#include "nsFileWidget.h" -#include "nsGUIEvent.h" - -#include "stdio.h" - -#define DBG 0 - -extern XtAppContext gAppContext; - - -//============================================================== -void nsXtWidget_InitNSEvent(XEvent * anXEv, - XtPointer p, - nsGUIEvent &anEvent, - PRUint32 aEventType) -{ - anEvent.message = aEventType; - anEvent.widget = (nsWindow *) p; - - if (anXEv != NULL) { - anEvent.point.x = anXEv->xbutton.x; - anEvent.point.y = anXEv->xbutton.y; - } - - anEvent.time = 0; //TBD - -} - -//============================================================== -void nsXtWidget_InitNSMouseEvent(XEvent * anXEv, - XtPointer p, - nsMouseEvent &anEvent, - PRUint32 aEventType) -{ - // Do base initialization - nsXtWidget_InitNSEvent(anXEv, p, anEvent, aEventType); - - if (anXEv != NULL) { // Do Mouse Event specific intialization - anEvent.time = anXEv->xbutton.time; - anEvent.isShift = anXEv->xbutton.state | ShiftMask; - anEvent.isControl = anXEv->xbutton.state | ControlMask; - } - - //anEvent.isAlt = GetKeyState(VK_LMENU) < 0 || GetKeyState(VK_RMENU) < 0; - ////anEvent.clickCount = (aEventType == NS_MOUSE_LEFT_DOUBLECLICK || - //aEventType == NS_MOUSE_LEFT_DOUBLECLICK)? 2:1; - -} - -//============================================================== -#ifndef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#endif - -#define INTERSECTS(r1_x1,r1_x2,r1_y1,r1_y2,r2_x1,r2_x2,r2_y1,r2_y2) \ - !((r2_x2 <= r1_x1) ||\ - (r2_y2 <= r1_y1) ||\ - (r2_x1 >= r1_x2) ||\ - (r2_y1 >= r1_y2)) - -//============================================================== -typedef struct COLLAPSE_INFO { - Window win; - nsRect *r; -} CollapseInfo; - -//============================================================== -static void expandDamageRect(nsRect *drect, XEvent *xev, Boolean debug, char*str) -{ -/* int x1 = xev->xexpose.x; - int y1 = xev->xexpose.y; - int x2 = x1 + xev->xexpose.width; - int y2 = y1 + xev->xexpose.height; - - if (debug) { - printf(" %s: collapsing (%d,%d %dx%d) into (%d,%d %dx%d) ->>", - str, x1, y1, xev->xexpose.width, xev->xexpose.height, - drect->x, drect->y, drect->width - drect->x, drect->height - drect->y); - } - - drect->x = MIN(x1, drect->x); - drect->y = MIN(y1, drect->y); - drect->width = MAX(x2, drect->width); - drect->height = MAX(y2, drect->height); - - if (debug) { - printf("(%d,%d %dx%d) %s\n", - drect->x, drect->y, drect->width - drect->x, drect->height - drect->y); - }*/ -} - -//============================================================== -static Bool checkForExpose(Display *dpy, XEvent *evt, XtPointer client_data) -{ - CollapseInfo *cinfo = (CollapseInfo*)client_data; - - if ((evt->type == Expose && evt->xexpose.window == cinfo->win && - INTERSECTS(cinfo->r->x, cinfo->r->width, cinfo->r->y, cinfo->r->height, - evt->xexpose.x, evt->xexpose.y, - evt->xexpose.x + evt->xexpose.width, - evt->xexpose.y + evt->xexpose.height)) || - (evt->type == GraphicsExpose && evt->xgraphicsexpose.drawable == cinfo->win && - INTERSECTS(cinfo->r->x, cinfo->r->width, cinfo->r->y, cinfo->r->height, - evt->xgraphicsexpose.x, evt->xgraphicsexpose.y, - evt->xgraphicsexpose.x + evt->xgraphicsexpose.width, - evt->xgraphicsexpose.y + evt->xgraphicsexpose.height))) { - - return True; - } - return False; -} - - -//============================================================== -void nsXtWidget_ExposureMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b) -{ - - if (DBG) fprintf(stderr, "In nsXtWidget_ExposureMask_EventHandler Type %d (%d,%d)\n", event->type, Expose, GraphicsExpose); - nsWindow * widgetWindow = (nsWindow *) p ; - - nsPaintEvent pevent; - nsRect rect; - nsXtWidget_InitNSEvent(event, p, pevent, NS_PAINT); - pevent.rect = (nsRect *)▭ - XEvent xev; - - rect.x = event->xexpose.x; - rect.y = event->xexpose.y; - rect.width = event->xexpose.width; - rect.height = event->xexpose.height; - - //printf("Expose (%d %d %d %d)\n", event->xexpose.x, event->xexpose.y, - //event->xexpose.width, event->xexpose.height); - - if (widgetWindow->GetResized()) - return; - - if (event->type == NoExpose) { - return; - } - - Display* display = XtDisplay(w); - Window window = XtWindow(w); - - XSync(display, FALSE); - - while (XCheckTypedWindowEvent(display, window, Expose, &xev) == TRUE) { - rect.x = xev.xexpose.x; - rect.y = xev.xexpose.y; - rect.width = xev.xexpose.width; - rect.height = xev.xexpose.height; - //printf("rect %d %d %d %d\n", rect.x, rect.y, rect.width, rect.height); - //fe_expose_eh(drawing_area, (XtPointer)context, &xev); - } - - -#if 0 - int count = 0; - while (XPeekEvent(XtDisplay(w), &xev)) - { - if ((xev.type == Expose || xev.type == GraphicsExpose || xev.type == 14) && - (xev.xexpose.window == XtWindow(w))) { - XNextEvent(XtDisplay(w), &xev); - count++; - } else { - // if (DBG) - printf("Ate %d events\n", count); - break; - } - } -#endif - if (DBG) printf("Calling OnPaint (%d %d %d %d)\n", rect.x, rect.y, rect.width, rect.height); - widgetWindow->OnPaint(pevent); - -#if 0 - - nsPaintEvent pevent; - nsRect rect; - nsXtWidget_InitNSEvent(event, p, pevent, NS_PAINT); - - pevent.rect = (nsRect *)▭ -printf("Count %d\n", event->xexpose.count); - if (event->xexpose.count != 0) - return ; - - /* Only post Expose/Repaint if we know others arn't following - * directly in the queue. - */ - if (event->xexpose.count == 0) { - Boolean debug = PR_TRUE; - int count = 0; - CollapseInfo cinfo; - - cinfo.win = XtWindow(w); - cinfo.r = pevent.rect; - - rect.x = event->xexpose.x; - rect.y = event->xexpose.y; - rect.width = event->xexpose.width; - rect.height = event->xexpose.height; -printf("Before %d %d %d %d\n", rect.x, rect.y, rect.width, rect.height); - /* Do a little more inspecting and collapse further if there - * are additional expose events pending on this window where - * the damage rects intersect with the current exposeRect. - */ - while (1) { - XEvent xev; - - if (XCheckIfEvent(XtDisplay(w), &xev, checkForExpose, (XtPointer)&cinfo)) { - printf("]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\n"); - count = xev.xexpose.count; - expandDamageRect(&rect, &xev, debug, "2"); - - } else /* XCheckIfEvent Failed. */ - break; - } -printf("After %d %d %d %d\n", rect.x, rect.y, rect.width, rect.height); - } - - widgetWindow->OnPaint(pevent); - - if (DBG) fprintf(stderr, "Out nsXtWidget_ExposureMask_EventHandler\n"); -#endif -} - -//============================================================== -void nsXtWidget_ButtonPressMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b) -{ - nsWindow * widgetWindow = (nsWindow *) p ; - nsMouseEvent mevent; - nsXtWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_LEFT_BUTTON_DOWN); - widgetWindow->DispatchMouseEvent(mevent); -} - -//============================================================== -void nsXtWidget_ButtonReleaseMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b) -{ - nsWindow * widgetWindow = (nsWindow *) p ; - nsMouseEvent mevent; - nsXtWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_LEFT_BUTTON_UP); - widgetWindow->DispatchMouseEvent(mevent); -} - -//============================================================== -void nsXtWidget_ButtonMotionMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b) -{ - //if (DBG) fprintf(stderr, "nsXtWidget_ButtonMotionMask_EventHandler\n"); - nsPaintEvent pevent ; - nsWindow * widgetWindow = (nsWindow *) p ; - nsMouseEvent mevent; - nsXtWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_MOVE); - widgetWindow->DispatchMouseEvent(mevent); - -} - -//============================================================== -void nsXtWidget_MotionMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b) -{ - //if (DBG) fprintf(stderr, "nsXtWidget_ButtonMotionMask_EventHandler\n"); - nsWindow * widgetWindow = (nsWindow *) p ; - nsMouseEvent mevent; - nsXtWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_MOVE); - widgetWindow->DispatchMouseEvent(mevent); - -} - -//============================================================== -void nsXtWidget_EnterMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b) -{ - nsWindow * widgetWindow = (nsWindow *) p ; - nsMouseEvent mevent; - nsXtWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_ENTER); - widgetWindow->DispatchMouseEvent(mevent); -} - -//============================================================== -void nsXtWidget_LeaveMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b) -{ - if (DBG) fprintf(stderr, "***************** nsXtWidget_LeaveMask_EventHandler\n"); - nsWindow * widgetWindow = (nsWindow *) p ; - nsMouseEvent mevent; - nsXtWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_EXIT); - widgetWindow->DispatchMouseEvent(mevent); -} - -//============================================================== -void nsXtWidget_Focus_Callback(Widget w, XtPointer p, XtPointer call_data) -{ - nsWindow * widgetWindow = (nsWindow *) p ; - - XmAnyCallbackStruct * cbs = (XmAnyCallbackStruct*)call_data; - - nsGUIEvent event; - nsXtWidget_InitNSEvent(cbs->event, p, event, - cbs->reason == XmCR_FOCUS?NS_GOTFOCUS:NS_LOSTFOCUS); - widgetWindow->DispatchFocus(event); - -} - -//============================================================== -void nsXtWidget_Toggle_Callback(Widget w, XtPointer p, XtPointer call_data) -{ - nsWindow * widgetWindow = (nsWindow *) p ; - if (DBG) fprintf(stderr, "***************** nsXtWidget_Scrollbar_Callback\n"); - - nsScrollbarEvent sevent; - - XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data; - - if (DBG) fprintf(stderr, "Callback struct 0x%x\n", cbs);fflush(stderr); - - /*nsGUIEvent event; - nsXtWidget_InitNSEvent(event, p, event, NS_MOUSE_MOVE); - widgetWindow->DispatchMouseEvent(mevent); - */ -} - -//============================================================== -void nsXtWidget_Toggle_ArmCallback(Widget w, XtPointer p, XtPointer call_data) -{ - nsCheckButton * checkBtn = (nsCheckButton *) p ; - - XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data; - - if (DBG) fprintf(stderr, "Callback struct 0x%x\n", cbs);fflush(stderr); - checkBtn->Armed(); - -} - -//============================================================== -void nsXtWidget_Toggle_DisArmCallback(Widget w, XtPointer p, XtPointer call_data) -{ - if (DBG) fprintf(stderr, "In ***************** nsXtWidget_Scrollbar_Callback\n"); - nsCheckButton * checkBtn = (nsCheckButton *) p ; - - nsScrollbarEvent sevent; - - XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data; - - if (DBG) fprintf(stderr, "Callback struct 0x%x\n", cbs);fflush(stderr); - - checkBtn->DisArmed(); - if (DBG) fprintf(stderr, "Out ***************** nsXtWidget_Scrollbar_Callback\n"); - -} - -//============================================================== -void nsXtWidget_RadioButton_ArmCallback(Widget w, XtPointer p, XtPointer call_data) -{ - if (DBG) fprintf(stderr, "In ***************** nsXtWidget_RadioButton_ArmCallback\n"); - nsRadioButton * radioBtn = (nsRadioButton *) p ; - - XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data; - - if (DBG) fprintf(stderr, "Callback struct 0x%x Set %d\n", cbs, cbs->set);fflush(stderr); - radioBtn->Armed(); - - nsMouseEvent mevent; - nsXtWidget_InitNSMouseEvent(cbs->event, p, mevent, NS_MOUSE_LEFT_BUTTON_DOWN); - radioBtn->DispatchMouseEvent(mevent); - - -} - -//============================================================== -void nsXtWidget_RadioButton_DisArmCallback(Widget w, XtPointer p, XtPointer call_data) -{ - if (DBG) fprintf(stderr, "In ***************** nsXtWidget_RadioButton_DisArmCallback\n"); - nsRadioButton * radioBtn = (nsRadioButton *) p ; - - nsScrollbarEvent sevent; - - XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data; - - if (DBG) fprintf(stderr, "Callback struct 0x%x Set %d\n", cbs, cbs->set);fflush(stderr); - - radioBtn->DisArmed(); - if (DBG) fprintf(stderr, "Out ***************** nsXtWidget_Scrollbar_Callback\n"); - - nsMouseEvent mevent; - nsXtWidget_InitNSMouseEvent(cbs->event, p, mevent, NS_MOUSE_LEFT_BUTTON_UP); - radioBtn->DispatchMouseEvent(mevent); - -} - - -//============================================================== -void nsXtWidget_Scrollbar_Callback(Widget w, XtPointer p, XtPointer call_data) -{ - nsWindow * widgetWindow = (nsWindow *) p ; - if (DBG) fprintf(stderr, "***************** nsXtWidget_Scrollbar_Callback\n"); - - nsScrollbarEvent sevent; - - XmScrollBarCallbackStruct * cbs = (XmScrollBarCallbackStruct*) call_data; - if (DBG) fprintf(stderr, "Callback struct 0x%x\n", cbs);fflush(stderr); - - sevent.widget = (nsWindow *) p; - if (cbs->event != nsnull) { - sevent.point.x = cbs->event->xbutton.x; - sevent.point.y = cbs->event->xbutton.y; - } else { - sevent.point.x = 0; - sevent.point.y = 0; - } - sevent.time = 0; //TBD - - switch (cbs->reason) { - - case XmCR_INCREMENT: - sevent.message = NS_SCROLLBAR_LINE_NEXT; - break; - - case XmCR_DECREMENT: - sevent.message = NS_SCROLLBAR_LINE_PREV; - break; - - case XmCR_PAGE_INCREMENT: - sevent.message = NS_SCROLLBAR_PAGE_NEXT; - break; - - case XmCR_PAGE_DECREMENT: - sevent.message = NS_SCROLLBAR_PAGE_PREV; - break; - - case XmCR_DRAG: - sevent.message = NS_SCROLLBAR_POS; - break; - - case XmCR_VALUE_CHANGED: - sevent.message = NS_SCROLLBAR_POS; - break; - - default: - if (DBG) fprintf(stderr, "In Default processing for scrollbar reason is [%d]\n", cbs->reason); - break; - } - widgetWindow->OnScroll(sevent, cbs->value); -} - - - -//============================================================== -void nsXtWidget_Expose_Callback(Widget w, XtPointer p, XtPointer call_data) -{ - - //if (DBG) -//fprintf(stderr, "In nsXtWidget_Resize_Callback 0x%x", p); - nsWindow * widgetWindow = (nsWindow *) p ; - if (widgetWindow == nsnull) { - return; - } - - XmDrawingAreaCallbackStruct * cbs = (XmDrawingAreaCallbackStruct *)call_data; - XEvent * event = cbs->event; - nsPaintEvent pevent; - nsRect rect; - nsXtWidget_InitNSEvent(event, p, pevent, NS_PAINT); - - pevent.rect = (nsRect *)▭ -#if 0 -printf("Count %d\n", event->xexpose.count); - if (event->xexpose.count != 0) - return ; - - /* Only post Expose/Repaint if we know others arn't following - * directly in the queue. - */ - if (event->xexpose.count == 0) { - Boolean debug = PR_TRUE; - int count = 0; - CollapseInfo cinfo; - - cinfo.win = XtWindow(w); - cinfo.r = pevent.rect; - - rect.x = event->xexpose.x; - rect.y = event->xexpose.y; - rect.width = event->xexpose.width; - rect.height = event->xexpose.height; -printf("Before %d %d %d %d\n", rect.x, rect.y, rect.width, rect.height); - /* Do a little more inspecting and collapse further if there - * are additional expose events pending on this window where - * the damage rects intersect with the current exposeRect. - */ - while (1) { - XEvent xev; - - if (XCheckIfEvent(XtDisplay(w), &xev, checkForExpose, (XtPointer)&cinfo)) { - printf("]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\n"); - count = xev.xexpose.count; - expandDamageRect(&rect, &xev, debug, "2"); - - } else /* XCheckIfEvent Failed. */ - break; - } -printf("After %d %d %d %d\n", rect.x, rect.y, rect.width, rect.height); - } -#endif - widgetWindow->OnPaint(pevent); - - if (DBG) fprintf(stderr, "Out nsXtWidget_ExposureMask_EventHandler\n"); - - -} - -//============================================================== -void nsXtWidget_Resize_Callback(Widget w, XtPointer p, XtPointer call_data) -{ - - //if (DBG) -//fprintf(stderr, "In nsXtWidget_Resize_Callback 0x%x", p); - nsWindow * widgetWindow = (nsWindow *) p ; - if (widgetWindow == nsnull) { - return; - } - - XmDrawingAreaCallbackStruct * cbs = (XmDrawingAreaCallbackStruct *)call_data; - - //fprintf(stderr, " %s ** %s\n", widgetWindow->gInstanceClassName, - //cbs->reason == XmCR_RESIZE?"XmCR_RESIZE":"XmCR_EXPOSE"); - - /*XEvent * xev = cbs->event; - if (xev != nsnull) { - //printf("Width %d Height %d\n", xev->xresizerequest.width, - //xev->xresizerequest.height); - } else { - //printf("Jumping out ##################################\n"); - //return; - }*/ - - /*if (cbs->reason == XmCR_EXPOSE && widgetWindow->IgnoreResize()) { - cbs->reason = XmCR_RESIZE; - widgetWindow->SetIgnoreResize(PR_FALSE); - printf("Got Expose doing resize!\n"); - } else if (widgetWindow->IgnoreResize() || - (!widgetWindow->IgnoreResize() && cbs->reason == XmCR_RESIZE)) { - printf("Skipping resize!\n"); - widgetWindow->SetIgnoreResize(PR_TRUE); - return; - }*/ - - if (cbs->reason == XmCR_RESIZE) { - nsSizeEvent event; - nsRect rect; - event.message = NS_SIZE; - event.widget = (nsWindow *) p; - if (cbs->event != NULL) { - event.point.x = cbs->event->xbutton.x; - event.point.y = cbs->event->xbutton.y; - } - event.time = 0; //TBD - event.windowSize = (nsRect *)▭ - widgetWindow->GetBounds(rect); - - Window win = nsnull; - if (widgetWindow) { - win = XtWindow(w); - } - - if (widgetWindow && win) { - XWindowAttributes attrs ; - - Display * d = XtDisplay(w); - - XGetWindowAttributes(d, win, &attrs); - - PRBool doResize = PR_FALSE; - if (attrs.width > 0 && - rect.width != attrs.width) { - rect.width = attrs.width; - doResize = PR_TRUE; - } - if (attrs.height > 0 && - rect.height != attrs.height) { - rect.height = attrs.height; - doResize = PR_TRUE; - } - //printf("doResize %s %d %d %d %d rect %d %d\n", (doResize ?"true":"false"), - //attrs.x, attrs.y, attrs.width, attrs.height, rect.width, rect.height); - - // NOTE: THIS May not be needed when embedded in chrome - - - if (! widgetWindow->GetResized()) { - //printf("Adding timeout for %d\n", widgetWindow); - XtAppAddTimeOut(gAppContext, 250, (XtTimerCallbackProc)nsXtWidget_Refresh_Callback, widgetWindow); - } - - widgetWindow->SetResizeRect(rect); - widgetWindow->SetBounds(rect); - widgetWindow->SetResized(PR_TRUE); - -#if 0 - //doResize = PR_TRUE; - if (doResize) { - //printf("??????????????????????????????? Doing Resize\n"); - widgetWindow->SetBounds(rect); // This needs to be done inside OnResize - widgetWindow->OnResize(event); - } -#endif - } - } -} - -//============================================================== -void nsXtWidget_Text_Callback(Widget w, XtPointer p, XtPointer call_data) -{ - if (DBG) fprintf(stderr, "In nsXtWidget_Text_Callback\n"); - nsWindow * widgetWindow = (nsWindow *) p ; - int len; - - XmTextVerifyCallbackStruct *cbs = (XmTextVerifyCallbackStruct *) call_data; - - PasswordData * data; - XtVaGetValues(w, XmNuserData, &data, NULL); - if (data == NULL || data->mIgnore) { - return; - } - - if (cbs->reason == XmCR_ACTIVATE) { - printf ("Password: %s\n", data->mPassword.ToNewCString()); - return; - } - - //printf("start %d insert %d len %d end %d ptr [%s]\n", - //cbs->startPos, cbs->currInsert, cbs->text->length, cbs->endPos, cbs->text->ptr); - - if (cbs->startPos < cbs->currInsert) { /* backspace */ - cbs->endPos = data->mPassword.Length(); /* delete from here to end */ - data->mPassword.SetLength(cbs->startPos); /* backspace--terminate */ - printf("[%s]\n", data == NULL?"":data->mPassword.ToNewCString()); - return; - } - - //if (cbs->text->length > 1) { - //cbs->doit = False; /* don't allow "paste" operations */ - //return; /* make the user *type* the password! */ - //} - - if (cbs->startPos == cbs->currInsert && cbs->currInsert < data->mPassword.Length()) { - //printf("Inserting [%s] at %d\n", cbs->text->ptr, cbs->currInsert); - nsString insStr(cbs->text->ptr); - data->mPassword.Insert(insStr, cbs->currInsert, strlen(cbs->text->ptr)); - } else if (cbs->startPos == cbs->currInsert && cbs->endPos != cbs->startPos) { - data->mPassword.SetLength(cbs->startPos); - printf("Setting Length [%s] at %d\n", cbs->text->ptr, cbs->currInsert); - } else if (cbs->startPos == cbs->currInsert) { /* backspace */ - data->mPassword.Append(cbs->text->ptr); - //printf("Appending [%s] at %d\n", cbs->text->ptr, cbs->currInsert); - } else { - printf("Shouldn't be here!\n"); - } - - for (len = 0; len < cbs->text->length; len++) - cbs->text->ptr[len] = '*'; - - if (DBG) fprintf(stderr, "Out nsXtWidget_Text_Callback\n"); -} - -//============================================================== -void nsXtWidget_FSBCancel_Callback(Widget w, XtPointer p, XtPointer call_data) -{ - nsFileWidget * widgetWindow = (nsFileWidget *) p ; - if (p != nsnull) { - printf("OnCancel\n"); - widgetWindow->OnCancel(); - } -} - -//============================================================== -void nsXtWidget_FSBOk_Callback(Widget w, XtPointer p, XtPointer call_data) -{ - nsFileWidget * widgetWindow = (nsFileWidget *) p ; - if (p != nsnull) { - widgetWindow->OnOk(); - } -} - -void nsXtWidget_ResetResize_Callback(XtPointer call_data) -{ - nsWindow* widgetWindow = (nsWindow*)call_data; - widgetWindow->SetResized(PR_FALSE); -} - -void nsXtWidget_Refresh_Callback(XtPointer call_data) -{ - printf("In timer\n"); - nsWindow* widgetWindow = (nsWindow*)call_data; - nsRect bounds; - widgetWindow->GetResizeRect(&bounds); - - nsSizeEvent event; - event.message = NS_SIZE; - event.widget = widgetWindow; - event.time = 0; //TBD - event.windowSize = &bounds; - - widgetWindow->SetBounds(bounds); - widgetWindow->OnResize(event); -// widgetWindow->SetResized(PR_FALSE); - - - nsPaintEvent pevent; - pevent.message = NS_PAINT; - pevent.widget = widgetWindow; - pevent.time = 0; - pevent.rect = (nsRect *)&bounds; - widgetWindow->OnPaint(pevent); - - XtAppAddTimeOut(gAppContext, 50, (XtTimerCallbackProc)nsXtWidget_ResetResize_Callback, widgetWindow); -} diff --git a/mozilla/widget/src/motif/nsXtEventHandler.h b/mozilla/widget/src/motif/nsXtEventHandler.h deleted file mode 100644 index 630823d1e6d..00000000000 --- a/mozilla/widget/src/motif/nsXtEventHandler.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef __nsXtEventHandler_h -#define __nsXtEventHandler_h - -#include "Xm/Xm.h" - -void nsXtWidget_ExposureMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b); -void nsXtWidget_ButtonPressMask_EventHandler(Widget w,XtPointer p, XEvent * event, Boolean * b); -void nsXtWidget_ButtonReleaseMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b); -void nsXtWidget_ButtonMotionMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b); -void nsXtWidget_MotionMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b); -void nsXtWidget_EnterMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b); -void nsXtWidget_LeaveMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b); -//---------------------------------------------------- - -void nsXtWidget_FSBCancel_Callback(Widget w, XtPointer p, XtPointer call_data); -void nsXtWidget_FSBOk_Callback(Widget w, XtPointer p, XtPointer call_data); - -//---------------------------------------------------- -void nsXtWidget_Focus_Callback(Widget w, XtPointer p, XtPointer call_data); -void nsXtWidget_Scrollbar_Callback(Widget w, XtPointer p, XtPointer call_data); -void nsXtWidget_Toggle_Callback(Widget w, XtPointer p, XtPointer call_data); -void nsXtWidget_Toggle_ArmCallback(Widget w, XtPointer p, XtPointer call_data); -void nsXtWidget_Toggle_DisArmCallback(Widget w, XtPointer p, XtPointer call_data); -void nsXtWidget_RadioButton_ArmCallback(Widget w, XtPointer p, XtPointer call_data); -void nsXtWidget_RadioButton_DisArmCallback(Widget w, XtPointer p, XtPointer call_data); - -void nsXtWidget_Text_Callback(Widget w, XtPointer p, XtPointer call_data); -void nsXtWidget_Resize_Callback(Widget w, XtPointer p, XtPointer call_data); -void nsXtWidget_Expose_Callback(Widget w, XtPointer p, XtPointer call_data); - -void nsXtWidget_Refresh_Callback(XtPointer call_data); - -void nsXtWidget_ResetResize_Callback(XtPointer call_data); - - -#endif // __nsXtEventHandler.h - - - - - diff --git a/mozilla/widget/src/windows/Makefile b/mozilla/widget/src/windows/Makefile deleted file mode 100644 index f516bfbbe18..00000000000 --- a/mozilla/widget/src/windows/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - - -include manifest.mn - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/widget/src/windows/makefile.win b/mozilla/widget/src/windows/makefile.win deleted file mode 100644 index 4f100c92149..00000000000 --- a/mozilla/widget/src/windows/makefile.win +++ /dev/null @@ -1,81 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. -IGNORE_MANIFEST=1 - -MAKE_OBJ_TYPE = DLL -DLLNAME = raptorwidget -DLL=.\$(OBJDIR)\$(DLLNAME).dll -RESFILE = widget.res - -MISCDEP = \ - $(DIST)\lib\xpcom32.lib \ - $(DIST)\lib\raptorbase.lib \ - $(DIST)\lib\raptorgfx.lib - -MODULE=raptor - -DEFINES =-D_IMPL_NS_WIDGET - -OBJS = \ - .\$(OBJDIR)\nsWidgetFactory.obj \ - .\$(OBJDIR)\nsObject.obj \ - .\$(OBJDIR)\nsWindow.obj \ - .\$(OBJDIR)\nsToolkit.obj \ - .\$(OBJDIR)\nsButton.obj \ - .\$(OBJDIR)\nsCheckButton.obj \ - .\$(OBJDIR)\nsRadioGroup.obj \ - .\$(OBJDIR)\nsRadioButton.obj \ - .\$(OBJDIR)\nsListBox.obj \ - .\$(OBJDIR)\nsComboBox.obj \ - .\$(OBJDIR)\nsTextWidget.obj \ - .\$(OBJDIR)\nsTextHelper.obj \ - .\$(OBJDIR)\nsTextAreaWidget.obj \ - .\$(OBJDIR)\nsFileWidget.obj \ - .\$(OBJDIR)\nsScrollbar.obj \ - .\$(OBJDIR)\nsTabWidget.obj \ - .\$(OBJDIR)\nsTooltipWidget.obj \ - .\$(OBJDIR)\nsAppShell.obj \ - $(NULL) - -LINCS= \ - -I$(PUBLIC)\raptor \ - -I$(PUBLIC)\xpcom \ - $(NULL) - -LCFLAGS = \ - $(LCFLAGS) \ - -D_IMPL_NS_WIDGET \ - -DNS_DLLNAME=$(DLLNAME).dll \ - $(NULL) - -LLIBS= \ - comctl32.lib \ - comdlg32.lib \ - $(DIST)\lib\xpcom32.lib \ - $(DIST)\lib\raptorgfx.lib \ - $(DIST)\lib\raptorbase.lib \ - $(LIBNSPR) - -include <$(DEPTH)\config\rules.mak> - -install:: $(DLL) - $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).dll $(DIST)\bin - -clobber:: - rm -f $(DIST)\bin\$(DLLNAME).dll diff --git a/mozilla/widget/src/windows/nsAppShell.cpp b/mozilla/widget/src/windows/nsAppShell.cpp deleted file mode 100644 index e312d77fa29..00000000000 --- a/mozilla/widget/src/windows/nsAppShell.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsAppShell.h" -#include - -//------------------------------------------------------------------------- -// -// Create the application shell -// -//------------------------------------------------------------------------- - -void nsAppShell::Create(int* argc, char ** argv) -{ -} - -void nsAppShell::SetDispatchListener(nsDispatchListener* aDispatchListener) -{ - mDispatchListener = aDispatchListener; -} - -//------------------------------------------------------------------------- -// -// Enter a message handler loop -// -//------------------------------------------------------------------------- - -nsresult nsAppShell::Run() -{ - // Process messages - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - if (mDispatchListener) - mDispatchListener->AfterDispatch(); - } - return msg.wParam; -} - -//------------------------------------------------------------------------- -// -// Exit a message handler loop -// -//------------------------------------------------------------------------- - -void nsAppShell::Exit() -{ - PostQuitMessage(0); -} - -//------------------------------------------------------------------------- -// -// nsAppShell constructor -// -//------------------------------------------------------------------------- -nsAppShell::nsAppShell(nsISupports *aOuter) : nsObject(aOuter) -{ - mDispatchListener = 0; -} - -//------------------------------------------------------------------------- -// -// nsAppShell destructor -// -//------------------------------------------------------------------------- -nsAppShell::~nsAppShell() -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsAppShell::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = NS_NOINTERFACE; - static NS_DEFINE_IID(kInsAppShellIID, NS_IAPPSHELL_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsAppShellIID)) { - *aInstancePtr = (void*) ((nsIAppShell*)this); - AddRef(); - result = NS_OK; - } - - return result; -} -//------------------------------------------------------------------------- -// -// GetNativeData -// -//------------------------------------------------------------------------- -void* nsAppShell::GetNativeData(PRUint32 aDataType) -{ - if (aDataType == NS_NATIVE_SHELL) { - return NULL; - } - return nsnull; -} \ No newline at end of file diff --git a/mozilla/widget/src/windows/nsAppShell.h b/mozilla/widget/src/windows/nsAppShell.h deleted file mode 100644 index eea295abd65..00000000000 --- a/mozilla/widget/src/windows/nsAppShell.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsAppShell_h__ -#define nsAppShell_h__ - -#include "nsObject.h" -#include "nsIAppShell.h" - -/** - * Native Win32 Application shell wrapper - */ - -class nsAppShell : public nsIAppShell, public nsObject -{ - public: - nsAppShell(nsISupports *aOuter); - virtual ~nsAppShell(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - PRBool OnPaint(); - - // nsIAppShellInterface - - virtual void Create(int* argc, char ** argv); - virtual nsresult Run(); - virtual void SetDispatchListener(nsDispatchListener* aDispatchListener); - virtual void Exit(); - virtual void* GetNativeData(PRUint32 aDataType); - - private: - nsDispatchListener* mDispatchListener; -}; - -#endif // nsAppShell_h__ diff --git a/mozilla/widget/src/windows/nsButton.cpp b/mozilla/widget/src/windows/nsButton.cpp deleted file mode 100644 index 60adee814c7..00000000000 --- a/mozilla/widget/src/windows/nsButton.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsButton.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" -#include - -//------------------------------------------------------------------------- -// -// nsButton constructor -// -//------------------------------------------------------------------------- -nsButton::nsButton(nsISupports *aOuter) : nsWindow(aOuter) -{ -} - -//------------------------------------------------------------------------- -// -// nsButton destructor -// -//------------------------------------------------------------------------- -nsButton::~nsButton() -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsButton::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kInsButtonIID, NS_IBUTTON_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsButtonIID)) { - *aInstancePtr = (void*) ((nsIButton*)this); - AddRef(); - result = NS_OK; - } - - return result; -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -void nsButton::SetLabel(const nsString& aText) -{ - NS_ALLOC_STR_BUF(label, aText, 256); - VERIFY(::SetWindowText(mWnd, label)); - NS_FREE_STR_BUF(label); -} - -//------------------------------------------------------------------------- -// -// Get this button label -// -//------------------------------------------------------------------------- -void nsButton::GetLabel(nsString& aBuffer) -{ - int actualSize = ::GetWindowTextLength(mWnd)+1; - NS_ALLOC_CHAR_BUF(label, 256, actualSize); - ::GetWindowText(mWnd, label, actualSize); - aBuffer.SetLength(0); - aBuffer.Append(label); - NS_FREE_CHAR_BUF(label); -} - -//------------------------------------------------------------------------- -// -// move, paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsButton::OnMove(PRInt32, PRInt32) -{ - return PR_FALSE; -} - -PRBool nsButton::OnPaint() -{ - //printf("** nsButton::OnPaint **\n"); - return PR_FALSE; -} - -PRBool nsButton::OnResize(nsRect &aWindowRect) -{ - return PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- -LPCTSTR nsButton::WindowClass() -{ - return "BUTTON"; -} - -//------------------------------------------------------------------------- -// -// return window styles -// -//------------------------------------------------------------------------- -DWORD nsButton::WindowStyle() -{ - return WS_CHILD | WS_CLIPSIBLINGS; -} - -//------------------------------------------------------------------------- -// -// return window extended styles -// -//------------------------------------------------------------------------- -DWORD nsButton::WindowExStyle() -{ - return 0; -} - - -//------------------------------------------------------------------------- -// -// get position/dimensions -// -//------------------------------------------------------------------------- - -void nsButton::GetBounds(nsRect &aRect) -{ - nsWindow::GetBounds(aRect); -} - diff --git a/mozilla/widget/src/windows/nsButton.h b/mozilla/widget/src/windows/nsButton.h deleted file mode 100644 index 60840e98fe2..00000000000 --- a/mozilla/widget/src/windows/nsButton.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsButton_h__ -#define nsButton_h__ - -#include "nsdefs.h" -#include "nsWindow.h" -#include "nsSwitchToUIThread.h" - -#include "nsIButton.h" - -/** - * Native Win32 button wrapper - */ - -class nsButton : public nsWindow, - public nsIButton -{ - -public: - nsButton(nsISupports *aOuter); - virtual ~nsButton(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - - // nsIWidget interface - BASE_IWIDGET_IMPL - - // nsIButton part - virtual void SetLabel(const nsString& aText); - virtual void GetLabel(nsString& aBuffer); - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnPaint(); - virtual PRBool OnResize(nsRect &aWindowRect); - virtual void GetBounds(nsRect &aRect); - -protected: - virtual LPCTSTR WindowClass(); - virtual DWORD WindowStyle(); - virtual DWORD WindowExStyle(); - -}; - -#endif // nsButton_h__ diff --git a/mozilla/widget/src/windows/nsCList.h b/mozilla/widget/src/windows/nsCList.h deleted file mode 100644 index bf9f3939fe3..00000000000 --- a/mozilla/widget/src/windows/nsCList.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef CLIST_H -#define CLIST_H - -#include - -// ----------------------------------------------------------------------- -// -// Simple circular linked-list implementation... -// -// ----------------------------------------------------------------------- - -// Foreward declarations... -struct CList; - -#define OBJECT_PTR_FROM_CLIST(className, listElement) \ - ((char*)listElement - offsetof(className, m_link)) - - -struct CList { - CList *next; - CList *prev; - - CList() { - next = prev = this; - } - - ~CList() { - Remove(); - } - - // - // Append an element to the end of this list - // - void Append(CList &element) { - element.next = this; - element.prev = prev; - prev->next = &element; - prev = &element; - } - - // - // Add an element to the beginning of this list - // - void Add(CList &element) { - element.next = next; - element.prev = this; - next->prev = &element; - next = &element; - } - - // - // Append this element to the end of a list - // - void AppendToList(CList &list) { - list.Append(*this); - } - - // - // Add this element to the beginning of a list - // - void AddToList(CList &list) { - list.Add(*this); - } - - // - // Remove this element from the list and re-initialize - // - void Remove(void) { - prev->next = next; - next->prev = prev; - - next = prev = this; - } - - // - // Is this list empty ? - // - BOOL IsEmpty(void) { - return (next == this); - } -}; - -#endif // CLIST_H - diff --git a/mozilla/widget/src/windows/nsCheckButton.cpp b/mozilla/widget/src/windows/nsCheckButton.cpp deleted file mode 100644 index 3ae4fa3e9e3..00000000000 --- a/mozilla/widget/src/windows/nsCheckButton.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsCheckButton.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" -#include - -//------------------------------------------------------------------------- -// -// nsCheckButton constructor -// -//------------------------------------------------------------------------- -nsCheckButton::nsCheckButton(nsISupports *aOuter) : nsWindow(aOuter) -{ -} - - -//------------------------------------------------------------------------- -// -// nsCheckButton destructor -// -//------------------------------------------------------------------------- -nsCheckButton::~nsCheckButton() -{ -} - - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsCheckButton::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kInsCheckButtonIID, NS_ICHECKBUTTON_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsCheckButtonIID)) { - *aInstancePtr = (void*) ((nsICheckButton*)this); - AddRef(); - result = NS_OK; - } - - return result; -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -void nsCheckButton::SetState(PRBool aState) -{ - BOOL state; - if (aState) - state = BST_CHECKED; - else - state = BST_UNCHECKED; - ::SendMessage(mWnd, BM_SETCHECK, (WPARAM)state, (LPARAM)0); -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -PRBool nsCheckButton::GetState() -{ - if (::SendMessage(mWnd, BM_GETCHECK, (WPARAM)0, (LPARAM)0) == BST_CHECKED) - return PR_TRUE; - else - return PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -void nsCheckButton::SetLabel(const nsString& aText) -{ - char label[256]; - aText.ToCString(label, 256); - label[255] = '\0'; - VERIFY(::SetWindowText(mWnd, label)); -} - - -//------------------------------------------------------------------------- -// -// Get this button label -// -//------------------------------------------------------------------------- -void nsCheckButton::GetLabel(nsString& aBuffer) -{ - int actualSize = ::GetWindowTextLength(mWnd)+1; - NS_ALLOC_CHAR_BUF(label, 256, actualSize); - ::GetWindowText(mWnd, label, actualSize); - aBuffer.SetLength(0); - aBuffer.Append(label); - NS_FREE_CHAR_BUF(label); -} - -//------------------------------------------------------------------------- -// -// move, paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsCheckButton::OnMove(PRInt32, PRInt32) -{ - return PR_FALSE; -} - -PRBool nsCheckButton::OnPaint() -{ - return PR_FALSE; -} - -PRBool nsCheckButton::OnResize(nsRect &aWindowRect) -{ - return PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- -LPCTSTR nsCheckButton::WindowClass() -{ - return "BUTTON"; -} - - -//------------------------------------------------------------------------- -// -// return window styles -// -//------------------------------------------------------------------------- -DWORD nsCheckButton::WindowStyle() -{ - return BS_CHECKBOX | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS; -} - - -//------------------------------------------------------------------------- -// -// return window extended styles -// -//------------------------------------------------------------------------- -DWORD nsCheckButton::WindowExStyle() -{ - return 0; -} - - -//------------------------------------------------------------------------- -// -// get position/dimensions -// -//------------------------------------------------------------------------- - -void nsCheckButton::GetBounds(nsRect &aRect) -{ - nsWindow::GetBounds(aRect); -} - - diff --git a/mozilla/widget/src/windows/nsCheckButton.h b/mozilla/widget/src/windows/nsCheckButton.h deleted file mode 100644 index 4393eeff428..00000000000 --- a/mozilla/widget/src/windows/nsCheckButton.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsCheckButton_h__ -#define nsCheckButton_h__ - -#include "nsdefs.h" -#include "nsWindow.h" -#include "nsSwitchToUIThread.h" - -#include "nsICheckButton.h" - -/** - * Native Win32 Checkbox wrapper - */ - -class nsCheckButton : public nsWindow, - public nsICheckButton -{ - -public: - nsCheckButton(nsISupports *aOuter); - virtual ~nsCheckButton(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - - // nsIWidget interface - BASE_IWIDGET_IMPL - - // nsICheckButton part - virtual void SetLabel(const nsString& aText); - virtual void GetLabel(nsString& aBuffer); - - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnPaint(); - virtual PRBool OnResize(nsRect &aWindowRect); - virtual void GetBounds(nsRect &aRect); - - virtual void SetState(PRBool aState); - virtual PRBool GetState(); - - -protected: - - virtual LPCTSTR WindowClass(); - virtual DWORD WindowStyle(); - virtual DWORD WindowExStyle(); - -}; - -#endif // nsCheckButton_h__ diff --git a/mozilla/widget/src/windows/nsComboBox.cpp b/mozilla/widget/src/windows/nsComboBox.cpp deleted file mode 100644 index b17107f3731..00000000000 --- a/mozilla/widget/src/windows/nsComboBox.cpp +++ /dev/null @@ -1,274 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsComboBox.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" -#include - -//------------------------------------------------------------------------- -// -// destructor -// -//------------------------------------------------------------------------- -void nsComboBox::AddItemAt(nsString &aItem, PRInt32 aPosition) -{ - NS_ALLOC_STR_BUF(val, aItem, 256); - ::SendMessage(mWnd, CB_ADDSTRING, (int)aPosition, (LPARAM)(LPCTSTR)val); - NS_FREE_STR_BUF(val); -} - -//------------------------------------------------------------------------- -// -// Finds an item at a postion -// -//------------------------------------------------------------------------- -PRInt32 nsComboBox::FindItem(nsString &aItem, PRInt32 aStartPos) -{ - NS_ALLOC_STR_BUF(val, aItem, 256); - int index = ::SendMessage(mWnd, CB_FINDSTRINGEXACT, (int)aStartPos, (LPARAM)(LPCTSTR)val); - NS_FREE_STR_BUF(val); - - return index; -} - -//------------------------------------------------------------------------- -// -// CountItems - Get Item Count -// -//------------------------------------------------------------------------- -PRInt32 nsComboBox::GetItemCount() -{ - return (PRInt32)::SendMessage(mWnd, CB_GETCOUNT, (int)0, (LPARAM)0); -} - -//------------------------------------------------------------------------- -// -// Removes an Item at a specified location -// -//------------------------------------------------------------------------- -PRBool nsComboBox::RemoveItemAt(PRInt32 aPosition) -{ - int status = ::SendMessage(mWnd, CB_DELETESTRING, (int)aPosition, (LPARAM)(LPCTSTR)0); - return (status != CB_ERR?PR_TRUE:PR_FALSE); -} - -//------------------------------------------------------------------------- -// -// Removes an Item at a specified location -// -//------------------------------------------------------------------------- -PRBool nsComboBox::GetItemAt(nsString& anItem, PRInt32 aPosition) -{ - PRBool result = PR_FALSE; - int len = ::SendMessage(mWnd, CB_GETLBTEXTLEN, (int)aPosition, (LPARAM)0); - if (len != CB_ERR) { - char * str = new char[len+1]; - anItem.SetLength(0); - int status = ::SendMessage(mWnd, CB_GETLBTEXT, (int)aPosition, (LPARAM)(LPCTSTR)str); - if (status != CB_ERR) { - anItem.Append(str); - result = PR_TRUE; - } - delete str; - } - return result; -} - -//------------------------------------------------------------------------- -// -// Gets the selected of selected item -// -//------------------------------------------------------------------------- -void nsComboBox::GetSelectedItem(nsString& aItem) -{ - - int index = ::SendMessage(mWnd, CB_GETCURSEL, (int)0, (LPARAM)0); - GetItemAt(aItem, index); -} - -//------------------------------------------------------------------------- -// -// Gets the list of selected otems -// -//------------------------------------------------------------------------- -PRInt32 nsComboBox::GetSelectedIndex() -{ - return ::SendMessage(mWnd, CB_GETCURSEL, (int)0, (LPARAM)0); -} - -//------------------------------------------------------------------------- -// -// SelectItem -// -//------------------------------------------------------------------------- -void nsComboBox::SelectItem(PRInt32 aPosition) -{ - ::SendMessage(mWnd, CB_SETCURSEL, (int)aPosition, (LPARAM)0); -} - -//------------------------------------------------------------------------- -// -// Deselect -// -//------------------------------------------------------------------------- -void nsComboBox::Deselect() -{ - ::SendMessage(mWnd, CB_SETCURSEL, (WPARAM)-1, (LPARAM)0); -} - -//------------------------------------------------------------------------- -// -// nsComboBox constructor -// -//------------------------------------------------------------------------- -nsComboBox::nsComboBox(nsISupports *aOuter) : nsWindow(aOuter) -{ - mBackground = NS_RGB(124, 124, 124); - mDropDownHeight = 60; // Default to 60 pixels for drop-down list height -} - -//------------------------------------------------------------------------- -// -// destructor -// -//------------------------------------------------------------------------- -nsComboBox::~nsComboBox() -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsComboBox::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kInsComboBoxIID, NS_ICOMBOBOX_IID); - static NS_DEFINE_IID(kInsListWidgetIID, NS_ILISTWIDGET_IID); - if (result == NS_NOINTERFACE) { - if (aIID.Equals(kInsComboBoxIID)) { - *aInstancePtr = (void*) ((nsIComboBox*)this); - AddRef(); - result = NS_OK; - } - else if (aIID.Equals(kInsListWidgetIID)) { - *aInstancePtr = (void*) ((nsIListWidget*)this); - AddRef(); - result = NS_OK; - } - } - - return result; -} - -//------------------------------------------------------------------------- -// -// move, paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsComboBox::OnMove(PRInt32, PRInt32) -{ - return PR_FALSE; -} - -PRBool nsComboBox::OnPaint() -{ - return PR_FALSE; -} - -PRBool nsComboBox::OnResize(nsRect &aWindowRect) -{ - return PR_FALSE; -} - - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- -LPCTSTR nsComboBox::WindowClass() -{ - return("COMBOBOX"); -} - -//------------------------------------------------------------------------- -// -// return window styles -// -//------------------------------------------------------------------------- -DWORD nsComboBox::WindowStyle() -{ - return (CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS); -} - -//------------------------------------------------------------------------- -// -// return window extended styles -// -//------------------------------------------------------------------------- -DWORD nsComboBox::WindowExStyle() -{ - return WS_EX_CLIENTEDGE; -} - -//------------------------------------------------------------------------- -// -// Cache the drop down list height in mDropDownHeight -// -//------------------------------------------------------------------------- - -void nsComboBox::PreCreateWidget(nsWidgetInitData *aInitData) -{ - nsComboBoxInitData* comboData = (nsComboBoxInitData*)aInitData; - mDropDownHeight = comboData->mDropDownHeight; -} - -//------------------------------------------------------------------------- -// -// Modify the height passed to create and resize to be -// the combo box drop down list height. (Note: Windows uses -// the height of the window to specify the drop-down list size, -// not the height of combobox text area. -// -//------------------------------------------------------------------------- - -PRInt32 nsComboBox::GetHeight(PRInt32 aProposedHeight) -{ - return(mDropDownHeight); -} - - -//------------------------------------------------------------------------- -// -// get position/dimensions -// -//------------------------------------------------------------------------- - -void nsComboBox::GetBounds(nsRect &aRect) -{ - nsWindow::GetNonClientBounds(aRect); -} - - diff --git a/mozilla/widget/src/windows/nsComboBox.h b/mozilla/widget/src/windows/nsComboBox.h deleted file mode 100644 index a5472983ce0..00000000000 --- a/mozilla/widget/src/windows/nsComboBox.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsComboBox_h__ -#define nsComboBox_h__ - -#include "nsdefs.h" -#include "nsWindow.h" -#include "nsSwitchToUIThread.h" -#include "nsIComboBox.h" - -/** - * Native Win32 Combobox wrapper - */ - -class nsComboBox : public nsWindow, - public nsIComboBox -{ - -public: - nsComboBox(nsISupports *aOuter); - ~nsComboBox(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnPaint(); - virtual PRBool OnResize(nsRect &aWindowRect); - virtual void GetBounds(nsRect &aRect); - - // nsIWidget interface - BASE_IWIDGET_IMPL - - // nsIComboBox part - - void AddItemAt(nsString &aItem, PRInt32 aPosition); - PRInt32 FindItem(nsString &aItem, PRInt32 aStartPos); - PRInt32 GetItemCount(); - PRBool RemoveItemAt(PRInt32 aPosition); - PRBool GetItemAt(nsString& anItem, PRInt32 aPosition); - void GetSelectedItem(nsString& aItem); - PRInt32 GetSelectedIndex(); - void SelectItem(PRInt32 aPosition); - void Deselect() ; - void PreCreateWidget(nsWidgetInitData *aInitData); - -protected: - - // Modify the height passed to create and resize to be - // the combo box drop down list height. - PRInt32 GetHeight(PRInt32 aProposedHeight); - LPCTSTR WindowClass(); - DWORD WindowStyle(); - DWORD WindowExStyle(); - PRInt32 mDropDownHeight; - -}; - -#endif // nsComboBox_h__ diff --git a/mozilla/widget/src/windows/nsFileWidget.cpp b/mozilla/widget/src/windows/nsFileWidget.cpp deleted file mode 100644 index acc6d45c8c1..00000000000 --- a/mozilla/widget/src/windows/nsFileWidget.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -// Define so header files for openfilename are included -#ifdef WIN32_LEAN_AND_MEAN -#undef WIN32_LEAN_AND_MEAN -#endif - -#include "nsFileWidget.h" -#include - -//------------------------------------------------------------------------- -// -// Show - Display the file dialog -// -//------------------------------------------------------------------------- - -PRBool nsFileWidget::Show() -{ - char fileBuffer[MAX_PATH]; - fileBuffer[0] = '\0'; - OPENFILENAME ofn; - memset(&ofn, 0, sizeof(ofn)); - - ofn.lStructSize = sizeof(ofn); - - nsString filterList; - GetFilterListArray(filterList); - char *filterBuffer = filterList.ToNewCString(); - char *title = mTitle.ToNewCString(); - ofn.lpstrTitle = title; - ofn.lpstrFilter = filterBuffer; - ofn.nFilterIndex = 1; - ofn.hwndOwner = mWnd; - ofn.lpstrFile = fileBuffer; - ofn.nMaxFile = MAX_PATH; - ofn.Flags = OFN_SHAREAWARE | OFN_NOCHANGEDIR | OFN_LONGNAMES | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; - - BOOL result; - - // Save current directory, so we can reset if it changes. - char* currentDirectory = new char[MAX_PATH+1]; - VERIFY(::GetCurrentDirectory(MAX_PATH, currentDirectory) > 0); - - if (mMode == eMode_load) { - result = GetOpenFileName(&ofn); - } - else if (mMode == eMode_save) { - result = GetSaveFileName(&ofn); - } - else { - NS_ASSERTION(0, "Only load and save are supported modes"); - } - - VERIFY(::SetCurrentDirectory(currentDirectory)); - - // Clean up filter buffers - delete filterBuffer; - delete title; - - // Set user-selected location of file or directory - mFile.SetLength(0); - if (result==PR_TRUE) { - mFile.Append(fileBuffer); - } - - return((PRBool)result); -} - -//------------------------------------------------------------------------- -// -// Convert filter titles + filters into a Windows filter string -// -//------------------------------------------------------------------------- - -void nsFileWidget::GetFilterListArray(nsString& aFilterList) -{ - aFilterList.SetLength(0); - for (PRUint32 i = 0; i < mNumberOfFilters; i++) { - const nsString& title = mTitles[i]; - const nsString& filter = mFilters[i]; - - aFilterList.Append(title); - aFilterList.Append('\0'); - aFilterList.Append(filter); - aFilterList.Append('\0'); - } - aFilterList.Append('\0'); -} - -//------------------------------------------------------------------------- -// -// Set the list of filters -// -//------------------------------------------------------------------------- - -void nsFileWidget::SetFilterList(PRUint32 aNumberOfFilters,const nsString aTitles[],const nsString aFilters[]) -{ - mNumberOfFilters = aNumberOfFilters; - mTitles = aTitles; - mFilters = aFilters; -} - -//------------------------------------------------------------------------- -// -// Get the file + path -// -//------------------------------------------------------------------------- - -void nsFileWidget::GetFile(nsString& aFile) -{ - aFile.SetLength(0); - aFile.Append(mFile); -} - -//------------------------------------------------------------------------- -// -// nsFileWidget constructor -// -//------------------------------------------------------------------------- -nsFileWidget::nsFileWidget(nsISupports *aOuter) : nsObject(aOuter) -{ - mWnd = NULL; - mNumberOfFilters = 0; -} - - -void nsFileWidget:: Create(nsIWidget *aParent, - nsString& aTitle, - nsMode aMode, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - void *aInitData) -{ - mWnd = (aParent) ? aParent->GetNativeData(NS_NATIVE_WINDOW) : 0; - mTitle.SetLength(0); - mTitle.Append(aTitle); - mMode = aMode; -} - - -//------------------------------------------------------------------------- -// -// nsFileWidget destructor -// -//------------------------------------------------------------------------- -nsFileWidget::~nsFileWidget() -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsFileWidget::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - // nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - nsresult result = NS_NOINTERFACE; - static NS_DEFINE_IID(kInsFileWidgetIID, NS_IFILEWIDGET_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsFileWidgetIID)) { - *aInstancePtr = (void*) ((nsIFileWidget*)this); - AddRef(); - result = NS_OK; - } - - return result; -} - - - diff --git a/mozilla/widget/src/windows/nsFileWidget.h b/mozilla/widget/src/windows/nsFileWidget.h deleted file mode 100644 index 09dcfe535bd..00000000000 --- a/mozilla/widget/src/windows/nsFileWidget.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsFileWidget_h__ -#define nsFileWidget_h__ - -#include "nsObject.h" -#include "nsToolkit.h" -#include "nsIWidget.h" -#include "nsIFileWidget.h" - -/** - * Native Win32 FileSelector wrapper - */ - -class nsFileWidget : public nsIFileWidget, public nsObject -{ - public: - nsFileWidget(nsISupports *aOuter); - virtual ~nsFileWidget(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - PRBool OnPaint(); - - // nsIWidget interface - - virtual void Create( nsIWidget *aParent, - nsString& aTitle, - nsMode aMode, - nsIDeviceContext *aContext = nsnull, - nsIToolkit *aToolkit = nsnull, - void *aInitData = nsnull); - - // nsIFileWidget part - virtual PRBool Show(); - virtual void GetFile(nsString& aFile); - virtual void SetFilterList(PRUint32 aNumberOfFilters,const nsString aTitles[],const nsString aFilters[]); - - protected: - - HWND mWnd; - nsString mTitle; - nsMode mMode; - nsString mFile; - PRUint32 mNumberOfFilters; - const nsString* mTitles; - const nsString* mFilters; - - void GetFilterListArray(nsString& aFilterList); -}; - -#endif // nsFileWidget_h__ diff --git a/mozilla/widget/src/windows/nsListBox.cpp b/mozilla/widget/src/windows/nsListBox.cpp deleted file mode 100644 index e74fdd72a8f..00000000000 --- a/mozilla/widget/src/windows/nsListBox.cpp +++ /dev/null @@ -1,338 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsListBox.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" -#include - -//------------------------------------------------------------------------- -// -// initializer -// -//------------------------------------------------------------------------- - -void nsListBox::SetMultipleSelection(PRBool aMultipleSelections) -{ - mMultiSelect = aMultipleSelections; -} - -void nsListBox::PreCreateWidget(nsWidgetInitData *aInitData) -{ - if (nsnull != aInitData) { - nsListBoxInitData* data = (nsListBoxInitData *) aInitData; - mMultiSelect = data->mMultiSelect; - } -} - -//------------------------------------------------------------------------- -// -// destructor -// -//------------------------------------------------------------------------- - -void nsListBox::AddItemAt(nsString &aItem, PRInt32 aPosition) -{ - NS_ALLOC_STR_BUF(val, aItem, 256); - SendMessage(mWnd, LB_INSERTSTRING, (int)aPosition, (LPARAM)(LPCTSTR)val); - NS_FREE_STR_BUF(val); -} - -//------------------------------------------------------------------------- -// -// Finds an item at a postion -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::FindItem(nsString &aItem, PRInt32 aStartPos) -{ - NS_ALLOC_STR_BUF(val, aItem, 256); - int index = ::SendMessage(mWnd, LB_FINDSTRINGEXACT, (int)aStartPos, (LPARAM)(LPCTSTR)val); - NS_FREE_STR_BUF(val); - - return index; -} - -//------------------------------------------------------------------------- -// -// CountItems - Get Item Count -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::GetItemCount() -{ - return (PRInt32)::SendMessage(mWnd, LB_GETCOUNT, (int)0, (LPARAM)0); -} - -//------------------------------------------------------------------------- -// -// Removes an Item at a specified location -// -//------------------------------------------------------------------------- -PRBool nsListBox::RemoveItemAt(PRInt32 aPosition) -{ - int status = ::SendMessage(mWnd, LB_DELETESTRING, (int)aPosition, (LPARAM)(LPCTSTR)0); - return (status != LB_ERR?PR_TRUE:PR_FALSE); -} - -//------------------------------------------------------------------------- -// -// Removes an Item at a specified location -// -//------------------------------------------------------------------------- -PRBool nsListBox::GetItemAt(nsString& anItem, PRInt32 aPosition) -{ - PRBool result = PR_FALSE; - int len = ::SendMessage(mWnd, LB_GETTEXTLEN, (int)aPosition, (LPARAM)0); - if (len != LB_ERR) { - char * str = new char[len+1]; - anItem.SetLength(0); - int status = ::SendMessage(mWnd, LB_GETTEXT, (int)aPosition, (LPARAM)(LPCTSTR)str); - if (status != LB_ERR) { - anItem.Append(str); - result = PR_TRUE; - } - delete str; - } - return result; -} - -//------------------------------------------------------------------------- -// -// Gets the selected of selected item -// -//------------------------------------------------------------------------- -void nsListBox::GetSelectedItem(nsString& aItem) -{ - if (!mMultiSelect) { - int index = ::SendMessage(mWnd, LB_GETCURSEL, (int)0, (LPARAM)0); - GetItemAt(aItem, index); - } else { - NS_ASSERTION(0, "Multi selection list box does not support GetSelectedItem()"); - } -} - -//------------------------------------------------------------------------- -// -// Gets the list of selected otems -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::GetSelectedIndex() -{ - if (!mMultiSelect) { - return ::SendMessage(mWnd, LB_GETCURSEL, (int)0, (LPARAM)0); - } else { - NS_ASSERTION(0, "Multi selection list box does not support GetSelectedIndex()"); - } - return 0; -} - -//------------------------------------------------------------------------- -// -// SelectItem -// -//------------------------------------------------------------------------- -void nsListBox::SelectItem(PRInt32 aPosition) -{ - if (!mMultiSelect) { - ::SendMessage(mWnd, LB_SETCURSEL, (int)aPosition, (LPARAM)0); - } else { - ::SendMessage(mWnd, LB_SETSEL, (WPARAM) (BOOL)PR_TRUE, (LPARAM)(UINT)aPosition); - } -} - -//------------------------------------------------------------------------- -// -// GetSelectedCount -// -//------------------------------------------------------------------------- -PRInt32 nsListBox::GetSelectedCount() -{ - if (!mMultiSelect) { - PRInt32 inx = GetSelectedIndex(); - return (inx == -1? 0 : 1); - } else { - return ::SendMessage(mWnd, LB_GETSELCOUNT, (int)0, (LPARAM)0); - } -} - -//------------------------------------------------------------------------- -// -// GetSelectedIndices -// -//------------------------------------------------------------------------- -void nsListBox::GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) -{ - ::SendMessage(mWnd, LB_GETSELITEMS, (int)aSize, (LPARAM)aIndices); -} - -//------------------------------------------------------------------------- -// -// SetSelectedIndices -// -//------------------------------------------------------------------------- -void nsListBox::SetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) -{ - for (int i=0;iQueryInterface(aIID, aInstancePtr); -} - -/** - * - */ -nsrefcnt nsObject::AddRef(void) -{ - return mOuter->AddRef(); -} - -/** - * - */ -nsrefcnt nsObject::Release(void) -{ - return NS_RELEASE(mOuter); -} - -/** - * - */ -inline nsrefcnt nsObject::AddRefObject(void) { - return ++mRefCnt; -} - -/** - * - */ -inline nsrefcnt nsObject::ReleaseObject(void) { - return (--mRefCnt) ? mRefCnt : (delete this, 0); -} - -/** - * - */ -nsresult nsObject::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - if (aIID.Equals(kISupportsIID)) { - *aInstancePtr = (void*) ((nsISupports*)&mInner); - AddRef(); - return NS_OK; - } - - return NS_NOINTERFACE; -} - - -/** - * static utility. Delete all live objects - */ - -void nsObject::DeleteAllObjects(void) -{ - PR_EnterMonitor(s_liveChainMutex); - - while (!s_liveChain.IsEmpty()) { - nsObject *pnsObject; - - pnsObject = (nsObject*)OBJECT_PTR_FROM_CLIST(nsObject, s_liveChain.next); - - // Remove the event from the chain... - pnsObject->m_link.Remove(); - delete pnsObject; - } - - PR_ExitMonitor(s_liveChainMutex); -} - diff --git a/mozilla/widget/src/windows/nsObject.h b/mozilla/widget/src/windows/nsObject.h deleted file mode 100644 index 56b4eed60a6..00000000000 --- a/mozilla/widget/src/windows/nsObject.h +++ /dev/null @@ -1,107 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef OBJECT_H -#define OBJECT_H - -#include "nsdefs.h" -#include "nsCList.h" -#include "nsISupports.h" -#include "prmon.h" - -/** - * nsObject is the base class for all native widgets - */ - -class nsObject : public nsISupports -{ - -public: - nsObject(nsISupports *aOuter); - virtual ~nsObject(); - - // Implementation of those, always forward to the outer object. - NS_IMETHOD QueryInterface(const nsIID& aIID, - void** aInstancePtr); - NS_IMETHOD_(nsrefcnt) AddRef(void); - NS_IMETHOD_(nsrefcnt) Release(void); - - // - // Derived classes have to implement this one - // - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - -protected: - // - // Data members: - // - CList m_link; - - nsISupports *mOuter; - -private: - - class InnerSupport : public nsISupports { - public: - InnerSupport() {} - -#define INNER_OUTER \ - ((nsObject*)((char*)this - offsetof(nsObject, mInner))) - - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr) - { return INNER_OUTER->QueryObject(aIID, aInstancePtr); } - NS_IMETHOD_(nsrefcnt) AddRef(void) - { return INNER_OUTER->AddRefObject(); } - NS_IMETHOD_(nsrefcnt) Release(void) - { return INNER_OUTER->ReleaseObject(); } - } mInner; - friend InnerSupport; - - nsrefcnt mRefCnt; - nsrefcnt AddRefObject(void); - nsrefcnt ReleaseObject(void); - -public: - - // - // The following data members are used to maintain a chain of all - // allocated nsObject instances. This chain is traversed at - // shutdown to clean up any dangling instances... - // - static CList s_liveChain; - static PRMonitor *s_liveChainMutex; - -#ifdef _DEBUG - static int32 s_nObjects; -#endif - - static void DeleteAllObjects(void); - -}; - -#define BASE_SUPPORT \ - NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr) \ - { return nsObject::QueryInterface(aIID, aInstancePtr); } \ - NS_IMETHOD_(nsrefcnt) AddRef(void) \ - { return nsObject::AddRef(); } \ - NS_IMETHOD_(nsrefcnt) Release(void) \ - { return nsObject::Release(); } - - -#endif // OBJECT_H - diff --git a/mozilla/widget/src/windows/nsRadioButton.cpp b/mozilla/widget/src/windows/nsRadioButton.cpp deleted file mode 100644 index f5ffdffbab1..00000000000 --- a/mozilla/widget/src/windows/nsRadioButton.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsRadioButton.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsStringUtil.h" - -#include - -//------------------------------------------------------------------------- -// -// nsRadioButton constructor -// -//------------------------------------------------------------------------- -nsRadioButton::nsRadioButton(nsISupports *aOuter) : nsWindow(aOuter) -{ -} - - -//------------------------------------------------------------------------- -// -// nsRadioButton destructor -// -//------------------------------------------------------------------------- -nsRadioButton::~nsRadioButton() -{ -} - - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsRadioButton::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kInsRadioButtonIID, NS_IRADIOBUTTON_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsRadioButtonIID)) { - *aInstancePtr = (void*) ((nsIRadioButton*)this); - AddRef(); - result = NS_OK; - } - - return result; -} - -//------------------------------------------------------------------------- -// -// Sets the state of the nsRadioButton -// -//------------------------------------------------------------------------- -void nsRadioButton::SetState(PRBool aState) -{ - fState = aState; - - ::SendMessage(GetWindowHandle(), BM_SETCHECK, (WPARAM)(fState), 0L); -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -PRBool nsRadioButton::GetState() -{ - return fState; -} - -//------------------------------------------------------------------------- -// -// Set this button label -// -//------------------------------------------------------------------------- -void nsRadioButton::SetLabel(const nsString& aText) -{ - char label[256]; - aText.ToCString(label, 256); - label[255] = '\0'; - VERIFY(::SetWindowText(mWnd, label)); -} - - -//------------------------------------------------------------------------- -// -// Get this button label -// -//------------------------------------------------------------------------- -void nsRadioButton::GetLabel(nsString& aBuffer) -{ - int actualSize = ::GetWindowTextLength(mWnd)+1; - NS_ALLOC_CHAR_BUF(label, 256, actualSize); - ::GetWindowText(mWnd, label, actualSize); - aBuffer.SetLength(0); - aBuffer.Append(label); - NS_FREE_CHAR_BUF(label); -} - -//------------------------------------------------------------------------- -// -// move, paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsRadioButton::OnMove(PRInt32, PRInt32) -{ - return PR_FALSE; -} - -PRBool nsRadioButton::OnPaint() -{ - return PR_FALSE; -} - -PRBool nsRadioButton::OnResize(nsRect &aWindowRect) -{ - return PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- -LPCTSTR nsRadioButton::WindowClass() -{ - return "BUTTON"; -} - - -//------------------------------------------------------------------------- -// -// return window styles -// -//------------------------------------------------------------------------- -DWORD nsRadioButton::WindowStyle() -{ - return BS_RADIOBUTTON | WS_CHILD | WS_CLIPSIBLINGS; -} - - -//------------------------------------------------------------------------- -// -// return window extended styles -// -//------------------------------------------------------------------------- -DWORD nsRadioButton::WindowExStyle() -{ - return 0; -} - - -//------------------------------------------------------------------------- -// -// get position/dimensions -// -//------------------------------------------------------------------------- - -void nsRadioButton::GetBounds(nsRect &aRect) -{ - nsWindow::GetBounds(aRect); -} - - diff --git a/mozilla/widget/src/windows/nsRadioButton.h b/mozilla/widget/src/windows/nsRadioButton.h deleted file mode 100644 index 6fc883cef3b..00000000000 --- a/mozilla/widget/src/windows/nsRadioButton.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsRadioButton_h__ -#define nsRadioButton_h__ - -#include "nsdefs.h" -#include "nsWindow.h" -#include "nsSwitchToUIThread.h" -#include "nsString.h" - -#include "nsIRadioButton.h" - - -/** - * Native Win32 Radio button wrapper - */ - -class nsRadioButton : public nsWindow, - public nsIRadioButton -{ - -public: - nsRadioButton(nsISupports *aOuter); - virtual ~nsRadioButton(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - - // nsIWidget interface - BASE_IWIDGET_IMPL - - // nsIRadioButton part - virtual void SetLabel(const nsString& aText); - virtual void GetLabel(nsString& aBuffer); - - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnPaint(); - virtual PRBool OnResize(nsRect &aWindowRect); - virtual void GetBounds(nsRect &aRect); - - virtual void SetState(PRBool aState); - virtual PRBool GetState(); - -protected: - PRBool fState; - - virtual LPCTSTR WindowClass(); - virtual DWORD WindowStyle(); - virtual DWORD WindowExStyle(); - -}; - -#endif // nsRadioButton_h__ diff --git a/mozilla/widget/src/windows/nsRadioGroup.cpp b/mozilla/widget/src/windows/nsRadioGroup.cpp deleted file mode 100644 index 6f0f94ccfba..00000000000 --- a/mozilla/widget/src/windows/nsRadioGroup.cpp +++ /dev/null @@ -1,379 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsRadioGroup.h" -#include "nsToolkit.h" -#include "nsStringUtil.h" - - -class nsStringHashKey : public nsHashKey { -public: - nsStringHashKey(const nsString & aKey); - ~nsStringHashKey(); - - PRBool operator==(const nsStringHashKey& aOther) const; - PRBool Equals(const nsHashKey* aOther) const; - PRUint32 HashValue(void) const; - nsHashKey* Clone(void) const; - -private: - nsStringHashKey(); - nsStringHashKey(const nsStringHashKey& aCopy); - nsStringHashKey& operator=(const nsStringHashKey& aCopy); - -protected: - nsString mKey; - PRUint32 mHashValid; - PRUint32 mHashValue; - -}; - -nsStringHashKey::nsStringHashKey(const nsString & aKey) -{ - mKey.SetLength(0); - mKey.Append(aKey); - mHashValid = 0; -} - -nsStringHashKey::nsStringHashKey(const nsStringHashKey& aCopy) -{ - mKey.SetLength(0); - mKey.Append(aCopy.mKey); - mHashValid = aCopy.mHashValid; - mHashValue = aCopy.mHashValue; -} - -nsStringHashKey::~nsStringHashKey() -{ -} - -PRBool nsStringHashKey::operator==(const nsStringHashKey& aOther) const -{ - return Equals(&aOther); -} - -PRBool nsStringHashKey::Equals(const nsHashKey* aOther) const -{ - PRBool result = PR_TRUE; - - const nsStringHashKey* other = (nsStringHashKey*)aOther; - - if (nsnull != other && other != this) { - result = mKey.Equals(other->mKey); - } - return result; -} - -nsHashKey* nsStringHashKey::Clone(void) const -{ - return new nsStringHashKey(*this); -} - -PRUint32 nsStringHashKey::HashValue(void) const -{ - if (0 == mHashValid) { - ((nsStringHashKey*)this)->mHashValue = 0; - - NS_ALLOC_STR_BUF(val, mKey, 256) - PRUint32 hash = 0; - PRUint32 off = 0; - PRUint32 len = mKey.Length(); - - if (len < 16) { - for (PRUint32 i = len ; i > 0; i--) { - hash = (hash * 37) + val[off++]; - } - } else { // only sample some characters - PRUint32 skip = len / 8; - for (PRUint32 i = len ; i > 0; i -= skip, off += skip) { - hash = (hash * 39) + val[off]; - } - } - NS_FREE_STR_BUF(val) - ((nsStringHashKey*)this)->mHashValue = hash;//^= (hash & 0x7FFFFFFF); - ((nsStringHashKey*)this)->mHashValid = 1; - } - return mHashValue; -} - - - -nsHashtable * nsRadioGroup::mRadioGroupHashtable = new nsHashtable(8); - -PRBool HashtableEnum(nsHashKey *aKey, void *aData) { - printf("HashtableEnum %s\n", aKey); - return PR_TRUE; -} - -//------------------------------------------------------------------------- -// -// nsRadioGroup static methods -// -//------------------------------------------------------------------------- -nsRadioGroup * nsRadioGroup::getNamedRadioGroup(const nsString & aName) { - nsStringHashKey key(aName); - nsRadioGroup * group = (nsRadioGroup *)mRadioGroupHashtable->Get((nsHashKey *)&key); - return group; -} - -NS_EXPORT nsIRadioGroup * NS_GetRadioGroup(const nsString &aName) { - return nsRadioGroup::getNamedRadioGroup(aName); -} - - -//------------------------------------------------------------------------- -// -// nsRadioGroup constructor -// -//------------------------------------------------------------------------- -nsRadioGroup::nsRadioGroup(nsISupports *aOuter) : nsObject(aOuter) -{ - mChildren = NULL; -} - - -//------------------------------------------------------------------------- -// -// nsRadioGroup destructor -// -//------------------------------------------------------------------------- -nsRadioGroup::~nsRadioGroup() -{ - if (mChildren) { - mChildren = NULL; - } -} - - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsRadioGroup::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsObject::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kInsRadioGroupIID, NS_IRADIOGROUP_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsRadioGroupIID)) { - *aInstancePtr = (void*) ((nsIRadioGroup*)this); - AddRef(); - result = NS_OK; - } - - return result; - -} - - -//------------------------------------------------------------------------- -// -// Gives a name to this group of radio buttons -// -//------------------------------------------------------------------------- -void nsRadioGroup::SetName(const nsString &aName) -{ - mName.SetLength(0); - mName.Append(aName); - mRadioGroupHashtable->Put(new nsStringHashKey(aName), this); -} - - -//------------------------------------------------------------------------- -// -// Adds a nsRadioButton to this group -// -//------------------------------------------------------------------------- -void nsRadioGroup::Clicked(nsIRadioButton * aChild) -{ -#if 0 - if (mChildren) { - nsIEnumerator * enumerator = GetChildren(); - nsIRadioButton * child = (nsIRadioButton*)enumerator->Next(); - while (child) { - child->SetStateNoNotify((PRBool)(child == aChild)); - NS_RELEASE(child); - child = (nsIRadioButton*)enumerator->Next(); - } - NS_RELEASE(enumerator); - } -#endif -} - -//------------------------------------------------------------------------- -// -// Adds a nsRadioButton to this group -// -//------------------------------------------------------------------------- -void nsRadioGroup::Add(nsIRadioButton * aChild) -{ - if (!mChildren) { - mChildren = new Enumerator(); - } - - mChildren->Append(aChild); - -} - -//------------------------------------------------------------------------- -// -// Removes a nsRadioButton from this group -// -//------------------------------------------------------------------------- -void nsRadioGroup::Remove(nsIRadioButton * aChild) -{ - if (mChildren) { - mChildren->Remove(aChild); - } - -} - -//------------------------------------------------------------------------- -// -// Get this window's list of children -// -//------------------------------------------------------------------------- -nsIEnumerator* nsRadioGroup::GetChildren() -{ - if (mChildren) { - mChildren->Reset(); - mChildren->AddRef(); - return mChildren; - } - - return NULL; -} - - -//------------------------------------------------------------------------- -// -// Constructor -// -//------------------------------------------------------------------------- -#define INITIAL_SIZE 2 - -nsRadioGroup::Enumerator::Enumerator() -{ - mRefCnt = 1; - mArraySize = INITIAL_SIZE; - mChildrens = (nsIRadioButton**)new DWORD[mArraySize]; - memset(mChildrens, 0, sizeof(DWORD) * mArraySize); - mCurrentPosition = 0; -} - - -//------------------------------------------------------------------------- -// -// Destructor -// -//------------------------------------------------------------------------- -nsRadioGroup::Enumerator::~Enumerator() -{ - if (mChildrens) { - for (int i = 0; mChildrens[i] && i < mArraySize; i++) { - NS_RELEASE(mChildrens[i]); - } - - delete[] mChildrens; - } -} - -// -// nsISupports methods -// -NS_IMPL_ISUPPORTS(nsRadioGroup::Enumerator, NS_IENUMERATOR_IID); - -//------------------------------------------------------------------------- -// -// Get enumeration next element. Return null at the end -// -//------------------------------------------------------------------------- -nsISupports* nsRadioGroup::Enumerator::Next() -{ - if (mCurrentPosition < mArraySize && mChildrens[mCurrentPosition]) { - mChildrens[mCurrentPosition]->AddRef(); - return mChildrens[mCurrentPosition++]; - } - - return NULL; -} - - -//------------------------------------------------------------------------- -// -// Reset enumerator internal pointer to the beginning -// -//------------------------------------------------------------------------- -void nsRadioGroup::Enumerator::Reset() -{ - mCurrentPosition = 0; -} - - -//------------------------------------------------------------------------- -// -// Append an element -// -//------------------------------------------------------------------------- -void nsRadioGroup::Enumerator::Append(nsIRadioButton* aRadioButton) -{ - NS_PRECONDITION(aRadioButton, "Adding a null radio button to a radio group"); - if (aRadioButton) { - int pos; - for (pos = 0; pos < mArraySize && mChildrens[pos]; pos++); - if (pos == mArraySize) { - GrowArray(); - } - mChildrens[pos] = aRadioButton; - aRadioButton->AddRef(); - } -} - - -//------------------------------------------------------------------------- -// -// Remove an element -// -//------------------------------------------------------------------------- -void nsRadioGroup::Enumerator::Remove(nsIRadioButton* aRadioButton) -{ - int pos; - for(pos = 0; mChildrens[pos] && (mChildrens[pos] != aRadioButton); pos++); - if (mChildrens[pos] == aRadioButton) { - NS_RELEASE(aRadioButton); - memcpy(mChildrens + pos, mChildrens + pos + 1, mArraySize - pos - 1); - } - -} - - -//------------------------------------------------------------------------- -// -// Grow the size of the children array -// -//------------------------------------------------------------------------- -void nsRadioGroup::Enumerator::GrowArray() -{ - mArraySize <<= 1; - nsIRadioButton **newArray = (nsIRadioButton**)new DWORD[mArraySize]; - memset(newArray, 0, sizeof(DWORD) * mArraySize); - memcpy(newArray, mChildrens, (mArraySize>>1) * sizeof(DWORD)); - mChildrens = newArray; -} - - diff --git a/mozilla/widget/src/windows/nsRadioGroup.h b/mozilla/widget/src/windows/nsRadioGroup.h deleted file mode 100644 index 3049b4293af..00000000000 --- a/mozilla/widget/src/windows/nsRadioGroup.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsRadioGroup_h__ -#define nsRadioGroup_h__ - -#include "nsdefs.h" -#include "nsWindow.h" -#include "nsSwitchToUIThread.h" - -#include "nsIRadioGroup.h" -#include "nsRadioButton.h" -#include "nsHashtable.h" - -/** - * Native radio button manager - */ - -class nsRadioGroup : public nsObject, - public nsIRadioGroup -{ - -public: - nsRadioGroup(nsISupports *aOuter); - virtual ~nsRadioGroup(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - - // nsIRadioGroup part - virtual void Add(nsIRadioButton * aChild); - virtual void Remove(nsIRadioButton * aChild); - - virtual void SetName(const nsString &aName); - - virtual void Clicked(nsIRadioButton * aChild); - virtual nsIEnumerator* GetChildren(); - - static nsRadioGroup * getNamedRadioGroup(const nsString & aName); - -protected: - nsString mName; - - static nsHashtable * mRadioGroupHashtable; - //static PRBool HashtableEnum(nsHashKey *aKey, void *aData); - - - // keep the list of children - class Enumerator : public nsIEnumerator { - nsIRadioButton **mChildrens; - int mCurrentPosition; - int mArraySize; - - public: - NS_DECL_ISUPPORTS - - Enumerator(); - ~Enumerator(); - - NS_IMETHOD_(nsISupports*) Next(); - NS_IMETHOD_(void) Reset(); - - void Append(nsIRadioButton* aWidget); - void Remove(nsIRadioButton* aWidget); - - private: - void GrowArray(); - - } *mChildren; - -}; - -#endif // nsRadioGroup_h__ diff --git a/mozilla/widget/src/windows/nsScrollbar.cpp b/mozilla/widget/src/windows/nsScrollbar.cpp deleted file mode 100644 index a0dba25cd69..00000000000 --- a/mozilla/widget/src/windows/nsScrollbar.cpp +++ /dev/null @@ -1,464 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsScrollbar.h" -#include "nsToolkit.h" -#include "nsGUIEvent.h" -#include -#include "nsUnitConversion.h" - -//------------------------------------------------------------------------- -// -// nsScrollbar constructor -// -//------------------------------------------------------------------------- -nsScrollbar::nsScrollbar(nsISupports *aOuter, PRBool aIsVertical) : nsWindow(aOuter) -{ - mPositionFlag = (aIsVertical) ? SBS_VERT : SBS_HORZ; - mScaleFactor = 1.0; - mLineIncrement = 0; - mBackground = ::GetSysColor(COLOR_SCROLLBAR); - mBrush = ::CreateSolidBrush(NSRGB_2_COLOREF(mBackground)); -} - - -//------------------------------------------------------------------------- -// -// nsScrollbar destructor -// -//------------------------------------------------------------------------- -nsScrollbar::~nsScrollbar() -{ -} - - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsScrollbar::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kInsScrollbarIID, NS_ISCROLLBAR_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsScrollbarIID)) { - *aInstancePtr = (void*) ((nsIScrollbar*)this); - AddRef(); - result = NS_OK; - } - - return result; -} - - -//------------------------------------------------------------------------- -// -// Define the range settings -// -//------------------------------------------------------------------------- -void nsScrollbar::SetMaxRange(PRUint32 aEndRange) -{ - if (aEndRange > 32767) - mScaleFactor = aEndRange / 32767.0; - if (mWnd) { - VERIFY(::SetScrollRange(mWnd, SB_CTL, 0, NS_TO_INT_ROUND(aEndRange / mScaleFactor), TRUE)); - } -} - - -//------------------------------------------------------------------------- -// -// Return the range settings -// -//------------------------------------------------------------------------- -PRUint32 nsScrollbar::GetMaxRange() -{ - int startRange, endRange; - if (mWnd) { - VERIFY(::GetScrollRange(mWnd, SB_CTL, &startRange, &endRange)); - } - - return (PRUint32)NS_TO_INT_ROUND(endRange * mScaleFactor); -} - - -//------------------------------------------------------------------------- -// -// Set the thumb position -// -//------------------------------------------------------------------------- -void nsScrollbar::SetPosition(PRUint32 aPos) -{ - ::SetScrollPos(mWnd, SB_CTL, NS_TO_INT_ROUND(aPos / mScaleFactor), TRUE); -} - - -//------------------------------------------------------------------------- -// -// Get the current thumb position. -// -//------------------------------------------------------------------------- -PRUint32 nsScrollbar::GetPosition() -{ - return (PRUint32)NS_TO_INT_ROUND(::GetScrollPos(mWnd, SB_CTL) * mScaleFactor); -} - - -//------------------------------------------------------------------------- -// -// Set the thumb size -// -//------------------------------------------------------------------------- -void nsScrollbar::SetThumbSize(PRUint32 aSize) -{ - if (mWnd) { - SCROLLINFO si; - si.cbSize = sizeof(SCROLLINFO); - si.fMask = SIF_PAGE; - si.nPage = NS_TO_INT_ROUND(aSize / mScaleFactor); - ::SetScrollInfo(mWnd, SB_CTL, &si, TRUE); - } -} - - -//------------------------------------------------------------------------- -// -// Get the thumb size -// -//------------------------------------------------------------------------- -PRUint32 nsScrollbar::GetThumbSize() -{ - if (mWnd) { - SCROLLINFO si; - si.cbSize = sizeof(SCROLLINFO); - si.fMask = SIF_PAGE; - VERIFY(::GetScrollInfo(mWnd, SB_CTL, &si)); - return (PRUint32)NS_TO_INT_ROUND(si.nPage * mScaleFactor); - } - - return 0; -} - - -//------------------------------------------------------------------------- -// -// Set the line increment for this scrollbar -// -//------------------------------------------------------------------------- -void nsScrollbar::SetLineIncrement(PRUint32 aSize) -{ - mLineIncrement = NS_TO_INT_ROUND(aSize / mScaleFactor); -} - - -//------------------------------------------------------------------------- -// -// Get the line increment for this scrollbar -// -//------------------------------------------------------------------------- -PRUint32 nsScrollbar::GetLineIncrement() -{ - return (PRUint32)NS_TO_INT_ROUND(mLineIncrement * mScaleFactor); -} - - -//------------------------------------------------------------------------- -// -// Set all scrolling parameters -// -//------------------------------------------------------------------------- -void nsScrollbar::SetParameters(PRUint32 aMaxRange, PRUint32 aThumbSize, - PRUint32 aPosition, PRUint32 aLineIncrement) -{ - if (aMaxRange > 32767) - mScaleFactor = aMaxRange / 32767.0; - - if (mWnd) { - SCROLLINFO si; - si.cbSize = sizeof(SCROLLINFO); - si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; - si.nPage = NS_TO_INT_ROUND(aThumbSize / mScaleFactor); - si.nPos = NS_TO_INT_ROUND(aPosition / mScaleFactor); - si.nMin = 0; - si.nMax = NS_TO_INT_ROUND(aMaxRange / mScaleFactor); - ::SetScrollInfo(mWnd, SB_CTL, &si, TRUE); - } - - mLineIncrement = NS_TO_INT_ROUND(aLineIncrement / mScaleFactor); -} - - -//------------------------------------------------------------------------- -// -// paint message. Don't send the paint out -// -//------------------------------------------------------------------------- -PRBool nsScrollbar::OnPaint() -{ - return PR_FALSE; -} - - -PRBool nsScrollbar::OnResize(nsRect &aWindowRect) -{ - return PR_FALSE; -} - - -//------------------------------------------------------------------------- -// -// Deal with scrollbar messages (actually implemented only in nsScrollbar) -// -//------------------------------------------------------------------------- -PRBool nsScrollbar::OnScroll(UINT scrollCode, int cPos) -{ - PRBool result = PR_TRUE; - int newPosition; - - switch (scrollCode) { - - // scroll one line right or down - // SB_LINERIGHT and SB_LINEDOWN are actually the same value - //case SB_LINERIGHT: - case SB_LINEDOWN: - { - newPosition = ::GetScrollPos(mWnd, SB_CTL) + mLineIncrement; - PRUint32 max = GetMaxRange() - GetThumbSize(); - if (newPosition > (int)max) - newPosition = (int)max; - - // if an event callback is registered, give it the chance - // to change the increment - if (mEventCallback) { - nsScrollbarEvent event; - event.message = NS_SCROLLBAR_LINE_NEXT; - event.widget = (nsWindow*)this; - DWORD pos = ::GetMessagePos(); - POINT cpos; - cpos.x = LOWORD(pos); - cpos.y = HIWORD(pos); - ::ScreenToClient(mWnd, &cpos); - event.point.x = cpos.x; - event.point.y = cpos.y; - event.time = ::GetMessageTime(); - event.position = (PRUint32)NS_TO_INT_ROUND(newPosition * mScaleFactor); - - result = ConvertStatus((*mEventCallback)(&event)); - newPosition = NS_TO_INT_ROUND(event.position / mScaleFactor); - } - - ::SetScrollPos(mWnd, SB_CTL, newPosition, TRUE); - - break; - } - - - // scroll one line left or up - //case SB_LINELEFT: - case SB_LINEUP: - { - newPosition = ::GetScrollPos(mWnd, SB_CTL) - mLineIncrement; - if (newPosition < 0) - newPosition = 0; - - // if an event callback is registered, give it the chance - // to change the decrement - if (mEventCallback) { - nsScrollbarEvent event; - event.message = NS_SCROLLBAR_LINE_PREV; - event.widget = (nsWindow*)this; - DWORD pos = ::GetMessagePos(); - POINT cpos; - cpos.x = LOWORD(pos); - cpos.y = HIWORD(pos); - ::ScreenToClient(mWnd, &cpos); - event.point.x = cpos.x; - event.point.y = cpos.y; - event.time = ::GetMessageTime(); - event.position = (PRUint32)NS_TO_INT_ROUND(newPosition * mScaleFactor); - - result = ConvertStatus((*mEventCallback)(&event)); - newPosition = NS_TO_INT_ROUND(event.position / mScaleFactor); - } - - ::SetScrollPos(mWnd, SB_CTL, newPosition, TRUE); - - break; - } - - // Scrolls one page right or down - // case SB_PAGERIGHT: - case SB_PAGEDOWN: - { - SCROLLINFO si; - si.cbSize = sizeof(SCROLLINFO); - si.fMask = SIF_PAGE; - VERIFY(::GetScrollInfo(mWnd, SB_CTL, &si)); - - newPosition = ::GetScrollPos(mWnd, SB_CTL) + si.nPage; - PRUint32 max = GetMaxRange() - GetThumbSize(); - if (newPosition > (int)max) - newPosition = (int)max; - - // if an event callback is registered, give it the chance - // to change the increment - if (mEventCallback) { - nsScrollbarEvent event; - event.message = NS_SCROLLBAR_PAGE_NEXT; - event.widget = (nsWindow*)this; - DWORD pos = ::GetMessagePos(); - POINT cpos; - cpos.x = LOWORD(pos); - cpos.y = HIWORD(pos); - ::ScreenToClient(mWnd, &cpos); - event.point.x = cpos.x; - event.point.y = cpos.y; - event.time = ::GetMessageTime(); - event.position = (PRUint32)NS_TO_INT_ROUND(newPosition * mScaleFactor);; - - - result = ConvertStatus((*mEventCallback)(&event)); - newPosition = NS_TO_INT_ROUND(event.position / mScaleFactor); - } - - ::SetScrollPos(mWnd, SB_CTL, newPosition, TRUE); - - break; - } - - // Scrolls one page left or up. - //case SB_PAGELEFT: - case SB_PAGEUP: - { - SCROLLINFO si; - si.cbSize = sizeof(SCROLLINFO); - si.fMask = SIF_PAGE; - VERIFY(::GetScrollInfo(mWnd, SB_CTL, &si)); - - newPosition = ::GetScrollPos(mWnd, SB_CTL) - si.nPage; - if (newPosition < 0) - newPosition = 0; - - // if an event callback is registered, give it the chance - // to change the increment - if (mEventCallback) { - nsScrollbarEvent event; - event.message = NS_SCROLLBAR_PAGE_PREV; - event.widget = (nsWindow*)this; - DWORD pos = ::GetMessagePos(); - POINT cpos; - cpos.x = LOWORD(pos); - cpos.y = HIWORD(pos); - ::ScreenToClient(mWnd, &cpos); - event.point.x = cpos.x; - event.point.y = cpos.y; - event.time = ::GetMessageTime(); - event.position = (PRUint32)NS_TO_INT_ROUND(newPosition * mScaleFactor); - - result = ConvertStatus((*mEventCallback)(&event)); - newPosition = NS_TO_INT_ROUND(event.position / mScaleFactor); - } - - ::SetScrollPos(mWnd, SB_CTL, newPosition - 10, TRUE); - - break; - } - - // Scrolls to the absolute position. The current position is specified by - // the cPos parameter. - case SB_THUMBPOSITION: - case SB_THUMBTRACK: - { - newPosition = cPos; - - // if an event callback is registered, give it the chance - // to change the increment - if (mEventCallback) { - nsScrollbarEvent event; - event.message = NS_SCROLLBAR_POS; - event.widget = (nsWindow*)this; - DWORD pos = ::GetMessagePos(); - POINT cpos; - cpos.x = LOWORD(pos); - cpos.y = HIWORD(pos); - ::ScreenToClient(mWnd, &cpos); - event.point.x = cpos.x; - event.point.y = cpos.y; - event.time = ::GetMessageTime(); - event.position = (PRUint32)NS_TO_INT_ROUND(newPosition * mScaleFactor); - - result = ConvertStatus((*mEventCallback)(&event)); - newPosition = NS_TO_INT_ROUND(event.position * mScaleFactor); - } - - ::SetScrollPos(mWnd, SB_CTL, newPosition, TRUE); - - break; - } - } - - return result; -} - - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- -LPCTSTR nsScrollbar::WindowClass() -{ - return "SCROLLBAR"; -} - - -//------------------------------------------------------------------------- -// -// return window styles -// -//------------------------------------------------------------------------- -DWORD nsScrollbar::WindowStyle() -{ - return mPositionFlag | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS; -} - - -//------------------------------------------------------------------------- -// -// return window extended styles -// -//------------------------------------------------------------------------- -DWORD nsScrollbar::WindowExStyle() -{ - return 0; -} - - -//------------------------------------------------------------------------- -// -// get position/dimensions -// -//------------------------------------------------------------------------- - -void nsScrollbar::GetBounds(nsRect &aRect) -{ - nsWindow::GetBounds(aRect); -} - - diff --git a/mozilla/widget/src/windows/nsScrollbar.h b/mozilla/widget/src/windows/nsScrollbar.h deleted file mode 100644 index 894030c3bca..00000000000 --- a/mozilla/widget/src/windows/nsScrollbar.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsScrollbar_h__ -#define nsScrollbar_h__ - -#include "nsdefs.h" -#include "nsWindow.h" -#include "nsSwitchToUIThread.h" - -#include "nsIScrollbar.h" - -/** - * Native WIN32 scrollbar wrapper. - */ - -class nsScrollbar : public nsWindow, - public nsIScrollbar -{ - -public: - nsScrollbar(nsISupports *aOuter, PRBool aIsVertical); - virtual ~nsScrollbar(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - - // nsIWidget interface - BASE_IWIDGET_IMPL - - - // nsIScrollbar part - virtual void SetMaxRange(PRUint32 aEndRange); - virtual PRUint32 GetMaxRange(); - virtual void SetPosition(PRUint32 aPos); - virtual PRUint32 GetPosition(); - virtual void SetThumbSize(PRUint32 aSize); - virtual PRUint32 GetThumbSize(); - virtual void SetLineIncrement(PRUint32 aSize); - virtual PRUint32 GetLineIncrement(); - virtual void SetParameters(PRUint32 aMaxRange, PRUint32 aThumbSize, - PRUint32 aPosition, PRUint32 aLineIncrement); - - virtual PRBool OnPaint(); - virtual PRBool OnScroll(UINT scrollCode, int cPos); - virtual PRBool OnResize(nsRect &aWindowRect); - virtual void GetBounds(nsRect &aRect); - -protected: - - virtual LPCTSTR WindowClass(); - virtual DWORD WindowStyle(); - virtual DWORD WindowExStyle(); - -private: - DWORD mPositionFlag; - int mLineIncrement; - double mScaleFactor; -}; - -#endif // nsButton_h__ diff --git a/mozilla/widget/src/windows/nsStringUtil.h b/mozilla/widget/src/windows/nsStringUtil.h deleted file mode 100644 index 4925500ba78..00000000000 --- a/mozilla/widget/src/windows/nsStringUtil.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -// Convience macros for converting nsString's to chars + -// creating temporary char[] bufs. - -#ifndef NS_STR_UTIL_H -#define NS_STR_UTIL_H - -// nsString to temporary char[] macro - -// Convience MACROS to convert an nsString to a char * which use a -// static char array if possible to reduce memory fragmentation, -// otherwise they allocate a char[] which must be freed. -// REMEMBER to always use the NS_FREE_STR_BUF after using the -// NS_ALLOC_STR_BUF. You can not nest NS_ALLOC_STR_BUF's. - -#define NS_ALLOC_STR_BUF(varName, strName, tempSize) \ - static const int _ns_kSmallBufferSize = tempSize; \ - char* varName = 0; \ - int _ns_smallBufUsed = 0; \ - char _ns_smallBuffer[_ns_kSmallBufferSize]; \ - if (strName.Length() < (_ns_kSmallBufferSize - 1)) { \ - strName.ToCString(_ns_smallBuffer, _ns_kSmallBufferSize); \ - _ns_smallBuffer[_ns_kSmallBufferSize - 1] = '\0'; \ - _ns_smallBufUsed = 1; \ - varName = _ns_smallBuffer; \ - } \ - else { \ - varName = strName.ToNewCString(); \ - } - -#define NS_FREE_STR_BUF(varName) \ - if (! _ns_smallBufUsed) \ - delete varName; - -// Create temporary char[] macro -// -// Create a temporary buffer for storing chars. -// If the actual size is > size then the buffer -// is allocated from the heap, otherwise the buffer -// is a stack variable. REMEMBER: use NS_FREE_BUF -// when finished with the buffer allocated, and do -// NOT nest INSERT_BUF'S. - -#define NS_ALLOC_CHAR_BUF(aBuf, aSize, aActualSize) \ - char *aBuf; \ - int _ns_smallBufUsed = 0; \ - static const int _ns_kSmallBufferSize = aSize; \ - if (aActualSize < _ns_kSmallBufferSize) { \ - char _ns_smallBuffer[_ns_kSmallBufferSize]; \ - aBuf = _ns_smallBuffer; \ - _ns_smallBufUsed = 1; \ - } \ - else { \ - aBuf = new char[aActualSize]; \ - } - -#define NS_FREE_CHAR_BUF(aBuf) \ -if (! _ns_smallBufUsed) \ - delete aBuf; - - -#endif // NSStringUtil \ No newline at end of file diff --git a/mozilla/widget/src/windows/nsSwitchToUIThread.h b/mozilla/widget/src/windows/nsSwitchToUIThread.h deleted file mode 100644 index 72be369c44c..00000000000 --- a/mozilla/widget/src/windows/nsSwitchToUIThread.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef SWITCHTOUITHREAD_H -#define SWITCHTOUITHREAD_H - - -// foreward declaration -struct MethodInfo; - -/** - * Switch thread to match the thread the widget was created in so messages will be dispatched. - */ - -class nsSwitchToUIThread { - -public: - virtual BOOL CallMethod(MethodInfo *info) = 0; - -}; - -// -// Structure used for passing the information necessary for synchronously -// invoking a method on the GUI thread... -// -struct MethodInfo { - nsSwitchToUIThread* target; - UINT methodId; - int nArgs; - DWORD* args; - - MethodInfo(nsSwitchToUIThread *obj, UINT id, int numArgs=0, DWORD *arguments = 0) { - target = obj; - methodId = id; - nArgs = numArgs; - args = arguments; - } - - BOOL Invoke() { return target->CallMethod(this); } -}; - -#endif // TOUITHRD_H - diff --git a/mozilla/widget/src/windows/nsTabWidget.cpp b/mozilla/widget/src/windows/nsTabWidget.cpp deleted file mode 100644 index 6dc5449bb78..00000000000 --- a/mozilla/widget/src/windows/nsTabWidget.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsTabWidget.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" -#include -#include - -//------------------------------------------------------------------------- -// -// nsTabWidget constructor -// -//------------------------------------------------------------------------- -nsTabWidget::nsTabWidget(nsISupports *aOuter) : nsWindow(aOuter) -{ - // Ensure that common controls dll is loaded - InitCommonControls(); -} - -//------------------------------------------------------------------------- -// -// nsTabWidget destructor -// -//------------------------------------------------------------------------- -nsTabWidget::~nsTabWidget() -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsTabWidget::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kInsTabWidgetIID, NS_ITABWIDGET_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsTabWidgetIID)) { - *aInstancePtr = (void*) ((nsITabWidget*)this); - AddRef(); - result = NS_OK; - } - - return result; -} - -//------------------------------------------------------------------------- -// -// Set the tab labels -// -//------------------------------------------------------------------------- - -void nsTabWidget::SetTabs(PRUint32 aNumberOfTabs, const nsString aTabLabels[]) -{ - TC_ITEM tie; - char labelTemp[256]; - - for (PRUint32 i = 0; i < aNumberOfTabs; i++) { - tie.mask = TCIF_TEXT; - aTabLabels[i].ToCString(labelTemp, 256); - tie.pszText = labelTemp; - TabCtrl_InsertItem(mWnd, i, &tie); - } -} - -//------------------------------------------------------------------------- -// -// Get the currently selected tab -// -//------------------------------------------------------------------------- - - -PRUint32 nsTabWidget::GetSelectedTab() -{ - return(TabCtrl_GetCurSel(mWnd)); -} - -//------------------------------------------------------------------------- -// -// paint message. Don't send the paint out -// -//------------------------------------------------------------------------- -PRBool nsTabWidget::OnPaint() -{ - return PR_FALSE; -} - -PRBool nsTabWidget::OnResize(nsRect &aWindowRect) -{ - return PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- - -LPCTSTR nsTabWidget::WindowClass() -{ - return WC_TABCONTROL; -} - -//------------------------------------------------------------------------- -// -// return window styles -// -//------------------------------------------------------------------------- -DWORD nsTabWidget::WindowStyle() -{ - return WS_CHILD | WS_CLIPSIBLINGS; -} - -//------------------------------------------------------------------------- -// -// return window extended styles -// -//------------------------------------------------------------------------- -DWORD nsTabWidget::WindowExStyle() -{ - return 0; -} - - -//------------------------------------------------------------------------- -// -// get position/dimensions -// -//------------------------------------------------------------------------- - -void nsTabWidget::GetBounds(nsRect &aRect) -{ - nsWindow::GetBounds(aRect); -} - diff --git a/mozilla/widget/src/windows/nsTabWidget.h b/mozilla/widget/src/windows/nsTabWidget.h deleted file mode 100644 index f8c9aa1b69d..00000000000 --- a/mozilla/widget/src/windows/nsTabWidget.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsTabWidget_h__ -#define nsTabWidget_h__ - -#include "nsdefs.h" -#include "nsWindow.h" -#include "nsSwitchToUIThread.h" - -#include "nsITabWidget.h" - -/** - * Native Win32 tab control wrapper - */ - -class nsTabWidget : public nsWindow, - public nsITabWidget -{ - -public: - nsTabWidget(nsISupports *aOuter); - virtual ~nsTabWidget(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - - // nsIWidget interface - BASE_IWIDGET_IMPL - - // nsITabWidget part - virtual void SetTabs(PRUint32 aNumberOfTabs, const nsString aTabLabels[]); - virtual PRUint32 GetSelectedTab(); - virtual PRBool OnPaint(); - virtual PRBool OnResize(nsRect &aWindowRect); - virtual void GetBounds(nsRect &aRect); - -protected: - virtual LPCTSTR WindowClass(); - virtual DWORD WindowStyle(); - virtual DWORD WindowExStyle(); - -}; - -#endif // nsTabWidget_h__ diff --git a/mozilla/widget/src/windows/nsTextAreaWidget.cpp b/mozilla/widget/src/windows/nsTextAreaWidget.cpp deleted file mode 100644 index 0e850f4e0e3..00000000000 --- a/mozilla/widget/src/windows/nsTextAreaWidget.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsTextAreaWidget.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include - -void nsTextAreaWidget::SelectAll() -{ - nsTextHelper::SelectAll(); -} - -void nsTextAreaWidget::SetMaxTextLength(PRUint32 aChars) -{ - nsTextHelper::SetMaxTextLength(aChars); -} - -PRUint32 nsTextAreaWidget::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) -{ - return(nsTextHelper::GetText(aTextBuffer, aBufferSize)); -} - -PRUint32 nsTextAreaWidget::SetText(const nsString &aText) -{ - return(nsTextHelper::SetText(aText)); -} - -PRUint32 nsTextAreaWidget::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) -{ - return(nsTextHelper::InsertText(aText, aStartPos, aEndPos)); -} - -void nsTextAreaWidget::RemoveText() -{ - nsTextHelper::RemoveText(); -} - -void nsTextAreaWidget::SetPassword(PRBool aIsPassword) -{ - nsTextHelper::SetPassword(aIsPassword); -} - -PRBool nsTextAreaWidget::SetReadOnly(PRBool aReadOnlyFlag) -{ - return(nsTextHelper::SetReadOnly(aReadOnlyFlag)); -} - -void nsTextAreaWidget::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) -{ -} - -void nsTextAreaWidget::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) -{ -} - -void nsTextAreaWidget::SetCaretPosition(PRUint32 aPosition) -{ -} - -PRUint32 nsTextAreaWidget::GetCaretPosition() -{ - return(0); -} - -//------------------------------------------------------------------------- -// -// nsTextAreaWidget constructor -// -//------------------------------------------------------------------------- -nsTextAreaWidget::nsTextAreaWidget(nsISupports *aOuter) : nsTextHelper(aOuter) -{ - nsTextHelper::mBackground = NS_RGB(124, 124, 124); -} - -//------------------------------------------------------------------------- -// -// nsTextAreaWidget destructor -// -//------------------------------------------------------------------------- -nsTextAreaWidget::~nsTextAreaWidget() -{ -} - - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsTextAreaWidget::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kInsTextAreaWidgetIID, NS_ITEXTAREAWIDGET_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsTextAreaWidgetIID)) { - *aInstancePtr = (void*) ((nsITextAreaWidget*)this); - AddRef(); - result = NS_OK; - } - - return result; -} - -//------------------------------------------------------------------------- -// -// move, paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsTextAreaWidget::OnMove(PRInt32, PRInt32) -{ - return PR_FALSE; -} - -PRBool nsTextAreaWidget::OnPaint() -{ - return PR_FALSE; -} - -PRBool nsTextAreaWidget::OnResize(nsRect &aWindowRect) -{ - return PR_FALSE; -} - - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- -LPCTSTR nsTextAreaWidget::WindowClass() -{ - return(nsTextHelper::WindowClass()); -} - - -//------------------------------------------------------------------------- -// -// return window styles -// -//------------------------------------------------------------------------- -DWORD nsTextAreaWidget::WindowStyle() -{ - DWORD style = nsTextHelper::WindowStyle(); - //style = style | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL; - style = style | ES_MULTILINE | ES_WANTRETURN | WS_HSCROLL | WS_VSCROLL; - return style; -} - - -//------------------------------------------------------------------------- -// -// return window extended styles -// -//------------------------------------------------------------------------- - -DWORD nsTextAreaWidget::WindowExStyle() -{ - return WS_EX_CLIENTEDGE; -} - - -//------------------------------------------------------------------------- -// -// get position/dimensions -// -//------------------------------------------------------------------------- - -void nsTextAreaWidget::GetBounds(nsRect &aRect) -{ - nsWindow::GetNonClientBounds(aRect); -} - - - diff --git a/mozilla/widget/src/windows/nsTextAreaWidget.h b/mozilla/widget/src/windows/nsTextAreaWidget.h deleted file mode 100644 index 22227b10fb9..00000000000 --- a/mozilla/widget/src/windows/nsTextAreaWidget.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsTextAreaWidget_h__ -#define nsTextAreaWidget_h__ - -#include "nsdefs.h" -#include "nsWindow.h" -#include "nsSwitchToUIThread.h" -#include "nsTextHelper.h" - -#include "nsITextAreaWidget.h" - -/** - * Native WIN32 multi-line edit control wrapper. - */ - -class nsTextAreaWidget : public nsTextHelper, - public nsITextAreaWidget -{ - -public: - nsTextAreaWidget(nsISupports *aOuter); - virtual ~nsTextAreaWidget(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnPaint(); - virtual PRBool OnResize(nsRect &aWindowRect); - virtual void GetBounds(nsRect &aRect); - - // nsIWidget interface - BASE_IWIDGET_IMPL - - // nsITextWidget part - virtual void SelectAll(); - virtual void SetMaxTextLength(PRUint32 aChars); - virtual PRUint32 SetText(const nsString &aText); - virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); - virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); - virtual void RemoveText(); - virtual void SetPassword(PRBool aIsPassword); - virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); - virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); - virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); - virtual void SetCaretPosition(PRUint32 aPosition); - virtual PRUint32 GetCaretPosition(); - -protected: - - virtual LPCTSTR WindowClass(); - virtual DWORD WindowStyle(); - virtual DWORD WindowExStyle(); - -}; - -#endif // nsTextAreaWidget_h__ diff --git a/mozilla/widget/src/windows/nsTextHelper.cpp b/mozilla/widget/src/windows/nsTextHelper.cpp deleted file mode 100644 index 0a162bc0049..00000000000 --- a/mozilla/widget/src/windows/nsTextHelper.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsTextHelper.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" -#include - - -void nsTextHelper::PreCreateWidget(nsWidgetInitData *aInitData) -{ - if (nsnull != aInitData) { - nsTextWidgetInitData* data = (nsTextWidgetInitData *) aInitData; - mIsPassword = data->mIsPassword; - } -} - -void nsTextHelper::SetMaxTextLength(PRUint32 aChars) -{ - ::SendMessage(mWnd, EM_SETLIMITTEXT, (WPARAM) (INT)aChars, 0); -} - -PRUint32 nsTextHelper::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) { - - int length = GetWindowTextLength(mWnd); - int bufLength = length + 1; - NS_ALLOC_CHAR_BUF(buf, 512, bufLength); - int charsCopied = GetWindowText(mWnd, buf, bufLength); - aTextBuffer.SetLength(0); - aTextBuffer.Append(buf); - NS_FREE_CHAR_BUF(buf); - - return(0); -} - -PRUint32 nsTextHelper::SetText(const nsString &aText) -{ - NS_ALLOC_STR_BUF(buf, aText, 512); - SetWindowText(mWnd, buf); - NS_FREE_STR_BUF(buf); - return(aText.Length()); -} - -PRUint32 nsTextHelper::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) -{ - nsString currentText; - GetText(currentText, 256); - nsString newText(aText); - currentText.Insert(newText, aStartPos, aText.Length()); - SetText(currentText); - return(aText.Length()); -} - -void nsTextHelper::RemoveText() -{ - SetWindowText(mWnd, ""); -} - -void nsTextHelper::SetPassword(PRBool aIsPassword) -{ - mIsPassword = aIsPassword; -} - -PRBool nsTextHelper::SetReadOnly(PRBool aReadOnlyFlag) -{ - PRBool oldSetting = mIsReadOnly; - mIsReadOnly = aReadOnlyFlag; - return(oldSetting); -} - - -void nsTextHelper::SelectAll() -{ - ::SendMessage(mWnd, EM_SETSEL, (WPARAM) 0, (LPARAM)-1); -} - - -void nsTextHelper::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) -{ - ::SendMessage(mWnd, EM_SETSEL, (WPARAM) (INT)aStartSel, (INT) (LPDWORD)aEndSel); -} - - -void nsTextHelper::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) -{ - ::SendMessage(mWnd, EM_GETSEL, (WPARAM) (LPDWORD)aStartSel, (LPARAM) (LPDWORD)aEndSel); -} - -void nsTextHelper::SetCaretPosition(PRUint32 aPosition) -{ - SetSelection(aPosition, aPosition); -} - -PRUint32 nsTextHelper::GetCaretPosition() -{ - PRUint32 start; - PRUint32 end; - GetSelection(&start, &end); - if (start == end) { - return start; - } - return -1; -} - -//------------------------------------------------------------------------- -// -// nsTextHelper constructor -// -//------------------------------------------------------------------------- - -nsTextHelper::nsTextHelper(nsISupports *aOuter) : nsWindow(aOuter) -{ - mIsReadOnly = PR_FALSE; - mIsPassword = PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// nsTextHelper destructor -// -//------------------------------------------------------------------------- -nsTextHelper::~nsTextHelper() -{ -} - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- -LPCTSTR nsTextHelper::WindowClass() -{ - return("EDIT"); -} - -//------------------------------------------------------------------------- -// -// return window styles -// -//------------------------------------------------------------------------- -DWORD nsTextHelper::WindowStyle() -{ - DWORD style = ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | ES_NOHIDESEL; - if (mIsPassword) - style = style | ES_PASSWORD; - - if (mIsReadOnly) - style = style | ES_READONLY; - - return style; -} - -//------------------------------------------------------------------------- -// -// return window extended styles -// -//------------------------------------------------------------------------- - -DWORD nsTextHelper::WindowExStyle() -{ - return 0; -} - -//------------------------------------------------------------------------- -// -// Clear window before paint -// -//------------------------------------------------------------------------- - -PRBool nsTextHelper::AutoErase() -{ - return(PR_TRUE); -} - - diff --git a/mozilla/widget/src/windows/nsTextHelper.h b/mozilla/widget/src/windows/nsTextHelper.h deleted file mode 100644 index 98fb9937f6d..00000000000 --- a/mozilla/widget/src/windows/nsTextHelper.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsTextHelper_h__ -#define nsTextHelper_h__ - -#include "nsdefs.h" -#include "nsITextWidget.h" -#include "nsWindow.h" - -/** - * Base class for nsTextAreaWidget and nsTextWidget - */ - -class nsTextHelper : public nsWindow, public nsITextWidget -{ - -public: - nsTextHelper(nsISupports *aOuter); - virtual ~nsTextHelper(); - - virtual void SelectAll(); - virtual void SetMaxTextLength(PRUint32 aChars); - virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); - virtual PRUint32 SetText(const nsString &aText); - virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); - virtual void RemoveText(); - virtual void SetPassword(PRBool aIsPassword); - virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); - virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); - virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); - virtual void SetCaretPosition(PRUint32 aPosition); - virtual PRUint32 GetCaretPosition(); - virtual LPCTSTR WindowClass(); - virtual DWORD WindowStyle(); - virtual void PreCreateWidget(nsWidgetInitData *aInitData); - virtual PRBool AutoErase(); - -protected: - - PRBool mIsPassword; - PRBool mIsReadOnly; - - virtual DWORD WindowExStyle(); - -}; - -#endif // nsTextHelper_h__ diff --git a/mozilla/widget/src/windows/nsTextWidget.cpp b/mozilla/widget/src/windows/nsTextWidget.cpp deleted file mode 100644 index 7d6042994e0..00000000000 --- a/mozilla/widget/src/windows/nsTextWidget.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsTextWidget.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include - - -//------------------------------------------------------------------------- -// -// nsTextWidget constructor -// -//------------------------------------------------------------------------- -nsTextWidget::nsTextWidget(nsISupports *aOuter) : nsTextHelper(aOuter) -{ - mBackground = NS_RGB(124, 124, 124); -} - -//------------------------------------------------------------------------- -// -// nsTextWidget destructor -// -//------------------------------------------------------------------------- -nsTextWidget::~nsTextWidget() -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsTextWidget::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kInsTextWidgetIID, NS_ITEXTWIDGET_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsTextWidgetIID)) { - *aInstancePtr = (void*) ((nsITextWidget*)this); - AddRef(); - result = NS_OK; - } - - return result; -} - -//------------------------------------------------------------------------- -// -// move, paint, resizes message - ignore -// -//------------------------------------------------------------------------- -PRBool nsTextWidget::OnMove(PRInt32, PRInt32) -{ - return PR_FALSE; -} - -PRBool nsTextWidget::OnPaint() -{ - return PR_FALSE; -} - - -PRBool nsTextWidget::OnResize(nsRect &aWindowRect) -{ - return PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- -LPCTSTR nsTextWidget::WindowClass() -{ - return(nsTextHelper::WindowClass()); -} - -//------------------------------------------------------------------------- -// -// return window styles -// -//------------------------------------------------------------------------- -DWORD nsTextWidget::WindowStyle() -{ - return(nsTextHelper::WindowStyle()); -} - - -//------------------------------------------------------------------------- -// -// return window extended styles -// -//------------------------------------------------------------------------- - -DWORD nsTextWidget::WindowExStyle() -{ - return WS_EX_CLIENTEDGE; -} - - -//------------------------------------------------------------------------- -// -// get position/dimensions -// -//------------------------------------------------------------------------- - -void nsTextWidget::GetBounds(nsRect &aRect) -{ - nsWindow::GetNonClientBounds(aRect); -} - - diff --git a/mozilla/widget/src/windows/nsTextWidget.h b/mozilla/widget/src/windows/nsTextWidget.h deleted file mode 100644 index 6bbc0558103..00000000000 --- a/mozilla/widget/src/windows/nsTextWidget.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsTextWidget_h__ -#define nsTextWidget_h__ - -#include "nsdefs.h" -#include "nsWindow.h" -#include "nsSwitchToUIThread.h" -#include "nsTextHelper.h" - -#include "nsITextWidget.h" - -/** - * Native WIN32 single line edit control wrapper. - */ - -class nsTextWidget : public nsTextHelper -{ - -public: - nsTextWidget(nsISupports *aOuter); - virtual ~nsTextWidget(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - virtual PRBool OnPaint(); - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnResize(nsRect &aWindowRect); - virtual void GetBounds(nsRect &aRect); - - // nsIWidget interface - BASE_IWIDGET_IMPL - -protected: - virtual LPCTSTR WindowClass(); - virtual DWORD WindowStyle(); - virtual DWORD WindowExStyle(); -}; - -#endif // nsTextWidget_h__ diff --git a/mozilla/widget/src/windows/nsToolkit.cpp b/mozilla/widget/src/windows/nsToolkit.cpp deleted file mode 100644 index f515813fe68..00000000000 --- a/mozilla/widget/src/windows/nsToolkit.cpp +++ /dev/null @@ -1,363 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsToolkit.h" -#include "nsWindow.h" -#include "prmon.h" -#include "prtime.h" -#include "nsGUIEvent.h" - -HINSTANCE nsToolkit::mDllInstance = 0; - -nsWindow *MouseTrailer::mHoldMouse; -MouseTrailer *MouseTrailer::theMouseTrailer; -PRBool MouseTrailer::gIgnoreNextCycle(PR_FALSE); - -// -// Dll entry point. Keep the dll instance -// -BOOL APIENTRY DllMain( HINSTANCE hModule, - DWORD reason, - LPVOID lpReserved ) -{ - switch( reason ) { - case DLL_PROCESS_ATTACH: - nsToolkit::mDllInstance = hModule; - - // - // register the internal window class - // - WNDCLASS wc; - - wc.style = CS_GLOBALCLASS; - wc.lpfnWndProc = nsToolkit::WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = nsToolkit::mDllInstance; - wc.hIcon = NULL; - wc.hCursor = NULL; - wc.hbrBackground = NULL; - wc.lpszMenuName = NULL; - wc.lpszClassName = "nsToolkitClass"; - - VERIFY(::RegisterClass(&wc)); - - break; - - case DLL_THREAD_ATTACH: - break; - - case DLL_THREAD_DETACH: - break; - - case DLL_PROCESS_DETACH: - //VERIFY(::UnregisterClass("nsToolkitClass", nsToolkit::mDllInstance)); - ::UnregisterClass("nsToolkitClass", nsToolkit::mDllInstance); - break; - - } - - return TRUE; -} - - -// -// main for the message pump thread -// -PRBool gThreadState = PR_FALSE; - -struct ThreadInitInfo { - PRMonitor *monitor; - nsToolkit *toolkit; -}; - -void RunPump(void* arg) -{ - ThreadInitInfo *info = (ThreadInitInfo*)arg; - ::PR_EnterMonitor(info->monitor); - - // do registration and creation in this thread - info->toolkit->CreateInternalWindow(PR_GetCurrentThread()); - - gThreadState = PR_TRUE; - - ::PR_Notify(info->monitor); - ::PR_ExitMonitor(info->monitor); - - delete info; - - // Process messages - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } -} - -//------------------------------------------------------------------------- -// -// constructor -// -//------------------------------------------------------------------------- -nsToolkit::nsToolkit() -{ - mGuiThread = NULL; - mDispatchWnd = 0; - NS_INIT_REFCNT(); -} - - -//------------------------------------------------------------------------- -// -// destructor -// -//------------------------------------------------------------------------- -nsToolkit::~nsToolkit() -{ - NS_PRECONDITION(::IsWindow(mDispatchWnd), "Invalid window handle"); - - // Destroy the Dispatch Window - ::DestroyWindow(mDispatchWnd); - mDispatchWnd = NULL; -} - - -//------------------------------------------------------------------------- -// -// nsISupports implementation macro -// -//------------------------------------------------------------------------- -NS_IMPL_ISUPPORTS(nsToolkit, NS_ITOOLKIT_IID) - - -//------------------------------------------------------------------------- -// -// Register the window class for the internal window and create the window -// -//------------------------------------------------------------------------- -void nsToolkit::CreateInternalWindow(PRThread *aThread) -{ - - NS_PRECONDITION(aThread, "null thread"); - mGuiThread = aThread; - - // - // create the internal window - // - mDispatchWnd = ::CreateWindow("nsToolkitClass", - "NetscapeDispatchWnd", - WS_DISABLED, - -50, -50, - 10, 10, - NULL, - NULL, - nsToolkit::mDllInstance, - NULL); - VERIFY(mDispatchWnd); -} - - -//------------------------------------------------------------------------- -// -// Create a new thread and run the message pump in there -// -//------------------------------------------------------------------------- -void nsToolkit::CreateUIThread() -{ - PRMonitor *monitor = ::PR_NewMonitor(); - - ::PR_EnterMonitor(monitor); - - ThreadInitInfo *ti = new ThreadInitInfo(); - ti->monitor = monitor; - ti->toolkit = this; - - // create a gui thread - mGuiThread = ::PR_CreateThread(PR_SYSTEM_THREAD, - RunPump, - (void*)ti, - PR_PRIORITY_NORMAL, - PR_LOCAL_THREAD, - PR_UNJOINABLE_THREAD, - 0); - - // wait for the gui thread to start - while(gThreadState == PR_FALSE) { - ::PR_Wait(monitor, PR_INTERVAL_NO_TIMEOUT); - } - - // at this point the thread is running - ::PR_ExitMonitor(monitor); - ::PR_DestroyMonitor(monitor); -} - - -//------------------------------------------------------------------------- -// -// -//------------------------------------------------------------------------- -void nsToolkit::Init(PRThread *aThread) -{ - // Store the thread ID of the thread containing the message pump. - // If no thread is provided create one - if (NULL != aThread) { - CreateInternalWindow(aThread); - } - else { - // create a thread where the message pump will run - CreateUIThread(); - } -} - - -//------------------------------------------------------------------------- -// -// nsToolkit WindowProc. Used to call methods on the "main GUI thread"... -// -//------------------------------------------------------------------------- -LRESULT CALLBACK nsToolkit::WindowProc(HWND hWnd, UINT msg, WPARAM wParam, - LPARAM lParam) -{ - switch (msg) { - case WM_CALLMETHOD: - { - MethodInfo *info = (MethodInfo *)lParam; - return info->Invoke(); - } - } - - return ::DefWindowProc(hWnd, msg, wParam, lParam); -} - -//------------------------------------------------------------------------- -// -// -//------------------------------------------------------------------------- -MouseTrailer * MouseTrailer::GetMouseTrailer(DWORD aThreadID) { - if (nsnull == MouseTrailer::theMouseTrailer) { - MouseTrailer::theMouseTrailer = new MouseTrailer(); - } - return MouseTrailer::theMouseTrailer; - -} - -//------------------------------------------------------------------------- -// -// -//------------------------------------------------------------------------- -nsWindow * MouseTrailer::GetMouseTrailerWindow() { - return MouseTrailer::mHoldMouse; -} -//------------------------------------------------------------------------- -// -// -//------------------------------------------------------------------------- -void MouseTrailer::SetMouseTrailerWindow(nsWindow * aNSWin) { - MouseTrailer::mHoldMouse = aNSWin; -} - -//------------------------------------------------------------------------- -// -// -//------------------------------------------------------------------------- -MouseTrailer::MouseTrailer() -{ - mTimerId = 0; - mHoldMouse = NULL; -} - - -//------------------------------------------------------------------------- -// -// -//------------------------------------------------------------------------- -MouseTrailer::~MouseTrailer() -{ - DestroyTimer(); - if (mHoldMouse) { - NS_RELEASE(mHoldMouse); - } -} - - -//------------------------------------------------------------------------- -// -// -//------------------------------------------------------------------------- -UINT MouseTrailer::CreateTimer() -{ - if (!mTimerId) { - mTimerId = ::SetTimer(NULL, 0, 200, (TIMERPROC)MouseTrailer::TimerProc); - } - - return mTimerId; -} - - -//------------------------------------------------------------------------- -// -// -//------------------------------------------------------------------------- -void MouseTrailer::DestroyTimer() -{ - if (mTimerId) { - ::KillTimer(NULL, mTimerId); - mTimerId = 0; - } - -} - -#define TIMER_DEBUG 1 -//------------------------------------------------------------------------- -// -// -//------------------------------------------------------------------------- -void CALLBACK MouseTrailer::TimerProc(HWND hWnd, UINT msg, UINT event, DWORD time) -{ - if (MouseTrailer::mHoldMouse && ::IsWindow(MouseTrailer::mHoldMouse->GetWindowHandle())) { - if (gIgnoreNextCycle) { - gIgnoreNextCycle = PR_FALSE; - } - else { - POINT mp; - DWORD pos = ::GetMessagePos(); - mp.x = LOWORD(pos); - mp.y = HIWORD(pos); - - if (::WindowFromPoint(mp) != mHoldMouse->GetWindowHandle()) { - int64 time = PR_Now(); // time in milliseconds - ::ScreenToClient(mHoldMouse->GetWindowHandle(), &mp); - - //notify someone that a mouse exit happened - if (nsnull != MouseTrailer::mHoldMouse) { - MouseTrailer::mHoldMouse->DispatchMouseEvent(NS_MOUSE_EXIT); - } - - // we are out of this window and of any window, destroy timer - MouseTrailer::theMouseTrailer->DestroyTimer(); - MouseTrailer::mHoldMouse = NULL; - } - } - } else { - MouseTrailer::theMouseTrailer->DestroyTimer(); - MouseTrailer::mHoldMouse = NULL; - } - -} - - diff --git a/mozilla/widget/src/windows/nsToolkit.h b/mozilla/widget/src/windows/nsToolkit.h deleted file mode 100644 index c3a73e82e44..00000000000 --- a/mozilla/widget/src/windows/nsToolkit.h +++ /dev/null @@ -1,139 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef TOOLKIT_H -#define TOOLKIT_H - -#include "nsdefs.h" -#include "nsIToolkit.h" - -struct MethodInfo; - -/** - * Wrapper around the thread running the message pump. - * The toolkit abstraction is necessary because the message pump must - * execute within the same thread that created the widget under Win32. - */ - -class nsToolkit : public nsIToolkit -{ - - public: - nsToolkit(); - - NS_DECL_ISUPPORTS - - virtual void Init(PRThread *aThread); - - - void CallMethod(MethodInfo *info); - - // Return whether the current thread is the application's Gui thread. - PRBool IsGuiThread(void) { return (PRBool)(mGuiThread == PR_GetCurrentThread());} - PRThread* GetGuiThread(void) { return mGuiThread; } - HWND GetDispatchWindow(void) { return mDispatchWnd; } - - void CreateInternalWindow(PRThread *aThread); - -private: - ~nsToolkit(); - - void CreateUIThread(void); - -public: - // Window procedure for the internal window - static LRESULT CALLBACK WindowProc(HWND hWnd, - UINT Msg, - WPARAM WParam, - LPARAM lParam); - -protected: - // Handle of the window used to receive dispatch messages. - HWND mDispatchWnd; - // Thread Id of the "main" Gui thread. - PRThread *mGuiThread; - -public: - static HINSTANCE mDllInstance; -}; - -#define WM_CALLMETHOD (WM_USER+1) - -inline void nsToolkit::CallMethod(MethodInfo *info) -{ - NS_PRECONDITION(::IsWindow(mDispatchWnd), "Invalid window handle"); - ::SendMessage(mDispatchWnd, WM_CALLMETHOD, (WPARAM)0, (LPARAM)info); -} - -class nsWindow; - -/** - * Makes sure exit/enter mouse messages are always dispatched. - * In the case where the mouse has exited the outer most window the - * only way to tell if it has exited is to set a timer and look at the - * mouse pointer to see if it is within the outer most window. - */ - -class MouseTrailer { - -public: - static MouseTrailer * GetMouseTrailer(DWORD aThreadID); - static nsWindow * GetMouseTrailerWindow(); - static void SetMouseTrailerWindow(nsWindow * aNSWin); - static void IgnoreNextCycle() { gIgnoreNextCycle = PR_TRUE; } - -private: - /// Global nsToolkit Instance - static MouseTrailer* theMouseTrailer; - -public: - ~MouseTrailer(); - - UINT CreateTimer(); - void DestroyTimer(); - -private: - /** - * Handle timer events - * @param hWnd handle to window - * @param msg Win32 message - * @param event Win32 event - * @param time time of the event - */ - static void CALLBACK TimerProc(HWND hWnd, - UINT msg, - UINT event, - DWORD time); - - MouseTrailer(); - -private: - /* global information for mouse enter/exit events - */ - //@{ - /// last window - static nsWindow* mHoldMouse; - /// timer ID - UINT mTimerId; - static PRBool gIgnoreNextCycle; - //@} - -}; - - -#endif // TOOLKIT_H diff --git a/mozilla/widget/src/windows/nsTooltipWidget.cpp b/mozilla/widget/src/windows/nsTooltipWidget.cpp deleted file mode 100644 index b66d1289237..00000000000 --- a/mozilla/widget/src/windows/nsTooltipWidget.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsTooltipWidget.h" -#include "nsToolkit.h" -#include "nsColor.h" -#include "nsGUIEvent.h" -#include "nsString.h" -#include "nsStringUtil.h" -#include -#include - -BOOL nsTooltipWidget::sTooltipWidgetIsRegistered = FALSE; - -//------------------------------------------------------------------------- -// -// nsTooltipWidget constructor -// -//------------------------------------------------------------------------- -nsTooltipWidget::nsTooltipWidget(nsISupports *aOuter) : nsWindow(aOuter) -{ -} - -//------------------------------------------------------------------------- -// -// nsTooltipWidget destructor -// -//------------------------------------------------------------------------- -nsTooltipWidget::~nsTooltipWidget() -{ -} - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsTooltipWidget::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsWindow::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kInsTooltipWidgetIID, NS_ITOOLTIPWIDGET_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kInsTooltipWidgetIID)) { - *aInstancePtr = (void*) ((nsITooltipWidget*)this); - AddRef(); - result = NS_OK; - } - - return result; -} - -//------------------------------------------------------------------------- -// -// paint message. Don't send the paint out -// -//------------------------------------------------------------------------- -PRBool nsTooltipWidget::OnPaint() -{ - return PR_FALSE; -} - -PRBool nsTooltipWidget::OnResize(nsRect &aWindowRect) -{ - return PR_FALSE; -} - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- - -LPCTSTR nsTooltipWidget::WindowClass() -{ - const LPCTSTR className = "NetscapeTooltipWidgetClass"; - - if (!nsTooltipWidget::sTooltipWidgetIsRegistered) { - WNDCLASS wc; - - wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; - wc.lpfnWndProc = ::DefWindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = nsToolkit::mDllInstance; - wc.hIcon = 0; - wc.hCursor = NULL; - wc.hbrBackground = ::CreateSolidBrush(NSRGB_2_COLOREF(NS_RGB(255,255,225))); - wc.lpszMenuName = NULL; - wc.lpszClassName = className; - - nsTooltipWidget::sTooltipWidgetIsRegistered = ::RegisterClass(&wc); - } - - return className; -} - -//------------------------------------------------------------------------- -// -// return window styles -// -//------------------------------------------------------------------------- -DWORD nsTooltipWidget::WindowStyle() -{ - return WS_POPUP; -} - -//------------------------------------------------------------------------- -// -// return window extended styles -// -//------------------------------------------------------------------------- -DWORD nsTooltipWidget::WindowExStyle() -{ - return 0; //WS_EX_TOPMOST; -} - -//------------------------------------------------------------------------- -// -// Clear window before paint -// -//------------------------------------------------------------------------- - -PRBool nsTooltipWidget::AutoErase() -{ - return(PR_TRUE); -} - - -//------------------------------------------------------------------------- -// -// get position/dimensions -// -//------------------------------------------------------------------------- - -void nsTooltipWidget::GetBounds(nsRect &aRect) -{ - nsWindow::GetBounds(aRect); -} - - - diff --git a/mozilla/widget/src/windows/nsTooltipWidget.h b/mozilla/widget/src/windows/nsTooltipWidget.h deleted file mode 100644 index d57e45f1225..00000000000 --- a/mozilla/widget/src/windows/nsTooltipWidget.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef nsTooltipWidget_h__ -#define nsTooltipWidget_h__ - -#include "nsdefs.h" -#include "nsWindow.h" -#include "nsSwitchToUIThread.h" - -#include "nsITooltipWidget.h" - -/** - * Native Win32 tooltip window wrapper - */ - -class nsTooltipWidget : public nsWindow, - public nsITooltipWidget -{ - -public: - nsTooltipWidget(nsISupports *aOuter); - virtual ~nsTooltipWidget(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - - // nsIWidget interface - BASE_IWIDGET_IMPL - - virtual PRBool OnPaint(); - virtual PRBool OnResize(nsRect &aWindowRect); - virtual PRBool AutoErase(); - virtual void GetBounds(nsRect &aRect); - -protected: - virtual LPCTSTR WindowClass(); - virtual DWORD WindowStyle(); - virtual DWORD WindowExStyle(); - -private: - static BOOL sTooltipWidgetIsRegistered; - -}; - -#endif // nsTooltipWidget_h__ diff --git a/mozilla/widget/src/windows/nsWidgetFactory.cpp b/mozilla/widget/src/windows/nsWidgetFactory.cpp deleted file mode 100644 index 8764a4de26e..00000000000 --- a/mozilla/widget/src/windows/nsWidgetFactory.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsIFactory.h" -#include "nsISupports.h" -#include "nsdefs.h" -#include "nsWidgetsCID.h" - -#include "nsButton.h" -#include "nsCheckButton.h" -#include "nsComboBox.h" -#include "nsFileWidget.h" -#include "nsListBox.h" -#include "nsRadioButton.h" -#include "nsRadioGroup.h" -#include "nsScrollbar.h" -#include "nsTextAreaWidget.h" -#include "nsTextHelper.h" -#include "nsTextWidget.h" -#include "nsToolkit.h" -#include "nsTabWidget.h" -#include "nsTooltipWidget.h" -#include "nsWindow.h" -#include "nsAppShell.h" - -static NS_DEFINE_IID(kCWindow, NS_WINDOW_CID); -static NS_DEFINE_IID(kCChild, NS_CHILD_CID); -static NS_DEFINE_IID(kCButton, NS_BUTTON_CID); -static NS_DEFINE_IID(kCCheckButton, NS_CHECKBUTTON_CID); -static NS_DEFINE_IID(kCCombobox, NS_COMBOBOX_CID); -static NS_DEFINE_IID(kCFileOpen, NS_FILEWIDGET_CID); -static NS_DEFINE_IID(kCListbox, NS_LISTBOX_CID); -static NS_DEFINE_IID(kCRadioButton, NS_RADIOBUTTON_CID); -static NS_DEFINE_IID(kCRadioGroup, NS_RADIOGROUP_CID); -static NS_DEFINE_IID(kCHorzScrollbar, NS_HORZSCROLLBAR_CID); -static NS_DEFINE_IID(kCVertScrollbar, NS_VERTSCROLLBAR_CID); -static NS_DEFINE_IID(kCTextArea, NS_TEXTAREA_CID); -static NS_DEFINE_IID(kCTextField, NS_TEXTFIELD_CID); -static NS_DEFINE_IID(kCTabWidget, NS_TABWIDGET_CID); -static NS_DEFINE_IID(kCTooltipWidget, NS_TOOLTIPWIDGET_CID); -static NS_DEFINE_IID(kCAppShell, NS_APPSHELL_CID); - - -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); - -class nsWidgetFactory : public nsIFactory -{ -public: - // nsISupports methods - NS_IMETHOD QueryInterface(const nsIID &aIID, - void **aResult); - NS_IMETHOD_(nsrefcnt) AddRef(void); - NS_IMETHOD_(nsrefcnt) Release(void); - - // nsIFactory methods - NS_IMETHOD CreateInstance(nsISupports *aOuter, - const nsIID &aIID, - void **aResult); - - NS_IMETHOD LockFactory(PRBool aLock); - - nsWidgetFactory(const nsCID &aClass); - ~nsWidgetFactory(); - -private: - nsrefcnt mRefCnt; - nsCID mClassID; -}; - - - -nsWidgetFactory::nsWidgetFactory(const nsCID &aClass) -{ - mRefCnt = 0; - mClassID = aClass; -} - -nsWidgetFactory::~nsWidgetFactory() -{ - NS_ASSERTION(mRefCnt == 0, "Reference count not zero in destructor"); -} - -nsresult nsWidgetFactory::QueryInterface(const nsIID &aIID, - void **aResult) -{ - if (aResult == NULL) { - return NS_ERROR_NULL_POINTER; - } - - // Always NULL result, in case of failure - *aResult = NULL; - - if (aIID.Equals(kISupportsIID)) { - *aResult = (void *)(nsISupports*)this; - } else if (aIID.Equals(kIFactoryIID)) { - *aResult = (void *)(nsIFactory*)this; - } - - if (*aResult == NULL) { - return NS_NOINTERFACE; - } - - AddRef(); // Increase reference count for caller - return NS_OK; -} - -nsrefcnt nsWidgetFactory::AddRef() -{ - return ++mRefCnt; -} - -nsrefcnt nsWidgetFactory::Release() -{ - if (--mRefCnt == 0) { - delete this; - return 0; // Don't access mRefCnt after deleting! - } - return mRefCnt; -} - -nsresult nsWidgetFactory::CreateInstance(nsISupports *aOuter, - const nsIID &aIID, - void **aResult) -{ - if (aResult == NULL) { - return NS_ERROR_NULL_POINTER; - } - - *aResult = NULL; - - if (nsnull != aOuter && !aIID.Equals(kISupportsIID)) { - // aggregation with IID != nsISupports - return NS_ERROR_ILLEGAL_VALUE; - } - - nsObject *inst = nsnull; - if (mClassID.Equals(kCWindow)) { - inst = (nsObject*)new nsWindow(aOuter); - } - else if (mClassID.Equals(kCChild)) { - inst = (nsObject*)new ChildWindow(aOuter); - } - else if (mClassID.Equals(kCButton)) { - inst = (nsObject*)new nsButton(aOuter); - } - else if (mClassID.Equals(kCCheckButton)) { - inst = (nsObject*)new nsCheckButton(aOuter); - } - else if (mClassID.Equals(kCCombobox)) { - inst = (nsObject*)new nsComboBox(aOuter); - } - else if (mClassID.Equals(kCRadioButton)) { - inst = (nsObject*)new nsRadioButton(aOuter); - } - else if (mClassID.Equals(kCRadioGroup)) { - inst = (nsObject*)new nsRadioGroup(aOuter); - } - else if (mClassID.Equals(kCFileOpen)) { - inst = (nsObject*)new nsFileWidget(aOuter); - } - else if (mClassID.Equals(kCListbox)) { - inst = (nsObject*)new nsListBox(aOuter); - } - else if (mClassID.Equals(kCHorzScrollbar)) { - inst = (nsObject*)new nsScrollbar(aOuter, PR_FALSE); - } - else if (mClassID.Equals(kCVertScrollbar)) { - inst = (nsObject*)new nsScrollbar(aOuter, PR_TRUE); - } - else if (mClassID.Equals(kCTextArea)) { - inst = (nsObject*)new nsTextAreaWidget(aOuter); - } - else if (mClassID.Equals(kCTextField)) { - inst = (nsObject*)new nsTextWidget(aOuter); - } - else if (mClassID.Equals(kCTabWidget)) { - inst = (nsObject*)new nsTabWidget(aOuter); - } - else if (mClassID.Equals(kCTooltipWidget)) { - inst = (nsObject*)new nsTooltipWidget(aOuter); - } - else if (mClassID.Equals(kCAppShell)) { - inst = (nsObject*)new nsAppShell(aOuter); - } - - if (inst == NULL) { - return NS_ERROR_OUT_OF_MEMORY; - } - - nsresult res = inst->QueryObject(aIID, aResult); - - if (res != NS_OK) { - // We didn't get the right interface, so clean up - delete inst; - } - else { - NS_RELEASE(inst); - } - - return res; -} - -nsresult nsWidgetFactory::LockFactory(PRBool aLock) -{ - // Not implemented in simplest case. - return NS_OK; -} - -// return the proper factory to the caller -extern "C" NS_WIDGET nsresult NSGetFactory(const nsCID &aClass, nsIFactory **aFactory) -{ - if (nsnull == aFactory) { - return NS_ERROR_NULL_POINTER; - } - - *aFactory = new nsWidgetFactory(aClass); - - if (nsnull == aFactory) { - return NS_ERROR_OUT_OF_MEMORY; - } - - return (*aFactory)->QueryInterface(kIFactoryIID, (void**)aFactory); -} - - diff --git a/mozilla/widget/src/windows/nsWindow.cpp b/mozilla/widget/src/windows/nsWindow.cpp deleted file mode 100644 index 1f0a71b47fe..00000000000 --- a/mozilla/widget/src/windows/nsWindow.cpp +++ /dev/null @@ -1,2105 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include "nsWindow.h" -#include "nsIFontMetrics.h" -#include "nsIFontCache.h" -#include "nsGUIEvent.h" -#include "nsIRenderingContext.h" -#include "nsIDeviceContext.h" -#include "nsRect.h" -#include "nsTransform2D.h" -#include "nsStringUtil.h" -#include -#include "nsGfxCIID.h" -#include "resource.h" -#include - -#include "prtime.h" - -BOOL nsWindow::sIsRegistered = FALSE; - -nsWindow* nsWindow::gCurrentWindow = nsnull; - -// Global variable -// g_hinst - handle of the application instance -extern HINSTANCE g_hinst; - -static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID); - -//------------------------------------------------------------------------- -// -// Default for height modification is to do nothing -// -//------------------------------------------------------------------------- - -PRInt32 nsWindow::GetHeight(PRInt32 aProposedHeight) -{ - return(aProposedHeight); -} - -//------------------------------------------------------------------------- -// -// Deferred Window positioning -// -//------------------------------------------------------------------------- - -void nsWindow::BeginResizingChildren(void) -{ - if (NULL == mDeferredPositioner) - mDeferredPositioner = ::BeginDeferWindowPos(1); -} - -void nsWindow::EndResizingChildren(void) -{ - if (NULL != mDeferredPositioner) { - ::EndDeferWindowPos(mDeferredPositioner); - mDeferredPositioner = NULL; - } -} - -// DoCreateTooltip - creates a tooltip control and adds some tools -// to it. -// Returns the handle of the tooltip control if successful or NULL -// otherwise. -// hwndOwner - handle of the owner window -// - -void nsWindow::AddTooltip(HWND hwndOwner,nsRect* aRect, int aId) -{ - TOOLINFO ti; // tool information - memset(&ti, 0, sizeof(TOOLINFO)); - - // Make sure the common control DLL is loaded - InitCommonControls(); - - // Create a tooltip control for the window if needed - if (mTooltip == (HWND) NULL) { - mTooltip = CreateWindow(TOOLTIPS_CLASS, (LPSTR) NULL, TTS_ALWAYSTIP, - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - NULL, (HMENU) NULL, - nsToolkit::mDllInstance, - NULL); - } - - if (mTooltip == (HWND) NULL) - return; - - ti.cbSize = sizeof(TOOLINFO); - ti.uFlags = TTF_SUBCLASS; - ti.hwnd = hwndOwner; - ti.hinst = nsToolkit::mDllInstance; - ti.uId = aId; - ti.lpszText = (LPSTR)" "; // must set text to - // something for tooltip to give events; - ti.rect.left = aRect->x; - ti.rect.top = aRect->y; - ti.rect.right = aRect->x + aRect->width; - ti.rect.bottom = aRect->y + aRect->height; - - if (!SendMessage(mTooltip, TTM_ADDTOOL, 0, - (LPARAM) (LPTOOLINFO) &ti)) - return; -} - -void nsWindow::WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) -{ - POINT point; - point.x = aOldRect.x; - point.y = aOldRect.y; - ::ClientToScreen((HWND)GetNativeData(NS_NATIVE_WINDOW), &point); - aNewRect.x = point.x; - aNewRect.y = point.y; - aNewRect.width = aOldRect.width; - aNewRect.height = aOldRect.height; -} - -void nsWindow::ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) -{ - POINT point; - point.x = aOldRect.x; - point.y = aOldRect.y; - ::ScreenToClient((HWND)GetNativeData(NS_NATIVE_WINDOW), &point); - aNewRect.x = point.x; - aNewRect.y = point.y; - aNewRect.width = aOldRect.width; - aNewRect.height = aOldRect.height; -} - -//------------------------------------------------------------------------- -// -// Setup initial tooltip rectangles -// -//------------------------------------------------------------------------- - -void nsWindow::SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]) -{ - RemoveTooltips(); - for (int i = 0; i < (int)aNumberOfTips; i++) { - AddTooltip(mWnd, aTooltipAreas[i], i); - } -} - -//------------------------------------------------------------------------- -// -// Update all tooltip rectangles -// -//------------------------------------------------------------------------- - -void nsWindow::UpdateTooltips(nsRect* aNewTips[]) -{ - TOOLINFO ti; - memset(&ti, 0, sizeof(TOOLINFO)); - ti.cbSize = sizeof(TOOLINFO); - ti.hwnd = mWnd; - // Get the number of tooltips - UINT count = ::SendMessage(mTooltip, TTM_GETTOOLCOUNT, 0, 0); - NS_ASSERTION(count > 0, "Called UpdateTooltips before calling SetTooltips"); - - for (UINT i = 0; i < count; i++) { - ti.uId = i; - int result =::SendMessage(mTooltip, TTM_ENUMTOOLS, i, (LPARAM) (LPTOOLINFO)&ti); - - nsRect* newTip = aNewTips[i]; - ti.rect.left = newTip->x; - ti.rect.top = newTip->y; - ti.rect.right = newTip->x + newTip->width; - ti.rect.bottom = newTip->y + newTip->height; - ::SendMessage(mTooltip, TTM_NEWTOOLRECT, 0, (LPARAM) (LPTOOLINFO)&ti); - - } - -} - -//------------------------------------------------------------------------- -// -// Remove all tooltip rectangles -// -//------------------------------------------------------------------------- - -void nsWindow::RemoveTooltips() -{ - TOOLINFO ti; - memset(&ti, 0, sizeof(TOOLINFO)); - ti.cbSize = sizeof(TOOLINFO); - long val; - - if (mTooltip == NULL) - return; - - // Get the number of tooltips - UINT count = ::SendMessage(mTooltip, TTM_GETTOOLCOUNT, 0, (LPARAM)&val); - for (UINT i = 0; i < count; i++) { - ti.uId = i; - ti.hwnd = mWnd; - ::SendMessage(mTooltip, TTM_DELTOOL, 0, (LPARAM) (LPTOOLINFO)&ti); - } -} - - -//------------------------------------------------------------------------- -// -// Convert nsEventStatus value to a windows boolean -// -//------------------------------------------------------------------------- - -PRBool nsWindow::ConvertStatus(nsEventStatus aStatus) -{ - switch(aStatus) { - case nsEventStatus_eIgnore: - return(PR_FALSE); - break; - case nsEventStatus_eConsumeNoDefault: - return(PR_TRUE); - break; - case nsEventStatus_eConsumeDoDefault: - return(PR_FALSE); - break; - default: - NS_ASSERTION(0, "Illegal nsEventStatus enumeration value"); - return(PR_FALSE); - break; - } -} - -//------------------------------------------------------------------------- -// -// Initialize an event to dispatch -// -//------------------------------------------------------------------------- - -void nsWindow::InitEvent(nsGUIEvent& event, PRUint32 aEventType, nsPoint* aPoint) -{ - event.widget = this; - event.widgetSupports = mOuter; - - if (nsnull == aPoint) { // use the point from the event - // get the message position in client coordinates and in twips - DWORD pos = ::GetMessagePos(); - POINT cpos; - - cpos.x = LOWORD(pos); - cpos.y = HIWORD(pos); - - ::ScreenToClient(mWnd, &cpos); - - event.point.x = cpos.x; - event.point.y = cpos.y; - } - else { // use the point override if provided - event.point.x = aPoint->x; - event.point.y = aPoint->y; - } - - event.time = ::GetMessageTime(); - event.message = aEventType; - - mLastPoint.x = event.point.x; - mLastPoint.y = event.point.y; -} - -//------------------------------------------------------------------------- -// -// Invokes callback and ProcessEvent method on Event Listener object -// -//------------------------------------------------------------------------- - -PRBool nsWindow::DispatchEvent(nsGUIEvent* event) -{ - PRBool result = PR_FALSE; - - if (nsnull != mEventCallback) { - result = ConvertStatus((*mEventCallback)(event)); - } - - // Dispatch to event listener if event was not consumed - if ((result != PR_TRUE) && (nsnull != mEventListener)) { - return ConvertStatus(mEventListener->ProcessEvent(*event)); - } - else { - return(result); - } -} - -//------------------------------------------------------------------------- -// -// Dispatch standard event -// -//------------------------------------------------------------------------- - -PRBool nsWindow::DispatchStandardEvent(PRUint32 aMsg) -{ - nsGUIEvent event; - InitEvent(event, aMsg); - return(DispatchEvent(&event)); -} - -//------------------------------------------------------------------------- -// -// the nsWindow procedure for all nsWindows in this toolkit -// -//------------------------------------------------------------------------- -LRESULT CALLBACK nsWindow::WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - // Get the window which caused the event and ask it to process the message - nsWindow *someWindow = (nsWindow*)::GetWindowLong(hWnd, GWL_USERDATA); - - - // Re-direct a tab change message destined for it's parent window to the - // the actual window which generated the event. - if (msg == WM_NOTIFY) { - LPNMHDR pnmh = (LPNMHDR) lParam; - if (pnmh->code == TCN_SELCHANGE) { - someWindow = (nsWindow*)::GetWindowLong(pnmh->hwndFrom, GWL_USERDATA); - } - } - - - if (nsnull != someWindow) { - LRESULT retValue; - if (PR_TRUE == someWindow->ProcessMessage(msg, wParam, lParam, &retValue)) { - return retValue; - } - } - - return ::CallWindowProc((FARPROC)someWindow->GetPrevWindowProc(), hWnd, msg, wParam, lParam); -} - - -//------------------------------------------------------------------------- -// -// nsWindow constructor -// -//------------------------------------------------------------------------- -nsWindow::nsWindow(nsISupports *aOuter) : nsObject(aOuter) -{ - mWnd = 0; - mPrevWndProc = NULL; - mChildren = NULL; - mEventCallback = NULL; - mToolkit = NULL; - mMouseListener = NULL; - mEventListener = NULL; - mBackground = ::GetSysColor(COLOR_WINDOW); - mBrush = ::CreateSolidBrush(NSRGB_2_COLOREF(mBackground)); - mForeground = ::GetSysColor(COLOR_WINDOWTEXT); - mPalette = NULL; - mCursor = eCursor_standard; - mBorderStyle = eBorderStyle_none; - mIsShiftDown = PR_FALSE; - mIsControlDown = PR_FALSE; - mIsAltDown = PR_FALSE; - mIsDestroying = PR_FALSE; - mTooltip = NULL; - mDeferredPositioner = NULL; - mLastPoint.x = 0; - mLastPoint.y = 0; - mWidth = mHeight = 0; -} - - -//------------------------------------------------------------------------- -// -// nsWindow destructor -// -//------------------------------------------------------------------------- -nsWindow::~nsWindow() -{ - mIsDestroying = PR_TRUE; - if (gCurrentWindow == this) { - gCurrentWindow = nsnull; - } - Destroy(); -} - - -//------------------------------------------------------------------------- -// -// Query interface implementation -// -//------------------------------------------------------------------------- -nsresult nsWindow::QueryObject(const nsIID& aIID, void** aInstancePtr) -{ - nsresult result = nsObject::QueryObject(aIID, aInstancePtr); - - static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID); - if (result == NS_NOINTERFACE && aIID.Equals(kIWidgetIID)) { - *aInstancePtr = (void*) ((nsIWidget*)this); - AddRef(); - result = NS_OK; - } - - return result; -} - - -//------------------------------------------------------------------------- -// -// Create the proper widget -// -//------------------------------------------------------------------------- -void nsWindow::Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - if (NULL == mToolkit) { - if (NULL != aToolkit) { - mToolkit = (nsToolkit*)aToolkit; - mToolkit->AddRef(); - } - else { - if (NULL != aParent) { - mToolkit = (nsToolkit*)(aParent->GetToolkit()); // the call AddRef's, we don't have to - } - // it's some top level window with no toolkit passed in. - // Create a default toolkit with the current thread - else { - mToolkit = new nsToolkit(); - mToolkit->AddRef(); - mToolkit->Init(PR_GetCurrentThread()); - } - } - - } - - // - // Switch to the "main gui thread" if necessary... This method must - // be executed on the "gui thread"... - // - if (!mToolkit->IsGuiThread()) { - DWORD args[5]; - args[0] = (DWORD)aParent; - args[1] = (DWORD)&aRect; - args[2] = (DWORD)aHandleEventFunction; - args[3] = (DWORD)aContext; - args[4] = (DWORD)aToolkit; - args[5] = (DWORD)aInitData; - MethodInfo info(this, nsWindow::CREATE, 6, args); - mToolkit->CallMethod(&info); - return; - } - - // save the event callback function - mEventCallback = aHandleEventFunction; - - // keep a reference to the toolkit object - if (aContext) { - mContext = aContext; - mContext->AddRef(); - } - else { - nsresult res; - - static NS_DEFINE_IID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID); - static NS_DEFINE_IID(kDeviceContextIID, NS_IDEVICE_CONTEXT_IID); - - res = NSRepository::CreateInstance(kDeviceContextCID, nsnull, kDeviceContextIID, (void **)&mContext); - - if (NS_OK == res) - mContext->Init(nsnull); - } - - if (nsnull != aInitData) { - PreCreateWidget(aInitData); - } - - mWnd = ::CreateWindowEx(WindowExStyle(), - WindowClass(), - "", - WindowStyle(), - aRect.x, - aRect.y, - aRect.width, - GetHeight(aRect.height), - (aParent) ? (HWND)aParent->GetNativeData(NS_NATIVE_WINDOW): - (HWND)NULL, - NULL, - nsToolkit::mDllInstance, - NULL); - - VERIFY(mWnd); - if (aParent) { - aParent->AddChild(this); - } - - // Force cursor to default setting - mCursor = eCursor_select; - SetCursor(eCursor_standard); - - // call the event callback to notify about creation - - DispatchStandardEvent(NS_CREATE); - SubclassWindow(TRUE); -} - - -//------------------------------------------------------------------------- -// -// create with a native parent -// -//------------------------------------------------------------------------- -void nsWindow::Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) -{ - - if (NULL == mToolkit) { - if (NULL != aToolkit) { - mToolkit = (nsToolkit*)aToolkit; - mToolkit->AddRef(); - } - else { - mToolkit = new nsToolkit(); - mToolkit->AddRef(); - mToolkit->Init(PR_GetCurrentThread()); - } - - } - - // - // Switch to the "main gui thread" if necessary... This method must - // be executed on the "gui thread"... - // - if (!mToolkit->IsGuiThread()) { - DWORD args[5]; - args[0] = (DWORD)aParent; - args[1] = (DWORD)&aRect; - args[2] = (DWORD)aHandleEventFunction; - args[3] = (DWORD)aContext; - args[4] = (DWORD)aToolkit; - args[5] = (DWORD)aInitData; - MethodInfo info(this, nsWindow::CREATE_NATIVE, 5, args); - mToolkit->CallMethod(&info); - return; - } - - // save the event callback function - mEventCallback = aHandleEventFunction; - - // keep a reference to the toolkit object - if (aContext) { - mContext = aContext; - mContext->AddRef(); - } - else { - nsresult res; - - static NS_DEFINE_IID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID); - static NS_DEFINE_IID(kDeviceContextIID, NS_IDEVICE_CONTEXT_IID); - - res = NSRepository::CreateInstance(kDeviceContextCID, nsnull, kDeviceContextIID, (void **)&mContext); - - if (NS_OK == res) - mContext->Init(nsnull); - } - - if (nsnull != aInitData) { - PreCreateWidget(aInitData); - } - - mWnd = ::CreateWindowEx(WindowExStyle(), - WindowClass(), - "", - WindowStyle(), - aRect.x, - aRect.y, - aRect.width, - GetHeight(aRect.height), - aParent, - NULL, - nsToolkit::mDllInstance, - NULL); - - VERIFY(mWnd); - - // call the event callback to notify about creation - DispatchStandardEvent(NS_CREATE); - SubclassWindow(TRUE); -} - - -//------------------------------------------------------------------------- -// -// Close this nsWindow -// -//------------------------------------------------------------------------- -void nsWindow::Destroy() -{ - // - // Switch to the "main gui thread" if necessary... This method must - // be executed on the "gui thread"... - // - if (mToolkit != nsnull && !mToolkit->IsGuiThread()) { - MethodInfo info(this, nsWindow::DESTROY); - mToolkit->CallMethod(&info); - return; - } - - //if we were in the middle deferred window positioning - if (mDeferredPositioner) { - VERIFY(::EndDeferWindowPos(mDeferredPositioner)); - } - - // destroy the nsWindow - if (mWnd) { - // destroy the nsWindow - mEventCallback = nsnull; // prevent the widget from causing additional events - VERIFY(::DestroyWindow(mWnd)); - } - - if (mPalette) { - VERIFY(::DeleteObject(mPalette)); - } - - // Destroy the tooltip control - if (mTooltip) { - VERIFY(::DestroyWindow(mTooltip)); - } -} - - -//------------------------------------------------------------------------- -// -// Get this nsWindow parent -// -//------------------------------------------------------------------------- -nsIWidget* nsWindow::GetParent(void) -{ - nsIWidget* widget = NULL; - if (mWnd) { - HWND parent = ::GetParent(mWnd); - if (parent) { - widget = (nsIWidget*)((nsWindow *)::GetWindowLong(mWnd, GWL_USERDATA)); - widget->AddRef(); - } - } - - return widget; -} - - -//------------------------------------------------------------------------- -// -// Get this nsWindow's list of children -// -//------------------------------------------------------------------------- -nsIEnumerator* nsWindow::GetChildren() -{ - if (mChildren) { - mChildren->Reset(); - //mChildren->AddRef(); - - Enumerator * children = new Enumerator(); - nsISupports * next = mChildren->Next(); - if (next) { - nsIWidget *widget; - if (NS_OK == next->QueryInterface(kIWidgetIID, (void**)&widget)) { - children->Append(widget); - //NS_RELEASE(widget); - } - } - - return (nsIEnumerator*)children; - } - - return NULL; -} - - -//------------------------------------------------------------------------- -// -// Add a child to the list of children -// -//------------------------------------------------------------------------- -void nsWindow::AddChild(nsIWidget* aChild) -{ - if (!mChildren) { - mChildren = new Enumerator(); - } - - mChildren->Append(aChild); -} - - -//------------------------------------------------------------------------- -// -// Remove a child from the list of children -// -//------------------------------------------------------------------------- -void nsWindow::RemoveChild(nsIWidget* aChild) -{ - if (mChildren) { - mChildren->Remove(aChild); - } -} - - -//------------------------------------------------------------------------- -// -// Hide or show this component -// -//------------------------------------------------------------------------- -void nsWindow::Show(PRBool bState) -{ - if (mWnd) { - if (bState) { - ::SetWindowPos(mWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); - } - else - ::ShowWindow(mWnd, SW_HIDE); - } -} - -//------------------------------------------------------------------------- -// -// Move this component -// -//------------------------------------------------------------------------- -void nsWindow::Move(PRUint32 aX, PRUint32 aY) -{ - if (mWnd) { - nsIWidget *par = GetParent(); - HDWP deferrer = NULL; - - if (nsnull != par) { - deferrer = ((nsWindow *)par)->mDeferredPositioner; - } - - if (NULL != deferrer) { - VERIFY(((nsWindow *)par)->mDeferredPositioner = ::DeferWindowPos(deferrer, - mWnd, NULL, aX, aY, 0, 0, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE)); - } - else { - VERIFY(::SetWindowPos(mWnd, NULL, aX, aY, 0, 0, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE)); - } - - NS_IF_RELEASE(par); - } -} - -//------------------------------------------------------------------------- -// -// Resize this component -// -//------------------------------------------------------------------------- -void nsWindow::Resize(PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint) -{ - if (mWnd) { - nsIWidget *par = GetParent(); - HDWP deferrer = NULL; - - if (nsnull != par) { - deferrer = ((nsWindow *)par)->mDeferredPositioner; - } - - UINT flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE; - if (!aRepaint) { - flags |= SWP_NOREDRAW; - } - - if (NULL != deferrer) { - VERIFY(((nsWindow *)par)->mDeferredPositioner = ::DeferWindowPos(deferrer, - mWnd, NULL, 0, 0, aWidth, GetHeight(aHeight), flags)); - } - else { - VERIFY(::SetWindowPos(mWnd, NULL, 0, 0, aWidth, GetHeight(aHeight), - flags)); - } - - NS_IF_RELEASE(par); - } -} - - -//------------------------------------------------------------------------- -// -// Resize this component -// -//------------------------------------------------------------------------- -void nsWindow::Resize(PRUint32 aX, - PRUint32 aY, - PRUint32 aWidth, - PRUint32 aHeight, - PRBool aRepaint) -{ - if (mWnd) { - nsIWidget *par = GetParent(); - HDWP deferrer = NULL; - - if (nsnull != par) { - deferrer = ((nsWindow *)par)->mDeferredPositioner; - } - - UINT flags = SWP_NOZORDER | SWP_NOACTIVATE; - if (!aRepaint) { - flags |= SWP_NOREDRAW; - } - - if (NULL != deferrer) { - VERIFY(((nsWindow *)par)->mDeferredPositioner = ::DeferWindowPos(deferrer, - mWnd, NULL, aX, aY, aWidth, GetHeight(aHeight), - flags)); - } - else { - VERIFY(::SetWindowPos(mWnd, NULL, aX, aY, aWidth, GetHeight(aHeight), - flags)); - } - - NS_IF_RELEASE(par); - } -} - - -//------------------------------------------------------------------------- -// -// Enable/disable this component -// -//------------------------------------------------------------------------- -void nsWindow::Enable(PRBool bState) -{ - if (mWnd) { - ::EnableWindow(mWnd, bState); - } -} - - -//------------------------------------------------------------------------- -// -// Give the focus to this component -// -//------------------------------------------------------------------------- -void nsWindow::SetFocus(void) -{ - // - // Switch to the "main gui thread" if necessary... This method must - // be executed on the "gui thread"... - // - if (!mToolkit->IsGuiThread()) { - MethodInfo info(this, nsWindow::SET_FOCUS); - mToolkit->CallMethod(&info); - return; - } - - if (mWnd) { - ::SetFocus(mWnd); - } -} - - -//------------------------------------------------------------------------- -// -// Get this component dimension -// -//------------------------------------------------------------------------- -void nsWindow::GetBounds(nsRect &aRect) -{ - if (mWnd) { - RECT r; - VERIFY(::GetClientRect(mWnd, &r)); - - // assign size - aRect.width = r.right - r.left; - aRect.height = r.bottom - r.top; - - // convert coordinates if parent exists - HWND parent = ::GetParent(mWnd); - if (parent) { - RECT pr; - VERIFY(::GetClientRect(parent, &pr)); - VERIFY(::ClientToScreen(mWnd, (LPPOINT)&r)); - VERIFY(::ClientToScreen(parent, (LPPOINT)&pr)); - r.left -= pr.left; - r.top -= pr.top; - } - aRect.x = r.left; - aRect.y = r.top; - } -} - -//get the bounds, but don't take into account the client size - -void nsWindow::GetNonClientBounds(nsRect &aRect) -{ - if (mWnd) { - RECT r; - VERIFY(::GetWindowRect(mWnd, &r)); - - // assign size - aRect.width = r.right - r.left; - aRect.height = r.bottom - r.top; - - // convert coordinates if parent exists - HWND parent = ::GetParent(mWnd); - if (parent) { - RECT pr; - VERIFY(::GetWindowRect(parent, &pr)); - r.left -= pr.left; - r.top -= pr.top; - } - aRect.x = r.left; - aRect.y = r.top; - } -} - - -//------------------------------------------------------------------------- -// -// Get the foreground color -// -//------------------------------------------------------------------------- -nscolor nsWindow::GetForegroundColor(void) -{ - return mForeground; -} - - -//------------------------------------------------------------------------- -// -// Set the foreground color -// -//------------------------------------------------------------------------- -void nsWindow::SetForegroundColor(const nscolor &aColor) -{ - mForeground = aColor; -} - - -//------------------------------------------------------------------------- -// -// Get the background color -// -//------------------------------------------------------------------------- -nscolor nsWindow::GetBackgroundColor(void) -{ - return mBackground; -} - - -//------------------------------------------------------------------------- -// -// Set the background color -// -//------------------------------------------------------------------------- -void nsWindow::SetBackgroundColor(const nscolor &aColor) -{ - mBackground = aColor; - - ::DeleteObject(mBrush); - mBrush = ::CreateSolidBrush(NSRGB_2_COLOREF(mBackground)); - SetClassLong(mWnd, GCL_HBRBACKGROUND, (LONG)mBrush); -} - - -//------------------------------------------------------------------------- -// -// Get this component font -// -//------------------------------------------------------------------------- -nsIFontMetrics* nsWindow::GetFont(void) -{ - NS_NOTYETIMPLEMENTED("GetFont not yet implemented"); // to be implemented - return NULL; -} - - -//------------------------------------------------------------------------- -// -// Set this component font -// -//------------------------------------------------------------------------- -void nsWindow::SetFont(const nsFont &aFont) -{ - nsIFontCache* fontCache = mContext->GetFontCache(); - nsIFontMetrics* metrics = fontCache->GetMetricsFor(aFont); - HFONT hfont = metrics->GetFontHandle(); - - // Draw in the new font - ::SendMessage(mWnd, WM_SETFONT, (WPARAM)hfont, (LPARAM)0); - NS_RELEASE(metrics); - NS_RELEASE(fontCache); -} - - -//------------------------------------------------------------------------- -// -// Get this component cursor -// -//------------------------------------------------------------------------- -nsCursor nsWindow::GetCursor() -{ - return mCursor; -} - - -//------------------------------------------------------------------------- -// -// Set this component cursor -// -//------------------------------------------------------------------------- - -#define DLLQUOTE(x) #x -#define DLLNAME(x) DLLQUOTE(x) - -void nsWindow::SetCursor(nsCursor aCursor) -{ - // Only change cursor if it's changing - if (aCursor != mCursor) { - HCURSOR newCursor = NULL; - - switch(aCursor) { - case eCursor_select: - newCursor = ::LoadCursor(NULL, IDC_IBEAM); - break; - - case eCursor_wait: - newCursor = ::LoadCursor(NULL, IDC_WAIT); - break; - - case eCursor_hyperlink: { - HMODULE hm = ::GetModuleHandle(DLLNAME(NS_DLLNAME)); - newCursor = ::LoadCursor(hm, MAKEINTRESOURCE(IDC_SELECTANCHOR)); - break; - } - - case eCursor_standard: - newCursor = ::LoadCursor(NULL, IDC_ARROW); - break; - - default: - NS_ASSERTION(0, "Invalid cursor type"); - break; - } - - if (NULL != newCursor) { - mCursor = aCursor; - HCURSOR oldCursor = ::SetCursor(newCursor); - } - } -} - -//------------------------------------------------------------------------- -// -// Invalidate this component visible area -// -//------------------------------------------------------------------------- -void nsWindow::Invalidate(PRBool aIsSynchronous) -{ - if (mWnd) { - VERIFY(::InvalidateRect(mWnd, NULL, TRUE)); - if (aIsSynchronous) { - VERIFY(::UpdateWindow(mWnd)); - } - } -} - - -//------------------------------------------------------------------------- -// -// Return some native data according to aDataType -// -//------------------------------------------------------------------------- -void* nsWindow::GetNativeData(PRUint32 aDataType) -{ - switch(aDataType) { - case NS_NATIVE_WIDGET: - case NS_NATIVE_WINDOW: - return (void*)mWnd; - case NS_NATIVE_GRAPHIC: - return (void*)::GetDC(mWnd); - case NS_NATIVE_COLORMAP: - default: - break; - } - - return NULL; -} - - -//------------------------------------------------------------------------- -// -// Create a rendering context from this nsWindow -// -//------------------------------------------------------------------------- -nsIRenderingContext* nsWindow::GetRenderingContext() -{ -nsRect bounds; - - nsIRenderingContext *renderingCtx = NULL; - if (mWnd) { - HDC aDC = ::GetDC(mWnd); - nsresult res; - - static NS_DEFINE_IID(kRenderingContextCID, NS_RENDERING_CONTEXT_CID); - static NS_DEFINE_IID(kRenderingContextIID, NS_IRENDERING_CONTEXT_IID); - - res = NSRepository::CreateInstance(kRenderingContextCID, nsnull, kRenderingContextIID, (void **)&renderingCtx); - - if (NS_OK == res) - renderingCtx->Init(mContext, (nsDrawingSurface)aDC); - - NS_ASSERTION(NULL != renderingCtx, "Null rendering context"); - } - - return renderingCtx; -} - -//------------------------------------------------------------------------- -// -// Return the toolkit this widget was created on -// -//------------------------------------------------------------------------- -nsIToolkit* nsWindow::GetToolkit() -{ - if (NULL != mToolkit) { - mToolkit->AddRef(); - } - - return mToolkit; -} - - -//------------------------------------------------------------------------- -// -// Set the colormap of the window -// -//------------------------------------------------------------------------- -void nsWindow::SetColorMap(nsColorMap *aColorMap) -{ - if (mPalette != NULL) { - ::DeleteObject(mPalette); - } - - PRUint8 *map = aColorMap->Index; - LPLOGPALETTE pLogPal = (LPLOGPALETTE) new char[2 * sizeof(WORD) + - aColorMap->NumColors * sizeof(PALETTEENTRY)]; - pLogPal->palVersion = 0x300; - pLogPal->palNumEntries = aColorMap->NumColors; - for(int i = 0; i < aColorMap->NumColors; i++) - { - pLogPal->palPalEntry[i].peRed = *map++; - pLogPal->palPalEntry[i].peGreen = *map++; - pLogPal->palPalEntry[i].peBlue = *map++; - pLogPal->palPalEntry[i].peFlags = 0; - } - mPalette = ::CreatePalette(pLogPal); - delete pLogPal; - - NS_ASSERTION(mPalette != NULL, "Null palette"); - if (mPalette != NULL) { - HDC hDC = ::GetDC(mWnd); - HPALETTE hOldPalette = ::SelectPalette(hDC, mPalette, TRUE); - ::RealizePalette(hDC); - ::SelectPalette(hDC, hOldPalette, TRUE); - ::ReleaseDC(mWnd, hDC); - } -} - -//------------------------------------------------------------------------- -// -// Return the used device context -// -//------------------------------------------------------------------------- -nsIDeviceContext* nsWindow::GetDeviceContext() -{ - if (mContext) { - mContext->AddRef(); - } - - return mContext; -} - - -//------------------------------------------------------------------------- -// -// Scroll the bits of a window -// -//------------------------------------------------------------------------- -void nsWindow::Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect) -{ - RECT trect; - - if (nsnull != aClipRect) - { - trect.left = aClipRect->x; - trect.top = aClipRect->y; - trect.right = aClipRect->XMost(); - trect.bottom = aClipRect->YMost(); - } - - ::ScrollWindowEx(mWnd, aDx, aDy, (nsnull != aClipRect) ? &trect : NULL, NULL, - NULL, NULL, SW_INVALIDATE); - ::UpdateWindow(mWnd); -} - - -//------------------------------------------------------------------------- -// -// Every function that needs a thread switch goes through this function -// by calling SendMessage (..WM_CALLMETHOD..) in nsToolkit::CallMethod. -// -//------------------------------------------------------------------------- -BOOL nsWindow::CallMethod(MethodInfo *info) -{ - BOOL bRet = TRUE; - - switch (info->methodId) { - case nsWindow::CREATE: - NS_ASSERTION(info->nArgs == 6, "Wrong number of arguments to CallMethod"); - Create((nsIWidget*)(info->args[0]), - (nsRect&)*(nsRect*)(info->args[1]), - (EVENT_CALLBACK)(info->args[2]), - (nsIDeviceContext*)(info->args[3]), - (nsIToolkit*)(info->args[4]), - (nsWidgetInitData*)(info->args[5])); - break; - - case nsWindow::CREATE_NATIVE: - NS_ASSERTION(info->nArgs == 6, "Wrong number of arguments to CallMethod"); - Create((nsNativeWidget)(info->args[0]), - (nsRect&)*(nsRect*)(info->args[1]), - (EVENT_CALLBACK)(info->args[2]), - (nsIDeviceContext*)(info->args[3]), - (nsIToolkit*)(info->args[4]), - (nsWidgetInitData*)(info->args[5])); - return TRUE; - - case nsWindow::DESTROY: - NS_ASSERTION(info->nArgs == 0, "Wrong number of arguments to CallMethod"); - Destroy(); - break; - - case nsWindow::SET_FOCUS: - NS_ASSERTION(info->nArgs == 0, "Wrong number of arguments to CallMethod"); - SetFocus(); - break; - - default: - bRet = FALSE; - break; - } - - return bRet; -} - -//------------------------------------------------------------------------- -// -// OnKey -// -//------------------------------------------------------------------------- -PRBool nsWindow::OnKey(PRUint32 aEventType, PRUint32 aKeyCode) -{ - nsKeyEvent event; - InitEvent(event, aEventType); - event.keyCode = aKeyCode; - event.isShift = mIsShiftDown; - event.isControl = mIsControlDown; - event.isAlt = mIsAltDown; - return(DispatchEvent(&event)); -} - - -//------------------------------------------------------------------------- -// -// Process all nsWindows messages -// -//------------------------------------------------------------------------- -PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *aRetValue) -{ - PRBool result = PR_FALSE; // call the default nsWindow proc - - - *aRetValue = 0; - - switch (msg) { - - case WM_COMMAND: { - WORD wNotifyCode = HIWORD(wParam); // notification code - if (wNotifyCode == 0) { // Menu selection - nsMenuEvent event; - event.menuItem = LOWORD(wParam); - InitEvent(event, NS_MENU_SELECTED); - result = DispatchEvent(&event); - } - } - break; - - - case WM_NOTIFY: - // TAB change - { - LPNMHDR pnmh = (LPNMHDR) lParam; - - switch (pnmh->code) { - case TCN_SELCHANGE: { - DispatchStandardEvent(NS_TABCHANGE); - result = PR_TRUE; - } - break; - - case TTN_SHOW: { - nsTooltipEvent event; - InitEvent(event, NS_SHOW_TOOLTIP); - event.tipIndex = (PRUint32)wParam; - result = DispatchEvent(&event); - } - break; - - case TTN_POP: - result = DispatchStandardEvent(NS_HIDE_TOOLTIP); - break; - } - } - break; - - case WM_MOVE: // Window moved - { - PRInt32 x = (PRInt32)LOWORD(lParam); // horizontal position in screen coordinates - PRInt32 y = (PRInt32)HIWORD(lParam); // vertical position in screen coordinates - result = OnMove(x, y); - } - break; - - case WM_DESTROY: - // clean up. - OnDestroy(); - result = PR_TRUE; - break; - - case WM_PAINT: - result = OnPaint(); - break; - - case WM_KEYUP: - if (wParam == NS_VK_SHIFT) { - mIsShiftDown = PR_FALSE; - } - if (wParam == NS_VK_CONTROL) { - mIsControlDown = PR_FALSE; - } - if (wParam == NS_VK_ALT) { - mIsAltDown = PR_FALSE; - } - result = OnKey(NS_KEY_UP, wParam); - break; - - case WM_KEYDOWN: - if (wParam == NS_VK_SHIFT) { - mIsShiftDown = PR_TRUE; - } - if (wParam == NS_VK_CONTROL) { - mIsControlDown = PR_TRUE; - } - if (wParam == NS_VK_ALT) { - mIsAltDown = PR_TRUE; - } - result = OnKey(NS_KEY_DOWN, wParam); - break; - - // say we've dealt with erase background if widget does - // not need auto-erasing - case WM_ERASEBKGND: - if (! AutoErase()) { - *aRetValue = 1; - result = PR_TRUE; - } - break; - - case WM_MOUSEMOVE: - //RelayMouseEvent(msg,wParam, lParam); - result = DispatchMouseEvent(NS_MOUSE_MOVE); - break; - - case WM_LBUTTONDOWN: - //RelayMouseEvent(msg,wParam, lParam); - result = DispatchMouseEvent(NS_MOUSE_LEFT_BUTTON_DOWN); - break; - - case WM_LBUTTONUP: - //RelayMouseEvent(msg,wParam, lParam); - result = DispatchMouseEvent(NS_MOUSE_LEFT_BUTTON_UP); - break; - - case WM_LBUTTONDBLCLK: - result = DispatchMouseEvent(NS_MOUSE_LEFT_BUTTON_DOWN); - if (result == PR_FALSE) - result = DispatchMouseEvent(NS_MOUSE_LEFT_DOUBLECLICK); - break; - - case WM_MBUTTONDOWN: - result = DispatchMouseEvent(NS_MOUSE_MIDDLE_BUTTON_DOWN); - break; - - case WM_MBUTTONUP: - result = DispatchMouseEvent(NS_MOUSE_MIDDLE_BUTTON_UP); - break; - - case WM_MBUTTONDBLCLK: - result = DispatchMouseEvent(NS_MOUSE_MIDDLE_BUTTON_DOWN); - break; - - case WM_RBUTTONDOWN: - result = DispatchMouseEvent(NS_MOUSE_RIGHT_BUTTON_DOWN); - break; - - case WM_RBUTTONUP: - result = DispatchMouseEvent(NS_MOUSE_RIGHT_BUTTON_UP); - break; - - case WM_RBUTTONDBLCLK: - result = DispatchMouseEvent(NS_MOUSE_RIGHT_BUTTON_DOWN); - if (result == PR_FALSE) - result = DispatchMouseEvent(NS_MOUSE_RIGHT_DOUBLECLICK); - break; - - case WM_HSCROLL: - case WM_VSCROLL: - // check for the incoming nsWindow handle to be null in which case - // we assume the message is coming from a horizontal scrollbar inside - // a listbox and we don't bother processing it (well, we don't have to) - if (lParam) { - nsWindow* scrollbar = (nsWindow*)::GetWindowLong((HWND)lParam, GWL_USERDATA); - - if (scrollbar) { - result = scrollbar->OnScroll(LOWORD(wParam), (short)HIWORD(wParam)); - } - } - break; - - case WM_CTLCOLORBTN: - case WM_CTLCOLOREDIT: - case WM_CTLCOLORLISTBOX: - case WM_CTLCOLORSCROLLBAR: - case WM_CTLCOLORSTATIC: - if (lParam) { - nsWindow* control = (nsWindow*)::GetWindowLong((HWND)lParam, GWL_USERDATA); - if (control) { - HDC hDC = (HDC)wParam; - //::SetBkColor (hDC, mBackground); - ::SetTextColor(hDC, mForeground); - *aRetValue = (LPARAM)control->OnControlColor(); - } - } - - result = PR_TRUE; - break; - - case WM_SETFOCUS: - result = DispatchFocus(NS_GOTFOCUS); - break; - - case WM_KILLFOCUS: - result = DispatchFocus(NS_LOSTFOCUS); - break; - - case WM_WINDOWPOSCHANGED: - { - WINDOWPOS *wp = (LPWINDOWPOS)lParam; - - // We only care about a resize, so filter out things like z-order - // changes. Note: there's a WM_MOVE handler above which is why we're - // not handling them here... - if (0 == (wp->flags & SWP_NOSIZE)) { - // XXX Why are we using the client size area? If the size notification - // is for the client area then the origin should be (0,0) and not - // the window origin in screen coordinates... - RECT r; - ::GetClientRect(mWnd, &r); - PRInt32 newWidth, newHeight; - newWidth = PRInt32(r.right - r.left); - newHeight = PRInt32(r.bottom - r.top); - nsRect rect(wp->x, wp->y, newWidth, newHeight); - if (newWidth > mWidth) - { - RECT drect; - - //getting wider - - drect.left = wp->x + mWidth; - drect.top = wp->y; - drect.right = drect.left + (newWidth - mWidth); - drect.bottom = drect.top + newHeight; - -// ::InvalidateRect(mWnd, &drect, FALSE); - ::RedrawWindow(mWnd, &drect, NULL, - RDW_INVALIDATE | RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ERASENOW | RDW_ALLCHILDREN); - } - if (newHeight > mHeight) - { - RECT drect; - - //getting taller - - drect.left = wp->x; - drect.top = wp->y + mHeight; - drect.right = drect.left + newWidth; - drect.bottom = drect.top + (newHeight - mHeight); - -// ::InvalidateRect(mWnd, &drect, FALSE); - ::RedrawWindow(mWnd, &drect, NULL, - RDW_INVALIDATE | RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ERASENOW | RDW_ALLCHILDREN); - } - mWidth = newWidth; - mHeight = newHeight; - ///nsRect rect(wp->x, wp->y, wp->cx, wp->cy); - result = OnResize(rect); - } - break; - } - case WM_QUERYNEWPALETTE: - if (mPalette) { - HDC hDC = ::GetDC(mWnd); - HPALETTE hOldPal = ::SelectPalette(hDC, mPalette, 0); - - int i = ::RealizePalette(hDC); - - ::SelectPalette(hDC, hOldPal, 0); - ::ReleaseDC(mWnd, hDC); - - if (i) { - ::InvalidateRect(mWnd, (LPRECT)(NULL), 1); - result = PR_TRUE; - } - else { - result = PR_FALSE; - } - } - else { - result = PR_FALSE; - } - break; - case WM_PALETTECHANGED: - if (mPalette && (HWND)wParam != mWnd) { - HDC hDC = ::GetDC(mWnd); - HPALETTE hOldPal = ::SelectPalette(hDC, mPalette, 0); - - int i = ::RealizePalette(hDC); - - if (i) { - ::InvalidateRect(mWnd, (LPRECT)(NULL), 1); - } - - ::SelectPalette(hDC, hOldPal, 0); - ::ReleaseDC(mWnd, hDC); - } - result = PR_TRUE; - break; - - } - - return result; -} - - - -//------------------------------------------------------------------------- -// -// return the window class name and initialize the class if needed -// -//------------------------------------------------------------------------- -LPCTSTR nsWindow::WindowClass() -{ - const LPCTSTR className = "NetscapeWindowClass"; - - if (!nsWindow::sIsRegistered) { - WNDCLASS wc; - -// wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = ::DefWindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = nsToolkit::mDllInstance; - wc.hIcon = ::LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = NULL; - wc.hbrBackground = NULL; - wc.lpszMenuName = NULL; - wc.lpszClassName = className; - - nsWindow::sIsRegistered = ::RegisterClass(&wc); - } - - return className; -} - - -//------------------------------------------------------------------------- -// -// return nsWindow styles -// -//------------------------------------------------------------------------- -DWORD nsWindow::WindowStyle() -{ - return WS_OVERLAPPEDWINDOW; -} - - -//------------------------------------------------------------------------- -// -// return nsWindow extended styles -// -//------------------------------------------------------------------------- -DWORD nsWindow::WindowExStyle() -{ - return WS_EX_CLIENTEDGE; -} - - -// ----------------------------------------------------------------------- -// -// Subclass (or remove the subclass from) this component's nsWindow -// -// ----------------------------------------------------------------------- -void nsWindow::SubclassWindow(BOOL bState) -{ - NS_PRECONDITION(::IsWindow(mWnd), "Invalid window handle"); - - if (bState) { - // change the nsWindow proc - mPrevWndProc = (WNDPROC)::SetWindowLong(mWnd, GWL_WNDPROC, - (LONG)nsWindow::WindowProc); - NS_ASSERTION(mPrevWndProc, "Null standard window procedure"); - // connect the this pointer to the nsWindow handle - ::SetWindowLong(mWnd, GWL_USERDATA, (LONG)this); - } - else { - (void) ::SetWindowLong(mWnd, GWL_WNDPROC, (LONG)mPrevWndProc); - mPrevWndProc = NULL; - } -} - - -//------------------------------------------------------------------------- -// -// WM_DESTROY has been called -// -//------------------------------------------------------------------------- -void nsWindow::OnDestroy() -{ - SubclassWindow(FALSE); - - if (mBrush) - ::DeleteObject(mBrush); - - // disconnect from the parent - /* - nsIWidget *parent = GetParent(); - if (parent) { - parent->RemoveChild(this); - }*/ - - mWnd = 0; - - // release children (I don't think we need this but...) - if (mChildren) { - NS_RELEASE(mChildren); - mChildren = NULL; - } - - // get the pixels to twips info before the device context is released - if (mContext) { - NS_RELEASE(mContext); - mContext = 0; - } - - if (NULL != mToolkit) { - NS_RELEASE(mToolkit); - mToolkit = NULL; - } - DispatchStandardEvent(NS_DESTROY); -} - -//------------------------------------------------------------------------- -// -// Move -// -//------------------------------------------------------------------------- -PRBool nsWindow::OnMove(PRInt32 aX, PRInt32 aY) -{ - nsGUIEvent event; - InitEvent(event, NS_MOVE); - event.point.x = aX; - event.point.y = aY; - return DispatchEvent(&event); -} - -//------------------------------------------------------------------------- -// -// Paint -// -//------------------------------------------------------------------------- -PRBool nsWindow::OnPaint() -{ - nsRect bounds; - PRBool result = PR_TRUE; - PAINTSTRUCT ps; - HDC hDC = ::BeginPaint(mWnd, &ps); - - if (ps.rcPaint.left || ps.rcPaint.right || ps.rcPaint.top || ps.rcPaint.bottom) { - // call the event callback - if (mEventCallback) { - nsPaintEvent event; - - InitEvent(event, NS_PAINT); - - nsRect rect(ps.rcPaint.left, - ps.rcPaint.top, - ps.rcPaint.right - ps.rcPaint.left, - ps.rcPaint.bottom - ps.rcPaint.top); - event.rect = ▭ - - ::EndPaint(mWnd, &ps); - - static NS_DEFINE_IID(kRenderingContextCID, NS_RENDERING_CONTEXT_CID); - static NS_DEFINE_IID(kRenderingContextIID, NS_IRENDERING_CONTEXT_IID); - - if (NS_OK == NSRepository::CreateInstance(kRenderingContextCID, nsnull, kRenderingContextIID, (void **)&event.renderingContext)) - { - hDC = ::GetDC(mWnd); - event.renderingContext->Init(mContext, (nsDrawingSurface)hDC); - result = DispatchEvent(&event); - NS_RELEASE(event.renderingContext); - ::ReleaseDC(mWnd, hDC); - } - else - result = PR_FALSE; - } - else - ::EndPaint(mWnd, &ps); - } - else - ::EndPaint(mWnd, &ps); - -// ::EndPaint(mWnd, &ps); - - return result; -} - - -//------------------------------------------------------------------------- -// -// Send a resize message to the listener -// -//------------------------------------------------------------------------- -PRBool nsWindow::OnResize(nsRect &aWindowRect) -{ - // call the event callback - if (mEventCallback) { - nsSizeEvent event; - InitEvent(event, NS_SIZE); - event.windowSize = &aWindowRect; - return(DispatchEvent(&event)); - } - - return PR_FALSE; -} - - - -//------------------------------------------------------------------------- -// -// Deal with all sort of mouse event -// -//------------------------------------------------------------------------- -PRBool nsWindow::DispatchMouseEvent(PRUint32 aEventType, nsPoint* aPoint) -{ - PRBool result = PR_FALSE; - - if (nsnull == mEventCallback && nsnull == mMouseListener) { - return result; - } - - nsMouseEvent event; - InitEvent(event, aEventType, aPoint); - - event.isShift = GetKeyState(VK_LSHIFT) < 0 || GetKeyState(VK_RSHIFT) < 0; - event.isControl = GetKeyState(VK_LCONTROL) < 0 || GetKeyState(VK_RCONTROL) < 0; - event.isAlt = GetKeyState(VK_LMENU) < 0 || GetKeyState(VK_RMENU) < 0; - event.clickCount = (aEventType == NS_MOUSE_LEFT_DOUBLECLICK || - aEventType == NS_MOUSE_LEFT_DOUBLECLICK)? 2:1; - - // call the event callback - if (nsnull != mEventCallback) { -//printf(" %d %d %d (%d,%d) \n", event.widget, event.widgetSupports, -// event.message, event.point.x, event.point.y); - - result = DispatchEvent(&event); - - //printf("**result=%d%\n",result); - if (aEventType == NS_MOUSE_MOVE) { - - MouseTrailer * mouseTrailer = MouseTrailer::GetMouseTrailer(0); - MouseTrailer::SetMouseTrailerWindow(this); - mouseTrailer->CreateTimer(); - - nsRect rect; - GetBounds(rect); - rect.x = 0; - rect.y = 0; - //printf("Rect[%d, %d, %d, %d] Point[%d,%d]\n", rect.x, rect.y, rect.width, rect.height, event.position.x, event.position.y); - //printf("gCurrentWindow 0x%X\n", gCurrentWindow); - - if (rect.Contains(event.point.x, event.point.y)) { - if (gCurrentWindow == NULL || gCurrentWindow != this) { - if ((nsnull != gCurrentWindow) && (!gCurrentWindow->mIsDestroying)) { - MouseTrailer::IgnoreNextCycle(); - gCurrentWindow->DispatchMouseEvent(NS_MOUSE_EXIT, gCurrentWindow->GetLastPoint()); - } - gCurrentWindow = this; - if (!mIsDestroying) { - gCurrentWindow->DispatchMouseEvent(NS_MOUSE_ENTER); - } - } - } - } else if (aEventType == NS_MOUSE_EXIT) { - if (gCurrentWindow == this) { - gCurrentWindow = nsnull; - } - } - - return result; - } - - if (nsnull != mMouseListener) { - switch (aEventType) { - case NS_MOUSE_MOVE: { - result = ConvertStatus(mMouseListener->MouseMoved(event)); - nsRect rect; - GetBounds(rect); - if (rect.Contains(event.point.x, event.point.y)) { - if (gCurrentWindow == NULL || gCurrentWindow != this) { - printf("Mouse enter"); - gCurrentWindow = this; - } - } else { - printf("Mouse exit"); - } - - } break; - - case NS_MOUSE_LEFT_BUTTON_DOWN: - case NS_MOUSE_MIDDLE_BUTTON_DOWN: - case NS_MOUSE_RIGHT_BUTTON_DOWN: - result = ConvertStatus(mMouseListener->MousePressed(event)); - break; - - case NS_MOUSE_LEFT_BUTTON_UP: - case NS_MOUSE_MIDDLE_BUTTON_UP: - case NS_MOUSE_RIGHT_BUTTON_UP: - result = ConvertStatus(mMouseListener->MouseReleased(event)); - result = ConvertStatus(mMouseListener->MouseClicked(event)); - break; - } // switch - } - return result; -} - -//------------------------------------------------------------------------- -// -// Deal with focus messages -// -//------------------------------------------------------------------------- -PRBool nsWindow::DispatchFocus(PRUint32 aEventType) -{ - // call the event callback - if (mEventCallback) { - if ((nsnull != gCurrentWindow) && (!gCurrentWindow->mIsDestroying)) { - return(DispatchStandardEvent(aEventType)); - } - } - - return PR_FALSE; -} - - -//------------------------------------------------------------------------- -// -// Deal with scrollbar messages (actually implemented only in nsScrollbar) -// -//------------------------------------------------------------------------- -PRBool nsWindow::OnScroll(UINT scrollCode, int cPos) -{ - return PR_FALSE; -} - - -//------------------------------------------------------------------------- -// -// Return the brush used to paint the background of this control -// -//------------------------------------------------------------------------- -HBRUSH nsWindow::OnControlColor() -{ - return mBrush; -} - - -//------------------------------------------------------------------------- -// -// Constructor -// -//------------------------------------------------------------------------- -#define INITIAL_SIZE 2 - -nsWindow::Enumerator::Enumerator() -{ - mRefCnt = 1; - mArraySize = INITIAL_SIZE; - mChildrens = (nsIWidget**)new DWORD[mArraySize]; - memset(mChildrens, 0, sizeof(DWORD) * mArraySize); - mCurrentPosition = 0; -} - - -//------------------------------------------------------------------------- -// -// Destructor -// -//------------------------------------------------------------------------- -nsWindow::Enumerator::~Enumerator() -{ - if (mChildrens) { - //for (int i = 0; mChildrens[i] && i < mArraySize; i++) { - // NS_RELEASE(mChildrens[i]); - //} - - delete[] mChildrens; - } -} - -// -// nsISupports implementation macro -// -NS_IMPL_ISUPPORTS(nsWindow::Enumerator, NS_IENUMERATOR_IID); - -//------------------------------------------------------------------------- -// -// Get enumeration next element. Return null at the end -// -//------------------------------------------------------------------------- -nsISupports* nsWindow::Enumerator::Next() -{ - if (mCurrentPosition < mArraySize && mChildrens[mCurrentPosition]) { - mChildrens[mCurrentPosition]->AddRef(); - return mChildrens[mCurrentPosition++]; - } - - return NULL; -} - - -//------------------------------------------------------------------------- -// -// Reset enumerator internal pointer to the beginning -// -//------------------------------------------------------------------------- -void nsWindow::Enumerator::Reset() -{ - mCurrentPosition = 0; -} - - -//------------------------------------------------------------------------- -// -// Append an element -// -//------------------------------------------------------------------------- -void nsWindow::Enumerator::Append(nsIWidget* aWidget) -{ - NS_PRECONDITION(aWidget, "Null widget"); - if (aWidget) { - int pos; - for (pos = 0; pos < mArraySize && mChildrens[pos]; pos++); - if (pos == mArraySize) { - GrowArray(); - } - mChildrens[pos] = aWidget; - aWidget->AddRef(); - } -} - - -//------------------------------------------------------------------------- -// -// Remove an element -// -//------------------------------------------------------------------------- -void nsWindow::Enumerator::Remove(nsIWidget* aWidget) -{ - int pos; - for(pos = 0; mChildrens[pos] && (mChildrens[pos] != aWidget); pos++); - if (mChildrens[pos] == aWidget) { - NS_RELEASE(aWidget); - memcpy(mChildrens + pos, mChildrens + pos + 1, mArraySize - pos - 1); - } - -} - - -//------------------------------------------------------------------------- -// -// Grow the size of the children array -// -//------------------------------------------------------------------------- -void nsWindow::Enumerator::GrowArray() -{ - mArraySize <<= 1; - nsIWidget **newArray = (nsIWidget**)new DWORD[mArraySize]; - memset(newArray, 0, sizeof(DWORD) * mArraySize); - memcpy(newArray, mChildrens, (mArraySize>>1) * sizeof(DWORD)); - mChildrens = newArray; -} - - -//------------------------------------------------------------------------- -// -// return the style for a child nsWindow -// -//------------------------------------------------------------------------- -DWORD ChildWindow::WindowStyle() -{ - return WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | GetBorderStyle(mBorderStyle); -} - - -DWORD nsWindow::GetBorderStyle(nsBorderStyle aBorderStyle) -{ - switch(aBorderStyle) - { - case eBorderStyle_none: - return(0); - break; - - case eBorderStyle_dialog: - return(WS_DLGFRAME | DS_3DLOOK); - break; - - default: - NS_ASSERTION(0, "unknown border style"); - return(WS_OVERLAPPEDWINDOW); - } -} - - -void nsWindow::SetBorderStyle(nsBorderStyle aBorderStyle) -{ - mBorderStyle = aBorderStyle; -} - -void nsWindow::SetTitle(const nsString& aTitle) -{ - NS_ALLOC_STR_BUF(buf, aTitle, 256); - ::SendMessage(mWnd, WM_SETTEXT, (WPARAM)0, (LPARAM)(LPCTSTR)buf); - NS_FREE_STR_BUF(buf); -} - - -/** - * Processes a mouse pressed event - * - **/ -void nsWindow::AddMouseListener(nsIMouseListener * aListener) -{ - NS_PRECONDITION(mMouseListener == nsnull, "Null mouse listener"); - mMouseListener = aListener; -} - -/** - * Processes a mouse pressed event - * - **/ -void nsWindow::AddEventListener(nsIEventListener * aListener) -{ - NS_PRECONDITION(mEventListener == nsnull, "Null mouse listener"); - mEventListener = aListener; -} - -PRBool nsWindow::AutoErase() -{ - return(PR_FALSE); -} - - - diff --git a/mozilla/widget/src/windows/nsWindow.h b/mozilla/widget/src/windows/nsWindow.h deleted file mode 100644 index f8e873fbea7..00000000000 --- a/mozilla/widget/src/windows/nsWindow.h +++ /dev/null @@ -1,431 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef Window_h__ -#define Window_h__ - -#include "nsdefs.h" -#include "nsObject.h" -#include "nsSwitchToUIThread.h" -#include "nsToolkit.h" - -#include "nsIWidget.h" -#include "nsIEnumerator.h" - -#include "nsIMouseListener.h" -#include "nsIEventListener.h" -#include "nsStringUtil.h" -#include "nsString.h" - - -#define NSRGB_2_COLOREF(color) \ - RGB(NS_GET_R(color),NS_GET_G(color),NS_GET_B(color)) - -/** - * Native WIN32 window wrapper. - */ - -class nsWindow : public nsObject, - public nsIWidget, - public nsSwitchToUIThread -{ - -public: - nsWindow(nsISupports *aOuter); - virtual ~nsWindow(); - - // nsISupports. Forward to the nsObject base class - BASE_SUPPORT - - virtual nsresult QueryObject(const nsIID& aIID, void** aInstancePtr); - - virtual void PreCreateWidget(nsWidgetInitData *aWidgetInitData) {} - // nsIWidget interface - virtual void Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - virtual void Create(nsNativeWidget aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - virtual void Destroy(); - virtual nsIWidget* GetParent(void); - virtual nsIEnumerator* GetChildren(); - virtual void AddChild(nsIWidget* aChild); - virtual void RemoveChild(nsIWidget* aChild); - virtual void Show(PRBool bState); - virtual void Move(PRUint32 aX, PRUint32 aY); - virtual void Resize(PRUint32 aWidth, - PRUint32 aHeight, - PRBool aRepaint); - virtual void Resize(PRUint32 aX, - PRUint32 aY, - PRUint32 aWidth, - PRUint32 aHeight, - PRBool aRepaint); - virtual void Enable(PRBool bState); - virtual void SetFocus(void); - virtual void GetBounds(nsRect &aRect); - virtual nscolor GetForegroundColor(void); - virtual void SetForegroundColor(const nscolor &aColor); - virtual nscolor GetBackgroundColor(void); - virtual void SetBackgroundColor(const nscolor &aColor); - virtual nsIFontMetrics* GetFont(void); - virtual void SetFont(const nsFont &aFont); - virtual nsCursor GetCursor(); - virtual void SetCursor(nsCursor aCursor); - virtual void Invalidate(PRBool aIsSynchronous); - virtual void* GetNativeData(PRUint32 aDataType); - virtual nsIRenderingContext* GetRenderingContext(); - virtual void SetColorMap(nsColorMap *aColorMap); - virtual nsIDeviceContext* GetDeviceContext(); - virtual void Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect); - virtual nsIToolkit* GetToolkit(); - virtual void SetBorderStyle(nsBorderStyle aBorderStyle); - virtual void SetTitle(const nsString& aTitle); - virtual void SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]); - virtual void RemoveTooltips(); - virtual void UpdateTooltips(nsRect* aNewTips[]); - virtual void WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect); - virtual void ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect); - virtual void AddMouseListener(nsIMouseListener * aListener); - virtual void AddEventListener(nsIEventListener * aListener); - virtual void BeginResizingChildren(void); - virtual void EndResizingChildren(void); - - // nsSwitchToUIThread interface - virtual BOOL CallMethod(MethodInfo *info); - - HWND GetWindowHandle() { return mWnd; } - WNDPROC GetPrevWindowProc() { return mPrevWndProc; } - - virtual PRBool DispatchMouseEvent(PRUint32 aEventType, nsPoint* aPoint = nsnull); - virtual PRBool AutoErase(); - nsPoint* GetLastPoint() { return &mLastPoint; } - -protected: - - virtual PRBool ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *aRetValue); - - // Allow Derived classes to modify the height that is passed - // when the window is created or resized. - virtual PRInt32 GetHeight(PRInt32 aProposedHeight); - virtual LPCTSTR WindowClass(); - virtual DWORD WindowStyle(); - virtual DWORD WindowExStyle(); - - void SubclassWindow(BOOL bState); - - virtual void OnDestroy(); - virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); - virtual PRBool OnPaint(); - virtual PRBool OnResize(nsRect &aWindowRect); - virtual PRBool OnKey(PRUint32 aEventType, PRUint32 aKeyCode); - - virtual PRBool DispatchFocus(PRUint32 aEventType); - virtual PRBool OnScroll(UINT scrollCode, int cPos); - virtual HBRUSH OnControlColor(); - - static LRESULT CALLBACK WindowProc(HWND hWnd, - UINT msg, - WPARAM wParam, - LPARAM lParam); - - static PRBool ConvertStatus(nsEventStatus aStatus); - DWORD GetBorderStyle(nsBorderStyle aBorderStyle); - - void InitEvent(nsGUIEvent& event, PRUint32 aEventType, nsPoint* aPoint = nsnull); - PRBool DispatchEvent(nsGUIEvent* event); - PRBool DispatchStandardEvent(PRUint32 aMsg); - void AddTooltip(HWND hwndOwner, nsRect* aRect, int aId); - void RelayMouseEvent(UINT aMsg, WPARAM wParam, LPARAM lParam); - - void GetNonClientBounds(nsRect &aRect); - -protected: - static nsWindow* gCurrentWindow; - nsPoint mLastPoint; - HWND mWnd; - HWND mTooltip; - HPALETTE mPalette; - WNDPROC mPrevWndProc; - EVENT_CALLBACK mEventCallback; - nsIDeviceContext *mContext; - nsIFontMetrics *mFontMetrics; - nsToolkit *mToolkit; - - nsIMouseListener * mMouseListener; - nsIEventListener * mEventListener; - - nscolor mBackground; - HBRUSH mBrush; - nscolor mForeground; - nsCursor mCursor; - nsBorderStyle mBorderStyle; - - PRBool mIsShiftDown; - PRBool mIsControlDown; - PRBool mIsAltDown; - PRBool mIsDestroying; - - PRInt32 mWidth; - PRInt32 mHeight; - - // keep the list of children - class Enumerator : public nsIEnumerator { - nsIWidget **mChildrens; - int mCurrentPosition; - int mArraySize; - - public: - NS_DECL_ISUPPORTS - - Enumerator(); - ~Enumerator(); - - NS_IMETHOD_(nsISupports*) Next(); - NS_IMETHOD_(void) Reset(); - - void Append(nsIWidget* aWidget); - void Remove(nsIWidget* aWidget); - - private: - void GrowArray(); - - } *mChildren; - - // Enumeration of the methods which are accessable on the "main GUI thread" - // via the CallMethod(...) mechanism... - // see nsSwitchToUIThread - enum { - CREATE = 0x0101, - CREATE_NATIVE, - DESTROY, - SET_FOCUS, - SET_CURSOR, - CREATE_HACK - }; - - static BOOL sIsRegistered; - - HDWP mDeferredPositioner; -}; - -// -// A child window is a window with different style -// -class ChildWindow : public nsWindow { - -public: - ChildWindow(nsISupports *aOuter) : nsWindow(aOuter) {} - -protected: - virtual DWORD WindowStyle(); - virtual DWORD WindowExStyle() { return 0; } -}; - -#define BASE_IWIDGET_IMPL BASE_INITIALIZE_IMPL BASE_WINDOWS_METHODS - - -#define BASE_INITIALIZE_IMPL \ - void Create(nsIWidget *aParent, \ - const nsRect &aRect, \ - EVENT_CALLBACK aHandleEventFunction, \ - nsIDeviceContext *aContext, \ - nsIToolkit *aToolkit = nsnull, \ - nsWidgetInitData *aInitData = nsnull) \ - { \ - nsWindow::Create(aParent, aRect, aHandleEventFunction, aContext, aToolkit, aInitData); \ - } \ - -#define BASE_WINDOWS_METHODS \ - void Create(nsNativeWidget aParent, \ - const nsRect &aRect, \ - EVENT_CALLBACK aHandleEventFunction, \ - nsIDeviceContext *aContext, \ - nsIToolkit *aToolkit = nsnull, \ - nsWidgetInitData *aInitData = nsnull) \ - { \ - nsWindow::Create(aParent, aRect, aHandleEventFunction, aContext, aToolkit, aInitData); \ - } \ - void Destroy(void) \ - { \ - nsWindow::Destroy(); \ - } \ - nsIWidget* GetParent(void) \ - { \ - return nsWindow::GetParent(); \ - } \ - nsIEnumerator* GetChildren(void) \ - { \ - return nsWindow::GetChildren(); \ - } \ - void AddChild(nsIWidget* aChild) \ - { \ - nsWindow::AddChild(aChild); \ - } \ - void RemoveChild(nsIWidget* aChild) \ - { \ - nsWindow::RemoveChild(aChild); \ - } \ - void Show(PRBool bState) \ - { \ - nsWindow::Show(bState); \ - } \ - void Move(PRUint32 aX, PRUint32 aY) \ - { \ - nsWindow::Move(aX, aY); \ - } \ - void Resize(PRUint32 aWidth, \ - PRUint32 aHeight, \ - PRBool aRepaint) \ - { \ - nsWindow::Resize(aWidth, aHeight, aRepaint); \ - } \ - void Resize(PRUint32 aX, \ - PRUint32 aY, \ - PRUint32 aWidth, \ - PRUint32 aHeight, \ - PRBool aRepaint) \ - { \ - nsWindow::Resize(aX, aY, aWidth, aHeight, aRepaint); \ - } \ - void Enable(PRBool bState) \ - { \ - nsWindow::Enable(bState); \ - } \ - void SetFocus(void) \ - { \ - nsWindow::SetFocus(); \ - } \ - nscolor GetForegroundColor(void) \ - { \ - return nsWindow::GetForegroundColor(); \ - } \ - void SetForegroundColor(const nscolor &aColor) \ - { \ - nsWindow::SetForegroundColor(aColor); \ - } \ - nscolor GetBackgroundColor(void) \ - { \ - return nsWindow::GetBackgroundColor(); \ - } \ - void SetBackgroundColor(const nscolor &aColor) \ - { \ - nsWindow::SetBackgroundColor(aColor); \ - } \ - nsIFontMetrics* GetFont(void) \ - { \ - return nsWindow::GetFont(); \ - } \ - void SetFont(const nsFont &aFont) \ - { \ - nsWindow::SetFont(aFont); \ - } \ - nsCursor GetCursor() \ - { \ - return nsWindow::GetCursor(); \ - } \ - void SetCursor(nsCursor aCursor) \ - { \ - nsWindow::SetCursor(aCursor); \ - } \ - void Invalidate(PRBool aIsSynchronous) \ - { \ - nsWindow::Invalidate(aIsSynchronous); \ - } \ - void* GetNativeData(PRUint32 aDataType) \ - { \ - return nsWindow::GetNativeData(aDataType); \ - } \ - nsIRenderingContext* GetRenderingContext() \ - { \ - return nsWindow::GetRenderingContext(); \ - } \ - nsIDeviceContext* GetDeviceContext() \ - { \ - return nsWindow::GetDeviceContext(); \ - } \ - void Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect) \ - { \ - nsWindow::Scroll(aDx, aDy, aClipRect); \ - } \ - nsIToolkit* GetToolkit() \ - { \ - return nsWindow::GetToolkit(); \ - } \ - void SetColorMap(nsColorMap *aColorMap) \ - { \ - nsWindow::SetColorMap(aColorMap); \ - } \ - void AddMouseListener(nsIMouseListener * aListener) \ - { \ - nsWindow::AddMouseListener(aListener); \ - } \ - void AddEventListener(nsIEventListener * aListener) \ - { \ - nsWindow::AddEventListener(aListener); \ - } \ - PRBool OnKey(PRUint32 aEventType, PRUint32 aKeyCode) \ - { \ - return nsWindow::OnKey(aEventType, aKeyCode); \ - } \ - void SetBorderStyle(nsBorderStyle aBorderStyle) \ - { \ - nsWindow::SetBorderStyle(aBorderStyle); \ - } \ - void SetTitle(const nsString& aTitle) \ - { \ - nsWindow::SetTitle(aTitle); \ - } \ - void SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]) \ - { \ - nsWindow::SetTooltips(aNumberOfTips, aTooltipAreas); \ - } \ - void UpdateTooltips(nsRect* aNewTips[]) \ - { \ - nsWindow::UpdateTooltips(aNewTips); \ - } \ - void RemoveTooltips() \ - { \ - nsWindow::RemoveTooltips(); \ - } \ - void WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) \ - { \ - nsWindow::WidgetToScreen(aOldRect, aNewRect); \ - } \ - void ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) \ - { \ - nsWindow::ScreenToWidget(aOldRect, aNewRect); \ - } \ - void BeginResizingChildren(void) \ - { \ - nsWindow::BeginResizingChildren(); \ - } \ - void EndResizingChildren(void) \ - { \ - nsWindow::EndResizingChildren(); \ - } - - - -#endif // Window_h__ diff --git a/mozilla/widget/src/windows/nsdefs.h b/mozilla/widget/src/windows/nsdefs.h deleted file mode 100644 index 9ef00bb72b5..00000000000 --- a/mozilla/widget/src/windows/nsdefs.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef NSDEFS_H -#define NSDEFS_H - -#include - -#ifdef _DEBUG - #define BREAK_TO_DEBUGGER DebugBreak() -#else - #define BREAK_TO_DEBUGGER -#endif - -#ifdef _DEBUG - #define VERIFY(exp) ((exp) ? 0: (GetLastError(), BREAK_TO_DEBUGGER)) -#else // !_DEBUG - #define VERIFY(exp) (exp) -#endif // !_DEBUG - -#endif // NSDEFS_H - - diff --git a/mozilla/widget/src/windows/res/select.cur b/mozilla/widget/src/windows/res/select.cur deleted file mode 100644 index 5a88b3707eec9461f920e225a5091ff46a913737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmZ|JI}U>|5QO31>5xL37D~$8Aha9?}VU8#*cu#97bF-e3*5>M#jqtM1;_X_uv(z=Z`|;k@yj|`;99I{lKcvPu5%WH( Nq`_mhzQ?g=$q&;}dK3Tv diff --git a/mozilla/widget/src/windows/resource.h b/mozilla/widget/src/windows/resource.h deleted file mode 100644 index 0573a0dfe4b..00000000000 --- a/mozilla/widget/src/windows/resource.h +++ /dev/null @@ -1,18 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#define IDC_SELECTANCHOR 4100 diff --git a/mozilla/widget/src/windows/widget.rc b/mozilla/widget/src/windows/widget.rc deleted file mode 100644 index 7273757ce1e..00000000000 --- a/mozilla/widget/src/windows/widget.rc +++ /dev/null @@ -1,20 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "resource.h" - -IDC_SELECTANCHOR CURSOR DISCARDABLE "res\\select.cur" diff --git a/mozilla/widget/tests/Makefile b/mozilla/widget/tests/Makefile deleted file mode 100644 index 0725c58d807..00000000000 --- a/mozilla/widget/tests/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH = ../.. - -include $(DEPTH)/config/config.mk - -include $(DEPTH)/config/rules.mk diff --git a/mozilla/widget/tests/makefile.win b/mozilla/widget/tests/makefile.win deleted file mode 100644 index fca5ccce136..00000000000 --- a/mozilla/widget/tests/makefile.win +++ /dev/null @@ -1,23 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\.. -IGNORE_MANIFEST=1 - -DIRS=scribble widget - -include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/widget/tests/scribble/Makefile b/mozilla/widget/tests/scribble/Makefile deleted file mode 100644 index 0201b8c287e..00000000000 --- a/mozilla/widget/tests/scribble/Makefile +++ /dev/null @@ -1,130 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../../.. - -include $(DEPTH)/config/config.mk - -CPPSRCS = \ - main.cpp \ - $(NULL) - -INCLUDES+= -I$(PUBLIC)/raptor -I$(PUBLIC)/xpcom -I$(PUBLIC)/shell - -DIRS = - -OBJS = $(CPPSRCS:.cpp=.o) - -EX_LIBS = \ - $(DIST)/bin/libraptorbase.so \ - $(DIST)/bin/libpng.so \ - $(DIST)/bin/libpref.so \ - $(DIST)/bin/libraptorbase.so \ - $(DIST)/bin/libwidgetunix.so \ - $(DIST)/bin/libraptorgfx.so \ - $(DIST)/bin/libgfxunix.so \ - $(DIST)/bin/libraptorhtml.so \ - $(DIST)/bin/libgmbaseunix.so \ - $(DIST)/bin/libraptorhtmlbase_s.so \ - $(DIST)/bin/libraptorhtmldoc_s.so \ - $(DIST)/bin/libraptorhtmlforms_s.so \ - $(DIST)/bin/libraptorhtmlpars.so \ - $(DIST)/bin/libraptorhtmlstyle_s.so \ - $(DIST)/bin/libraptorhtmltable_s.so \ - $(DIST)/bin/libraptorlayout_s.so \ - $(DIST)/bin/libraptorevents_s.so \ - $(DIST)/bin/libraptorview.so \ - $(DIST)/bin/libreg.so \ - $(DIST)/bin/libabouturl.so \ - $(DIST)/bin/libfileurl.so \ - $(DIST)/bin/libftpurl.so \ - $(DIST)/bin/libgophurl.so \ - $(DIST)/bin/libhttpurl.so \ - $(DIST)/bin/libimg.so \ - $(DIST)/bin/libjpeg.so \ - $(DIST)/bin/libjs.so \ - $(DIST)/bin/libjsdom.so \ - $(DIST)/bin/libjsj.so \ - $(DIST)/bin/libmimetype.so \ - $(DIST)/bin/libmsgc21.so \ - $(DIST)/bin/libnetcache.so \ - $(DIST)/bin/libnetcnvts.so \ - $(DIST)/bin/libnetlib.so \ - $(DIST)/bin/libnetutil.so \ - $(DIST)/bin/libnetwork.so \ - $(DIST)/bin/libnspr21.so \ - $(DIST)/bin/libplc21.so \ - $(DIST)/bin/libplds21.so \ - $(DIST)/bin/libraptorwebwidget.so \ - $(DIST)/bin/libreg.so \ - $(DIST)/bin/libremoturl.so \ - $(DIST)/bin/libsecfree.so \ - $(DIST)/bin/libstubnj.so \ - $(DIST)/bin/libstubsj.so \ - $(DIST)/bin/libtestdynamic.so \ - $(DIST)/bin/libutil.so \ - $(DIST)/bin/libxp.so \ - $(DIST)/bin/libxpcom.so \ - $(DIST)/bin/libzlib.so \ - $(DIST)/bin/libutil.so \ - $(DIST)/bin/libxp.so \ - $(DIST)/bin/libxpcom.so \ - $(DIST)/bin/libzlib.so \ - $(DIST)/bin/libnglcsslay_s.so \ - $(DIST)/bin/libnglhtmlcon_s.so \ - $(NULL) - -ifeq ($(OS_ARCH),Linux) -EX_LIBS += \ - $(DIST)/bin/libpwcac.so \ - $(DIST)/bin/libdbm.so \ - $(NULL) -endif - -PROGS = $(addprefix $(OBJDIR)/, $(CPPSRCS:.cpp=)) - -TARGETS = $(PROGS) - -include $(DEPTH)/config/rules.mk - -$(OBJDIR)/Scribble.o:: Scribble.cpp - $(CCC) -o $@ -c $(CFLAGS) Scribble.cpp $(LDFLAGS) - - -$(OBJDIR)/%.o: %.cpp - @$(MAKE_OBJDIR) - $(CCC) -o $@ $(CFLAGS) -c $*.cpp - -$(PROGS):$(OBJDIR)/%: $(OBJDIR)/%.o $(OBJDIR)/Scribble.o $(EX_LIBS) - @$(MAKE_OBJDIR) -ifeq ($(OS_ARCH),Linux) - $(CCC) -rdynamic -o $@ $@.o $(OBJDIR)/Scribble.o $(LDFLAGS) $(EX_LIBS) $(OS_LIBS) -L/usr/X11R6/lib -lXm -lXt -lX11 -lXp -lXext -else - $(CCC) -o $@ $@.o -woff 84,85 $(LDFLAGS) $(OBJDIR)/Scribble.o $(EX_LIBS) $(OS_LIBS) -lXm -lXt -lX11 -endif - -export:: - - - -install:: $(TARGETS) - $(INSTALL) $(PROGS) $(DIST)/bin - -clobber:: - rm -f $(DIST)/bin/viewer.exe - - diff --git a/mozilla/widget/tests/scribble/Scribble.cpp b/mozilla/widget/tests/scribble/Scribble.cpp deleted file mode 100644 index 6ea175b3f9b..00000000000 --- a/mozilla/widget/tests/scribble/Scribble.cpp +++ /dev/null @@ -1,602 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include -#include - -#include "nsIButton.h" -#include "nsICheckButton.h" -#include "nsIRadioButton.h" -#include "nsITextWidget.h" -#include "nsIScrollbar.h" -#include "nsGUIEvent.h" -#include "nsIEnumerator.h" -#include "nsIRenderingContext.h" -#include "nsFont.h" -#include "nsUnitConversion.h" -#include "nsColor.h" -#include "nsString.h" -#include "Scribble.h" -#include "nsIDeviceContext.h" -#include "nsTransform2D.h" -#include "nsGfxCIID.h" -#include "nsWidgetsCID.h" -#include "nsIAppShell.h" - -ScribbleApp scribbleData; - -#ifdef XP_PC -#define WIDGET_DLL "raptorwidget.dll" -#define GFX_DLL "raptorgfxwin.dll" -#define TEXT_HEIGHT 25 -#endif - -#ifdef XP_UNIX -#define WIDGET_DLL "libwidgetunix.so" -#define GFX_DLL "libgfxunix.so" -#define TEXT_HEIGHT 30 -#endif - - -static NS_DEFINE_IID(kCAppShellCID, NS_APPSHELL_CID); -static NS_DEFINE_IID(kIAppShellIID, NS_IAPPSHELL_IID); -static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID); -static NS_DEFINE_IID(kIButtonIID, NS_IBUTTON_IID); -static NS_DEFINE_IID(kIScrollbarIID, NS_ISCROLLBAR_IID); -static NS_DEFINE_IID(kICheckButtonIID, NS_ICHECKBUTTON_IID); -static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID); -static NS_DEFINE_IID(kIRadioButtonIID, NS_IRADIOBUTTON_IID); - - -// -// Main window events -// -nsEventStatus PR_CALLBACK HandleEventMain(nsGUIEvent *aEvent) -{ - - //printf("aEvent->message %d on 0x%X\n", aEvent->message, aEvent->widget); - - nsEventStatus result = nsEventStatus_eConsumeNoDefault; - switch(aEvent->message) { - - case NS_SIZE: - { - nsIEnumerator *enumer = aEvent->widget->GetChildren(); - if (enumer) { - nsISupports *next; - next = enumer->Next(); - if (next) { - nsIWidget *widget; - if (NS_OK == next->QueryInterface(kIWidgetIID, (void**)&widget)) { - widget->Resize(0, 0, 200, ((nsSizeEvent*)aEvent)->windowSize->height - 26, PR_TRUE); - NS_RELEASE(widget); - } - } - - NS_RELEASE(enumer); - delete enumer; - } - - scribbleData.drawPane->Resize(200, - 0, - ((nsSizeEvent*)aEvent)->windowSize->width - 206, - ((nsSizeEvent*)aEvent)->windowSize->height - 26, - PR_TRUE); - - break; - } - - case NS_DESTROY: - printf("Destroy Window...Release window\n"); - NS_RELEASE(scribbleData.red); - NS_RELEASE(scribbleData.green); - NS_RELEASE(scribbleData.blue); - NS_RELEASE(scribbleData.scribble); - NS_RELEASE(scribbleData.lines); - // NS_RELEASE(scribbleData.drawPane); - // NS_RELEASE(scribbleData.mainWindow); - - exit(0); // for now - break; - - default: - result = nsEventStatus_eIgnore; - } - - return result; -} - - -// -// Control pane events -// -nsEventStatus PR_CALLBACK HandleEventControlPane(nsGUIEvent *aEvent) -{ - //printf("aEvent->message %d on 0x%X\n", aEvent->message, aEvent->widget); - - nsEventStatus result = nsEventStatus_eConsumeNoDefault; - switch(aEvent->message) { - case NS_PAINT: - { - // paint the background - nsIRenderingContext *drawCtx = ((nsPaintEvent*)aEvent)->renderingContext; - drawCtx->SetColor(aEvent->widget->GetBackgroundColor()); - drawCtx->FillRect(*(((nsPaintEvent*)aEvent)->rect)); - - // draw the line separating the two panes - drawCtx->SetColor(aEvent->widget->GetForegroundColor()); - drawCtx->DrawLine(198, 0, 198, 800); - drawCtx->DrawLine(199, 0, 199, 800); - drawCtx->DrawLine(200, 0, 200, 800); - - // draw the colors text - nsFont font("Times", NS_FONT_STYLE_NORMAL, - NS_FONT_VARIANT_NORMAL, - NS_FONT_WEIGHT_BOLD, - 0, - 12); - drawCtx->SetFont(font); - - int y = 351; - nsString red("Red"); - drawCtx->SetColor(NS_RGB(255, 0, 0)); - drawCtx->DrawString(red, 50, y, 200); - y += TEXT_HEIGHT+2; - - nsString green("Green"); - drawCtx->SetColor(NS_RGB(0, 255, 0)); - drawCtx->DrawString(green, 50, y, 100); - y += TEXT_HEIGHT+2; - - nsString blue("Blue"); - drawCtx->SetColor(NS_RGB(0, 0, 255)); - drawCtx->DrawString(blue, 50, y, 100); - y += TEXT_HEIGHT+2; - - return nsEventStatus_eConsumeNoDefault; - } - } - - return nsEventStatus_eIgnore; -} - - -// -// Graphic pane events -// -nsEventStatus PR_CALLBACK HandleEventGraphicPane(nsGUIEvent *aEvent) -{ - //printf("aEvent->message %d on 0x%X\n", aEvent->message, aEvent->widget); - - nsEventStatus result = nsEventStatus_eConsumeNoDefault; - switch(aEvent->message) { - - case NS_PAINT: - { - nsIRenderingContext *drawCtx = ((nsPaintEvent*)aEvent)->renderingContext; - drawCtx->SetColor(aEvent->widget->GetBackgroundColor()); - drawCtx->FillRect(*(((nsPaintEvent*)aEvent)->rect)); - - return nsEventStatus_eConsumeNoDefault; - } - - case NS_MOUSE_LEFT_BUTTON_DOWN: - aEvent->widget->SetFocus(); - scribbleData.isDrawing = PR_TRUE; - scribbleData.mousePos = ((nsGUIEvent*)aEvent)->point; - return nsEventStatus_eConsumeNoDefault; - - case NS_MOUSE_LEFT_BUTTON_UP: - scribbleData.isDrawing = PR_FALSE; - return nsEventStatus_eConsumeNoDefault; - - case NS_MOUSE_MOVE: - { - if (scribbleData.isDrawing) { - nsIRenderingContext *drawCtx = aEvent->widget->GetRenderingContext(); - drawCtx->SetColor(aEvent->widget->GetForegroundColor()); - drawCtx->DrawLine(scribbleData.mousePos.x, - scribbleData.mousePos.y, - ((nsGUIEvent*)aEvent)->point.x, - ((nsGUIEvent*)aEvent)->point.y); - - if (scribbleData.scribble->GetState()) - scribbleData.mousePos = ((nsGUIEvent*)aEvent)->point; - - - NS_RELEASE(drawCtx); - } - - return nsEventStatus_eConsumeNoDefault; - } - - } - - return nsEventStatus_eIgnore; -} - - -// -// Buttons events -// -nsEventStatus PR_CALLBACK HandleEventButton(nsGUIEvent *aEvent) -{ - //printf("aEvent->message %d on 0x%X\n", aEvent->message, aEvent->widget); - - switch(aEvent->message) { - case NS_MOUSE_LEFT_BUTTON_UP: - scribbleData.drawPane->Invalidate(PR_TRUE); - } - - return nsEventStatus_eIgnore; -} - -// -// Buttons events -// -nsEventStatus PR_CALLBACK HandleEventRadioButton(nsGUIEvent *aEvent) -{ - //printf("aEvent->message %d on 0x%X\n", aEvent->message, aEvent->widget); - - switch(aEvent->message) { - case NS_MOUSE_LEFT_BUTTON_UP: { - nsIWidget * win; - if (NS_OK == scribbleData.lines->QueryInterface(kIWidgetIID, (void**)&win)) { - if (win == aEvent->widget) { - scribbleData.lines->SetState(PR_TRUE); - scribbleData.scribble->SetState(PR_FALSE); - } else { - scribbleData.lines->SetState(PR_FALSE); - scribbleData.scribble->SetState(PR_TRUE); - } - } - } - } - - return nsEventStatus_eIgnore; -} - - - -// -// Handle events for the auto-mode (rectangles/circles) -// -nsEventStatus PR_CALLBACK HandleEventCheck(nsGUIEvent *aEvent) -{ - //printf("aEvent->message %d on 0x%X\n", aEvent->message, aEvent->widget); - //printf("aEvent->message %d == %d on 0x%X\n", aEvent->message, NS_MOUSE_LEFT_BUTTON_UP, aEvent->widget); - - switch(aEvent->message) { - case NS_MOUSE_LEFT_BUTTON_UP: - { - nsICheckButton *option; - - if (NS_OK == aEvent->widget->QueryInterface(kICheckButtonIID, (void**)&option)) { - // invert the two checkboxes state - PRBool state = option->GetState(); - option->SetState((state) ? PR_FALSE : PR_TRUE); - - if (state == PR_FALSE) { - nsAutoString buf; - option->GetLabel(buf); - - nsIRenderingContext *drawCtx = scribbleData.drawPane->GetRenderingContext(); - - // - srand(aEvent->time); - if (drawCtx) { - - // a sort of random rect - nsRect rect; - scribbleData.drawPane->GetBounds(rect); - nscoord width = rect.width; - nscoord height = rect.height; - - nsString circles("Circles"); - nsString rects("Rectangles"); - if (buf.Equals(circles)) { - for (int i = 0; i < 100; i++) { - drawCtx->SetColor((nscolor)rand()); - - rect.MoveTo(rand() % width, rand() % height); - rect.SizeTo(rand() % (width - rect.x), - rand() % (height - rect.y)); - drawCtx->DrawEllipse(rect); - } - } - else if (buf.Equals(rects)) { - for (int i = 0; i < 100; i++) { - drawCtx->SetColor((nscolor)rand()); - - rect.MoveTo(rand() % width, rand() % height); - rect.SizeTo(rand() % (width - rect.x), - rand() % (height - rect.y)); - drawCtx->DrawRect(rect); - } - } - - NS_RELEASE(drawCtx); - } - } - } - - } - } - - return nsEventStatus_eIgnore; -} - - -// -// Handle events for the text fields -// -nsEventStatus PR_CALLBACK HandleEventText(nsGUIEvent *aEvent) -{ - //if (aEvent->message != 300) - //printf("HandleEventText message %d on 0x%X\n", aEvent->message, aEvent->widget); - - switch(aEvent->message) { - case NS_LOSTFOCUS: - { - nscolor color = scribbleData.drawPane->GetForegroundColor(); - nsAutoString buf; - - nsITextWidget *text; - if (NS_OK == aEvent->widget->QueryInterface(kITextWidgetIID, (void**)&text)) { - if (text == scribbleData.red) { - scribbleData.red->GetText(buf, 0); - PRInt32 value, err; - value = buf.ToInteger(&err); - color = NS_RGB(value, NS_GET_G(color), NS_GET_B(color)); - } - else if (text == scribbleData.green) { - scribbleData.green->GetText(buf, 0); - PRInt32 value, err; - value = buf.ToInteger(&err); - color = NS_RGB(NS_GET_R(color), value, NS_GET_B(color)); - } - else if (text == scribbleData.blue) { - scribbleData.blue->GetText(buf, 0); - PRInt32 value, err; - value = buf.ToInteger(&err); - color = NS_RGB(NS_GET_R(color), NS_GET_G(color), value); - } - - NS_RELEASE(text); - } - - scribbleData.drawPane->SetForegroundColor(color); - - return nsEventStatus_eIgnore; - } - } - - return nsEventStatus_eIgnore; -} - - -// -// Main application entry function -// -nsresult CreateApplication(int * argc, char ** argv) -{ - scribbleData.isDrawing = PR_FALSE; - - // register graphics classes - static NS_DEFINE_IID(kCRenderingContextIID, NS_RENDERING_CONTEXT_CID); - static NS_DEFINE_IID(kCDeviceContextIID, NS_DEVICE_CONTEXT_CID); - static NS_DEFINE_IID(kCFontMetricsIID, NS_FONT_METRICS_CID); - static NS_DEFINE_IID(kCImageIID, NS_IMAGE_CID); - - NSRepository::RegisterFactory(kCRenderingContextIID, GFX_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCDeviceContextIID, GFX_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCFontMetricsIID, GFX_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCImageIID, GFX_DLL, PR_FALSE, PR_FALSE); - - // register widget classes - static NS_DEFINE_IID(kCWindowCID, NS_WINDOW_CID); - static NS_DEFINE_IID(kCChildCID, NS_CHILD_CID); - static NS_DEFINE_IID(kCButtonCID, NS_BUTTON_CID); - static NS_DEFINE_IID(kCCheckButtonCID, NS_CHECKBUTTON_CID); - static NS_DEFINE_IID(kCComboBoxCID, NS_COMBOBOX_CID); - static NS_DEFINE_IID(kCFileWidgetCID, NS_FILEWIDGET_CID); - static NS_DEFINE_IID(kCListBoxCID, NS_LISTBOX_CID); - static NS_DEFINE_IID(kCRadioButtonCID, NS_RADIOBUTTON_CID); - static NS_DEFINE_IID(kCHorzScrollbarCID, NS_HORZSCROLLBAR_CID); - static NS_DEFINE_IID(kCVertScrollbarCID, NS_VERTSCROLLBAR_CID); - static NS_DEFINE_IID(kCTextAreaCID, NS_TEXTAREA_CID); - static NS_DEFINE_IID(kCTextFieldCID, NS_TEXTFIELD_CID); - - NSRepository::RegisterFactory(kCAppShellCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCWindowCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCChildCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCButtonCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCCheckButtonCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCComboBoxCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCFileWidgetCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCListBoxCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCRadioButtonCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCHorzScrollbarCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCVertScrollbarCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCTextAreaCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCTextFieldCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - - //NS_InitToolkit(PR_GetCurrentThread()); - - nsresult res; - - static NS_DEFINE_IID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID); - static NS_DEFINE_IID(kDeviceContextIID, NS_IDEVICE_CONTEXT_IID); - - res = NSRepository::CreateInstance(kDeviceContextCID, nsnull, kDeviceContextIID, (void **)&scribbleData.mContext); - - if (NS_OK == res) - scribbleData.mContext->Init(nsnull); - - - // Create an application shell - nsIAppShell *appShell; - NSRepository::CreateInstance(kCAppShellCID, nsnull, kIAppShellIID, (void**)&appShell); - appShell->Create(argc, argv); - - // - // create the main window - // - NSRepository::CreateInstance(kCWindowCID, nsnull, kIWidgetIID, (void **)&(scribbleData.mainWindow)); - //nsRect rect(100, 100, 600, 600); - //scribbleData.mainWindow->Create((nsIWidget*)NULL, rect, HandleEventMain, NULL); -#ifdef XP_PC - nsRect rect(100, 100, 600, 700); - scribbleData.mainWindow->Create((nsIWidget*)NULL, rect, HandleEventMain, NULL); -#endif -#ifdef XP_UNIX - nsRect rect(100, 100, 400, 580); - scribbleData.mainWindow->Create((nsNativeWidget)NULL, rect, HandleEventMain, - (nsIDeviceContext *)nsnull, - (nsIToolkit *)nsnull, - (nsWidgetInitData*)appShell->GetNativeData(NS_NATIVE_SHELL)); -#endif - scribbleData.mainWindow->SetBackgroundColor(NS_RGB(255, 255, 255)); - - // - // create the control pane - // - nsIWidget *controlPane; - rect.SetRect(0, 0, 200, 580); - NSRepository::CreateInstance(kCChildCID, nsnull, kIWidgetIID, (void **)&controlPane); - controlPane->Create(scribbleData.mainWindow, rect, HandleEventControlPane, NULL); - controlPane->SetBackgroundColor(NS_RGB(255, 255, 255)); - - // - // Add the scribble/lines section - // - - // create the "Scribble" check button - rect.SetRect(50, 50, 100, 25); - - NSRepository::CreateInstance(kCRadioButtonCID, nsnull, kIRadioButtonIID, (void **)&(scribbleData.scribble)); - scribbleData.scribble->Create(controlPane, rect, HandleEventRadioButton, NULL); - nsString cbLabel("Scribble"); - scribbleData.scribble->SetLabel(cbLabel); - scribbleData.scribble->SetState(PR_FALSE); - //scribbleData.scribble->SetBackgroundColor(NS_RGB(255, 255, 255)); - scribbleData.scribble->Show(PR_TRUE); - - // create the "Lines" check button - rect.SetRect(50, 75, 100, 25); - - NSRepository::CreateInstance(kCRadioButtonCID, nsnull, kIRadioButtonIID, (void **)&(scribbleData.lines)); - scribbleData.lines->Create(controlPane, rect, HandleEventRadioButton, NULL); - nsString cbLabel1("Lines"); - scribbleData.lines->SetLabel(cbLabel1); - scribbleData.lines->SetState(PR_TRUE); - //scribbleData.lines->SetBackgroundColor(NS_RGB(255, 255, 255)); - scribbleData.lines->Show(PR_TRUE); - // - // Add the circle/rectangle section - // - - // create the "Circles" check button - nsICheckButton * checkButton; - rect.SetRect(50, 200, 100, 25); - - NSRepository::CreateInstance(kCCheckButtonCID, nsnull, kICheckButtonIID, (void **)&checkButton); - checkButton->Create(controlPane, rect, HandleEventCheck, NULL); - nsString cbLabel2("Circles"); - checkButton->SetLabel(cbLabel2); - checkButton->SetBackgroundColor(NS_RGB(255, 255, 255)); - checkButton->Show(PR_TRUE); - NS_RELEASE(checkButton); - - // create the "Rectangles" check button - rect.SetRect(50, 225, 100, 25); - - NSRepository::CreateInstance(kCCheckButtonCID, nsnull, kICheckButtonIID, (void **)&checkButton); - checkButton->Create(controlPane, rect, HandleEventCheck, NULL); - nsString cbLabel3("Rectangles"); - checkButton->SetLabel(cbLabel3); - checkButton->SetBackgroundColor(NS_RGB(255, 255, 255)); - checkButton->Show(PR_TRUE); - NS_RELEASE(checkButton); - - // - // Add the color section - // - - int y = 350; - // create the "red" text widget - rect.SetRect(100, y, 50, TEXT_HEIGHT); - - NSRepository::CreateInstance(kCTextFieldCID, nsnull, kITextWidgetIID, (void **)&(scribbleData.red)); - scribbleData.red->Create(controlPane, rect, HandleEventText, NULL); - nsString initText("0"); - scribbleData.red->SetText(initText); - scribbleData.red->SetBackgroundColor(NS_RGB(0, 0, 255)); - scribbleData.red->Show(PR_TRUE); - y += rect.height +2; - - // create the "green" text widget - rect.SetRect(100, y, 50, TEXT_HEIGHT); - - NSRepository::CreateInstance(kCTextFieldCID, nsnull, kITextWidgetIID, (void **)&(scribbleData.green)); - scribbleData.green->Create(controlPane, rect, HandleEventText, NULL); - scribbleData.green->SetText(initText); - scribbleData.green->SetBackgroundColor(NS_RGB(255, 0, 0)); - scribbleData.green->Show(PR_TRUE); - y += rect.height +2; - - // create the "blue" text widget - rect.SetRect(100, y, 50, TEXT_HEIGHT); - - NSRepository::CreateInstance(kCTextFieldCID, nsnull, kITextWidgetIID, (void **)&(scribbleData.blue)); - scribbleData.blue->Create(controlPane, rect, HandleEventText, NULL); - scribbleData.blue->SetText(initText); - scribbleData.blue->SetBackgroundColor(NS_RGB(0, 255, 0)); - scribbleData.blue->Show(PR_TRUE); - y += rect.height +2; - - // - // create a button - // - nsIButton *button; - rect.SetRect(50, 500, 100, 25); - NSRepository::CreateInstance(kCButtonCID, nsnull, kIButtonIID, (void **)&button); - button->Create(controlPane, rect, HandleEventButton, NULL); - nsString label("Clear"); - button->SetLabel(label); - button->Show(PR_TRUE); - NS_RELEASE(button); - - NS_RELEASE(controlPane); // the parent keeps a reference on this child - - // - // create the draw pane - // - rect.SetRect(200, 0, 400, 580); - NSRepository::CreateInstance(kCChildCID, nsnull, kIWidgetIID, (void **)&scribbleData.drawPane); - scribbleData.drawPane->Create(scribbleData.mainWindow, rect, HandleEventGraphicPane, NULL); - scribbleData.drawPane->SetBackgroundColor(NS_RGB(255, 255, 255)); - - // - // show. We are in business... - // - scribbleData.mainWindow->Show(PR_TRUE); - - return(appShell->Run()); -} - diff --git a/mozilla/widget/tests/scribble/Scribble.h b/mozilla/widget/tests/scribble/Scribble.h deleted file mode 100644 index d64655aaff0..00000000000 --- a/mozilla/widget/tests/scribble/Scribble.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef Scribble_h__ -#define Scribble_h__ - -#include "nsIWidget.h" -#include "nsIRadioButton.h" -#include "nsIRadioGroup.h" -#include "nsITextWidget.h" -#include "nsPoint.h" -#include "nsIDeviceContext.h" - -struct ScribbleApp { - nsIWidget *mainWindow; - nsIWidget *drawPane; - - nsITextWidget *red; - nsITextWidget *green; - nsITextWidget *blue; - - nsIRadioGroup *group; - nsIRadioButton *scribble; - nsIRadioButton *lines; - - PRBool isDrawing; - - nsPoint mousePos; - - nsIDeviceContext *mContext; -}; - - -nsresult CreateApplication(int * argc, char ** argv); - -#endif - - - diff --git a/mozilla/widget/tests/scribble/main.cpp b/mozilla/widget/tests/scribble/main.cpp deleted file mode 100644 index 9d376056032..00000000000 --- a/mozilla/widget/tests/scribble/main.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "Scribble.h" - -#ifdef XP_PC - - -#include - -int WINAPI WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpszCmdLine, - int nCmdShow) -{ - int argC = 0; - char ** argv = NULL; - return(CreateApplication(&argC, argv)); -} - -void main(int argc, char **argv) -{ - WinMain(GetModuleHandle(NULL), NULL, 0, SW_SHOW); -} - -#endif - -#ifdef XP_UNIX -void main(int argc, char **argv) -{ - int argC = argc; - return(CreateApplication(&argC, argv)); - -} -#endif - diff --git a/mozilla/widget/tests/scribble/makefile.win b/mozilla/widget/tests/scribble/makefile.win deleted file mode 100644 index aacc4efdbc2..00000000000 --- a/mozilla/widget/tests/scribble/makefile.win +++ /dev/null @@ -1,51 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. -IGNORE_MANIFEST=1 - - -MAKE_OBJ_TYPE = EXE -PROGRAM = .\$(OBJDIR)\scribble.exe -#RESFILE = scribble.res - -OBJS = \ - .\$(OBJDIR)\main.obj \ - .\$(OBJDIR)\Scribble.obj \ - $(NULL) - -LINCS=-I$(PUBLIC)\raptor -I$(PUBLIC)\xpcom - -MYLIBS= \ - $(DIST)\lib\xpcom32.lib \ - $(LIBNSPR) \ - $(DIST)\lib\raptorbase.lib \ - $(DIST)\lib\raptorgfx.lib \ - $(NULL) - -LLIBS= $(MYLIBS) \ - -SUBSYSTEM:CONSOLE - -include <$(DEPTH)\config\rules.mak> - -install:: $(PROGRAM) - $(MAKE_INSTALL) $(PROGRAM) $(DIST)\bin - -clobber:: - rm -f $(DIST)\bin\scribble.exe - -$(PROGRAM):: $(OBJS) $(MYLIBS) diff --git a/mozilla/widget/tests/widget/Makefile b/mozilla/widget/tests/widget/Makefile deleted file mode 100644 index 68d515759e4..00000000000 --- a/mozilla/widget/tests/widget/Makefile +++ /dev/null @@ -1,130 +0,0 @@ -#!gmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=../../.. - -include $(DEPTH)/config/config.mk - -CPPSRCS = \ - main.cpp \ - $(NULL) - -INCLUDES+= -I$(PUBLIC)/raptor -I$(PUBLIC)/xpcom -I$(PUBLIC)/shell - -DIRS = - -OBJS = $(CPPSRCS:.cpp=.o) - -EX_LIBS = \ - $(DIST)/bin/libraptorbase.so \ - $(DIST)/bin/libpng.so \ - $(DIST)/bin/libpref.so \ - $(DIST)/bin/libraptorbase.so \ - $(DIST)/bin/libwidgetunix.so \ - $(DIST)/bin/libraptorgfx.so \ - $(DIST)/bin/libgfxunix.so \ - $(DIST)/bin/libraptorhtml.so \ - $(DIST)/bin/libgmbaseunix.so \ - $(DIST)/bin/libraptorhtmlbase_s.so \ - $(DIST)/bin/libraptorhtmldoc_s.so \ - $(DIST)/bin/libraptorhtmlforms_s.so \ - $(DIST)/bin/libraptorhtmlpars.so \ - $(DIST)/bin/libraptorhtmlstyle_s.so \ - $(DIST)/bin/libraptorhtmltable_s.so \ - $(DIST)/bin/libraptorlayout_s.so \ - $(DIST)/bin/libraptorevents_s.so \ - $(DIST)/bin/libraptorview.so \ - $(DIST)/bin/libreg.so \ - $(DIST)/bin/libabouturl.so \ - $(DIST)/bin/libfileurl.so \ - $(DIST)/bin/libftpurl.so \ - $(DIST)/bin/libgophurl.so \ - $(DIST)/bin/libhttpurl.so \ - $(DIST)/bin/libimg.so \ - $(DIST)/bin/libjpeg.so \ - $(DIST)/bin/libjs.so \ - $(DIST)/bin/libjsdom.so \ - $(DIST)/bin/libjsj.so \ - $(DIST)/bin/libmimetype.so \ - $(DIST)/bin/libmsgc21.so \ - $(DIST)/bin/libnetcache.so \ - $(DIST)/bin/libnetcnvts.so \ - $(DIST)/bin/libnetlib.so \ - $(DIST)/bin/libnetutil.so \ - $(DIST)/bin/libnetwork.so \ - $(DIST)/bin/libnspr21.so \ - $(DIST)/bin/libplc21.so \ - $(DIST)/bin/libplds21.so \ - $(DIST)/bin/libraptorwebwidget.so \ - $(DIST)/bin/libreg.so \ - $(DIST)/bin/libremoturl.so \ - $(DIST)/bin/libsecfree.so \ - $(DIST)/bin/libstubnj.so \ - $(DIST)/bin/libstubsj.so \ - $(DIST)/bin/libtestdynamic.so \ - $(DIST)/bin/libutil.so \ - $(DIST)/bin/libxp.so \ - $(DIST)/bin/libxpcom.so \ - $(DIST)/bin/libzlib.so \ - $(DIST)/bin/libutil.so \ - $(DIST)/bin/libxp.so \ - $(DIST)/bin/libxpcom.so \ - $(DIST)/bin/libzlib.so \ - $(DIST)/bin/libnglcsslay_s.so \ - $(DIST)/bin/libnglhtmlcon_s.so \ - $(NULL) - -ifeq ($(OS_ARCH),Linux) -EX_LIBS += \ - $(DIST)/bin/libpwcac.so \ - $(DIST)/bin/libdbm.so \ - $(NULL) -endif - -PROGS = $(addprefix $(OBJDIR)/, $(CPPSRCS:.cpp=)) - -TARGETS = $(PROGS) - -include $(DEPTH)/config/rules.mk - -$(OBJDIR)/nsWidgetTest.o:: nsWidgetTest.cpp - $(CCC) -o $@ -c $(CFLAGS) nsWidgetTest.cpp $(LDFLAGS) - - -$(OBJDIR)/%.o: %.cpp - @$(MAKE_OBJDIR) - $(CCC) -o $@ $(CFLAGS) -c $*.cpp - -$(PROGS):$(OBJDIR)/%: $(OBJDIR)/%.o $(OBJDIR)/nsWidgetTest.o $(EX_LIBS) - @$(MAKE_OBJDIR) -ifeq ($(OS_ARCH),Linux) - $(CCC) -rdynamic -o $@ $@.o $(OBJDIR)/nsWidgetTest.o $(LDFLAGS) $(EX_LIBS) $(OS_LIBS) -L/usr/X11R6/lib -lXm -lXt -lX11 -lXp -lXext -else - $(CCC) -o $@ $@.o -woff 84,85 $(LDFLAGS) $(OBJDIR)/nsWidgetTest.o $(EX_LIBS) $(OS_LIBS) -lXm -lXt -lX11 -endif - -export:: - - - -install:: $(TARGETS) - $(INSTALL) $(PROGS) $(DIST)/bin - -clobber:: - rm -f $(DIST)/bin/viewer.exe - - diff --git a/mozilla/widget/tests/widget/main.cpp b/mozilla/widget/tests/widget/main.cpp deleted file mode 100644 index 81ad9cfe33c..00000000000 --- a/mozilla/widget/tests/widget/main.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIWidget.h" - -extern nsresult WidgetTest(int * argc, char **argv); - -#ifdef XP_PC - -#include - -void main(int argc, char **argv) -{ - int argC = argc; - - WidgetTest(&argC, argv); -} - -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, - int nCmdShow) -{ - int argC = 0; - char ** argv = NULL; - - return(WidgetTest(&argC, argv)); -} - -#endif - -#ifdef XP_UNIX -void main(int argc, char **argv) -{ - int argC = argc; - - WidgetTest(&argC, argv); - -} -#endif diff --git a/mozilla/widget/tests/widget/makefile.win b/mozilla/widget/tests/widget/makefile.win deleted file mode 100644 index 19f8d000951..00000000000 --- a/mozilla/widget/tests/widget/makefile.win +++ /dev/null @@ -1,50 +0,0 @@ -#!nmake -# -# The contents of this file are subject to the Netscape Public License -# Version 1.0 (the "NPL"); you may not use this file except in -# compliance with the NPL. You may obtain a copy of the NPL at -# http://www.mozilla.org/NPL/ -# -# Software distributed under the NPL is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL -# for the specific language governing rights and limitations under the -# NPL. -# -# The Initial Developer of this code under the NPL is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All Rights -# Reserved. - -DEPTH=..\..\.. - -MAKE_OBJ_TYPE = EXE -PROGRAM = .\$(OBJDIR)\widget.exe -#RESFILE = widget.res - -OBJS = \ - .\$(OBJDIR)\main.obj \ - .\$(OBJDIR)\nsWidgetTest.obj \ - $(NULL) - -LINCS=-I$(PUBLIC)\raptor \ - -I$(PUBLIC)\xpcom -I\ns\raptor\ui\src\windows - -MYLIBS= \ - $(DIST)\lib\xpcom32.lib \ - $(LIBNSPR) \ - $(DIST)\lib\raptorbase.lib \ - $(DIST)\lib\raptorgfx.lib \ - $(NULL) - -LLIBS= $(MYLIBS) \ - -SUBSYSTEM:CONSOLE - -include <$(DEPTH)\config\rules.mak> - -install:: $(PROGRAM) - $(MAKE_INSTALL) $(PROGRAM) $(DIST)\bin - -clobber:: - rm -f $(DIST)\bin\widget.exe - -$(PROGRAM):: $(OBJS) $(MYLIBS) diff --git a/mozilla/widget/tests/widget/nsWidgetTest.cpp b/mozilla/widget/tests/widget/nsWidgetTest.cpp deleted file mode 100644 index 122e791d764..00000000000 --- a/mozilla/widget/tests/widget/nsWidgetTest.cpp +++ /dev/null @@ -1,1541 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include -#include - -//---- Factory Includes & Stuff -----// -#include "nsIFactory.h" -#include "nsRepository.h" -#include "nsGfxCIID.h" - -#include "nsWidgetsCID.h" - - -#include "nsIWidget.h" -#include "nsIButton.h" -#include "nsICheckButton.h" -#include "nsIRadioButton.h" -#include "nsIScrollbar.h" -#include "nsITextWidget.h" -#include "nsITextAreaWidget.h" -#include "nsGUIEvent.h" -#include "nsIEnumerator.h" -#include "nsString.h" -#include "nsRect.h" -#include "nsIRenderingContext.h" -#include "nsIListBox.h" -#include "nsIComboBox.h" -#include "nsIFileWidget.h" -#include "nsIDeviceContext.h" -#include "nsFont.h" -#include "nsRepository.h" -#include "nsWidgetsCID.h" -#include "nsITabWidget.h" -#include "nsITooltipWidget.h" -#include "nsIAppShell.h" - -#include - -char * gLogFileName = "selftest.txt"; -FILE * gFD = nsnull; -PRInt32 gOverallStatus = 0; -PRInt32 gNonVisualStatus = 0; - -nsIWidget *window = NULL; -nsITextWidget *statusText = NULL; -nsITextWidget *textWidgetInstance = NULL; -nsITextWidget *passwordText = NULL; - -nsIListWidget *comboBox = NULL; -nsIListWidget *listBox = NULL; -nsIListBox *gMultiListBox = NULL; - -nsIWidget *movingWidget = NULL; -nsIScrollbar *scrollbar = NULL; -nsITabWidget *tabWidget = NULL; -nsIButton *toolTipButton1 = NULL; -nsIButton *toolTipButton2 = NULL; - -nsITooltipWidget *tooltipWindow = NULL; - -nsIRadioButton * gRadioBtns[16]; -int gNumRadioBtns = 0; - -char * gFailedMsg = NULL; - - -#ifdef XP_PC -#define WIDGET_DLL "raptorwidget.dll" -#define GFX_DLL "raptorgfxwin.dll" -#define TEXT_HEIGHT 25 -#endif - -#ifdef XP_UNIX -#define WIDGET_DLL "libwidgetunix.so" -#define GFX_DLL "libgfxunix.so" -#define TEXT_HEIGHT 30 -#endif - -#define DEBUG_MOUSE 0 - -#define NUM_COMBOBOX_ITEMS 8 -#define kSetCaret "Set Caret" -#define kGetCaret "Get Caret" -#define kSetSelection "Set Selection" -#define kClearSelection "Clear Sel." -#define kSelectAll "Select All" -#define kRemoveSelection "Remove Selection" -#define kSetText "Set Text" -#define kGetText "Get Text" -#define kHideBtn "Hide Btn" -#define kShowBtn "Show Btn" -#define kBrowseBtn "Browse..." -#define kSetSelectedIndices "Set 0,2,4" - -#define kTooltip1_x 400 -#define kTooltip1_y 100 -#define kTooltip1_width 100 -#define kTooltip1_height 100 - -#define kTooltip2_x 200 -#define kTooltip2_y 300 -#define kTooltip2_width 100 -#define kTooltip2_height 100 - -// class ids -static NS_DEFINE_IID(kCWindowCID, NS_WINDOW_CID); -static NS_DEFINE_IID(kCChildCID, NS_CHILD_CID); -static NS_DEFINE_IID(kCButtonCID, NS_BUTTON_CID); -static NS_DEFINE_IID(kCCheckButtonCID, NS_CHECKBUTTON_CID); -static NS_DEFINE_IID(kCComboBoxCID, NS_COMBOBOX_CID); -static NS_DEFINE_IID(kCFileWidgetCID, NS_FILEWIDGET_CID); -static NS_DEFINE_IID(kCListBoxCID, NS_LISTBOX_CID); -static NS_DEFINE_IID(kCRadioButtonCID, NS_RADIOBUTTON_CID); -static NS_DEFINE_IID(kCHorzScrollbarCID, NS_HORZSCROLLBAR_CID); -static NS_DEFINE_IID(kCVertScrollbarCID, NS_VERTSCROLLBAR_CID); -static NS_DEFINE_IID(kCTextAreaCID, NS_TEXTAREA_CID); -static NS_DEFINE_IID(kCTextFieldCID, NS_TEXTFIELD_CID); - -static NS_DEFINE_IID(kCTabWidgetCID, NS_TABWIDGET_CID); -static NS_DEFINE_IID(kCTooltipWidgetCID, NS_TOOLTIPWIDGET_CID); -static NS_DEFINE_IID(kCAppShellCID, NS_APPSHELL_CID); - - -// interface ids -static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID); -static NS_DEFINE_IID(kIButtonIID, NS_IBUTTON_IID); -static NS_DEFINE_IID(kIScrollbarIID, NS_ISCROLLBAR_IID); -static NS_DEFINE_IID(kICheckButtonIID, NS_ICHECKBUTTON_IID); -static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID); -static NS_DEFINE_IID(kITextAreaWidgetIID, NS_ITEXTAREAWIDGET_IID); -static NS_DEFINE_IID(kIRadioButtonIID, NS_IRADIOBUTTON_IID); -static NS_DEFINE_IID(kIListBoxIID, NS_ILISTBOX_IID); -static NS_DEFINE_IID(kIComboBoxIID, NS_ICOMBOBOX_IID); -static NS_DEFINE_IID(kIFileWidgetIID, NS_IFILEWIDGET_IID); -static NS_DEFINE_IID(kITabWidgetIID, NS_ITABWIDGET_IID); -static NS_DEFINE_IID(kITooltipWidgetIID, NS_ITOOLTIPWIDGET_IID); -static NS_DEFINE_IID(kIAppShellIID, NS_IAPPSHELL_IID); - - -char * eval(PRInt32 aVal) { - if (!aVal) { - gOverallStatus++; - } - return aVal? "PASSED":"FAILED"; -} - -char * eval(PRUint32 aVal) { - if (!aVal) { - gOverallStatus++; - } - - return aVal ? "PASSED":"FAILED"; -} - -#if 0 -char * eval(PRBool aVal) { - if (!aVal) { - gOverallStatus++; - } - return aVal ? "PASSED":"FAILED"; -} -#endif - -/**-------------------------------------------------------------------------------- - * Generic ListWidget Box Non-Visual Test - *-------------------------------------------------------------------------------- - */ -void listSelfTest(FILE * fd, char * aTitle, nsIListWidget * listBox) { - fprintf(fd, "\n\n-----------------------------\n"); - fprintf(fd, "%s self test\n", aTitle); - fprintf(fd, "-----------------------------\n\n"); - - int inx = 4; - char * item4 = "List Item 4"; - - fprintf(fd, "\nTesting GetItemCount\n\tItem count should be [%d] is [%d] Test: [%s]\n", NUM_COMBOBOX_ITEMS, listBox->GetItemCount(), - (NUM_COMBOBOX_ITEMS == (int)listBox->GetItemCount()?"PASSED":"FAILED")); - fflush(fd); - - fprintf(fd, "\nTesting SelectItem value is [%d]\n", inx); fflush(fd); - listBox->SelectItem(inx); - nsAutoString buf; - listBox->GetSelectedItem(buf); - char * selStr = buf.ToNewCString(); - fprintf(fd, "\nTesting GetSelectedItem\n"); - fprintf(fd, "\tSelection should be [%s] is [%s] Test: [%s]\n", - item4, selStr, eval(!strcmp(item4, selStr))); fflush(fd); - if (nsnull != selStr) delete selStr; - - int sel = listBox->GetSelectedIndex(); - fprintf(fd, "\nTesting GetSelectedIndex\n");fflush(fd); - fprintf(fd, "\tSelection should be [%d] is [%d] Test: [%s]\n", - inx, sel, eval(inx == (int)sel)); fflush(fd); - - nsString item4Str(item4); - sel = listBox->FindItem(item4Str, 0); - fprintf(fd, "\nTesting FindItem\n");fflush(fd); - fprintf(fd, "\tItem index should be [%d] index is [%d] Test: [%s]\n", - inx, sel, eval(inx == (int)sel)); fflush(fd); - listBox->GetItemAt(buf, 4); - selStr = buf.ToNewCString(); - fprintf(fd, "\nTesting GetItemAt\n\tItem %d should be [%s] is [%s] Test: [%s]\n", inx, item4, selStr, eval(strcmp(selStr, item4) == 0)); fflush(fd); - if (nsnull != selStr) delete selStr; - - listBox->SelectItem(2); - inx = listBox->GetSelectedIndex(); - fprintf(fd, "\nTesting SelectItem && GetSelectedIndex\n\t Selected Item should be [%d] is [%d] Test: [%s]\n", 2, inx, eval(inx == 2)); fflush(fd); - - int i; - for (i=0;i<(int)listBox->GetItemCount();i++) { - nsAutoString buf; - listBox->GetItemAt(buf, i); - char * str = buf.ToNewCString(); - - fprintf(fd, "Item %d [%s]\n", i, str);fflush(fd); - - if (nsnull != str) delete str; - } - fprintf(fd, "Removing Item #4\n");fflush(fd); - listBox->RemoveItemAt(4); - fprintf(fd, "\nTesting RemoveItemAt\n\tTest: [%s]\n", eval(-1 == (int)listBox->FindItem(nsString(item4), 0))); fflush(fd); - - for (i=0;i<(int)listBox->GetItemCount();i++) { - nsAutoString buf; - listBox->GetItemAt(buf, i); - char * str = buf.ToNewCString(); - - fprintf(fd, "Item %d [%s]\n", i, str);fflush(fd); - - if (nsnull != str) delete str; - } - listBox->Deselect(); - fprintf(fd, "\nTesting Deselect\n\t Selected Item [%d] Test:[%s]\n", (int)listBox->GetSelectedIndex(), (-1 == (int)listBox->GetSelectedIndex()?"PASSED":"FAILED")); fflush(fd); - -} - -/**-------------------------------------------------------------------------------- - * Generic Text Box Non-Visual Test - *-------------------------------------------------------------------------------- - */ -void textSelfTest(FILE * fd, char * aTitle, nsITextWidget * aTextWidget) { - fprintf(fd, "\n\n-----------------------------\n"); - fprintf(fd, "%s self test\n", aTitle); - fprintf(fd, "-----------------------------\n\n"); - - aTextWidget->SetText(nsString("1234567890")); - PRUint32 start = 1; - PRUint32 end = 5; - aTextWidget->SetSelection(start, end); - - PRUint32 start2 = 0; - PRUint32 end2 = 0; - aTextWidget->GetSelection(&start2, &end2); - - fprintf(fd, "Tested SetSelection and GetSelection Test Should be [%d,%d] is [%d,%d] [%s]\n", start,end, start2,end2,eval(start == start2 && end == end2)); - - start = 5; - aTextWidget->SetCaretPosition(start); - - start2 = aTextWidget->GetCaretPosition(); - - fprintf(fd, "Tested SetCaretPosition and GetCaretPosition Test [%s]\n", eval(start == start2)); - aTextWidget->InsertText(nsString("xxx"),1,3); - nsString str; - aTextWidget->GetText(str,256); - char * s = str.ToNewCString(); - char * s2 = "1xxx234567890"; - fprintf(fd, "Tested InsertText Test [%s] is [%s] [%s]\n", s2, s, eval(!strcmp(s2, s))); - fprintf(fd, "Tested InsertText Test [%s]\n", s); - delete s; - -} - -/**-------------------------------------------------------------------------------- - * Generic MultiListWidget Box Non-Visual Test - *-------------------------------------------------------------------------------- - */ -void multiListSelfTest(FILE * fd, char * aTitle, nsIListBox * listBox) { - fprintf(fd, "\n\n-----------------------------\n"); - fprintf(fd, "%s self test\n", aTitle); - fprintf(fd, "-----------------------------\n\n");fflush(fd); - - nsIListBox * multi = (nsIListBox*)listBox; - - int inx = 4; - char * item4 = "Multi List Item 4"; - - nsAutoString buf; - char * selStr; - - multi->GetItemAt(buf, 4); - selStr = buf.ToNewCString(); - fprintf(fd, "\nTesting GetItemAt\n\tItem %d should be [%s] is [%s] Test: [%s]\n", inx, item4, selStr, - eval(strcmp(selStr, item4) == 0)); fflush(fd); - if (nsnull != selStr) delete selStr; - - - multi->Deselect(); - int count = multi->GetSelectedCount(); - fprintf(fd, "\nTesting Deselect\n\tCount %d Test: [%s]\n", count, eval(0 == count)); fflush(fd); - - PRInt32 inxs[] = {0,2,4}; - PRInt32 len = 3; - - int i; - /*for (i=0;iSelectItem(inxs[i]); - }*/ - multi->SetSelectedIndices(inxs, 3); - fprintf(fd, "\nTesting selecting items 0,2,4\n");fflush(fd); - - /*char * item0 = "Multi List Item 0"; - nsString selItem; - multi->GetSelectedItem(selItem); - selStr = selItem.ToNewCString(); - fprintf(fd, "\nTesting GetSelectedItem\n\t is [%s] should be [%s] Test: [%s]\n", - selStr, item0, eval(!strcmp(selStr, item0))); fflush(fd); - if (nsnull != selStr) delete selStr;*/ - - int status = 1; - count = multi->GetSelectedCount(); - fprintf(fd, "\nTesting GetSelectedCount\n\tCount [%d] should be [%d] Test: [%s]\n", count, len, - eval(len == count)); fflush(fd); - - if (count == len) { - PRInt32 indices[256]; - multi->GetSelectedIndices(indices, 256); - for (i=0;iGetSelectedCount())); fflush(fd); - } - - for (i=0;i<(int)multi->GetItemCount();i++) { - nsAutoString buf; - multi->GetItemAt(buf, i); - char * str = buf.ToNewCString(); - - fprintf(fd, "Item %d [%s]\n", i, str);fflush(fd); - - if (nsnull != str) delete str; - } - fprintf(fd, "Removing Item #4\n");fflush(fd); - multi->RemoveItemAt(4); - fprintf(fd, "\nTesting RemoveItemAt\n\tTest: [%s]\n", eval(-1 == (int)multi->FindItem(nsString(item4), 0))); fflush(fd); - - for (i=0;i<(int)multi->GetItemCount();i++) { - nsAutoString buf; - multi->GetItemAt(buf, i); - char * str = buf.ToNewCString(); - - fprintf(fd, "Item %d [%s]\n", i, str);fflush(fd); - - if (nsnull != str) delete str; - } - fprintf(fd, "Done with Mulitple List Box\n"); -} - -/**-------------------------------------------------------------------------------- - * - */ -int createTestButton(nsIWidget * aWin, - char * aTitle, - int aX, - int aY, - int aWidth, - EVENT_CALLBACK aHandleEventFunction) { - nsIButton *button; - nsRect rect(aX, aY, aWidth, 25); - NSRepository::CreateInstance(kCButtonCID, nsnull, kIButtonIID, (void **) &button); - button->Create(window, rect, aHandleEventFunction, NULL); - nsString label(aTitle); - button->SetLabel(label); - button->Show(PR_TRUE); - //NS_RELEASE(button); - return aX + aWidth; -} - -/**-------------------------------------------------------------------------------- - * - */ -nsIButton* createSimpleButton(nsIWidget * aWin, - char * aTitle, - int aX, - int aY, - int aWidth, - EVENT_CALLBACK aHandleEventFunction) { - nsIButton *button; - nsRect rect(aX, aY, aWidth, 25); - NSRepository::CreateInstance(kCButtonCID, nsnull, kIButtonIID, (void**)&button); - button->Create(aWin, rect, aHandleEventFunction, NULL); - nsString label(aTitle); - button->SetLabel(label); - button->Show(PR_TRUE); -// NS_RELEASE(button); - return button; -} - - -/**-------------------------------------------------------------------------------- - * - */ -nsITooltipWidget* createTooltipWindow(nsIWidget * aWin, - char * aTitle, - int aX, - int aY, - int aWidth, - EVENT_CALLBACK aHandleEventFunction) { - nsITooltipWidget *tooltip; - nsRect rect(aX, aY, aWidth, 40); - NSRepository::CreateInstance(kCTooltipWidgetCID, nsnull, kITooltipWidgetIID, (void**)&tooltip); - tooltip->Create((nsIWidget*)NULL, rect, aHandleEventFunction, NULL); - nsIButton *toolTipButton = createSimpleButton(tooltip, "tooltip",5, 5, 80, 0); - tooltip->Show(PR_TRUE); - return tooltip; -} - - - -/**-------------------------------------------------------------------------------- - * List Test Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK GenericListHandleEvent(nsGUIEvent *aEvent, char * aTitle, nsIListWidget * aListWidget) -{ - - nsIButton * btn; - if (aEvent->message != NS_MOUSE_LEFT_BUTTON_UP) { - return nsEventStatus_eIgnore; - } - nsString str(aTitle); - fprintf(gFD, "\nVisually tested nsIListWidget\n"); - - if (NS_OK == aEvent->widget->QueryInterface(kIButtonIID, (void**)&btn)) { - nsAutoString strBuf; - btn->GetLabel(strBuf); - char * title = strBuf.ToNewCString(); - //fprintf(gFD, "Title is [%s]\n", title); - - if (!strcmp(title, kSetSelection)) { - aListWidget->SelectItem(2); - fprintf(gFD, "\tTested SelectItem(2)\n"); - str.Append(" should show 'List Item 2'"); - statusText->SetText(str); - gFailedMsg = "List::SelectItem"; - } else if (!strcmp(title, kRemoveSelection)) { - nsString item2("List Item 2"); - PRInt32 inx = aListWidget->FindItem(item2, 0); - - printf("aListWidget->FindItem(item2, 0) %d\n", inx); - - if (inx > -1) { - aListWidget->RemoveItemAt(inx); - } - fprintf(gFD, "\tTested FindItem(...)\n"); - str.Append(" should show empty"); - statusText->SetText(str); - gFailedMsg = "List::RemoveItemAt && FindItem"; - } - delete title; - //NS_RELEASE(btn); - } - return nsEventStatus_eIgnore; -} - -/**-------------------------------------------------------------------------------- - * Combox Test Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK ComboTestHandleEvent(nsGUIEvent *aEvent) -{ - return GenericListHandleEvent(aEvent, "ComboBox", comboBox); -} - - -/**-------------------------------------------------------------------------------- - * ListBox Test Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK ListBoxTestHandleEvent(nsGUIEvent *aEvent) -{ - return GenericListHandleEvent(aEvent, "ListBox", listBox); -} - -/**-------------------------------------------------------------------------------- - * Multi-ListBox Test Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK MultiListBoxTestHandleEvent(nsGUIEvent *aEvent) -{ - nsIButton * btn; - if (aEvent->message != NS_MOUSE_LEFT_BUTTON_UP) { - return nsEventStatus_eIgnore; - } - nsString str("Multi-ListBox"); - fprintf(gFD, "\nVisually tested Multi-List Box\n"); - - if (NS_OK == aEvent->widget->QueryInterface(kIButtonIID, (void**)&btn)) { - nsAutoString strBuf; - btn->GetLabel(strBuf); - char * title = strBuf.ToNewCString(); - //fprintf(gFD, "Title is [%s]\n", title); - - if (!strcmp(title, kSetSelection)) { - gMultiListBox->Deselect(); - - PRInt32 inxs[] = {0,2,4}; - PRInt32 len = 3; - - int i; - for (i=0;iSelectItem(2);//inxs[i]); - } - fprintf(gFD, "\tTested SelectItem()\n"); - str.Append(" should show 'List Item 0,2,5'"); - statusText->SetText(str); - gFailedMsg = "Multi-List::SelectItem"; - } else if (!strcmp(title, kSetSelectedIndices)) { - PRInt32 inxs[] = {0,2,4}; - PRInt32 len = 3; - gMultiListBox->SetSelectedIndices(inxs, 3); - } else if (!strcmp(title, kRemoveSelection)) { - nsString item2("Multi List Item 2"); - PRInt32 inx = gMultiListBox->FindItem(item2, 0); - - if (inx > -1) { - gMultiListBox->RemoveItemAt(inx); - } - fprintf(gFD, "\tTested FindItem(...)\n"); - str.Append(" should show 0,5"); - statusText->SetText(str); - gFailedMsg = "Multi-List::FindItem && RemoveItemAt"; - } - delete title; - //NS_RELEASE(btn); - } - return nsEventStatus_eIgnore; - -} - -/**-------------------------------------------------------------------------------- - * Checkbutton Test Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK CheckButtonTestHandleEvent(nsGUIEvent *aEvent) -{ - nsICheckButton * chkBtn; - if (aEvent->message != NS_MOUSE_LEFT_BUTTON_UP) { - return nsEventStatus_eIgnore; - } - fprintf(gFD, "\nVisually tested CheckBox\n"); - - if (NS_OK == aEvent->widget->QueryInterface(kICheckButtonIID, (void**)&chkBtn)) { - fprintf(gFD, "\tGetState and SetState tested.\n"); - chkBtn->SetState((PRBool)!chkBtn->GetState()); - //NS_RELEASE(chkBtn); - gFailedMsg = "CheckButton::SetState & GetState"; - } - return nsEventStatus_eIgnore; -} - -/**-------------------------------------------------------------------------------- - * Failed Button Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK FailedButtonHandleEvent(nsGUIEvent *aEvent) -{ - nsIButton * btn; - if (aEvent->message != NS_MOUSE_LEFT_BUTTON_UP) { - return nsEventStatus_eIgnore; - } - //fprintf(gFD, "\nVisually tested CheckBox\n"); - - if (NS_OK == aEvent->widget->QueryInterface(kIButtonIID, (void**)&btn)) { - gOverallStatus++; - if (gFailedMsg == nsnull) { - fprintf(gFD, "\n*** Something failed but the msg wan't set correctly in the code!\n"); - } else { - fprintf(gFD, "Method [%s] FAILED!\n", gFailedMsg); - gFailedMsg = nsnull; - } - - } - return nsEventStatus_eIgnore; -} - -/**-------------------------------------------------------------------------------- - * Succeeded Button Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK SucceededButtonHandleEvent(nsGUIEvent *aEvent) -{ - - nsIButton * btn; - if (aEvent->message != NS_MOUSE_LEFT_BUTTON_UP) { - return nsEventStatus_eIgnore; - } - //fprintf(gFD, "\nVisually tested CheckBox\n"); - - if (NS_OK == aEvent->widget->QueryInterface(kIButtonIID, (void**)&btn)) { - if (gFailedMsg == nsnull) { - fprintf(gFD, "\n*** Something Succeeded but the msg wan't set correctly in the code!\n"); - } else { - fprintf(gFD, "Method [%s] SUCCEEDED!\n", gFailedMsg); - gFailedMsg = nsnull; - } - - } - return nsEventStatus_eIgnore; -} - -/**-------------------------------------------------------------------------------- - * TextWidget Test Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK GenericTextTestHandleEvent(char *aTitle, - nsGUIEvent *aEvent, - nsITextWidget *aTextWidget, - const nsString &aTestStr, - const nsString &aStrToShow) -{ - nsIButton * btn; - if (aEvent->message != NS_MOUSE_LEFT_BUTTON_UP) { - return nsEventStatus_eIgnore; - } - - - if (NS_OK == aEvent->widget->QueryInterface(kIButtonIID, (void**)&btn)) { - nsAutoString strBuf; - nsString str; - btn->GetLabel(strBuf); - char * title = strBuf.ToNewCString(); - - if (!strcmp(title, kSetText)) { - aTextWidget->SetText(aTestStr); - - fprintf(gFD, "\nVisually Testing Text\n"); - - str.Append(" should show["); - str.Append(aStrToShow); - str.Append("]"); - - statusText->SetText(str); - gFailedMsg = "nsITextWidget::SetText"; - } else if (!strcmp(title, kGetText)) { - nsString getStr; - aTextWidget->GetText(getStr, 256); - - fprintf(gFD, "\tTested GetText(...) \n"); - - if (aTestStr.Equals(getStr)) { - str.Append(" Test PASSED"); - fprintf(gFD, "Test PASSED"); - } else { - str.Append(" Test FAILED"); - fprintf(gFD, "Test FAILED"); - } - statusText->SetText(str); - gFailedMsg = "nsITextWidget::GetText"; - } else if (!strcmp(title, kSetCaret)) { - nsString getStr; - aTextWidget->SetCaretPosition(1); - fprintf(gFD, "\tTested SetCaretPosition(1) \n"); - str.Append(" should show caret in position 1"); - statusText->SetText(str); - gFailedMsg = "nsITextWidget::SetCaretPosition"; - } else if (!strcmp(title, kGetCaret)) { - nsString getStr; - PRUint32 pos = aTextWidget->GetCaretPosition(); - - fprintf(gFD, "Visually tested GetCaretPosition(1) \n"); - - if (pos == 1) { - str.Append(" Test PASSED"); - fprintf(gFD, "Test PASSED\n"); - } else { - str.Append(" Test FAILED"); - fprintf(gFD, "Test FAILED\n"); - } - statusText->SetText(str); - gFailedMsg = "nsITextWidget::GetCaretPosition"; - } else if (!strcmp(title, kClearSelection)) { - aTextWidget->SetSelection(0,0); - //aTextWidget->SetCaretPosition(0); - str.Append(" selection should be cleared"); - statusText->SetText(str); - } else if (!strcmp(title, kSelectAll)) { - aTextWidget->SelectAll(); - str.Append(" Everything should be selected"); - statusText->SetText(str); - } else if (!strcmp(title, kSetSelection)) { - nsString getStr; - aTextWidget->SetSelection(1,5); - - fprintf(gFD, "\tTested SetSelection(1,5) \n"); - - str.Append(" should show selection from 1 to 5"); - statusText->SetText(str); - gFailedMsg = "nsITextWidget::SetSelection"; - } - delete title; - //NS_RELEASE(btn); - } - return nsEventStatus_eIgnore; -} - - -/**-------------------------------------------------------------------------------- - * Button Test Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK ButtonTestHandleEvent(nsGUIEvent *aEvent) -{ - - nsIButton * btn; - if (aEvent->message != NS_MOUSE_LEFT_BUTTON_UP) { - return nsEventStatus_eIgnore; - } - - if (NS_OK == aEvent->widget->QueryInterface(kIButtonIID, (void**)&btn)) { - nsAutoString strBuf; - nsString str("Tesing "); - btn->GetLabel(strBuf); - char * title = strBuf.ToNewCString(); - - if (!strcmp(title, kHideBtn)) { - movingWidget->Show(PR_FALSE); - str.Append("nsIWidget::Show(FALSE)"); - statusText->SetText(str); - gFailedMsg = "nsIWidget::Show(FALSE)"; - } else if (!strcmp(title, kShowBtn)) { - movingWidget->Show(PR_TRUE); - str.Append("nsIWidget::Show(TRUE)"); - statusText->SetText(str); - gFailedMsg = "nsIWidget::Show(TRUE)"; - } - - delete title; - //NS_RELEASE(btn); - - } - return nsEventStatus_eIgnore; -} - -/**-------------------------------------------------------------------------------- - * TextWidget Test Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK PasswordTextTestHandleEvent(nsGUIEvent *aEvent) -{ - return GenericTextTestHandleEvent("Password", aEvent, passwordText, nsString("123"), nsString("***")); -} - -/**-------------------------------------------------------------------------------- - * Dumps the size of the main window and all child windows - *-------------------------------------------------------------------------------- - */ - -void DumpRects() -{ -#ifdef XP_PC - nsRect rect; - // print the main window position - window->GetBounds(rect); - printf("Bounds(%d, %d, %d, %d)\n", rect.x, rect.y, rect.width, rect.height); - - // print all children's position - nsIEnumerator *enumerator = window->GetChildren(); - nsISupports * widget; - while (widget = enumerator->Next()) { - nsIWidget *child; - if (NS_OK == widget->QueryInterface(kIWidgetIID, (void**)&child)) { - // - child->GetBounds(rect); - printf("Bounds(%d, %d, %d, %d)\n", rect.x, rect.y, rect.width, rect.height); - NS_RELEASE(child); - } - NS_RELEASE(widget); - } - - NS_RELEASE(enumerator); - delete enumerator; -#endif -} - - -/**-------------------------------------------------------------------------------- - * Main Handler - *-------------------------------------------------------------------------------- - */ -nsEventStatus PR_CALLBACK HandleEvent(nsGUIEvent *aEvent) -{ - // printf("aEvent->message %d\n", aEvent->message); - nsEventStatus result = nsEventStatus_eIgnore; - switch(aEvent->message) { - - case NS_SHOW_TOOLTIP: - { - char buf[256]; - nsTooltipEvent* tEvent = (nsTooltipEvent*)aEvent; - sprintf(buf,"Show tooltip %d", tEvent->tipIndex); - statusText->SetText(buf); - nsRect oldPos; - oldPos.x = aEvent->point.x; - oldPos.y = aEvent->point.y; - nsRect newPos; - window->WidgetToScreen(oldPos, newPos); - tooltipWindow->Move(newPos.x + 5, newPos.y + 5); - tooltipWindow->Show(PR_TRUE); - } - break; - - case NS_HIDE_TOOLTIP: - statusText->SetText("Hide tooltip"); - tooltipWindow->Show(PR_FALSE); - break; - - case NS_MOVE: - char str[256]; - sprintf(str, "Moved window to %d,%d", aEvent->point.x, aEvent->point.y); - statusText->SetText(str); - break; - - case NS_MOUSE_LEFT_DOUBLECLICK: - statusText->SetText("Left button double click"); - break; - - case NS_MOUSE_RIGHT_DOUBLECLICK: - statusText->SetText("Right button double click"); - break; - - case NS_MOUSE_ENTER: - if (DEBUG_MOUSE) printf("NS_MOUSE_ENTER 0x%X\n", aEvent->widget); - break; - - case NS_MOUSE_EXIT: - if (DEBUG_MOUSE) printf("NS_MOUSE_EXIT 0x%X\n", aEvent->widget); - break; - - case NS_MOUSE_MOVE: - if (DEBUG_MOUSE) printf("NS_MOUSE_MOVE\n"); - break; - - case NS_MOUSE_LEFT_BUTTON_UP: { - if (DEBUG_MOUSE) printf("NS_MOUSE_LEFT_BUTTON_UP\n"); - int i = 0; - for (i=0;iQueryInterface(kIWidgetIID, (void**)&win)) { - printf("%d 0x%x 0x%x\n", i, win, aEvent->widget); - if (win == aEvent->widget) { - gRadioBtns[i]->SetState(PR_TRUE); - } else { - gRadioBtns[i]->SetState(PR_FALSE); - } - } - } - } break; - - - case NS_MOUSE_LEFT_BUTTON_DOWN: - if (DEBUG_MOUSE) printf("NS_MOUSE_LEFT_BUTTON_DOWN\n"); - break; - - case NS_CREATE: - printf("Window Created\n"); - break; - - case NS_PAINT: - // paint the background - if (aEvent->widget == window) { - nsIRenderingContext *drawCtx = ((nsPaintEvent*)aEvent)->renderingContext; - drawCtx->SetColor(aEvent->widget->GetBackgroundColor()); - drawCtx->FillRect(*(((nsPaintEvent*)aEvent)->rect)); - - return nsEventStatus_eIgnore; - } - break; - - case NS_DESTROY: - printf("Destroy Window...Release window\n"); - fprintf(gFD, "\n\n--------------------------------------------------\n"); - fprintf(gFD, "Summary of non-visual tests, Number of Failures %d\n", gNonVisualStatus); - fprintf(gFD, "Summary of visual tests, Number of Failures %d\n", gOverallStatus-gNonVisualStatus); - fprintf(gFD, "Summary of all tests, Number of Failures %d\n", gOverallStatus); - fprintf(gFD, "--------------------------------------------------\n"); - fflush(gFD); - fclose(gFD); - - exit(0); // for now - - break; - - - case NS_SCROLLBAR_POS: - case NS_SCROLLBAR_PAGE_NEXT: - case NS_SCROLLBAR_PAGE_PREV: - case NS_SCROLLBAR_LINE_NEXT: - case NS_SCROLLBAR_LINE_PREV: - if (nsnull != movingWidget) { - PRUint32 pos = scrollbar->GetPosition(); - movingWidget->Move(10, pos); - } - break; - - case NS_KEY_UP: { - nsKeyEvent * ke = (nsKeyEvent*)aEvent; - char str[256]; - sprintf(str, "Key Event Key Code[%d] Key [%c] Shift [%s] Control [%s] Alt [%s]", - ke->keyCode, ke->keyCode, - (ke->isShift?"Pressed":"Released"), - (ke->isControl?"Pressed":"Released"), - (ke->isAlt?"Pressed":"Released")); - printf("%s\n", str); - statusText->SetText(nsString(str)); - } - break; - - - default: - result = nsEventStatus_eIgnore; - } - //printf("result: %d = %d\n", result, PR_FALSE); - - return result; -} - - - -nsEventStatus PR_CALLBACK HandleFileButtonEvent(nsGUIEvent *aEvent) -{ - switch(aEvent->message) { - - case NS_MOUSE_LEFT_BUTTON_UP: - // create a FileWidget - // - nsIFileWidget *fileWidget; - - nsString title("FileWidget Title mode = save"); - NSRepository::CreateInstance(kCFileWidgetCID, nsnull, kIFileWidgetIID, (void**)&fileWidget); - - nsString titles[] = {"all files","html","executables" }; - nsString filters[] = {"*.*", "*.html", "*.exe" }; - fileWidget->SetFilterList(3, titles, filters); - fileWidget->Create(window, - title, - eMode_save, - nsnull, - nsnull); - - PRUint32 result = fileWidget->Show(); - if (result) { - nsString file; - fileWidget->GetFile(file); - printf("file widget contents %s\n", file.ToNewCString()); - statusText->SetText(file.ToNewCString()); - } - else - statusText->SetText("Cancel selected"); - - - //NS_RELEASE(fileWidget); - break; - } - - return(nsEventStatus_eConsumeDoDefault); -} - -/*-------------------------------------------------------------------------------- - * Tab change handler - *-------------------------------------------------------------------------------- - */ - -nsEventStatus PR_CALLBACK HandleTabEvent(nsGUIEvent *aEvent) -{ - switch(aEvent->message) { - - case NS_TABCHANGE: - PRUint32 tab = tabWidget->GetSelectedTab(); - char buf[256]; - sprintf(buf, "Selected tab %d", tab); - statusText->SetText(buf); - break; - } - - return(nsEventStatus_eConsumeDoDefault); -} - - -void SetTooltipPos(int pos, nsIWidget *aWidget, nsIButton *aButton1, nsIButton *aButton2) -{ - switch(pos) { - case 1: { - nsRect* tips1[2]; - tips1[0] = new nsRect( - kTooltip1_x, - kTooltip1_y, - kTooltip1_width / 2, - kTooltip1_height); - tips1[1] = new nsRect( - kTooltip1_x + (kTooltip1_width / 2), - kTooltip1_y, - kTooltip1_width / 2, - kTooltip1_height); - aWidget->SetTooltips(2, tips1); - aButton1->Move(kTooltip1_x, kTooltip1_y); - aButton2->Move(kTooltip1_x + kTooltip1_width, - kTooltip1_y + kTooltip1_height); - delete tips1[0]; - delete tips1[1]; - } - break; - case 2: { - nsRect* tipsDummy[1]; - - // Test updating the tooltips by initialy giving a tooltip - // location that is 100 pixels to the left, then changing - // it to the correct position. - tipsDummy[0] = new nsRect(kTooltip2_x - 100,kTooltip2_y, - kTooltip2_width,kTooltip2_height); - - aWidget->SetTooltips(1, tipsDummy); - - nsRect* tips2[1]; - tips2[0] = new nsRect(kTooltip2_x,kTooltip2_y, - kTooltip2_width,kTooltip2_height); - - aWidget->UpdateTooltips(tips2); // Put it in the correct position - - aButton1->Move(kTooltip2_x, kTooltip2_y); - aButton2->Move(kTooltip2_x + kTooltip2_width, - kTooltip2_y + kTooltip2_height); - delete tips2[0]; - delete tipsDummy[0]; - } - break; - } -} - - -nsEventStatus MoveTooltip(int aPos, nsGUIEvent *aEvent) -{ - switch(aEvent->message) { - - case NS_MOUSE_LEFT_BUTTON_DOWN: - SetTooltipPos(aPos, window, toolTipButton1, toolTipButton2); - break; - } - - return(nsEventStatus_eConsumeDoDefault); -} - -nsEventStatus PR_CALLBACK TooltipPos1(nsGUIEvent *aEvent) -{ - return(MoveTooltip(1, aEvent)); -} - -nsEventStatus PR_CALLBACK TooltipPos2(nsGUIEvent *aEvent) -{ - return(MoveTooltip(2, aEvent)); -} - -/*---------------------------------------------------------------------------- - * DoSelfTests - *---------------------------------------------------------------------------*/ -nsEventStatus PR_CALLBACK DoSelfTests(nsGUIEvent *aEvent) -{ - if (aEvent->message != NS_MOUSE_LEFT_BUTTON_UP) { - return nsEventStatus_eIgnore; - } - - textSelfTest(gFD, "Password Text", passwordText); - listSelfTest(gFD, "ListBox", listBox); - listSelfTest(gFD, "ComboBox", comboBox); - multiListSelfTest(gFD, "Multi-ListBox", gMultiListBox); - - return nsEventStatus_eIgnore; - -} - -/**-------------------------------------------------------------------------------- - * - */ -nsresult WidgetTest(int *argc, char **argv) -{ - // Open global test log file - gFD = fopen(gLogFileName, "w"); - if (gFD == nsnull) { - fprintf(stderr, "Couldn't open file[%s]\n", gLogFileName); - exit(1); - } - - // register widget classes - NSRepository::RegisterFactory(kCWindowCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCChildCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCButtonCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCCheckButtonCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCComboBoxCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCFileWidgetCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCListBoxCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCRadioButtonCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCHorzScrollbarCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCVertScrollbarCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCTextAreaCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCTextFieldCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCTabWidgetCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCTooltipWidgetCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCAppShellCID, WIDGET_DLL, PR_FALSE, PR_FALSE); - - - static NS_DEFINE_IID(kCRenderingContextIID, NS_RENDERING_CONTEXT_CID); - static NS_DEFINE_IID(kCDeviceContextIID, NS_DEVICE_CONTEXT_CID); - static NS_DEFINE_IID(kCFontMetricsIID, NS_FONT_METRICS_CID); - static NS_DEFINE_IID(kCImageIID, NS_IMAGE_CID); - - - NSRepository::RegisterFactory(kCRenderingContextIID, GFX_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCDeviceContextIID, GFX_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCFontMetricsIID, GFX_DLL, PR_FALSE, PR_FALSE); - NSRepository::RegisterFactory(kCImageIID, GFX_DLL, PR_FALSE, PR_FALSE); - - // Create a application shell - nsIAppShell *appShell; - NSRepository::CreateInstance(kCAppShellCID, nsnull, kIAppShellIID, (void**)&appShell); - if (appShell != nsnull) { - appShell->Create(argc, argv); - } else { - printf("AppShell is null!\n"); - } - - nsIDeviceContext* deviceContext = 0; - - // Create a device context for the widgets - nsresult res; - - static NS_DEFINE_IID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID); - static NS_DEFINE_IID(kDeviceContextIID, NS_IDEVICE_CONTEXT_IID); - - res = NSRepository::CreateInstance(kDeviceContextCID, nsnull, kDeviceContextIID, (void **)&deviceContext); - - if (NS_OK == res) - { - deviceContext->Init(nsnull); - NS_ADDREF(deviceContext); - } - - // - // create the main window - // - NSRepository::CreateInstance(kCWindowCID, nsnull, kIWidgetIID, (void**)&window); -#ifdef XP_PC - nsRect rect(100, 100, 600, 700); - window->Create((nsIWidget*)NULL, rect, HandleEvent, NULL); -#endif -#ifdef XP_UNIX - nsRect rect(0, 0, 600, 700); - window->Create((nsNativeWidget)NULL, rect, HandleEvent, - (nsIDeviceContext *)nsnull, - (nsIToolkit *)nsnull, - (nsWidgetInitData*)appShell->GetNativeData(NS_NATIVE_SHELL)); -#endif - window->SetTitle("TOP-LEVEL window"); - window->Show(PR_TRUE); - window->SetBackgroundColor(NS_RGB(196, 196, 196)); - -#ifdef XP_PC - tooltipWindow = createTooltipWindow(window, "INSERT here", 0, 0, 150, 0); - tooltipWindow->Show(PR_FALSE); - toolTipButton1 = createSimpleButton(window, "Tooltip \\/\\/",400, 100, 100, 0); - toolTipButton2 = createSimpleButton(window, "Tooltip /\\/\\",500, 200, 100, 0); - createTestButton(window, "Move Tooltip pos 1", 450, 150, 130, TooltipPos1); - createTestButton(window, "Move Tooltip pos 2", 450, 175, 130, TooltipPos2); - SetTooltipPos(1, window, toolTipButton1, toolTipButton2); -#endif - - // - // create a child - // - nsIWidget *child; - // - // create another child - // - - int x = 5; - int y = 10; - rect.SetRect(x, y, 100, 100); - - NSRepository::CreateInstance(kCChildCID, nsnull, kIWidgetIID, (void**)&child); - -#if 0 - child->SetBorderStyle(eBorderStyle_dialog); - child->Create(window, rect, HandleEvent, NULL); - //child->SetBackgroundColor(NS_RGB(255, 255, 0)); - child->SetForegroundColor(NS_RGB(255, 0, 0)); - child->SetBackgroundColor(NS_RGB(255, 128, 64)); -#endif - - //NS_RELEASE(child); // the parent keeps a reference on this child - - y += rect.height + 5; - - - // - // create a button - // - nsIButton *button; - rect.SetRect(x, y, 60, 25); - NSRepository::CreateInstance(kCButtonCID, nsnull, kIButtonIID, (void**)&button); - button->Create(window, rect, HandleEvent, NULL); - nsString label("Slider"); - button->SetLabel(label); - - nsAutoString strBuf; - button->GetLabel(strBuf); - button->Show(PR_TRUE); - - movingWidget = button; - y += rect.height + 5; - - x = 5; - x = createTestButton(window, kHideBtn, x, y, 75, ButtonTestHandleEvent) + 5; - x = createTestButton(window, kShowBtn, x, y, 75, ButtonTestHandleEvent); - x = 5; - y += rect.height + 5; - - // Create browse button - x = createTestButton(window, kBrowseBtn, x, y, 75, HandleFileButtonEvent); - x = 5; - y += rect.height + 5; - - // - // create a check button - // - nsICheckButton * checkButton; - rect.SetRect(x, y, 100, 25); - - NSRepository::CreateInstance(kCCheckButtonCID, nsnull, kICheckButtonIID, (void**)&checkButton); - checkButton->Create(window, rect, CheckButtonTestHandleEvent, NULL); - nsString cbLabel("CheckButton"); - checkButton->SetLabel(cbLabel); - checkButton->Show(PR_TRUE); - //NS_RELEASE(checkButton); - y += rect.height + 5; - - // - // create a text widget - // - - nsITextWidget * textWidget; - rect.SetRect(x, y, 100, TEXT_HEIGHT); - - NSRepository::CreateInstance(kCTextFieldCID, nsnull, kITextWidgetIID, (void**)&textWidget); - textWidget->Create(window, rect, HandleEvent, deviceContext); - - - nsFont font("Times", NS_FONT_STYLE_NORMAL, - NS_FONT_VARIANT_NORMAL, - NS_FONT_WEIGHT_BOLD, - 0, - 12); - - textWidget->SetFont(font); - nsString initialText("0123456789"); - textWidget->SetText(initialText); - textWidget->SetMaxTextLength(12); - textWidget->SelectAll(); - textWidget->Show(PR_TRUE); - - //NS_RELEASE(textWidget); - y += rect.height + 5; - - // - // create a text password widget - // - - nsITextWidget * ptextWidget; - rect.SetRect(x, y, 100, TEXT_HEIGHT); - NSRepository::CreateInstance(kCTextFieldCID, nsnull, kITextWidgetIID, (void**)&ptextWidget); - ptextWidget->SetPassword(PR_TRUE); - ptextWidget->Create(window, rect, HandleEvent, NULL); - nsString pinitialText("password text"); - ptextWidget->SetText(pinitialText); - passwordText = ptextWidget; - - x = x+180; - int saveX = x; - - x = createTestButton(window, kSetSelection, saveX,y, 100, PasswordTextTestHandleEvent); - x = createTestButton(window, kClearSelection, x+5,y, 100, PasswordTextTestHandleEvent); - x = createTestButton(window, kSelectAll, x+5,y, 100, PasswordTextTestHandleEvent); - - // Next Row of texting Buttons - x = saveX; - y += 30; - x = createTestButton(window, kSetCaret, x+5,y, 75, PasswordTextTestHandleEvent); - x = createTestButton(window, kGetCaret, x+5,y, 75, PasswordTextTestHandleEvent); - x = createTestButton(window, kSetText, x+5,y, 75, PasswordTextTestHandleEvent); - x = createTestButton(window, kGetText, x+5,y, 75, PasswordTextTestHandleEvent); - - x = 5; - //y += rect.height + 5; - - // - // create a readonly text widget - // - - nsITextWidget * rtextWidget; - rect.SetRect(x, y, 100, TEXT_HEIGHT); - NSRepository::CreateInstance(kCTextFieldCID, nsnull, kITextWidgetIID, (void**)&rtextWidget); - rtextWidget->SetReadOnly(PR_TRUE); - rtextWidget->Create(window, rect, HandleEvent, NULL); - nsString rinitialText("This is readonly"); - rtextWidget->SetText(rinitialText); - //NS_RELEASE(rtextWidget); - y += rect.height + 5; - - // - // create a text area widget - // - - nsITextAreaWidget * textAreaWidget; - rect.SetRect(x, y, 150, 100); - NSRepository::CreateInstance(kCTextAreaCID, nsnull, kITextAreaWidgetIID, (void**)&textAreaWidget); - textAreaWidget->Create(window, rect, HandleEvent, NULL); - nsString textAreaInitialText("Text Area Widget"); - textWidgetInstance = textAreaWidget; - textAreaWidget->SetText(textAreaInitialText); - //NS_RELEASE(textAreaWidget); - //y += rect.height + 5; - x += rect.width + 5; - - // Save these for later - int saveY = y; - saveX = x; - - // - // create a scrollbar - // - rect.SetRect(x, 10, 25, 300); - NSRepository::CreateInstance(kCVertScrollbarCID, nsnull, kIScrollbarIID, (void**)&scrollbar); - scrollbar->Create(window, rect, HandleEvent, NULL); - scrollbar->SetMaxRange(300); - scrollbar->SetThumbSize(50); - scrollbar->SetPosition(100); - x += rect.width + 5; - - // - // create a Status Text - // - y = 10; - rect.SetRect(x, y, 350, TEXT_HEIGHT); - NSRepository::CreateInstance(kCTextFieldCID, nsnull, kITextWidgetIID, (void**)&statusText); - statusText->Create(window, rect, HandleEvent, deviceContext); - statusText->Show(PR_TRUE); - y += rect.height + 5; - - // - // create a Failed Button - // - rect.SetRect(x, y, 100, 25); - NSRepository::CreateInstance(kCButtonCID, nsnull, kIButtonIID, (void**)&button); - button->Create(window, rect, FailedButtonHandleEvent, NULL); - nsString failedLabel("Failed"); - button->SetLabel(failedLabel); - button->Show(PR_TRUE); - //NS_RELEASE(button); - - rect.SetRect(x, y+30, 150, 25); - NSRepository::CreateInstance(kCButtonCID, nsnull, kIButtonIID, (void**)&button); - button->Create(window, rect, DoSelfTests, NULL); - nsString selfTestLabel("Perform Self Tests"); - button->SetLabel(selfTestLabel); - button->Show(PR_TRUE); - x += rect.width + 5; - - // - // create a Succeeded Button - // - rect.SetRect(x, y, 100, 25); - NSRepository::CreateInstance(kCButtonCID, nsnull, kIButtonIID, (void**)&button); - button->Create(window, rect, SucceededButtonHandleEvent, NULL); - nsString succeededLabel("Succeeded"); - button->SetLabel(succeededLabel); - button->Show(PR_TRUE); - //NS_RELEASE(button); - - - // - // create a listbox widget - // - y = saveY; - x = saveX; - rect.SetRect(x, y, 150, 100); - NSRepository::CreateInstance(kCListBoxCID, nsnull, kIListBoxIID, (void**)&listBox); - listBox->Create(window, rect, HandleEvent, NULL); - listBox->Show(PR_TRUE); - char str[256]; - int i; - for (i=0;iAddItemAt(listStr1, i); - } - - x += rect.width+5; - x = createTestButton(window, kSetSelection, x, y, 125, ListBoxTestHandleEvent) + 5; - x = createTestButton(window, kRemoveSelection, x, y, 125, ListBoxTestHandleEvent); - x = 5; - y += rect.height + 5; - - - // - // create a multi-selection listbox widget - // - - rect.SetRect(x, y, 150, 100); -//#ifdef XP_PC - NSRepository::CreateInstance(kCListBoxCID, nsnull, kIListBoxIID, (void**)&gMultiListBox); - // Notice the extra agrument PR_TRUE below which indicates that - // the list widget is multi-select - gMultiListBox->SetMultipleSelection(PR_TRUE); - gMultiListBox->Create(window, rect, HandleEvent, NULL); - for (i=0;iAddItemAt(listStr1, i); - } - gMultiListBox->Show(PR_TRUE); -//#endif - - x = createTestButton(window, kSetSelection, x+150, y, 125, MultiListBoxTestHandleEvent); - x = createTestButton(window, kRemoveSelection, x+5, y, 125, MultiListBoxTestHandleEvent); - x = createTestButton(window, kSetSelectedIndices, x+5, y, 125, MultiListBoxTestHandleEvent); - - y += rect.height + 5; - x = 5; - - // - // create a tab widget - // - rect.SetRect(300, 500, 200, 50); -#ifdef XP_PC - NSRepository::CreateInstance(kCTabWidgetCID, nsnull, kITabWidgetIID, (void**)&tabWidget); - tabWidget->Create(window, rect, HandleTabEvent, NULL); - nsString tabs[] = {"low", "medium", "high" }; - - tabWidget->SetTabs(3, tabs); - tabWidget->Show(PR_TRUE); -#endif - - // - // create a Radio button - // - nsIRadioButton * radioButton; - rect.SetRect(x, y, 120, 25); - - NSRepository::CreateInstance(kCRadioButtonCID, nsnull, kIRadioButtonIID, (void**)&radioButton); - radioButton->Create(window, rect, HandleEvent, NULL); - nsString rbLabel("RadioButton1"); - radioButton->SetLabel(rbLabel); - radioButton->Show(PR_TRUE); - gRadioBtns[gNumRadioBtns++] = radioButton; - //NS_RELEASE(radioButton); - y += rect.height + 5; - - // - // create a Radio button - // - rect.SetRect(x, y, 120, 25); - - NSRepository::CreateInstance(kCRadioButtonCID, nsnull, kIRadioButtonIID, (void**)&radioButton); - radioButton->Create(window, rect, HandleEvent, NULL); - nsString rbLabel2("RadioButton2"); - radioButton->SetLabel(rbLabel2); - radioButton->Show(PR_TRUE); - gRadioBtns[gNumRadioBtns++] = radioButton; - //NS_RELEASE(radioButton); - y += rect.height + 5; - - //window->SetBackgroundColor(NS_RGB(0,255,0)); - - // - // create a ComboBox - // - rect.SetRect(x, y, 120, 100); - - NSRepository::CreateInstance(kCComboBoxCID, nsnull, kIComboBoxIID, (void**)&comboBox); - comboBox->Create(window, rect, HandleEvent, NULL); - comboBox->Show(PR_TRUE); - for (i=0;iAddItemAt(listStr1, i); - } - //NS_RELEASE(comboBox); - - x = createTestButton(window, kSetSelection, x+125, y, 125, ComboTestHandleEvent); - x = createTestButton(window, kRemoveSelection, x+5, y, 125, ComboTestHandleEvent); - - x = 5; - y += 30; - - - nsString status("The non-visual tests: "); - status.Append( (gOverallStatus ? "PASSED":"FAILED")); - - gNonVisualStatus = gOverallStatus; - - statusText->SetText(status); - - // show - window->Show(PR_TRUE); - window->SetCursor(eCursor_hyperlink); - - return(appShell->Run()); -} - - diff --git a/mozilla/widget/tests/widget/viewerMenu.cpp b/mozilla/widget/tests/widget/viewerMenu.cpp deleted file mode 100644 index 730f2db7767..00000000000 --- a/mozilla/widget/tests/widget/viewerMenu.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#include -#include -#include -#include "resources.h" -#include "viewerMenu.h" - -//============================================================== - typedef struct _callBackInfo { - MenuCallbackProc mCallback; - int mId; - } MenuCallbackStruct; - -//============================================================== -void nsXtWidget_Menu_Callback(Widget w, XtPointer p, XtPointer call_data) -{ - fprintf(stderr, "Menu Selected 0x%x 0x%x\n", p, call_data); - - MenuCallbackStruct * cbs = (MenuCallbackStruct *)p; - if (cbs != NULL) { - MenuCallbackProc cb = (MenuCallbackProc)call_data; - if (cbs->mCallback != NULL) { - (*cbs->mCallback)((int)cbs->mId); - } - } -} - - -//----------------------------------------------------- -Widget CreatePulldownMenu(Widget aParent, - char * aMenuTitle, - char * aMenuMnemonic) -{ - - Widget pullDown; - Widget casBtn; - XmString str; - - pullDown = XmCreatePulldownMenu(aParent, "_pulldown", NULL, 0); - - str = XmStringCreateLocalized(aMenuTitle); - casBtn = XtVaCreateManagedWidget(aMenuTitle, - xmCascadeButtonGadgetClass, aParent, - XmNsubMenuId, pullDown, - XmNlabelString, str, - XmNmnemonic, aMenuMnemonic, - NULL); - XmStringFree(str); - - return pullDown; - -} - -//----------------------------------------------------- -Widget CreateMenuItem(Widget aParent, - char * aTitle, - long aID, - MenuCallbackProc aCallback) -{ - - Widget widget = XtVaCreateManagedWidget(aTitle, xmPushButtonGadgetClass, - aParent, - NULL); - - MenuCallbackStruct * cbs = new MenuCallbackStruct(); - cbs->mCallback = aCallback; - cbs->mId = aID; - - XtAddCallback(widget, XmNactivateCallback, nsXtWidget_Menu_Callback, cbs); - - return widget; - -} -//----------------------------------------------------- -Widget CreateSeparator(Widget aParent) -{ - - Widget widget = XtVaCreateManagedWidget("__sep", xmSeparatorGadgetClass, - aParent, - NULL); -} - -typedef struct _menuBtns { - char * title; - char * mneu; - long command; -} MenuBtns; - -//----------------------------------------------------- -void AddMenuItems(Widget aParent, - MenuBtns * aBtns, - MenuCallbackProc aCallback) -{ - int i = 0; - while (aBtns[i].title != NULL) { - if (!strcmp(aBtns[i].title, "separator")) { - CreateSeparator(aParent); - } else { - CreateMenuItem(aParent, aBtns[i].title, aBtns[i].command, aCallback); - } - i++; - } -} - -//----------------------------------------------------- -void CreateViewerMenus(Widget aParent, MenuCallbackProc aCallback) -{ - MenuBtns editBtns[] = { - {"Cut", "T", VIEWER_EDIT_CUT}, - {"Copy", "C", VIEWER_EDIT_COPY}, - {"Paste", "P", VIEWER_EDIT_PASTE}, - {"separator", NULL, 0}, - {"Select All", "A", VIEWER_EDIT_SELECTALL}, - {"separator", NULL, 0}, - {"Find in Page", "F", VIEWER_EDIT_FINDINPAGE}, - {NULL, NULL, 0} - }; - - MenuBtns debugBtns[] = { - {"Visual Debugging", "V", VIEWER_VISUAL_DEBUGGING}, - {"Reflow Test", "R", VIEWER_REFLOW_TEST}, - {"separator", NULL, 0}, - {"Dump Content", "C", VIEWER_DUMP_CONTENT}, - {"Dump Frames", "F", VIEWER_DUMP_FRAMES}, - {"Dump Views", "V", VIEWER_DUMP_VIEWS}, - {"separator", NULL, 0}, - {"Dump Style Sheets", "S", VIEWER_DUMP_STYLE_SHEETS}, - {"Dump Style Contexts", "T", VIEWER_DUMP_STYLE_CONTEXTS}, - {"separator", NULL, 0}, - {"Show Content Size", "z", VIEWER_SHOW_CONTENT_SIZE}, - {"Show Frame Size", "a", VIEWER_SHOW_FRAME_SIZE}, - {"Show Style Size", "y", VIEWER_SHOW_STYLE_SIZE}, - {"separator", NULL, 0}, - {"Debug Robot", "R", VIEWER_DEBUGROBOT}, - {NULL, NULL, 0} - }; - - Widget menuBar; - Widget fileMenu; - Widget debugMenu; - Widget menu; - - menuBar = XmCreateMenuBar(aParent, "menubar", NULL, 0); - - fileMenu = CreatePulldownMenu(menuBar, "File", "F"); - CreateMenuItem(fileMenu, "Open...", VIEWER_OPEN, aCallback); - - menu = CreatePulldownMenu(fileMenu, "Samples", "S"); - CreateMenuItem(menu, "demo #0", VIEWER_DEMO0, aCallback); - CreateMenuItem(menu, "demo #1", VIEWER_DEMO1, aCallback); - CreateMenuItem(menu, "demo #2", VIEWER_DEMO2, aCallback); - CreateMenuItem(menu, "demo #3", VIEWER_DEMO3, aCallback); - CreateMenuItem(menu, "demo #4", VIEWER_DEMO4, aCallback); - CreateMenuItem(menu, "demo #5", VIEWER_DEMO5, aCallback); - CreateMenuItem(menu, "demo #6", VIEWER_DEMO6, aCallback); - CreateMenuItem(menu, "demo #7", VIEWER_DEMO7, aCallback); - CreateMenuItem(menu, "demo #8", VIEWER_DEMO8, aCallback); - - menu = CreatePulldownMenu(fileMenu, "Print Preview", "P"); - CreateMenuItem(menu, "One Column", VIEWER_ONE_COLUMN, aCallback); - CreateMenuItem(menu, "Two Column", VIEWER_TWO_COLUMN, aCallback); - CreateMenuItem(menu, "Three Column", VIEWER_THREE_COLUMN, aCallback); - - CreateMenuItem(fileMenu, "Exit", VIEWER_EXIT, aCallback); - - menu = CreatePulldownMenu(menuBar, "Edit", "E"); - AddMenuItems(menu, editBtns, aCallback); - - debugMenu = CreatePulldownMenu(menuBar, "Debug", "D"); - AddMenuItems(debugMenu, debugBtns, aCallback); - - menu = CreatePulldownMenu(menuBar, "Tools", "T"); - CreateMenuItem(menu, "Java Script Console", JS_CONSOLE, aCallback); - - XtManageChild(menuBar); - -} diff --git a/mozilla/widget/tests/widget/viewerMenu.h b/mozilla/widget/tests/widget/viewerMenu.h deleted file mode 100644 index 70c7a4a61e8..00000000000 --- a/mozilla/widget/tests/widget/viewerMenu.h +++ /dev/null @@ -1,29 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#ifndef viewerMenu_h_ -#define viewerMenu_h_ - -typedef void (*MenuCallbackProc)( - int -); - -void CreateViewerMenus(Widget aParent, MenuCallbackProc aCallback); - - -#endif // viewerMenu_h_ diff --git a/mozilla/xpcom/ds/nsArena.cpp b/mozilla/xpcom/ds/nsArena.cpp deleted file mode 100644 index a38ef687f58..00000000000 --- a/mozilla/xpcom/ds/nsArena.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIArena.h" -#include "nsCRT.h" - -#define PL_ARENA_CONST_ALIGN_MASK 7 -#include "plarena.h" - -static NS_DEFINE_IID(kArenaIID, NS_IARENA_IID); - -// Simple arena implementation layered on plarena -class ArenaImpl : public nsIArena { -public: - ArenaImpl(PRInt32 aBlockSize); - - NS_DECL_ISUPPORTS - - virtual void* Alloc(PRInt32 aSize); - -protected: - ~ArenaImpl(); - - PLArenaPool mPool; - PRInt32 mBlockSize; -}; - -ArenaImpl::ArenaImpl(PRInt32 aBlockSize) -{ - NS_INIT_REFCNT(); - if (aBlockSize < NS_MIN_ARENA_BLOCK_SIZE) { - aBlockSize = NS_DEFAULT_ARENA_BLOCK_SIZE; - } - PL_INIT_ARENA_POOL(&mPool, "nsIArena", aBlockSize); - mBlockSize = aBlockSize; -} - -NS_IMPL_ISUPPORTS(ArenaImpl,kArenaIID) - -ArenaImpl::~ArenaImpl() -{ - PL_FinishArenaPool(&mPool); -} - -void* ArenaImpl::Alloc(PRInt32 size) -{ - // Adjust size so that it's a multiple of sizeof(double) - PRInt32 align = size & (sizeof(double) - 1); - if (0 != align) { - size += sizeof(double) - align; - } - - void* p; - PL_ARENA_ALLOCATE(p, &mPool, size); - return p; -} - -NS_BASE nsresult NS_NewHeapArena(nsIArena** aInstancePtrResult, - PRInt32 aArenaBlockSize) -{ - ArenaImpl* it = new ArenaImpl(aArenaBlockSize); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kArenaIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/xpcom/ds/nsAtomTable.cpp b/mozilla/xpcom/ds/nsAtomTable.cpp deleted file mode 100644 index 41c5de0282b..00000000000 --- a/mozilla/xpcom/ds/nsAtomTable.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIAtom.h" -#include "nsString.h" -#include "nsCRT.h" -#include "plhash.h" -#include "nsISizeOfHandler.h" - -/** - * The shared hash table for atom lookups. - */ -static nsrefcnt gAtoms; -static struct PLHashTable* gAtomHashTable; - -class AtomImpl : public nsIAtom { -public: - AtomImpl(); - ~AtomImpl(); - - NS_DECL_ISUPPORTS - - void* operator new(size_t size, const PRUnichar* us, PRInt32 uslen); - - virtual void ToString(nsString& aBuf) const; - - virtual const PRUnichar* GetUnicode() const; - - NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler) const; - - // Actually more; 0 terminated. This slot is reserved for the - // terminating zero. - PRUnichar mString[1]; -}; - -AtomImpl::AtomImpl() -{ - NS_INIT_REFCNT(); - // Every live atom holds a reference on the atom hashtable - gAtoms++; -} - -AtomImpl::~AtomImpl() -{ - NS_PRECONDITION(nsnull != gAtomHashTable, "null atom hashtable"); - if (nsnull != gAtomHashTable) { - PL_HashTableRemove(gAtomHashTable, mString); - nsrefcnt cnt = --gAtoms; - if (0 == cnt) { - // When the last atom is destroyed, the atom arena is destroyed - NS_ASSERTION(0 == gAtomHashTable->nentries, "bad atom table"); - PL_HashTableDestroy(gAtomHashTable); - gAtomHashTable = nsnull; - } - } -} - -static NS_DEFINE_IID(kIAtomIID, NS_IATOM_IID); -NS_IMPL_ISUPPORTS(AtomImpl, kIAtomIID); - -void* AtomImpl::operator new(size_t size, const PRUnichar* us, PRInt32 uslen) -{ - size = size + uslen * sizeof(PRUnichar); - AtomImpl* ii = (AtomImpl*) new char[size]; - nsCRT::memcpy(ii->mString, us, uslen * sizeof(PRUnichar)); - ii->mString[uslen] = 0; - return ii; -} - -void AtomImpl::ToString(nsString& aBuf) const -{ - aBuf.SetLength(0); - aBuf.Append(mString, nsCRT::strlen(mString)); -} - -const PRUnichar* AtomImpl::GetUnicode() const -{ - return mString; -} - -NS_IMETHODIMP -AtomImpl::SizeOf(nsISizeOfHandler* aHandler) const -{ - aHandler->Add(sizeof(*this) + nsCRT::strlen(mString) * sizeof(PRUnichar)); - return NS_OK; -} - -//---------------------------------------------------------------------- - -static PLHashNumber HashKey(const PRUnichar* k) -{ - return (PLHashNumber) nsCRT::HashCode(k); -} - -static PRIntn CompareKeys(const PRUnichar* k1, const PRUnichar* k2) -{ - return nsCRT::strcmp(k1, k2) == 0; -} - -NS_BASE nsIAtom* NS_NewAtom(const char* isolatin1) -{ - nsAutoString tmp(isolatin1); - return NS_NewAtom(tmp.GetUnicode()); -} - -NS_BASE nsIAtom* NS_NewAtom(const nsString& aString) -{ - return NS_NewAtom(aString.GetUnicode()); -} - -NS_BASE nsIAtom* NS_NewAtom(const PRUnichar* us) -{ - if (nsnull == gAtomHashTable) { - gAtomHashTable = PL_NewHashTable(8, (PLHashFunction) HashKey, - (PLHashComparator) CompareKeys, - (PLHashComparator) nsnull, - nsnull, nsnull); - } - PRInt32 uslen; - PRInt32 hashCode = nsCRT::HashCode(us, &uslen); - PLHashEntry** hep = PL_HashTableRawLookup(gAtomHashTable, hashCode, us); - PLHashEntry* he = *hep; - if (nsnull != he) { - nsIAtom* id = (nsIAtom*) he->value; - NS_ADDREF(id); - return id; - } - AtomImpl* id = new(us, uslen) AtomImpl(); - PL_HashTableRawAdd(gAtomHashTable, hep, hashCode, id->mString, id); - NS_ADDREF(id); - return id; -} - -NS_BASE nsrefcnt NS_GetNumberOfAtoms(void) -{ - if (nsnull != gAtomHashTable) { - NS_PRECONDITION(nsrefcnt(gAtomHashTable->nentries) == gAtoms, "bad atom table"); - } - return gAtoms; -} diff --git a/mozilla/xpcom/ds/nsBTree.cpp b/mozilla/xpcom/ds/nsBTree.cpp deleted file mode 100644 index a771d94aaac..00000000000 --- a/mozilla/xpcom/ds/nsBTree.cpp +++ /dev/null @@ -1,403 +0,0 @@ - -/** - * This file defines the binary tree class and it - * nsNode child class. - * - * This simple version stores nodes, and the - * nodes store void* ptrs. - * - * @update gess 4/11/98 - * @param - * @return - */ - -#include "nsBTree.h" - -/** - * default constructor - * - * @update gess 4/11/98 - */ -nsNode::nsNode(){ - mLeft=0; - mRight=0; - mParent=0; - mColor=eBlack; -} - - -/** - * Copy constructor - * - * @update gess 4/11/98 - * @param - * @return - */ -nsNode::nsNode(const nsNode& aNode){ - mLeft=aNode.mLeft; - mRight=aNode.mRight; - mParent=aNode.mParent; - mColor=aNode.mColor; -} - -/** - * destructor - * - * @update gess 4/11/98 - */ -nsNode::~nsNode(){ -} - -/** - * Retrive ptr to parent node - * - * @update gess 4/11/98 - * @return ptr to parent node - */ -nsNode* nsNode::GetParentNode(void) const{ - return mParent; -} - -/** - * Retrieve ptr to left (less) node - * - * @update gess 4/11/98 - * @return ptr to left (may be NULL) - */ -nsNode* nsNode::GetLeftNode(void) const{ - return mLeft; -} - -/** - * Retrieve ptr to right (more) node - * - * @update gess 4/11/98 - * @return ptr to right node (may be NULL) - */ -nsNode* nsNode::GetRightNode(void) const{ - return mRight; -} - - -/** - * - * - * @update gess 4/11/98 - * @param - * @return - */ -nsNode& nsNode::operator=(const nsNode& aNode){ - if(this!=&aNode){ - mLeft=aNode.mLeft; - mRight=aNode.mRight; - mParent=aNode.mParent; - mColor=aNode.mColor; - } - return *this; -} - -/******************************************************** - * Here comes the BTREE class... - ********************************************************/ - -/** - * nsBTree constructor - * - * @update gess 4/11/98 - */ -nsBTree::nsBTree(){ - mRoot=0; -} - - -/** - * destructor - * - * @update gess 4/11/98 - */ -nsBTree::~nsBTree(){ - if(mRoot){ - //walk the tree and destroy the children. - } -} - -/** - * Given a node, we're supposed to add it into - * our tree. - * - * @update gess 4/11/98 - * @param aNode to be added to tree - * @return ptr to added node or NULL - */ -nsNode* nsBTree::Add(nsNode& aNode){ - PRBool result=PR_TRUE; - - nsNode* node1=mRoot; //x - nsNode* node2=0; //y - while(node1) { - node2=node1; - if(aNode<*node1) - node1=node1->mLeft; - else node1=node1->mRight; - } - aNode.mParent=node2; - if(!node2){ - mRoot=&aNode; - } - else{ - if(aNode<*node2) - node2->mLeft=&aNode; - else node2->mRight=&aNode; - } - - return &aNode; -} - - -/** - * Removes given node from tree if present. - * - * @update gess 4/11/98 - * @param aNode to be found and removed - * @return ptr to remove node, or NULL - */ -nsNode* nsBTree::Remove(nsNode& aNode){ - nsNode* result=0; - nsNode* node3=Find(aNode); - - if(node3) { - nsNode* node1; - nsNode* node2; - - if((!node3->mLeft) || (!node3->mRight)) - node2=node3; - else node2=After(*node3); - - if(node2->mLeft) - node1=node2->mLeft; - else node1=node2->mRight; - - if(node1) - node1->mParent=node2->mParent; - - if(node2->mParent) { - if(node2==node2->mParent->mLeft) - node2->mParent->mLeft=node1; - else node2->mParent->mRight=node1; - } - else mRoot=node1; - - if(node2!=node3) - (*node3)==(*node2); - - if(node2->mColor == nsNode::eBlack) - ReBalance(*node1); - - delete node2; - result=&aNode; - } - return result; -} - -/** - * Clears the tree of any data. - * Be careful here if your objects are heap based! - * This method doesn't free the objects, so if you - * don't have your own pointers, they will become - * orphaned. - * - * @update gess 4/11/98 - * @param - * @return this - */ -nsBTree& nsBTree::Empty(nsNode* aNode) { - mRoot=0; - return *this; -} - -/** - * This method destroys all the objects in the tree. - * WARNING: Never call this method on stored objects - * that are stack-based! - * - * @update gess 4/11/98 - * @param - * @return this - */ -nsBTree& nsBTree::Erase(nsNode* aNode){ - nsNode* node1 =(aNode) ? aNode : mRoot; - - if(aNode) { - Erase(aNode->mLeft); //begin by walking left side - Erase(aNode->mRight); //then search right side - delete aNode; //until a leaf, then delete - } - return *this; -} - -/** - * Retrieve ptr to first node in tree - * - * @update gess 4/11/98 - * @return - */ -nsNode* nsBTree::First(void) const{ - if(mRoot) - return First(*mRoot); - return 0; -} - -/** - * Retrive ptr to first node rel to given node - * - * @update gess 4/11/98 - * @param node to begin scan from - * @return ptr to first node from given node or NULL - */ -nsNode* nsBTree::First(const nsNode& aNode) const{ - nsNode* result=0; - - if(mRoot) { - result=mRoot; - while(result->GetLeftNode()) { - result=result->GetLeftNode(); - } - } - return result; -} - -/** - * Retrive ptr to last node - * - * @update gess 4/11/98 - * @return ptr to last node rel to root or NULL - */ -nsNode* nsBTree::Last(void) const{ - if(mRoot) - return Last(*mRoot); - return 0; -} - -/** - * Retrive ptr to last node rel to given node - * - * @update gess 4/11/98 - * @param node to begin scan from - * @return ptr to first node from given node or NULL - */ -nsNode* nsBTree::Last(const nsNode& aNode) const{ - nsNode* result=0; - - if(mRoot) { - result=mRoot; - while(result->GetRightNode()) { - result=result->GetRightNode(); - } - } - return result; -} - - -/** - * Retrive ptr to prior node rel to given node - * - * @update gess 4/11/98 - * @param node to begin scan from - * @return ptr to prior node from given node or NULL - */ -nsNode* nsBTree::Before(const nsNode& aNode) const{ - - if(aNode.GetLeftNode()) - return Last(*aNode.GetLeftNode()); - - //otherwise... - - nsNode* node1=(nsNode*)&aNode; - nsNode* node2=aNode.GetParentNode(); - - while((node2) && (node1==node2->GetLeftNode())) { - node1=node2; - node2=node2->GetParentNode(); - } - return node2; -} - - -/** - * Retrive ptr to next node rel to given node - * - * @update gess 4/11/98 - * @param node to begin scan from - * @return ptr to next node from given node or NULL - */ -nsNode* nsBTree::After(const nsNode& aNode) const{ - - if(aNode.GetRightNode()) - return First(*aNode.GetRightNode()); - - //otherwise... - - nsNode* node1=(nsNode*)&aNode; - nsNode* node2=aNode.GetParentNode(); - - while((node2) && (node1==node2->GetRightNode())) { - node1=node2; - node2=node2->GetParentNode(); - } - - return node2; -} - -/** - * Scan for given node - * - * @update gess 4/11/98 - * @param node to find - * @return ptr to given node, or NULL - */ -nsNode* nsBTree::Find(const nsNode& aNode) const{ - nsNode* result=mRoot; - - while((result) && (!(aNode==(*result)))) { - if(aNode<*result) - result=result->mLeft; - else result=result->mRight; - } - return (nsNode*)result; -} - -/** - * Rebalances tree around the given node. This only - * needs to be called after a node is deleted. - * This method does nothing for btrees, but is - * needed for RBTrees. - * - * @update gess 4/11/98 - * @param aNode -- node to balance around - * @return this - */ -nsBTree& nsBTree::ReBalance(nsNode& aNode){ - return *this; -} - - -/** - * - * - * @update gess 4/11/98 - * @param - * @return - */ -const nsBTree& nsBTree::ForEach(nsNodeFunctor& aFunctor,nsNode* aNode) const{ - nsNode* node1 =(aNode) ? aNode : mRoot; - - if(node1) { - if(node1->mLeft) - ForEach(aFunctor,node1->mLeft); //begin by walking left side - aFunctor(*node1); - if(node1->mRight) - ForEach(aFunctor,node1->mRight); //then search right side - } - return *this; -} - diff --git a/mozilla/xpcom/ds/nsBTree.h b/mozilla/xpcom/ds/nsBTree.h deleted file mode 100644 index 62b79b8b654..00000000000 --- a/mozilla/xpcom/ds/nsBTree.h +++ /dev/null @@ -1,283 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -/** - * This file defines the binary tree class and it - * nsNode child class. Note that like all nsBTree - * containers, this one does not automatically balance. - * (Find for random data, bad for pre-ordered data). - * - * This simple version stores nodes, and the - * nodes store void* ptrs. - * - * @update gess 4/11/98 - */ - - -/** - * nsNode - * - * @update gess 4/11/98 - * @param - * @return - */ - -#ifndef _BTREE_H -#define _BTREE_H - -#include "nscore.h" - -struct NS_BASE nsNode { - - /** - * - * @update gess4/20/98 - * @param - * @return - */ - nsNode(); - - /** - * Copy constructor - * @update gess 4/11/98 - */ - nsNode(const nsNode& aNode); - - /** - * destructor - * @update gess 4/11/98 - */ - virtual ~nsNode(); - - /** - * Retrieve parent node - * - * @update gess 4/11/98 - * @return - */ - nsNode* GetParentNode(void) const; - - /** - * - * @update gess 4/11/98 - * @param - * @return - */ - nsNode* GetLeftNode() const; - - /** - * - * @update gess 4/11/98 - * @param - * @return - */ - nsNode* GetRightNode() const; - - /** - * - * @update gess 4/11/98 - * @param - * @return - */ - virtual nsNode& operator=(const nsNode& aNode); - - - /** - * This method gets called to determine which of - * two nodes is less. When you create your own - * subclass of nsNode, this is the most important - * method for you to overload. - * - * @update gess 4/11/98 - * @param - * @return - */ - virtual PRBool operator<(const nsNode& aNode) const=0; - - /** - * This method gets called to determine which of - * two nodes is less. When you create your own - * subclass of nsNode, this is the most important - * method for you to overload. - * - * @update gess 4/11/98 - * @param - * @return - */ - virtual PRBool operator==(const nsNode& aNode) const=0; - - enum eRBColor {eRed,eBlack}; - - nsNode* mParent; - nsNode* mLeft; - nsNode* mRight; - eRBColor mColor; -}; - -/** - * The Nodefunctor class is used when you want to create - * callbacks between the nsRBTree and your generic code. - * - * @update gess4/20/98 - */ -class NS_BASE nsNodeFunctor { -public: - virtual nsNodeFunctor& operator()(nsNode& aNode)=0; -}; - - -/**************************************************** - * Here comes the nsBTree class... - ****************************************************/ - -class NS_BASE nsBTree { -public: -friend class nsBTreeIterator; - - nsBTree(); - ~nsBTree(); - - /** - * Add given node reference into our tree. - * - * @update gess 4/11/98 - * @param aNode is a ref to a node to be added - * @return newly added node - */ - nsNode* Add(nsNode& aNode); - - /** - * Remove given node reference into our tree. - * - * @update gess 4/11/98 - * @param aNode is a ref to a node to be removed - * @return Ptr to node if found (and removed) or NULL - */ - nsNode* Remove(nsNode& aNode); - - /** - * Clears the tree of any data. - * Be careful here if your objects are heap based! - * This method doesn't free the objects, so if you - * don't have your own pointers, they will become - * orphaned. - * - * @update gess 4/11/98 - * @param - * @return this - */ - nsBTree& Empty(nsNode* aNode=0); - - /** - * This method destroys all the objects in the tree. - * WARNING: Never call this method on stored objects - * that are stack-based! - * - * @update gess 4/11/98 - * @param - * @return this - */ - nsBTree& Erase(nsNode* aNode=0); - - /** - * Retrieve ptr to 1st node in tree (starting at root) - * - * @update gess 4/11/98 - * @return ptr to 1st node, possible to be NULL - */ - nsNode* First(void) const; - - /** - * Find first node in tree starting at given node - * - * @update gess 4/11/98 - * @param aNode node to begin 1st search from - * @return ptr to 1st node below given node - */ - nsNode* First(const nsNode& aNode) const; - - /** - * Retrieve ptr to last node in tree relative to root. - * - * @update gess 4/11/98 - * @return ptr to last node or NULL - */ - nsNode* Last(void) const; - - /** - * Retrieve ptr to last node in tree relative to given node. - * - * @update gess 4/11/98 - * @param node to find last node from - * @return ptr to last node or NULL - */ - nsNode* Last(const nsNode& aNode) const; - - /** - * Retrieve a ptr to the node that preceeds given node - * - * @update gess 4/11/98 - * @param aNode used as reference to find prev. - * @return ptr to prev node or NULL - */ - nsNode* Before(const nsNode& aNode) const; - - /** - * Retrieve a ptr to the node after given node - * - * @update gess 4/11/98 - * @param aNode used as reference to find next. - * @return ptr to next node or NULL - */ - nsNode* After(const nsNode& aNode) const; - - /** - * Find given node in tree. - * (Why would you want to find a node you already have?) - * - * @update gess 4/11/98 - * @param aNode is the node you're searching for - * @return ptr to node if found, or NULL - */ - nsNode* Find(const nsNode& aNode) const; - - /** - * Walks the tree, starting with root. - * - * @update gess 4/11/98 - */ - virtual const nsBTree& ForEach(nsNodeFunctor& aFunctor,nsNode* aNode=0) const; - -protected: - - /** - * Rebalances tree around the given node. This only - * needs to be called after a node is deleted. - * - * @update gess 4/11/98 - * @param aNode -- node to balance around - * @return this - */ - virtual nsBTree& ReBalance(nsNode& aNode); - - - nsNode* mRoot; -}; - -#endif - diff --git a/mozilla/xpcom/ds/nsByteBuffer.cpp b/mozilla/xpcom/ds/nsByteBuffer.cpp deleted file mode 100644 index a27f8cbf2c9..00000000000 --- a/mozilla/xpcom/ds/nsByteBuffer.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsIByteBuffer.h" -#include "nsIInputStream.h" -#include "nsCRT.h" - -#define MIN_BUFFER_SIZE 32 - -class ByteBufferImpl : public nsIByteBuffer { -public: - ByteBufferImpl(PRInt32 aBufferSize); - ~ByteBufferImpl(); - - NS_DECL_ISUPPORTS - virtual PRInt32 GetLength() const; - virtual PRInt32 GetBufferSize() const; - virtual char* GetBuffer() const; - virtual PRBool Grow(PRInt32 aNewSize); - virtual PRInt32 Fill(PRInt32* aErrorCode, nsIInputStream* aStream, - PRInt32 aKeep); - - char* mBuffer; - PRInt32 mSpace; - PRInt32 mLength; -}; - -ByteBufferImpl::ByteBufferImpl(PRInt32 aBufferSize) -{ - if (PRUint32(aBufferSize) < MIN_BUFFER_SIZE) { - aBufferSize = MIN_BUFFER_SIZE; - } - mSpace = aBufferSize; - mBuffer = new char[aBufferSize]; - mLength = 0; - NS_INIT_REFCNT(); -} - -NS_DEFINE_IID(kByteBufferIID,NS_IBYTE_BUFFER_IID); -NS_IMPL_ISUPPORTS(ByteBufferImpl,kByteBufferIID) - -ByteBufferImpl::~ByteBufferImpl() -{ - if (nsnull != mBuffer) { - delete mBuffer; - mBuffer = nsnull; - } - mLength = 0; -} - -PRInt32 ByteBufferImpl::GetLength() const -{ - return mLength; -} - -PRInt32 ByteBufferImpl::GetBufferSize() const -{ - return mSpace; -} - -char* ByteBufferImpl::GetBuffer() const -{ - return mBuffer; -} - -PRBool ByteBufferImpl::Grow(PRInt32 aNewSize) -{ - if (PRUint32(aNewSize) < MIN_BUFFER_SIZE) { - aNewSize = MIN_BUFFER_SIZE; - } - char* newbuf = new char[aNewSize]; - if (nsnull != newbuf) { - if (0 != mLength) { - nsCRT::memcpy(newbuf, mBuffer, mLength); - } - delete mBuffer; - mBuffer = newbuf; - return PR_TRUE; - } - return PR_FALSE; -} - -PRInt32 ByteBufferImpl::Fill(PRInt32* aErrorCode, nsIInputStream* aStream, - PRInt32 aKeep) -{ - NS_PRECONDITION(nsnull != aStream, "null stream"); - NS_PRECONDITION(PRUint32(aKeep) <= PRUint32(mLength), "illegal keep count"); - if ((nsnull == aStream) || (PRUint32(aKeep) > PRUint32(mLength))) { - // whoops - *aErrorCode = NS_INPUTSTREAM_ILLEGAL_ARGS; - return -1; - } - - if (0 != aKeep) { - // Slide over kept data - nsCRT::memmove(mBuffer, mBuffer + (mLength - aKeep), aKeep); - } - - // Read in some new data - mLength = aKeep; - PRInt32 amount = mSpace - aKeep; - PRInt32 nb = aStream->Read(aErrorCode, mBuffer, aKeep, amount); - if (nb > 0) { - mLength += nb; - } - return nb; -} - -NS_BASE nsresult NS_NewByteBuffer(nsIByteBuffer** aInstancePtrResult, - nsISupports* aOuter, - PRInt32 aBufferSize) -{ - if (nsnull != aOuter) { - return NS_ERROR_NO_AGGREGATION; - } - ByteBufferImpl* it = new ByteBufferImpl(aBufferSize); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kByteBufferIID, (void **) aInstancePtrResult); -} diff --git a/mozilla/xpcom/ds/nsCRT.cpp b/mozilla/xpcom/ds/nsCRT.cpp deleted file mode 100644 index c4ac141a2ad..00000000000 --- a/mozilla/xpcom/ds/nsCRT.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#include "nsCRT.h" - -// XXX Bug: These tables don't lowercase the upper 128 characters properly - -// This table maps uppercase characters to lower case characters; -// characters that are neither upper nor lower case are unaffected. -static const unsigned char kUpper2Lower[256] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, - - // upper band mapped to lower [A-Z] => [a-z] - 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119,120,121,122, - - 91, 92, 93, 94, 95, - 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, - 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 -}; - -static const unsigned char kLower2Upper[256] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, - - // lower band mapped to upper [a-z] => [A-Z] - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - - 123,124,125,126,127, - 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 -}; - -static const PRUnichar kIsoLatin1ToUCS2[256] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, - 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 -}; - -//---------------------------------------------------------------------- - -#define TOLOWER(_ucs2) \ - (((_ucs2) < 256) ? PRUnichar(kUpper2Lower[_ucs2]) : _ToLower(_ucs2)) - -#define TOUPPER(_ucs2) \ - (((_ucs2) < 256) ? PRUnichar(kLower2Upper[_ucs2]) : _ToUpper(_ucs2)) - -static PRUnichar _ToLower(PRUnichar aChar) -{ - // XXX need i18n code here - return aChar; -} - -static PRUnichar _ToUpper(PRUnichar aChar) -{ - // XXX need i18n code here - return aChar; -} - -//---------------------------------------------------------------------- - -PRUnichar nsCRT::ToUpper(PRUnichar aChar) -{ - return TOUPPER(aChar); -} - -PRUnichar nsCRT::ToLower(PRUnichar aChar) -{ - return TOLOWER(aChar); -} - -PRInt32 nsCRT::strlen(const PRUnichar* s) -{ - PRInt32 len = 0; - while (*s++ != 0) { - len++; - } - return len; -} - -PRInt32 nsCRT::strcmp(const PRUnichar* s1, const PRUnichar* s2) -{ - for (;;) { - PRUnichar c1 = *s1++; - PRUnichar c2 = *s2++; - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - if (c1 == 0) break; - } - return 0; -} - -// characters following a null character are not compared -PRInt32 nsCRT::strncmp(const PRUnichar* s1, const PRUnichar* s2, PRInt32 n) -{ - while (--n >= 0) { - PRUnichar c1 = *s1++; - PRUnichar c2 = *s2++; - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strcasecmp(const PRUnichar* s1, const PRUnichar* s2) -{ - for (;;) { - PRUnichar c1 = *s1++; - PRUnichar c2 = *s2++; - if (c1 != c2) { - c1 = TOLOWER(c1); - c2 = TOLOWER(c2); - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strncasecmp(const PRUnichar* s1, const PRUnichar* s2, PRInt32 n) -{ - while (--n >= 0) { - PRUnichar c1 = *s1++; - PRUnichar c2 = *s2++; - if (c1 != c2) { - c1 = TOLOWER(c1); - c2 = TOLOWER(c2); - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strcmp(const PRUnichar* s1, const char* s2) -{ - for (;;) { - PRUnichar c1 = *s1++; - PRUnichar c2 = kIsoLatin1ToUCS2[*(const unsigned char*)s2++]; - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strncmp(const PRUnichar* s1, const char* s2, PRInt32 n) -{ - while (--n >= 0) { - PRUnichar c1 = *s1++; - PRUnichar c2 = kIsoLatin1ToUCS2[*(const unsigned char*)s2++]; - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strcasecmp(const PRUnichar* s1, const char* s2) -{ - for (;;) { - PRUnichar c1 = *s1++; - PRUnichar c2 = kIsoLatin1ToUCS2[*(const unsigned char*)s2++]; - if (c1 != c2) { - c1 = TOLOWER(c1); - c2 = TOLOWER(c2); - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::strncasecmp(const PRUnichar* s1, const char* s2, PRInt32 n) -{ - while (--n >= 0) { - PRUnichar c1 = *s1++; - PRUnichar c2 = kIsoLatin1ToUCS2[*(const unsigned char*)s2++]; - if (c1 != c2) { - c1 = TOLOWER(c1); - c2 = TOLOWER(c2); - if (c1 != c2) { - if (c1 < c2) return -1; - return 1; - } - } - if (c1 == 0) break; - } - return 0; -} - -PRInt32 nsCRT::HashCode(const PRUnichar* us) -{ - PRInt32 rv = 0; - PRUnichar ch; - while ((ch = *us++) != 0) { - // FYI: rv = rv*37 + ch - rv = ((rv << 5) + (rv << 2) + rv) + ch; - } - return rv; -} - -PRInt32 nsCRT::HashCode(const PRUnichar* us, PRInt32* uslenp) -{ - PRInt32 rv = 0; - PRInt32 len = 0; - PRUnichar ch; - while ((ch = *us++) != 0) { - // FYI: rv = rv*37 + ch - rv = ((rv << 5) + (rv << 2) + rv) + ch; - len++; - } - *uslenp = len; - return rv; -} - -PRInt32 nsCRT::atoi( const PRUnichar *string ) -{ - return atoi(string); -} - diff --git a/mozilla/xpcom/ds/nsCRT.h b/mozilla/xpcom/ds/nsCRT.h deleted file mode 100644 index 0161c67e129..00000000000 --- a/mozilla/xpcom/ds/nsCRT.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ -#ifndef nsCRT_h___ -#define nsCRT_h___ - -#include -#include -#include "plstr.h" -#include "nscore.h" - -/// This is a wrapper class around all the C runtime functions. - -class NS_BASE nsCRT { -public: - /** Copy bytes from aSrc to aDest. - @param aDest the destination address - @param aSrc the source address - @param aCount the number of bytes to copy - */ - static void memcpy(void* aDest, const void* aSrc, PRInt32 aCount) { - ::memcpy(aDest, aSrc, (size_t)aCount); - } - - static void memmove(void* aDest, const void* aSrc, PRInt32 aCount) { - ::memmove(aDest, aSrc, (size_t)aCount); - } - - static void memset(void* aDest, PRUint8 aByte, PRInt32 aCount) { - ::memset(aDest, aByte, aCount); - } - - static void zero(void* aDest, PRInt32 aCount) { - ::memset(aDest, 0, (size_t)aCount); - } - - /** Compute the string length of s - @param s the string in question - @return the length of s - */ - static PRInt32 strlen(const char* s) { - return PRInt32(::strlen(s)); - } - - /// Compare s1 and s2. - static PRInt32 strcmp(const char* s1, const char* s2) { - return PRInt32(PL_strcmp(s1, s2)); - } - - /// Case-insensitive string comparison. - static PRInt32 strcasecmp(const char* s1, const char* s2) { - return PRInt32(PL_strcasecmp(s1, s2)); - } - - /// Case-insensitive string comparison with length - static PRInt32 strncasecmp(const char* s1, const char* s2, PRInt32 aMaxLen) { - return PRInt32(PL_strncasecmp(s1, s2, aMaxLen)); - } - - /// Like strlen except for ucs2 strings - static PRInt32 strlen(const PRUnichar* s); - - /// Like strcmp except for ucs2 strings - static PRInt32 strcmp(const PRUnichar* s1, const PRUnichar* s2); - /// Like strcmp except for ucs2 strings - static PRInt32 strncmp(const PRUnichar* s1, const PRUnichar* s2, - PRInt32 aMaxLen); - - /// Like strcasecmp except for ucs2 strings - static PRInt32 strcasecmp(const PRUnichar* s1, const PRUnichar* s2); - /// Like strncasecmp except for ucs2 strings - static PRInt32 strncasecmp(const PRUnichar* s1, const PRUnichar* s2, - PRInt32 aMaxLen); - - /// Like strcmp with a char* and a ucs2 string - static PRInt32 strcmp(const PRUnichar* s1, const char* s2); - /// Like strncmp with a char* and a ucs2 string - static PRInt32 strncmp(const PRUnichar* s1, const char* s2, - PRInt32 aMaxLen); - - /// Like strcasecmp with a char* and a ucs2 string - static PRInt32 strcasecmp(const PRUnichar* s1, const char* s2); - /// Like strncasecmp with a char* and a ucs2 string - static PRInt32 strncasecmp(const PRUnichar* s1, const char* s2, - PRInt32 aMaxLen); - - /// Compute a hashcode for a ucs2 string - static PRInt32 HashCode(const PRUnichar* s1); - - /// Same as above except that we return the length in s1len - static PRInt32 HashCode(const PRUnichar* s1, PRInt32* s1len); - - /// String to integer. - static PRInt32 atoi( const PRUnichar *string ); - - static PRUnichar ToUpper(PRUnichar aChar); - - static PRUnichar ToLower(PRUnichar aChar); -}; - -#endif /* nsCRT_h___ */ diff --git a/mozilla/xpcom/ds/nsDeque.cpp b/mozilla/xpcom/ds/nsDeque.cpp deleted file mode 100644 index c221ec9aaf3..00000000000 --- a/mozilla/xpcom/ds/nsDeque.cpp +++ /dev/null @@ -1,433 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - - -#include "nsDeque.h" -#include "nsCRT.h" - -/** - * Standard constructor - * @update gess4/18/98 - * @return new deque - */ -nsDeque::nsDeque(nsDequeFunctor& aMemDestroyer) : mMemDestroyer(aMemDestroyer) { - mMemDestroyer=aMemDestroyer; - mCapacity=eGrowthDelta; - mOrigin=mSize=0; - mData=new void*[mCapacity]; -} - - -/** - * Destructor - * @update gess4/18/98 - */ -nsDeque::~nsDeque() { - Erase(); - delete [] mData; - mData=0; -} - - -/** - * Returns the number of elements currently stored in - * this deque. - * - * @update gess4/18/98 - * @param - * @return int contains element count - */ -PRInt32 nsDeque::GetSize(void) const { - return mSize; -} - -/** - * Remove all items from container without destroying them. - * - * @update gess4/18/98 - * @param - * @return - */ -nsDeque& nsDeque::Empty() { - nsCRT::zero(mData,mCapacity*sizeof(mData)); - mSize=0; - mOrigin=0; - return *this; -} - -/** - * Remove and delete all items from container - * - * @update gess4/18/98 - * @return this - */ -nsDeque& nsDeque::Erase() { - ForEach(mMemDestroyer); - return Empty(); -} - - -/** - * This method adds an item to the end of the queue. - * This operation has the potential to cause the - * underlying buffer to resize. - * - * @update gess4/18/98 - * @param anItem: new item to be added to queue - * @return nada - */ -nsDeque& nsDeque::Push(void* anItem) { - if(mSize==mCapacity) { - void** temp=new void*[mCapacity+eGrowthDelta]; - - //Here's the interesting part: You can't just move the elements - //directy (in situ) from the old buffer to the new one. - //Since capacity has changed, the old origin doesn't make - //sense anymore. It's better to resequence the elements now. - - int tempi=0; - int i=0; - int j=0; - for(i=mOrigin;i0) { - result=mData[mOrigin]; - mData[mOrigin++]=0; //zero it out for debugging purposes. - mSize--; - if(0==mSize) - mOrigin=0; - } - return result; -} - -/** - * Remove and return the last item in the container. - * - * @update gess4/18/98 - * @param none - * @return ptr to last item in container - */ -void* nsDeque::PopBack(void) { - void* result=0; - if(mSize>0) { - int offset=mOrigin+mSize; - if(offset>=mCapacity) - offset-=mCapacity; - result=mData[offset-1]; - mData[offset-1]=0; - mSize--; - if(0==mSize) - mOrigin=0; - } - return result; -} - -/** - * Call this to retrieve the ith element from this container. - * Keep in mind that accessing the underlying elements is - * done in a relative fashion. Object 0 is not necessarily - * the first element (the first element is at mOrigin). - * - * @update gess4/18/98 - * @param anIndex : 0 relative offset of item you want - * @return void* or null - */ -void* nsDeque::ObjectAt(PRInt32 anIndex) const { - void* result=0; - - if((anIndex>=0) && (anIndexoperator==(anIter)); -} - - -/** - * Compare 2 iterators for equivalence. - * - * @update gess4/18/98 - * @param anIter is the other iterator to be compared to - * @return TRUE if EQUAL - */ -PRBool nsDequeIterator::operator<(nsDequeIterator& anIter) { - return PRBool(((mIndex=(nsDequeIterator& anIter) { - return PRBool(((mIndex>=anIter.mIndex) && (&mDeque==&anIter.mDeque))); -} - -/** - * Pre-increment operator - * - * @update gess4/18/98 - * @return object at preincremented index - */ -void* nsDequeIterator::operator++() { - return mDeque.ObjectAt(++mIndex); -} - -/** - * Post-increment operator - * - * @update gess4/18/98 - * @param param is ignored - * @return object at post-incremented index - */ -void* nsDequeIterator::operator++(int) { - return mDeque.ObjectAt(mIndex++); -} - -/** - * Pre-decrement operator - * - * @update gess4/18/98 - * @return object at pre-decremented index - */ -void* nsDequeIterator::operator--() { - return mDeque.ObjectAt(--mIndex); -} - -/** - * Post-decrement operator - * - * @update gess4/18/98 - * @param param is ignored - * @return object at post-decremented index - */ -void* nsDequeIterator::operator--(int) { - return mDeque.ObjectAt(mIndex--); -} - -/** - * Dereference operator - * - * @update gess4/18/98 - * @return object at ith index - */ -void* nsDequeIterator::GetCurrent(void) { - return mDeque.ObjectAt(mIndex); -} - -/** - * Call this method when you wanto to iterate all the - * members of the container, passing a functor along - * to call your code. - * - * @update gess4/20/98 - * @param aFunctor object to call for each member - * @return *this - */ -const void* nsDequeIterator::ForEach(nsDequeFunctor& aFunctor) const{ - return mDeque.ForEach(aFunctor); -} - - -/** - * conduct automated self test for this class - * - * @update gess4/18/98 - * @param - * @return - */ -void nsDeque::SelfTest(void) { -#undef _SELFTEST_DEQUE -#ifdef _SELFTEST_DEQUE -#include - - { - nsDeque theDeque(PR_FALSE); //construct a simple one... - - int ints[10]={100,200,300,400,500,600,700,800,900,1000}; - int count=sizeof(ints)/sizeof(int); - - int i=0; - for(i=0;i

  • http://home.netscape.com/misc/trademarks.html#trademarks - -

    Please refer to that page for details.  You may not release a localized -version of the Netscape Communicator with these trademarks left in the -product. -
      -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -

    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/gettingStarted.html b/l10nkits/client/windows/docs/installer/gettingStarted.html deleted file mode 100644 index 1159a619a01..00000000000 --- a/l10nkits/client/windows/docs/installer/gettingStarted.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - Getting Started - - - -

    -2. Getting Started

    -Before you can begin using the Windows Installer Localization Kit, you -must install it and setup your working directories. This is a simple matter -of unzipping the compressed kit file(s) into the proper directories. Your -system must also meet certain requirements to run the tools needed to perform -the localization steps described below. - -

    -


    -

    -System Requirements

    -There few system requirements for the kit in the strictest sense; however, -your choice of tools will have their own set of requirements.  The -most likely minimum configuration will be as follows: -
      -
    • -100% IBM compatible PC
    • - -
    • -Pentium® processor
    • - -
    • -Microsoft® Windows NT 3.51 or 4.0 (localized -versions will help testing but aren't required)
    • - -
    • -16 MB RAM
    • - -
    • -30 MB available hard disk space
    • - -
    • -InstallShield International version 3.0 or other install builder software
    • - -
    • -A visual resource editor, such as those provided with Microsoft® -Visual C++, Borland® C++, etc.
    • - -
    • -An active Internet connection and the ability to ftp (send and receive) -large files
    • - -
    • -A Web browser (say, for example, Netscape Communicator ;-)
    • -
    - -

    - -

    - -

    -Installing the Kit

    -It is recommended that you install the Windows Installer Localization Kit -into the same directory as your other Netscape/Mozilla localization kits: -in other words, install this kit into your kitRoot directory.  -Place this localization kit's .ZIP file in that directory and UNZIP it -with the -d parameter: - -

    PKUNZIP -d filename -

      Example:  PKUNZIP -d instkit
    - -
    -

    -Configuring Your Tools

    -Please refer to your Installshield or other install builder tool's documentation -for set up and usage instructions. -
      -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/isocodes.htm b/l10nkits/client/windows/docs/installer/isocodes.htm deleted file mode 100644 index c33c7d170f9..00000000000 --- a/l10nkits/client/windows/docs/installer/isocodes.htm +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - ISO Locale codes - - - -
    -

    -ISO Language and Country Codes

    -2 letter language codes are derived from the ISO 639 standard; country -codes are from ISO 3166. Here are the codes for the locales currently supported -by the L10n kits. If an entry also includes the country code then you must -use that as well when creating the locale directory or naming a file. -

    -ISO Language and Country Codes table

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Language NameLanguage CodeCountry Code
    -
    Chinese (Traditional)
    -
    -
    zh
    -
    -
    CN
    -
    -
    Chinese (Simplified)
    -
    -
    zh
    -
    -
    TW
    -
    -
    Danish
    -
    -
    da
    -
    -
    DK
    -
    -
    Dutch
    -
    -
    nl
    -
    -
    NL
    -
    -
    French
    -
    -
    fr
    -
    -
    FR
    -
    -
    German
    -
    -
    de
    -
    -
    DE
    -
    -
    Italian
    -
    -
    it
    -
    -
    IT
    -
    -
    Japanese
    -
    -
    ja
    -
    -
    JP
    -
    -
    Korean
    -
    -
    ko
    -
    -
    KR
    -
    -
    Portuguese
    -
    -
    pt
    -
    -
    BR
    -
    -
    Spanish
    -
    -
    es
    -
    -
    ES
    -
    -
    Swedish
    -
    -
    sv
    -
    -
    SE
    -
    - -

    -1997, Copyright Netscape Communications -Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/kitOverview.html b/l10nkits/client/windows/docs/installer/kitOverview.html deleted file mode 100644 index 45f1f0c67dd..00000000000 --- a/l10nkits/client/windows/docs/installer/kitOverview.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - Kit Overview - - - -

    -Kit Overview

    -This kit is primarily intended for knowledgeable developers who are familiar -with the localization process, with InstallShield or other installation -programs, and with Windows resource editors.  There are two basic -approaches you can take to create an installer for your localized Communicator, -Navigator or Mozilla derivative product: -
      -
    1. -Use an existing Communicator or Navigator Export product installer as a -base and add your localized files, or
    2. - -
    3. -Create your own install program and use the registry setting information -provided by the kit.
    4. -
    - -
      -

      -Overview of Method 1.

      -For this method you will need the following components: -
        -
        -
      • -Your own copy of InstallShield version 3 International
      • - -
      • -The appropriate version of a Netscape Communicator or Navigator installer.
      • - -
      • -This localization kit.
      • - -
      • -A text editor.
      • - -
      • -A resource editor (e.g., MSDEV)
      • -
      - - -

      You will start with an Export version of a Netscape Communicator or -Navigator installer.  Then, you will extract the localizable components -and modify them as desired.  You will localize a number of strings -contained in .INI files using a text editor. You will use a resource editor -or the Netscape Translation Tools to localize STRINGTABLE and DIALOG resource -types contained in two .DLLs. Once the localizable components of the installer -are finished, you will reassemble the installer using the InstallShield -EXE BUILDER tool, including your localized Communicator, Navigator or Mozilla -derivative product.  This process is detailed in the next section.

    - -
      -

      -Overview of Method 2.

      -For this method you will need the following components: -
        -
        -
      • -Your own copy of any install builder software
      • - -
      • -This localization kit
      • -
      - - -

      You will create your own installation program in whatever fashion you -wish.  In order for your localized product to function properly, your -installer will need to implement certain Windows -registry settings.

    -  -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    -  -
     1998, Copyright Netscape Communications Corp. -All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/kitStruct.html b/l10nkits/client/windows/docs/installer/kitStruct.html deleted file mode 100644 index 9c7222da826..00000000000 --- a/l10nkits/client/windows/docs/installer/kitStruct.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Kit Structure - - - -

    -Kit Structure and Organization

    -When you install this localization kit you will find a number of new directories -on your hard disk. Each directory is named so as to be fairly self-explanatory, -but the following diagram and description may help avoid any confusion -you may have about what's what. -

    -

    - -

    -Description of Kit Directories

    - -
      -
    • -The kitRoot directory is wherever you install the Netscape -Localization Kits.
    • - -
    • -The l10nkits directory contains the tools (if any) and -documentation you need to complete your work.
    • - -
    • -Since this kit concerns the Windows client product (as opposed to our server -products) all the relevant documentation and tools are found under the -client\windows directory.
    • - -
    • -The docs directory contains documentation on the kit, including -the file you are reading now.
    • -
    -  -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/localizeAim.html b/l10nkits/client/windows/docs/installer/localizeAim.html deleted file mode 100644 index 57882525f20..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeAim.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - Localize AIM.INI - - - -

    -Localization notes for AIM.INI

    - -General Notes: -
      -
    • -Only translate the strings which are shown in bold type face below.
    • - -
    • -Change Netscape trademarks to your own product name(s).
    • -
    - -Specific Notes: -

    -File Copy String=Copying Netscape AOL Instant Messenger Service files... - -

    -Installation String=Installing Netscape AOL Instant Messenger Service files... - -

    -Configuration String=Configuring Netscape AOL Instant Messenger Service... - -

    -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -

    - -

    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/localizeCD.html b/l10nkits/client/windows/docs/installer/localizeCD.html deleted file mode 100644 index 5c7e5d6dd42..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeCD.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - Localize CD.INI - - - -

    -Localization notes for CD.INI

    -General Notes: -
      -
    • -Only translate the strings which are shown in bold type face below.
    • - -
    • -Update the product version number as appropriate.
    • - -
    • -Modify the locale code according to the ISO 639 and ISO 3166 standards. -(See the Reference section for details).
    • - -
    • -You may need to move the placement of "%s" variables in your translation.
    • - -
    • -Do not exceed the length of US string for Deinstall Dialog Wait Message.
    • - -
    • -Change Netscape trademarks to your own product name(s).
    • -
    -Specific Notes: - -

    Product Setup Title1= Deinstaller - -

    Product Version=4.03 (en) - -

    Deinstall Dialog Message=Are you sure you want to deinstall Netscape -Communicator 4.03 ? - -

    Deinstall Dialog Wait Message=Parsing Netscape Communicator -4.03  deinstall log file %s (this will take several minutes)... - -

      -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  -
      - - diff --git a/l10nkits/client/windows/docs/installer/localizeCosmo.html b/l10nkits/client/windows/docs/installer/localizeCosmo.html deleted file mode 100644 index 1d23dc46a5a..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeCosmo.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - Localize COSMO.INI - - - -

    -Localization notes for COSMO.INI

    -General Notes: -
      -
    • -Only translate the strings which are shown in bold type face below.
    • - -
    • -Update the product version number as appropriate.
    • - -
    • -Modify the locale code according to the ISO 639 and ISO 3166 standards. -(See the Reference section for details).
    • -
    -Specific Notes: -
      -
    Installation String=Installing Cosmo Player files... - -

    Configuration String=Configuring Cosmo Player... - -

    File Copy String=Copying Cosmo Player files...  - -

    Description=VRML 2.0 support  - -

    [Registry Entries-Reg2] -
    HKEY Value=4.03 (en) - -

    [Registry Entries-Reg3] -
    HKEY Key Path=Software\Netscape\Cosmo\4.03 (en) - -

    [Registry Entries-Reg4] -
    HKEY Key Path=Software\Netscape\Cosmo\4.03 (en)\Main -
      -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  -
      - - diff --git a/l10nkits/client/windows/docs/installer/localizeIsuser.html b/l10nkits/client/windows/docs/installer/localizeIsuser.html deleted file mode 100644 index ae583f05177..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeIsuser.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Localize _ISUSER.DLL - - - -

    -Localization notes for _ISUSER.DLL

    -All dialogs in this .DLL can be localized. -
      -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/localizeMmedia.html b/l10nkits/client/windows/docs/installer/localizeMmedia.html deleted file mode 100644 index c8390b57676..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeMmedia.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Localize MMEDIA.INI - - - -

    -Localization notes for MMEDIA.INI

    -General Notes: -
      -
    • -Only translate the strings which are shown in bold type face below.
    • - -
    -Specific Notes: - -

    Installation String=Installing Audio/Video Playback files... - -

    Configuration String=Configuring Audio/Video Playback... - -

    File Copy String=Copying Audio/Video Playback files... - -

    Description=Support for multi-media web pages -

    -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -

    -

    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/localizeMplay.html b/l10nkits/client/windows/docs/installer/localizeMplay.html deleted file mode 100644 index 998b6091787..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeMplay.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Localizing MPLAY32.INI - - - -

    -Localization notes for MPLAY32.INI

    -General Notes: -
      -
    • -Only translate the strings which are shown in bold type face below.
    • - -
    • -Update the product version number as appropriate.
    • - -
    • -Modify the locale code according to the ISO 639 and ISO 3166 standards. -(See the Reference section for details).
    • - -
    • -Change Netscape trademarks to your own product name(s).
    • -
    -Specific Notes: - -

    Installation String=Installing Netscape Media Player files... - -

    Configuration String=Configuring Netscape Media Player... - -

    File Copy String=Copying Netscape Media Player files... - -

    Description=Streaming audio support - -

    [Default Folder-Icon2] -
    ProgramFolder=[Default Folder]\Utilities - -

    [Registry Entries-Reg2] -
    HKEY Value=4.03 (en) - -

    [Registry Entries-Reg3] -
    HKEY Key Path=Software\Netscape\Media Player\4.03 (en) - -

    [Registry Entries-Reg4] -
    HKEY Key Path=Software\Netscape\Media Player\4.03 (en)\Main - -

    [Registry Entries-Reg5] -
    HKEY Key Path=Software\Netscape\Media Player\4.03 (en)\Main -
      -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/localizeNav40.html b/l10nkits/client/windows/docs/installer/localizeNav40.html deleted file mode 100644 index 956cd78205b..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeNav40.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - Localize NAV40.INI - - - -

    -Localization notes for NAV40.INI

    -General Notes: -
      -
    • -Do not exceed the length of English string if possible.
    • - -
    • -Modify the locale code according to the ISO 639 and ISO 3166 standards. -(See the Reference section for details).
    • - -
    • -The "Utilities" folder name may be localized.
    • - -
    • -"Item name" is the name that will appear under the associated icon; these -may be localized.
    • - -
    • -You may need to move the placement of "%s" variables in your translation.
    • - -
    • -Change Netscape trademarks to your own product name(s).
    • -
    -Specific Notes: - -

    Installation String=Installing Netscape Communicator 4.03 files... - -

    Configuration String=Configuring Netscape Communicator 4.03... - -

    File Copy String=Copying Netscape Communicator 4.03 files... - -

    Description=Contains Collabra, Composer, Messenger, and Navigator. - -

    Warn Previous Version Message=Setup has detected a previous installation -of %s. If you installed plugins or helper applications with a previous -installation, you will need to reinstall them to this version of Communicator. - -

    [Navigator 1] -
    Message=Setup has detected that an instance of Navigator is currently -running. Please quit Navigator before running Setup. - -

    [Navigator 2] -
    Message=Setup has detected that an instance of Navigator is currently -running. Please quit Navigator before running Setup. - -

    [Navigator 3] -
    Message=Setup has detected that an instance of Navigator is currently -running. Please quit Navigator before running Setup. - -

    [NSMail Notifier] -
    Message=Installation cannot continue because the Mail Notification -program is currently running. Use your right mouse button to click the -Mail icon next to the task bar clock and select 'Exit' to disable Mail -Notification, then run the installer again. - -

    [Navigator 4.05 32] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.05 (en)\Main - -

    [Navigator 4.04 32] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.04 (en)\Main - -

    [Navigator 4.03 32] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.03 (en)\Main - -

    [Navigator 4.02 32] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.02 (en)\Main - -

    [Navigator 4.01 32] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.01 (en)\Main - -

    [Navigator 4.0 32] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.0 (en)\Main - -

    [Navigator 4.0b6 32] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.0b6 (en)\Main - -

    [Navigator 4.0b5 32] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.0b5 (en)\Main - -

    [Navigator 4.0b4 32] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.0b4 (en)\Main - -

    [Navigator 4.0b3 32] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.0b3 [en]\Main - -

    [Default Folder-Icon11] -
    ItemName=User Profile Manager - -

    [Default Folder-Icon12] -
    ProgramFolder=[Default Folder]\Utilities -
    ItemName=User Profile Manager - -

    [Default Folder-Icon13] -
    ItemName=Netscape Mail Notification - -

    [Default Folder-Icon14] -
    ProgramFolder=[Default Folder]\Utilities -
    ItemName=Netscape Mail Notification - -

    [Registry Entries-R14] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.03 (en) - -

    [Registry Entries-R15] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.03 (en)\Main - -

    [Registry Entries-R16] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.03 (en)\Main - -

    [Registry Entries-R17] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.03 (en)\Main - -

    [Registry Entries-R18] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.03 (en)\Main - -

    [Registry Entries-R19] -
    HKEY Key Path=Software\Netscape\Netscape Navigator\4.03 (en)\Main - -

    [Registry Entries-R37] -
    HKEY Value=4.03 (en) - -

    [Registry Entries-R38] -
    HKEY Key Path=Software\Netscape\Netcaster\4.03 (en)\Main - -

    [Registry Entries-R39] -
    HKEY Key Path=Software\Netscape\Netcaster\4.03 (en)\Main -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/localizeNetcast.html b/l10nkits/client/windows/docs/installer/localizeNetcast.html deleted file mode 100644 index 5f84f8f84b8..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeNetcast.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Localize NETCAST.INI - - - -

    -Localization notes for NETCAST.INI

    - -General Notes: -
      -
    • -Only translate the strings which are shown in bold type face below.
    • - -
    • -Change Netscape trademarks to your own product name(s).
    • -
    - -Specific Notes: -

    -Installation String=Installing Netscape Netcaster files... -

    -Configuration String=Configuring Netscape Netcaster... -

    -File Copy String=Copying Netscape Netcaster files... - -

    -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -

    - -

    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/localizeNsconf.html b/l10nkits/client/windows/docs/installer/localizeNsconf.html deleted file mode 100644 index 5ef304d097c..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeNsconf.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - Localizing NSCONF.INI - - - -

    -Localization notes for NSCONF.INI

    -General Notes: -
      -
    • -Only translate the strings which are shown in bold type face below.
    • - -
    • -Update the product version number as appropriate.
    • - -
    • -Modify the locale code according to the ISO 639 and ISO 3166 standards. -(See the Reference section for details).
    • - -
    • -Change Netscape trademarks to your own product name(s).
    • -
    -Specific Notes: - -

    Installation String=Installing Netscape Conference files... - -

    Configuration String=Configuring Netscape Conference... - -

    File Copy String=Copying Netscape Conference files... - -

    Description=Real-time collaboration and audio conferencing - -

    [Registry Entries-Reg17] -
    HKEY Value=4.03 (en) - -

    [Registry Entries-Reg18] -
    HKEY Key Path=Software\Netscape\Conference\4.03 (en) - -

    [Registry Entries-Reg19] -
    HKEY Key Path=Software\Netscape\Conference\4.03 (en)\Main - -

    [Registry Entries-Reg20] -
    HKEY Key Path=Software\Netscape\Conference\4.03 (en)\Main
    -
    -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/localizeRsutil.html b/l10nkits/client/windows/docs/installer/localizeRsutil.html deleted file mode 100644 index 0fdff957a81..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeRsutil.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - Localize RSUTIL.DLL - - - -

    -Localization notes for RSUTIL.DLL

    -STRINGTABLES - -

    Do not translate the following strings: - -

    STRING ID: -
    -
    17 18 19  -
    20 21 22 23 24 25 26 27 28 29  -
    30 31 32 33 34 35 36 37 38 39  -
    40 41 42 43 44 45 46 47 48 49  -
    50 51 52 53 54 55 56 57 58 59  -
    60 61 62 63 64 65 66 67 68 69  -
    70 71 72 73 74 75 76 77 78 79  -
    80 81 82 83 85 86 88  -
    90 91 92 95 97 98 99 -
    100 101 102 103 104 105 106 107 108 109 -
    110 111 112 113 114 -
    122 123 126 127 129 -
    132 133 134 135 136 137 138 139 -
    140 145 149 -
    151 153 154 155 156 157 158 159 -
    162 163 164 165 166 167 169  -
    170 171 172 173 174 175 176 177 178 179 -
    180 181 182 183 184 185 187 188 -
    190 192 193 194 195 196 197 198 199 -
    200 201 202 203 204 205 206 207 208 209 -
    210 211 212 213 214 215 216 217 218 219 -
    220 221 222 226 227 228 229  -
    230 232 233 234 235 236 237 238 239 -
    240 241 242 243 244 245 246 247 248 249 -
    250 251 252 253 254 255 256 257  -
    260 261 263 264 265 266 267 269 -
    270 271 272 273 274 275 276 277 278 279 -
    280 281 282 283 -
      -
    -


    -
    ICONS -
    Replace any trademarked icons, as described in the universal localization -program license agreement, with your own icons. -
      -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/localizeSetup.html b/l10nkits/client/windows/docs/installer/localizeSetup.html deleted file mode 100644 index cc2ca881bb6..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeSetup.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - Localize SETUP.INI - - - -

    -Localization notes for SETUP.INI

    -General Notes: -
      -
    • -Only translate the strings which are shown in bold type face below.
    • - -
    • -The "StartCopy Dialog Message" should be less than 256 bytes long.
    • - -
    • -For the "Multiple Components" section, both the key and the value may be -localized (optional).
    • - -
    • -If the key "Multimedia Support" is localized then next section name should -be identical to the localized key.
    • - -
    • -Change Netscape trademarks to your own product name(s).
    • - -
    • -Update the version number as appropriate.
    • - -
    • -Modify the locale code according to the ISO 639 and ISO 3166 standards. -(See the Reference section for details).
    • -
    -Specific Notes: - -

    Product Setup Title1= Setup - -

    Product Version=4.03 (en) - -

    Deinstall Version=4.03 (en) - -

    License Dialog Title=Software License Agreement - -

    License Dialog Message=Please read the following license agreement. -Use the scroll bar to view the rest of this agreement. - -

    License Dialog Question=Do you accept all the terms of the preceding -license agreement? If so, click on the Yes button. If you select No, Setup -will close. - -

    License Icon Description=License Agreement - -

    Welcome Dialog Title=Netscape Communicator 4.03 Setup - -

    Welcome Dialog Message=Welcome to Netscape Communicator 4.03 Setup. - -

    SetupType Dialog Title=Setup Type - -

    SetupType Dialog Message=Select the type of setup you prefer. - -

    Insufficient Space Dialog Title=Insufficient Space - -

    Insufficient Space Dialog Message=The path below contains insufficient -space. - -

    Path Dialog Title=Choose Destination Location - -

    Path Dialog Message=Please enter the location where you would like -to install Netscape Communicator 4.03 -
    components. You may type a new directory name or click the Browse -button to find a new location. - -

    Options Dialog Title=Netscape Communicator 4.03 Options - -

    Options Dialog Message=Check the components you would like to install. - -

    Associations Dialog Title=Setup Associations - -

    Associations Dialog Message=Check the extensions you would like Communicator -to set up. These extensions will be associated with Communicator components. - -

    Select Folder Dialog Title=Select Program Folder - -

    StartCopy Dialog Title=Start Copying Files - -

    StartCopy Dialog Message=Setup has enough information to start copying -the program files. If you want to review or change settings, click Back. -If you are satisfied with the current settings, click Install to begin -copying files. - -

    Readme Dialog Prompt=Would you like to view the README file now? - -

    Finish Dialog Prompt=Setup is complete. You may run Netscape Communicator -4.03 by double-clicking on one of the icons in the folder. - -

    Reboot Dialog Title=Restarting Windows - -

    Reboot Dialog Message=Setup has finished copying files to your computer. -Before you can use the program, you must restart Windows or your computer. - -

    Exit Dialog Message=Are you sure you want to exit setup? - -

    Error Resource Message1=Could not load Resource: %s -
    Error Resource Message2=Attempted to fix the problem. Please restart -the setup application. -
    Error Resource Message3=Could not get module handle of rsutil.dll. -System memory could be corrupted. Please reboot and try again. - -

    [Multiple Components] -
    Multimedia Support=Extension modules for Netscape Communicator -4.03 - -

    [Multimedia Support] -
    Default Path= -
      -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/localizeURL.html b/l10nkits/client/windows/docs/installer/localizeURL.html deleted file mode 100644 index 57718bc00fd..00000000000 --- a/l10nkits/client/windows/docs/installer/localizeURL.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - Localizing URLs - - - -

    -Localizing URLs

    -Many resources of all types in the Communicator contain Internet addresses -in the form of URLs (Universal Resource Locators). Most of these point -to locations within the Netscape domain; as part of the Unlimited Localization -Program, you can leave these as they are, or you may change them as you -desire. -

    -Internal URLs

    -There are a number of internal URLs that should not -be changed.  These are the strings that look like about:[some -value].  These point to internally contained resources, such as -the main About Communicator page.  If you localize these strings you -will not be able to load these pages.  The main examples you might -find are: -
      -
    • -about:
    • - -
    • -about:plugins
    • - -
    • -about:fonts
    • -
    -For more examples and information on these internal URLs go here. -
      -
      -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    -1998, Copyright Netscape Communications -Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/localize_these_files.html b/l10nkits/client/windows/docs/installer/localize_these_files.html deleted file mode 100644 index 17950feab44..00000000000 --- a/l10nkits/client/windows/docs/installer/localize_these_files.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - Localize these Files - - - -

    -Localize These Files

    -This section tells you exactly what files need to be localized. The following -tables contain two columns: -
      -
    • -The file to be localized column gives the specific file name. The path -name temp refers to wherever you have copied the uncompressed installer -files in Step 2 of the Localization -Checklist. If the file or resource name is a hypertext link, further -information can be found by following that link.
    • - -
    • -The purpose column describes the basic purpose of this file.
    • -
    -Table 1. Binary files to be localized - - - - - - - - - - - - - - - - - - -
    File to be localized Purpose
    rsutil.dllInstaller STRINGTABLE and ICON resources. 
    _isuser.dllInstaller DIALOG resources.
    - -

    -Table 2. .INI files to be localized - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    File to be localizedPurpose
    aim.iniAOL Instant Messgenger initialization file.*
    cd.iniDeinstaller initialization file.
    cosmo.iniCosmo player initialization file.*
    mmedia.iniMultimedia initialization file.*
    mplay32.iniMedia Player initialization file.*
    nav40.iniMain product initialization file.
    netcast.iniNetcaster initialization file.
    nsconf.iniNetscape Conference initialization file.*
    setup.iniMain setup initialization file.
    -

    -* These files come with the Complete installer version. -

    -

    - - - -
    -
    [CONTENTS]
    -
    - -

    -

    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/nomenclature.html b/l10nkits/client/windows/docs/installer/nomenclature.html deleted file mode 100644 index 7b3bff64402..00000000000 --- a/l10nkits/client/windows/docs/installer/nomenclature.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - Conventions - - - -

    -Nomenclature and Typographical Conventions

    -Typographical Conventions -
    Words in italics typeface represent a variable term or phrase, -meant to be replaced by another value at "runtime."  Example: -
      locale -- replaced by a 2- or 4 letter locale code; e.g. zhtw
    -Words in bold typeface, using a proportional font, represent a literal -value in a string that might also contain a variable word or phrase. Example: -
      4.03 [locale] -- 4.03 [ ] are literal values, -while locale is a variable. -
         
      -
    -Words in a fixed width font represent file or directory names, -or DOS or Windows commands to be typed as they appear.  Sometimes, -part or all of the path will be in bold, for emphasis. -Examples: -
      Change to the kitRoot\l10nkits\client\windows\tools -directory -
      Execute RTRNKIT
    -Nomenclature -
    Throughout this document, certain terms and phrases will be used repeatedly: - -

    Table 1. Nomenclature and Typographical Conventions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    kitRoot directory indicates the starting or topmost directory of the Windows Front End -Localization Kit.
    platformeither 16 or 32 bit, depending on the version you are working on.
    localein general, this refers to the language into which you are localizing -the product. The list of valid locale names is defined in the ISO -Language and Country Codes Table.
    localization databasea database generated by a leveraging tool from a set of matched binary -resource files. 
    localization notesany special instructions, including the "translate/don't translate" -flag, associated with a given resource.  Localization notes are contained -in the localization database for each resource module.
    leverageThe process of merging previous localized versions of a file into a -current version. 
    forbidden resourceA resource that cannot be changed from the original value without (negatively) -impacting the functionality of the product. These are identified in the -localization databases.
    -  -
      -

    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/projectOverview.html b/l10nkits/client/windows/docs/installer/projectOverview.html deleted file mode 100644 index 642b5087fd4..00000000000 --- a/l10nkits/client/windows/docs/installer/projectOverview.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Project Overview - - - -

    -1. Project Overview

    - -
    Welcome to the Communicator/Navigator -Installer Localization Kit!
    - - -

    Under the universal localization program, you are free to create an -installer for a localized Communicator, Navigator or Mozilla derivative -product in any way you choose. This localization kit will assist you in -creating a your installer for the 32-bit Windows platform. As long as you -follow the terms of the universal localization program license agreement, -you are free to do what you want with the resulting localized product and -installer. - -

    The Netscape Communicator and Netscape Navigator 4.x installation programs -were created with InstallShield® version -3.  Because this is the proprietary product of InstallShield Corporation, -Netscape cannot redistribute the complete source for these installers.  -You may, however, modify an existing Communicator or Navigator installer, -or if you choose, you may build your own installer "from scratch". - -

    Note: because of the U.S. Government's restrictions on the export -of strong cryptography, you may only distribute the "export" version -of the Netscape binaries.  Please keep this in mind as you work with -the localization kit instructions. -
      -

    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    -  -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/reference.html b/l10nkits/client/windows/docs/installer/reference.html deleted file mode 100644 index b424d42abe8..00000000000 --- a/l10nkits/client/windows/docs/installer/reference.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - Reference - - - -

    -Reference

    -This section summarizes the references used throughout this document.  -In addition, other miscellaneous references may be found here. - -

    Table 5. Reference Links - - - - - - - - - - - - - - - - -
    Locale Table (local)Locale -Table (remote)Windows Registry Settings Reference
    Communicator International -Features
    - - -

      -

    - - - -
    -
    [CONTENTS]
    -
    - -
     
    - -
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/registrySettings.html b/l10nkits/client/windows/docs/installer/registrySettings.html deleted file mode 100644 index 7dd697b6524..00000000000 --- a/l10nkits/client/windows/docs/installer/registrySettings.html +++ /dev/null @@ -1,612 +0,0 @@ - - - - - - Windows Registry Settings - - - -

    -Windows Registry Settings

    -This document is provided as a reference to the Windows registry settings -implemented by Communicator and Navigator.  You may use this as a -guide to the registry settings you must implement if you create your own -installation program (as opposed to localizing an existing Netscape installer). - -

    Note that in the Netscape installers, these settings are implemented -only within .INI files.  This simplifies modifying and localizing -the installer. It is recommended that your installer do the same. - -

    You may observe the registry changes made by any product with tools -such as Regmon. This -may be a useful addition to your toolset. - -

    These notes are applicable to Netscape Communicator version 4.03. -
      - - - - -
    MPLAY32.INI  - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Media Player  -
    Name : CurrentVersion  -
    Value: 4.03 (en)  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Media Player\4.03 (en)  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Media Player\4.03 (en)\Main  -
    Name : Install Directory  -
    Value: [Default Path]\MPlayer  -
    Type : REGDB_STRING  - -

    Name : Program Folder  -
    Value: [Program Folder]  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\.LAM  -
    Name : (Default)  -
    Value: LAMDocument  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\LAMDocument\shell\open\command  -
    Name : (Default)  -
    Value: [WINSYSDIR]\mplay32.exe %1  -
    Type : REGDB_STRING  - -

    Name : (Default)  -
    Value: [WINDIR]\mplayer.exe %1  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\LAMDocument\DefaultIcon  -
    Name : (Default)  -
    Value: [Default Path]\MPlayer\npcfg32.exe ,0  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\MCI32  -
    Name : LiveAudioFile  -
    Value: mcilma32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\MCI  -
    Name : LiveAudioFile  -
    Value: mcilma.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\MCI32  -
    Name : LiveAudioMetafile  -
    Value: mcilau32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\drivers.desc  -
    Name : mcilau32.dll  -
    Value: (MCI) Netscape Media Player  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\MCI  -
    Name : LiveAudioMetafile  -
    Value: mcilau.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\MCI -Extensions  -
    Name : LAM  -
    Value: LiveAudioMetafile  -
    Type : REGDB_STRING  - -

    Name : LMA  -
    Value: LiveAudioFile  -
    Type : REGDB_STRING  - -

    Name : LA  -
    Value: LiveAudioFile  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\drivers.desc  -
    Name : mcilma32.dll  -
    Value: (MCI) Netscape Packetized Audio  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Drivers32  -
    Name : MSACM.NSPAC  -
    Value: NSPAC32.ACM  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\drivers.desc  -
    Name : NSPAC32.ACM  -
    Value: elemedia(TM) AX24000P Music Codec  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Drivers32  -
    Name : MSACM.voxacm118  -
    Value: vdk32118.acm  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\drivers.desc  -
    Name : vdk32118.acm  -
    Value: Voxware 32bit Codec  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Drivers32  -
    Name : MSACM.NSX83  -
    Value: NSX83P32.ACM  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\drivers.desc  -
    Name : NSX83P32.ACM  -
    Value: elemedia(TM) SX8300 Speech Codec  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Drivers32  -
    Name : MSACM.NSMLAW  -
    Value: NSMLAW32.DLL  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\drivers.desc  -
    Name : NSMLAW32.DLL  -
    Value: Netscape G.711 Decoder  -
    Type : REGDB_STRING  -
    -


    -
    NAV40.INI  - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App -Paths\Netscape.exe  -
    Name : (Default)  -
    Value: [Default Path]\Program\Netscape.exe  -
    Type : REGDB_STRING  - -

    Name : Path  -
    Value: [Default Path]\Program  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{7865A9A1-33A8-11d0-BED9-00A02468FAB6}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\brpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{543EC0D0-6AB7-11d0-BF56-00A02468FAB6}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\brpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{543EC0D1-6AB7-11d0-BF56-00A02468FAB6}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\brpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{2D0A7D70-748C-11d0-9705-00805F8AA8B8}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\edpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{E8D6B4F0-8B58-11d0-9B63-00805F8ADDDE}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\mnpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{DDF4AB60-8B84-11d0-9B63-00805F8ADDDE}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\mnpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{CC3E2871-43CA-11d0-B6D8-00805F8ADDDE}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\mnpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{CC3E2872-43CA-11d0-B6D8-00805F8ADDDE}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\mnpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Netscape Navigator  -
    Name : CurrentVersion  -
    Value: 4.03 (en)  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Netscape Navigator\Users  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Netscape Navigator\4.03 -(en)  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Netscape Navigator\4.03 -(en)\Main  -
    Name : Install Directory  -
    Value: [Default Path]  -
    Type : REGDB_STRING  - -

    Name : Java Directory  -
    Value: [Default Path]\Program\Java  -
    Type : REGDB_STRING  - -

    Name : NetHelp Directory  -
    Value: [Default Path]\Program\NetHelp  -
    Type : REGDB_STRING  - -

    Name : Plugins Directory  -
    Value: [Default Path]\Program\Plugins  -
    Type : REGDB_STRING  - -

    Name : Program Folder  -
    Value: [Program Folder]  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CURRENT_USER\Software\Netscape  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_CURRENT_USER\Software\Netscape\Netscape Navigator  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_CURRENT_USER\Software\Netscape\Netscape Navigator\Main  -
    Name : Install Directory  -
    Value: [Default Path]  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\CLSID  -
    Name : (Default)  -
    Value: {61D8DE20-CA9A-11CE-9EA5-0080C82BE3B6}  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\Insertable  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\protocol\StdFileEditing\server  -
    Name : (Default)  -
    Value: [Default Path]\Program\Netscape.exe  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\protocol\StdFileEditing\verb\0  -
    Name : (Default)  -
    Value: &Edit  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\open\command  -
    Name : (Default)  -
    Value: [Default Path]\Program\Netscape.exe "%1"  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\print\command  -
    Name : (Default)  -
    Value: [Default Path]\Program\Netscape.exe /print("%1")  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\print\ddeexec  -
    Name : (Default)  -
    Value: [print("%1")]  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\PrintTo\command  -
    Name : (Default)  -
    Value: [Default Path]\Program\Netscape.exe /printto("%1","%2","%3","%4")  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\PrintTo\ddeexec  -
    Name : (Default)  -
    Value: [("%1","%2","%3","%4")]  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\open\ddeexec  -
    Name : (Default)  -
    Value: "%1"  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\open\ddeexec\Application  -
    Name : (Default)  -
    Value: NSShell  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\open\ddeexec\Topic  -
    Name : (Default)  -
    Value: WWW_OpenURL  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\Edit\command  -
    Name : (Default)  -
    Value: [Default Path]\Program\Netscape.exe -edit "%1"  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\Edit\ddeexec  -
    Name : (Default)  -
    Value: [edit("%1")]  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Netcaster  -
    Name : CurrentVersion  -
    Value: 4.03 (en)  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Netcaster\4.03 (en)\Main  -
    Name : Install Directory  -
    Value: [Shell Path]\Netcast  -
    Type : REGDB_STRING  - -

    Name : Program Folder  -
    Value: [Program Folder]  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{C98D0190-7D81-11d0-BF8D-00A02468FAB6}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\brpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{37B601C0-8AC8-11d0-83AF-00805F8A274D}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\brpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\CLSID\{913A4A20-8EBF-11d0-BFAB-00A02468FAB6}\InprocServer32  -
    Name : (Default)  -
    Value: [Default Path]\Program\brpref32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\print\ddeexec\Application  -
    Name : (Default)  -
    Value: NSShell  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\PrintTo\ddeexec\Application  -
    Name : (Default)  -
    Value: NSShell  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup\shell\Edit\ddeexec\Application  -
    Name : (Default)  -
    Value: NSShell  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\NetscapeMarkup  -
    Name : (Default)  -
    Value: Hypertext Markup Language  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\telnet  -
    Name : (Default)  -
    Value: URL:Telnet Protocol  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CLASSES_ROOT\telnet\shell\open\command  -
    Name : (Default)  -
    Value: telnet %1  -
    Type : REGDB_STRING  -
    -


    -
    NETCAST.INI  - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Netcaster  -
    Name : CurrentVersion  -
    Value: 1.0 (en)  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Netcaster\1.0 (en)  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Netcaster\1.0 (en)\Main  -
    Name : Install Directory  -
    Value: [Default Path]  -
    Type : REGDB_STRING  - -

    Name : Program Folder  -
    Value: [Program Folder]  -
    Type : REGDB_STRING  -
    -


    -
    NSCONF.INI  - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Conference  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Conference\CurrentVersion  -
    Name : Description  -
    Value: Conference  -
    Type : REGDB_STRING  - -

    Name : InstallDate  -
    Value: [TIME]  -
    Type : REGDB_NUMBER  - -

    Name : Installed  -
    Value: 1  -
    Type : REGDB_NUMBER  - -

    Name : PathName  -
    Value: [Default Path]  -
    Type : REGDB_STRING  - -

    Name : SoftwareType  -
    Value: application  -
    Type : REGDB_STRING  - -

    Name : VersionBuild  -
    Value: 1213  -
    Type : REGDB_NUMBER  - -

    Name : VersionMajor  -
    Value: 1  -
    Type : REGDB_NUMBER  - -

    Name : VersionMinor  -
    Value: 0  -
    Type : REGDB_NUMBER  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Drivers32  -
    Name : MSACM.VOXACM118  -
    Value: vdk32118.acm  -
    Type : REGDB_STRING  - -

    Name : MSACM.NSX83  -
    Value: nsx83p32.acm  -
    Type : REGDB_STRING  - -

    Name : MSACM.NSX723  -
    Value: sx5363s.acm  -
    Type : REGDB_STRING  - -

    Name : MSACM.NSMLAW  -
    Value: nsmlaw32.dll  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_CURRENT_USER\Software\Netscape  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_CLASSES_ROOT\nscfile\shell\open\command  -
    Name : (Default)  -
    Value: [Default Path]\NSConf32.exe -f "%1"  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Conference  -
    Name : CurrentVersion  -
    Value: 4.03 (en)  -
    Type : REGDB_STRING  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Conference\4.03 (en)  -
    Name : (Default)  -
    Value:  -
    Type :  -
      - -

    Key  : HKEY_LOCAL_MACHINE\Software\Netscape\Conference\4.03 (en)\Main  -
    Name : Install Directory  -
    Value: [Default Path]  -
    Type : REGDB_STRING  - -

    Name : Program Folder  -
    Value: [Program Folder]  -
    Type : REGDB_STRING  -
     

    -  -
      -

    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/reportingBugs.html b/l10nkits/client/windows/docs/installer/reportingBugs.html deleted file mode 100644 index efa1cb5a045..00000000000 --- a/l10nkits/client/windows/docs/installer/reportingBugs.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Reporting Bugs - - - -

    -Reporting Bugs

    -Any bugs in the localization kits you find should be reported to mozilla.org -as soon as possible. When you report a bug, try to be as specific as you -can about the exact steps needed to reproduce the bug.  Provide a -complete description of the problem versus the expected results.  -You should let us know if the problem is 100% reproducible (it happens -every time), or if it is intermittant.  If you think that your operating -environment may play some factor, let us know the details of that.  -Finally, before reporting any bug, you should make sure that the problem -doesn't also happen in the US English product (if it does, we still want -to know, but it may not be possible to fix it through the localization -kits or tools as they are now). - -

    To report a bug, post a message to the following mozilla.org newsgroup: -
      -

    news://news.mozilla.org/netscape.public.mozilla.general
    - - -

    Be sure to include the information described above. -
      -

    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/returnKit.html b/l10nkits/client/windows/docs/installer/returnKit.html deleted file mode 100644 index 57a3ad67937..00000000000 --- a/l10nkits/client/windows/docs/installer/returnKit.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - Returning the Kit - - - -

    -5. Publishing the Finished Kit

    -Once you are satisfied with the quality of your localization efforts, you -are required by the terms of the universal localization program license -agreement to make your localized product publicly available. The exact -details of how you do this is up to you, the most commonly acceptable method -is to post your localized product to a publicly accessible ftp site. - -

    You should post just the localized versions of the files mentioned in -the Localize These Files section of this document. For ease of transfer, -you may create a compressed archive in the .ZIP file format that contains -the localized files. Create one .ZIP file for each language/platform you -do. If you are publishing more than one language or platform, you may combine -multiple .ZIP files into one master .ZIP file if this makes your life easier. - -

    If your localized product includes your own trademarks, you should identify -these and any restrictions you are placing on their use. You must also -include a copy of the End User License Agreement (EULA), as well as a notice -stating that Netscape Communications is not required to support your product, -and that you are the Licensor referred to in the EULA. Please refer to -the Universal Localization Agreement for the exact legal requirements. - -

    Once your localized product is publicly available, you may inform the -world in any manner you choose, but we encourage you to also post the download -location to the mozilla.org Announcements newsgroup (netscape.public.mozilla.announce). -

     
    -Congratulations! You are done!
    -  -
    - - - - - -
    -
    [BACK]
    -
    -
    [CONTENTS]
    -
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/installer/splash.html b/l10nkits/client/windows/docs/installer/splash.html deleted file mode 100644 index d7aac2266e1..00000000000 --- a/l10nkits/client/windows/docs/installer/splash.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Title Page - - - -
    -

    -NETSCAPE COMMUNICATOR

    - -
    - -
    -

    -Localization Kit

    - -
    -

    -for Microsoft® Windows (32-bit version)

    - -
    -

    -Revision 1.1

    - -
    Copyright © 1994-1998 Netscape® Communications Corporation, -All rights reserved.
    -  -
      -
    - - - - - -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    - - - diff --git a/l10nkits/client/windows/docs/installer/testKit.html b/l10nkits/client/windows/docs/installer/testKit.html deleted file mode 100644 index 5de12261ca9..00000000000 --- a/l10nkits/client/windows/docs/installer/testKit.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - Testing the Localized Resources - - - -

    -4. Ensuring Quality

    -The quality of your localized version will have a large impact on its acceptance -in the marketplace.  You can greatly enhance your chances of producing -a quality product by using experienced and skilled localizers, and by performing -post-translation testing. - -

    When performing the actual translation, you should be sensitive to a -number of issues: -

      -
    • -Completeness: you should aim for as thorough a translation as possible.  -Try not to leave portions of the product untranslated. However, be aware -that some terms may best be left in English, depending on local conventions.
    • - -
    • -Suitability: all translations should be suitable and appropriate for product, -the language, the market and the customers you intend to reach.  This -includes using the proper technical terminology for a give platform or -computer operation, as well as using language that is readily understood -by the average user of the product in a given language.  You should, -where possible, try to use terminology which is similar to other products -available on the same platform (without violating copyrights or trademarks, -of course).
    • - -
    • -Accuracy: you should be sure your translation conveys the same meaning -and intention as the original English.
    • - -
    • -Grammar and spelling: you should be sure your translation is grammatically -accurate and free from spelling errors.
    • -
    -Keep in mind that engineers do not necessarily make the best localizers! - -

    Once localization is complete, there are two basic types of post-translation -testing that should be done: -
      - - - - - - - - - - - - -
    Linguistic ReviewChecking all translations for accuracy and appropriateness in the actual -context in which they appear.
    Functional TestingEnsuring the product still functions as designed (or at least as well -as the US English product).
    -  -
    For the linguistic review, you should have an independent reviewer -(i.e. not the person who implemented the translations) check every string -for the items listed above.  In some cases, it may be enough to review -the running product itself; however, it is also valuable to print out your -translations and review them externally from the product. - -

    For the functional testing, your best resource are the directions contained -in the localization notes and this document. You should review the completed -product's localization notes with this document in hand, double checking -that you have followed all the instructions contained here. - -

    Consider the following general guidelines when testing: -

      -
    • -It is helpful to have a second copy of the product running with the English -version so you can compare them side by side (a second computer might be -helpful or required for this).
    • - -
    • -Walk through every menu in each module you have localized looking for translation -accuracy, pick letter conflicts and other problems.
    • - -
    • -Bring up as many dialogs as you can, looking for translation accuracy, -pick letter conflicts, truncated strings and functionality issues.
    • - -
    • -Exercise the installer in as many ways as possible:
    • - -
        -
      • -Select every installer option
      • - -
      • -Be sure to test the deinstaller
      • - -
      • -Look at the icons and folder names created
      • - -
      • -Use accented or multibyte file and directory names
      • - -
      • -Install to non-existant and read-only directories
      • - -
      • -Install to drives with insufficient disk space
      • - -
      • -etc.
      • -
      - -
    • -If functional problems are found, you should compare the same steps you -took in the localized product to the English product: if the two products -fail in the same way, it is a "core" bug, which can only be fixed by changing -the core product's executable. If the localized product fails while the -English product does not, then it is probably a translation-related bug; -these can be fixed by altering the way you localize the product (perhaps -by not translating a particular item, or by translating it differently).
    • -
    -The following section tells you how to report bugs in the localization -kit itself, or in the core product. -
      -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
     
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    -  - - diff --git a/l10nkits/client/windows/docs/installer/toc.html b/l10nkits/client/windows/docs/installer/toc.html deleted file mode 100644 index 5503e91c44a..00000000000 --- a/l10nkits/client/windows/docs/installer/toc.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - Table of Contents - - - -

    -Table of Contents

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    i. Title Page  -
     
    1. Project Overview  - -
    2. Getting Started  -
    3. Using the Kit  -
    4. Ensuring Quality  -
    5. Publishing the Finished Kit  -
     
    6. References 
    -  - - diff --git a/l10nkits/client/windows/docs/installer/usingKit.html b/l10nkits/client/windows/docs/installer/usingKit.html deleted file mode 100644 index f8d625beab9..00000000000 --- a/l10nkits/client/windows/docs/installer/usingKit.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - Using the Kit - - -  - - - - -
    -
    WARNING! Protect yourself from data loss -by making regular backups of your work.
    -
    - -

    -3. Using the Kit

    -Once your copy of the Windows Installer Localization Kit is correctly installed, -you may begin your localization work by following the instructions in the -remainder of this document. The next section discusses the contents of -the localization notes provided with this kit. It is important that you -work properly with the instructions contained in these files or the localized -product you create may not function. -

    -Understanding the Localization Notes

    -Each localized module to be installed has an associated initialization -(.INI) file. The localization notes for these files, and for the localizable -dynamic link libraries used by the InstallShield installer, are provided -as HTML documentation. (There are no localization databases in this kit). -Additionally, a section detailing the required Windows registry settings -is also provided in HTML format. - -

    The next section presents the basic localization process as a checklist. -

    -
    - -

    -Localization Checklist

    -This checklist applies to the "modifying -an existing Communicator installer" method. If you are creating -your own installer, you will need to adapt this checklist accordingly. -A reference is provided to help you implement the correct Windows -registry settings. - -

    1. Download an existing installer -
    You will need a matching installer for the product you are localizing. -In other words, if you are localizing Netscape Communicator version 4.03, -you need an installer for the Export version of Netscape Communicator 4.03. -If you are localizing Mozilla Navigator version 5.0, you need an installer -for the Export version (if any) of Mozilla Navigator version 5.0. Latest -versions of Netscape products can be downloaded from the Netscape -homepage. Older versions of Netscape installers, matching the versions -used to generate the localization kits, can be found on the mozilla.org -ftp site. - -

    Current Netscape installers come in two forms: base and complete. Complete -installers include plugins and other components besides the basic Communicator -software. You may use either installer as the foundation for your work, -but note that there may not be localization kits for the additional components. -Even if you choose to distribute the English version of these components, -however, you must modify the associated initialization files, listed in -the Localize These Files -page in order for the additional components to be installed properly. - -

    2. Uncompress the Installer files -

      -
    • -Run the installer you downloaded in step 1. This will bring up the following -dialog (or something very similar):
    • - -
      -
    • -Click yes. InstallShield will extract all the installation files to your -temporary directory. (Usually, this will be C:\temp or something similar). -Once this process is complete, the blue InstallShield background will display.
    • - -
    • -Without exiting the installer, locate the unpacked installer files in your -temp directory and copy them to a new directory. Call this directory "install" -(or something similar).
    • - -
    • -Exit the installer.
    • -
    -3. Uncompress the Deinstaller files -
      -
    • -Change directories to your "install" directory. Locate the file cd32*.exe -(where * equals the version number you are working on. For example, version -4.03 would be represented as cd32403.exe).
    • - -
    • -Execute cd32*.exe. This will bring up a dialog similar to the one shown -is step 2. Click yes and wait until InstallShield has finished unpacking -the deinstaller files (the blue InstallShield background will display).
    • - -
    • -Without exiting the installer, locate the unpacked deinstaller files in -your temp directory and copy them to a new directory. Call this directory -"deinstall" (or something similar).
    • - -
    • -Exit the installer.
    • -
    -4. Extract localizable installer .DLLs -
    Change directories to your "install" directory. Use the InstallShield -tool ICOMP.EXE to extract RSUTIL.DLL and _ISUSER.DLL from _SETUP.LIB: -
      Example: icomp _setup.lib -d
    -4. Localize files -
    Consult the Localize These -Files page to learn which files contain localizable resources. - -

    For each file to be localized, locate the associated Localization Notes -for that file and follow them carefully. - -

    5. Replace original product files contained in nav40.z with localized -product files -
    Use the ICOMP tool to replace the original (English language) Communicator -or Navigator files with the ones you have localized using the Windows Front -End Localization Kit. -

      -
    • -Make sure your localized product directory structure matches the structure -inside the compressed file nav40.z. (If necessary, uncompress nav40.z (including -subdirectories), and replace all the localizable files (as identified by -the Windows Front End Localization Kit) with your localized versions).
    • - -
    • -Update nav40.z with your localized files:
    • - -
        Example: icomp \kitRoot\products\client\windows\platform\locale\*.* -nav40.z -i
      -
    -6. Rebuild the self-extracting deinstaller program -
    Use the InstallShield tool EXE Builder to reassemble the self-extracting -deinstaller archive. -
      -
    • -Specify your "deinstall" directory as the source directory.
    • - -
    • -Set compression on.
    • - -
    • -Specify Setup.exe as the command line program to run when self-extraction -is complete. (No optional parameters are required.)
    • - -
    • -Specify your "install" directory as the target directory.
    • - -
    • -Enter the name of your localized product as the application name.
    • - -
    • -Do not specify a password.
    • - -
    • -Once creation of your localized self-extracting deinstaller is complete, -locate the file Setupex.exe in your "install" directory and rename it to -match the original name of the deinstaller self-extracting program (e.g., -cd32403.exe).
    • -
    -7. Rebuild the self-extracting installer program -
    Use the InstallShield tool EXE Builder to reassemble the self-extracting -installer archive. -
      -
    • -Specify your "install" directory as the source directory.
    • - -
    • -Set compression on.
    • - -
    • -Specify Setup.exe as the command line program to run when self-extraction -is complete. (No optional parameters are required.)
    • - -
    • -Specify any directory you want as the target directory.
    • - -
    • -Enter the name of your localized product as the application name.
    • - -
    • -Do not specify a password.
    • - -
    • -Once creation of your localized self-extracting installer is complete, -locate the file Setupex.exe in your target directory and rename it to something -meaningful.
    • -
    -8. Complete post-translation processing -
    After translation is complete, you need to test your work and deal -with any problems: -
      -
    • -Test the localized installer.
    • - -
    • -Fix translation bugs using your localization tools or a resource editor.
    • - -
    • -Fix dialog size bugs using your localization tools or a resource editor.
    • - -
    • -Report core bugs to Netscape.
    • -
    -9. Publish your localized product to the Internet -
    As the terms of the universal localization program license agreement -state, your localized product - -

    "must be made publicly available in executable code form, -
    free of charge, for electronic delivery via a mechanism -
    generally accepted in the software development -
    community." - -

    In plain English, this means you should post your localized product -on a publicly accessible http: or ftp: server. You may also want to send -an announcement of your product's availability to mozilla.org (though you -are not required to do so). - -

    -


    -

    -Product Branding Issues

    -If you are using this kit under the auspices of the universal localization -program, you must remove or replace Netscape trademarked strings, images -and icons in your localized version. Click here -for instructions. - -

    -


    -

    -How to Localize Different Resource Types

    -This section provides you with general information about localizing the -various resource types and files found with this kit. -

    -Localizing .INI Files

    - -
      Most of the work for the Windows installers is localizing initialization -(.INI) files. You may use the text editor of your choice to do this work. -Be sure the localized files are saved as plain text only. -

      -Localization Notes

      -Individual localization notes for the installer .INI files are contained -in the individual HTML documents linked from the Localize -These Files page.
    - -

    -Localizing URLs

    - -
      You will not likely encounter any URLs (Universal Resource Locators) -in the installers, but if you do, how they are localized depends on whether -you are creating a branded Netscape version or not. The rules for how to -handle URLs are found here.
    - -

    -Localizing String Tables

    - -
      Use the resource editor of your choice to localize STRINGTABLE resources. -These are the most sensitive, potentially problematic resource type you -will be working with. Therefore, you must pay close attention to the instructions -provided in the localization notes. -

      -Localization Notes

      -Individual localization notes for the installer resource .DLLs are contained -in the individual HTML documents linked from the Localize -These Files page. This section gives you some additional general guidelines -to follow when localizing the installer binary files. -
        -
      • -Some strings may contain C++ print format strings, such as %s, %ld, %lu, -etc. Do not modify these while translating the rest of the string.
      • - -
      • -Some strings may contain new line characters: \n. In general, you should -try leave these as you find them.
      • -
      -
    - -

    -Localizing Menus

    - -
      There are no menu resources in the Windows installer
    - -

    -Localizing Dialogs

    - -
      Use the resource editor of your choice to localize and resize DIALOG -resources. Dialog translation is usually not as tricky as localizing string -tables; however, you should take care to assign unique pickletters to dialog -controls. -

      -Localization Notes

      -
    - -
      Individual localization notes for the installer resource .DLLs are -contained in the individual HTML documents linked from the Localize -These Files page.
    -  -
    - - - - - - - -
    -
    [BACK]
    -
    -
    [NEXT]
    -
    -
    [CONTENTS]
    -
    - -
    1998, Copyright Netscape -Communications Corp. All Rights Reserved
    - - - diff --git a/l10nkits/client/windows/docs/nav40/SPLASH.JPG b/l10nkits/client/windows/docs/nav40/SPLASH.JPG deleted file mode 100644 index 37d129cb7e4631c064f485d2408d43089c31eacc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19447 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 diff --git a/l10nkits/client/windows/docs/nav40/allxpstr.h b/l10nkits/client/windows/docs/nav40/allxpstr.h deleted file mode 100644 index 2753cf49937..00000000000 --- a/l10nkits/client/windows/docs/nav40/allxpstr.h +++ /dev/null @@ -1,7878 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -#if defined(FEATURE_CUSTOM_BRAND) -#include "xp_brand.h" -#else -#define MOZ_NAME_PRODUCT "Mozilla" -#define MOZ_NAME_BRAND "Mozilla" -#define MOZ_NAME_FULL "Mozilla Navigator" -#define MOZ_NAME_COMPANY "Netscape Communications Corp" -#endif /* FEATURE_CUSTOM_BRAND */ - - -/* -** Cross platform error codes. These are system errors, library errors, -** etc. The ranges of error messages are displayed in the following table: -** -** actual 7000 added category -** low high low high -** -12288 -12276 -5288 -5276 sslerr (Mac, Unix) -** -8192 -8171 -1192 -1171 secerr (Mac, Unix) -** -7000 -5700 0 1300 Win, Mac FE -** -4978 -4978 2022 2022 Mac FE -** -436 -204 6564 6796 merrors -** 0 160 7000 7160 xp_error (Mac, Unix) -** 1000 1048 8000 8048 Unix FE -** 10000 11004 17000 18004 xp_error (Win) -** 14000 14020 21000 21020 Mac FE -** 15000 25000 22000 32000 xp_msg (Win, Mac, Unix) -** 25769 27500 32769 34500 Win FE -** 50000 58000 57000 65000 secerr, sslerr (Win) -** -** Newbie NOTE: allxpstr.c and allxpstr.rc are exactly the same file. -** Edit only one and cvs update the other one. rc is for windows build. -** -*/ -#ifndef _ALLXPSTR_H_ -#define _ALLXPSTR_H_ - -#include "resdef.h" - -#define XP_MSG_BASE 15000 -#define SEC_DIALOG_STRING_BASE (XP_MSG_BASE + 8000) - - -/* WARNING: DO NOT TAKE ERROR CODE -666, it is used internally - by the message lib */ - - -/* from merrors.h */ -RES_START -BEGIN_STR(mcom_include_merrors_i_strings) - -/* #define MK_HTTP_TYPE_CONFLICT -204 */ -ResDef(MK_HTTP_TYPE_CONFLICT, -204, -"A communications error occurred.\n\ - (TCP Error: %s)\n\n\ -Try connecting again.") - -/* #define MK_BAD_CONNECT -205 */ -ResDef(MK_BAD_CONNECT, -205, -MOZ_NAME_BRAND" is unable to connect to the server at\n\ -the location you have specified. The server may\n\ -be down or busy.\n\n\ -Try connecting again later.") - -/* #define MK_TCP_ERROR -206 */ -ResDef(MK_TCP_ERROR, -206, -"A communications error occurred.\n\ - (TCP Error: %s)\n\n\ -Try connecting again.") - -#ifdef XP_MAC -/* #define MK_OUT_OF_MEMORY -207 */ -ResDef(MK_OUT_OF_MEMORY , -207, -MOZ_NAME_BRAND" is out of memory.\n\n\ -Try quitting "MOZ_NAME_PRODUCT" and increasing its minimum memory\n\ -requirements through Get Info.") -#else -ResDef(MK_OUT_OF_MEMORY , -207, -MOZ_NAME_BRAND" is out of memory.\n\n\ -Try quitting some other applications or closing\n\ -some windows.") - -#endif - - -/* #define MK_MALFORMED_URL_ERROR -209 */ -ResDef(MK_MALFORMED_URL_ERROR, -209, -"This Location (URL) is not recognized:\n\ - %.200s\n\n\ -Check the Location and try again.") - -/* #define MK_UNABLE_TO_USE_PASV_FTP -211 */ -ResDef(MK_UNABLE_TO_USE_PASV_FTP, -211, -"Unable to use FTP passive mode") - -/* #define MK_UNABLE_TO_CHANGE_FTP_MODE -212 */ -ResDef(MK_UNABLE_TO_CHANGE_FTP_MODE , -212, -MOZ_NAME_BRAND" is unable to set the FTP transfer mode with\n\ -this server. You will not be able to download files.\n\n\ -You should contact the administrator for this server\n\ -or try again later.") - - -/* #define MK_UNABLE_TO_FTP_CWD -213 */ -ResDef(MK_UNABLE_TO_FTP_CWD, -213, -MOZ_NAME_BRAND" is unable to send the change directory (cd)\n\ -command, to the FTP server. You cannot view another\n\ -directory.\n\n\ -You should contact the administrator for this server\n\ -or try again later.") - - -/* #define MK_UNABLE_TO_SEND_PORT_COMMAND -214 */ -ResDef(MK_UNABLE_TO_SEND_PORT_COMMAND, -214, -MOZ_NAME_BRAND" is unable to send a port command to the FTP\n\ -server to establish a data connection.\n\n\ -You should contact the administrator for this server\n\ -or try again later.") - - -/* #define MK_UNABLE_TO_LOCATE_FILE -215 */ -ResDef(MK_UNABLE_TO_LOCATE_FILE, -215, -MOZ_NAME_BRAND" is unable to find the file or directory named:\n\ - %.200s\n\n\ -Check the name and try again.") - - -/* #define MK_BAD_NNTP_CONNECTION -216 */ -ResDef(MK_BAD_NNTP_CONNECTION, -216, -"A News error occurred: Invalid NNTP connection\n\n\ -Try connecting again.") - -/* #define MK_NNTP_SERVER_ERROR -217 */ -ResDef(MK_NNTP_SERVER_ERROR, -217, -"An error occurred with the News server.\n\n\ -If you are unable to connect again, contact the\n\ -administrator for this server.") - -/* #define MK_SERVER_TIMEOUT -218 */ -ResDef(MK_SERVER_TIMEOUT, -218, -"There was no response. The server could be down\n\ -or is not responding.\n\n\ -If you are unable to connect again later, contact\n\ -the server's administrator.") - - -/* #define MK_UNABLE_TO_LOCATE_HOST -219 */ -ResDef(MK_UNABLE_TO_LOCATE_HOST, -219, -MOZ_NAME_BRAND" is unable to locate the server:\n\ - %.200s\n\ -The server does not have a DNS entry.\n\n\ -Check the server name in the Location (URL)\n\ -and try again.") - -/* #define MK_SERVER_DISCONNECTED -220 */ -ResDef(MK_SERVER_DISCONNECTED, -220, -"The server has disconnected.\n\ -The server may have gone down or there may be a\n\ -network problem.\n\n\ -Try connecting again.") - -/* #define MK_NEWS_ITEM_UNAVAILABLE -221 */ -ResDef(MK_NEWS_ITEM_UNAVAILABLE, -221, -"The Discussion item is unavailable. It may have expired.\n\n\ -Try retrieving another item.") - -/* #define MK_UNABLE_TO_OPEN_NEWSRC -222 */ -ResDef(MK_UNABLE_TO_OPEN_NEWSRC, -222, -MOZ_NAME_BRAND" is unable to open your News file (newsrc).\n\n\ -Please verify that your Mail and Groups preferences are\n\ -correct and try again.") - - -/* #define MK_UNABLE_TO_OPEN_FILE -223 */ -ResDef(MK_UNABLE_TO_OPEN_FILE, -223, -MOZ_NAME_BRAND" is unable to open the file:\n\ - %.200s\n\n\ -Check the file name and try again.") - -/* #define MK_TCP_WRITE_ERROR -236 */ -ResDef(MK_TCP_WRITE_ERROR, -236, -"A network error occurred while "MOZ_NAME_PRODUCT"\n\ -was sending data.\n(Network Error: %s)\n\n\ -Try connecting again.") - -/* #define MK_COULD_NOT_LOGIN_TO_SMTP_SERVER -229 */ -ResDef(MK_COULD_NOT_LOGIN_TO_SMTP_SERVER, -229, -"An error occurred sending mail:\n\ -"MOZ_NAME_PRODUCT" was unable to connect to the SMTP server.\n\ -The server may be down or may be incorrectly configured.\n\n\ -Please verify that your Mail preferences are correct\n\ -and try again.") - - -/* #define MK_ERROR_SENDING_FROM_COMMAND -230 */ -ResDef(MK_ERROR_SENDING_FROM_COMMAND, -230, -"An error occurred sending mail.\n\ -The mail server responded:\n\ - %s\n\ -Please verify that your email address is correct\n\ -in your Mail preferences and try again.") - - -/* #define MK_ERROR_SENDING_RCPT_COMMAND -231 */ -ResDef(MK_ERROR_SENDING_RCPT_COMMAND, -231, -"An error occurred sending mail.\n\ -The mail server responded:\n\ - %s\n\ -Please check the message recipients and try again.") - -/* #define MK_ERROR_SENDING_DATA_COMMAND -232 */ -ResDef(MK_ERROR_SENDING_DATA_COMMAND, -232, -"SMTP Error while sending mail.\nServer responded: %s") - -/* #define MK_ERROR_SENDING_MESSAGE -233 */ -ResDef(MK_ERROR_SENDING_MESSAGE, -233, -"An error occurred sending mail.\n\ -The mail server responded:\n\ - %s\n\ -Please check the message and try again.") - -/* #define MK_SMTP_SERVER_ERROR -234 */ -ResDef(MK_SMTP_SERVER_ERROR, -234, -"An error occurred sending mail: SMTP server error.\n\ -The server responded:\n\ - %s\n\ -Contact your mail administrator for assistance.") - -/* #define MK_UNABLE_TO_CONNECT -240 -- generic error -- */ -ResDef(MK_UNABLE_TO_CONNECT, -240, -"A network error occurred:\n\ -unable to connect to server (TCP Error: %s)\n\ -The server may be down or unreachable.\n\n\ -Try connecting again later.") - -/* #define MK_CONNECTION_TIMED_OUT -241 */ -ResDef(MK_CONNECTION_TIMED_OUT, -241, -"There was no response. The server could be down\n\ -or is not responding.\n\n\ -If you are unable to connect again later, contact\n\ -the server's administrator.") - -/* #define MK_CONNECTION_REFUSED -242 */ -ResDef(MK_CONNECTION_REFUSED, -242, -MOZ_NAME_BRAND"'s network connection was refused by the server:\n\ - %.200s\n\ -The server may not be accepting connections or\n\ -may be busy.\n\n\ -Try connecting again later.") - - -#ifdef XP_WIN -/* #define MK_UNABLE_TO_CREATE_SOCKET -243 */ -ResDef(MK_UNABLE_TO_CREATE_SOCKET , -243, -MOZ_NAME_BRAND" was unable to create a network socket connection.\n\ -There may be insufficient system resources or the network\n\ -may be down. (Reason: %s)\n\n\ -Try connecting again later or try restarting "MOZ_NAME_PRODUCT". You\n\ -can also try restarting Windows.") -#else -ResDef(MK_UNABLE_TO_CREATE_SOCKET , -243, -MOZ_NAME_BRAND" was unable to create a network socket connection.\n\ -There may be insufficient system resources or the network\n\ -may be down. (Reason: %s)\n\n\ -Try connecting again later or try restarting "MOZ_NAME_PRODUCT".") -#endif - - -#ifdef XP_WIN -/* #define MK_UNABLE_TO_ACCEPT_SOCKET -245 */ -ResDef(MK_UNABLE_TO_ACCEPT_SOCKET, -245, -MOZ_NAME_BRAND" is unable to complete a socket connection \n\ -with this server. There may be insufficient system\n\ -resources.\n\n\ -Try restarting "MOZ_NAME_PRODUCT" or restarting Windows.") -#else -/* #define MK_UNABLE_TO_ACCEPT_SOCKET -245 */ -ResDef(MK_UNABLE_TO_ACCEPT_SOCKET, -245, -MOZ_NAME_BRAND" is unable to complete a socket connection\n\ -with this server. There may be insufficient system\n\ -resources.\n\n\ -Try restarting "MOZ_NAME_PRODUCT".") -#endif - - -/* #define MK_UNABLE_TO_CONNECT_TO_PROXY -246 */ -ResDef(MK_UNABLE_TO_CONNECT_TO_PROXY, -246, -MOZ_NAME_BRAND" is unable to connect to your proxy server.\n\ -The server may be down or may be incorrectly configured.\n\n\ -Please verify that your Proxy preferences are correct\n\ -and try again, or contact the server's administrator.") - -/* #define MK_UNABLE_TO_LOCATE_PROXY -247 */ -ResDef(MK_UNABLE_TO_LOCATE_PROXY, -247, -MOZ_NAME_BRAND" is unable to locate your proxy server.\n\ -The server may be down or may be incorrectly configured.\n\n\ -Please verify that your Proxy preferences are correct\n\ -and try again, or contact the server's administrator.") - - - -/* #define MK_ZERO_LENGTH_FILE -251 */ -ResDef(MK_ZERO_LENGTH_FILE, -251, -"Document contains no data") - - -/* #define MK_TCP_READ_ERROR -252 */ -ResDef(MK_TCP_READ_ERROR , -252, -"A network error occurred while "MOZ_NAME_PRODUCT"\n\ -was receiving data.\n(Network Error: %s)\n\n\ -Try connecting again.") - - - -/* #define MK_UNABLE_TO_OPEN_TMP_FILE -253 */ -ResDef(MK_UNABLE_TO_OPEN_TMP_FILE, -253, -MOZ_NAME_BRAND" is unable to open the temporary file:\n\ - %.200s\n\n\ -Check your `Temporary Directory' setting and try again.") - -/* #define MK_COULD_NOT_GET_USERS_MAIL_ADDRESS -235 */ -ResDef(MK_COULD_NOT_GET_USERS_MAIL_ADDRESS, -235, -"An error occurred sending mail:\n\ -the return mail address was invalid.\n\n\ -Please verify that your email address is correct\n\ -in your Mail preferences and try again.") - -/* #define MK_DISK_FULL -250 */ -ResDef(MK_DISK_FULL, -250, -"The disk is full. "MOZ_NAME_PRODUCT" is cancelling the file\n\ -transfer and removing the file.\n\n\ -Please remove some files and try again.") - - -/* #define MK_NNTP_AUTH_FAILED -260 -- NNTP authinfo failure -- */ -ResDef(MK_NNTP_AUTH_FAILED, -260, -"An authorization error occurred:\n\n\ -%s\n\n\ -Please try entering your name and/or password again.") - -/* #define MK_MIME_NO_SENDER -266 */ -ResDef(MK_MIME_NO_SENDER, -266, /* From: empty */ -"No sender was specified.") - -/* #define MK_MIME_NO_RECIPIENTS -267 */ -ResDef(MK_MIME_NO_RECIPIENTS, -267, /* To: and Newsgroups: empty */ -"No recipients were specified.") - -/* #define MK_MIME_NO_SUBJECT -268 */ -ResDef(MK_MIME_NO_SUBJECT, -268, /* Subject: empty */ -"No subject was specified.") - -/* #define MK_MIME_ERROR_WRITING_FILE -269 */ -ResDef(MK_MIME_ERROR_WRITING_FILE, -269, -"Error writing temporary file.") - -/* #define MK_MIME_MULTIPART_BLURB -275 */ -ResDef(MK_MIME_MULTIPART_BLURB, -275, /* text preceding multiparts */ -"This is a multi-part message in MIME format.") - -/* #define MK_PRINT_LOSSAGE -278 */ -ResDef(MK_PRINT_LOSSAGE, -278, -"Printing stopped. A problem occurred while receiving\n\ -the document. Transmission may have been interrupted\n\ -or there may be insufficient space to write the file.\n\n\ -Try again. Check that space is available in the\n\ -temporary directory or restart "MOZ_NAME_PRODUCT".") - -/* #define MK_SIGNATURE_TOO_LONG -279 */ -ResDef(MK_SIGNATURE_TOO_LONG, -279, -"Your signature exceeds the recommended four lines.") - -/* #define MK_SIGNATURE_TOO_WIDE -280 */ -ResDef(MK_SIGNATURE_TOO_WIDE, -280, -"Your signature exceeds the recommended 79 columns.\n\ -For most readers, the lines will appear truncated, or\n\ -will be wrapped unattractively. \n\n\ -Please edit it to keep the lines shorter than 80 characters.") - -ResDef(MK_UNABLE_TO_CONNECT2, -281, -"A network error occurred:\n\ - unable to connect to server\n\ -The server may be down or unreachable.\n\n\ -Try connecting again later.") - -/* #define MK_CANT_LOAD_HELP_TOPIC -282 */ -ResDef(MK_CANT_LOAD_HELP_TOPIC, -282, -"Unable to load the requested help topic") - -/* #define MK_TIMEBOMB_MESSAGE -301 */ -ResDef(MK_TIMEBOMB_MESSAGE, -301, -"This copy of "MOZ_NAME_PRODUCT" has expired.\n\ -This pre-release copy of "MOZ_NAME_FULL" has expired\n\ -and can only be used to download a newer version of "MOZ_NAME_PRODUCT".") - -/* #define MK_TIMEBOMB_URL_PROHIBIT -302 */ -ResDef(MK_TIMEBOMB_URL_PROHIBIT, -302, -"This trial or pre-release copy of "MOZ_NAME_FULL" has expired\n\ -and can only be used to purchase or download a newer version of "MOZ_NAME_PRODUCT".") - -/* #define MK_NO_WAIS_PROXY -303 */ -ResDef(MK_NO_WAIS_PROXY, -303, -"No WAIS proxy is configured.\n\n\ -Check your Proxy preferences and try again.") - -/* #define MK_NNTP_ERROR_MESSAGE -304 */ -ResDef(MK_NNTP_ERROR_MESSAGE, -304, -"A News (NNTP) error occurred:\n\ - %.100s") - -/* #define MK_NNTP_NEWSGROUP_SCAN_ERROR -305 */ -ResDef(MK_NNTP_NEWSGROUP_SCAN_ERROR, -305, -"A News error occurred. The scan of all discussion groups is incomplete.\n\ - \n\ -Try to View All Discussion Groups again.") - -/* #define MK_CREATING_NEWSRC_FILE -306 */ -ResDef(MK_CREATING_NEWSRC_FILE, -306, -MOZ_NAME_BRAND" could not find a News file (newsrc)\n\ -and is creating one for you.") - -/* #define MK_NNTP_SERVER_NOT_CONFIGURED -307 */ -ResDef(MK_NNTP_SERVER_NOT_CONFIGURED,-307, -"No NNTP server is configured.\n\n\ -Check your Mail and Groups preferences and try again.") - -/* #define MK_COMMUNICATIONS_ERROR -308 */ -ResDef(MK_COMMUNICATIONS_ERROR, -308, -"Communications exception (%d).") - - -/* #define MK_SECURE_NEWS_PROXY_ERROR -309 */ -ResDef(MK_SECURE_NEWS_PROXY_ERROR, -309, -MOZ_NAME_BRAND" was unble to connect to the secure news server\n\ -because of a proxy error") - - -/* #define MK_POP3_SERVER_ERROR -311 generic pop3 error code */ -ResDef(MK_POP3_SERVER_ERROR, -311, -"An error occurred with the POP3 server.\n\ -You should contact the administrator for this server\n\ -or try again later.") - -/* #define MK_POP3_USERNAME_UNDEFINED -312 no username defined */ -ResDef(MK_POP3_USERNAME_UNDEFINED, -312, -MOZ_NAME_BRAND" is unable to use the mail server because\n\ -you have not provided a username. Please provide\n\ -one in the preferences and try again") - -/* #define MK_POP3_PASSWORD_UNDEFINED -313 no password defined */ -ResDef(MK_POP3_PASSWORD_UNDEFINED, -313, -"Error getting mail password.") - -/* #define MK_POP3_USERNAME_FAILURE -314 failure in USER step */ -ResDef(MK_POP3_USERNAME_FAILURE, -314, -"An error occurred while sending your user name to the mail server.\n\ -You should contact the administrator for this server\n\ -or try again later.") - -/* #define MK_POP3_PASSWORD_FAILURE -315 failure in PASS step */ -ResDef(MK_POP3_PASSWORD_FAILURE, -315, -"An error occurred while sending your password to the mail server.\n\ -You should contact the administrator for this server\n\ -or try again later.") - -/* #define MK_POP3_NO_MESSAGES -316 no mail messages on pop server */ -ResDef(MK_POP3_NO_MESSAGES, -316, -"No new messages on server") - -/* #define MK_POP3_LIST_FAILURE -317 LIST command failed */ -ResDef(MK_POP3_LIST_FAILURE, -317, -"An error occurred while listing messages on the POP3 server.\n\ -You should contact the administrator for this server\n\ -or try again later.") - -/* #define MK_POP3_LAST_FAILURE -318 LAST command failed */ -ResDef(MK_POP3_LAST_FAILURE, -318, -"An error occurred while querying the POP3 server for\n\ -the last processed message.\n\ -You should contact the administrator for this server\n\ -or try again later.") - - -/* #define MK_POP3_RETR_FAILURE -319 RETR command failed, continues */ -ResDef(MK_POP3_RETR_FAILURE, -319, -"An error occurred while getting messages from the POP3 server.\n\ -You should contact the administrator for this server\n\ -or try again later.") - -/* #define MK_POP3_DELE_FAILURE -320 DELE command failed */ -ResDef(MK_POP3_DELE_FAILURE, -320, -"An error occurred while removing messages from the POP3 server.\n\ -You should contact the administrator for this server\n\ -or try again later.") - -/* #define MK_POP3_OUT_OF_DISK_SPACE -321 */ -ResDef(MK_POP3_OUT_OF_DISK_SPACE, -321, -"There isn't enough room on the local disk to download\n\ -your mail from the POP3 server. Please make room and\n\ -try again. (The `Empty Trash' and `Compress This Folder'\n\ -commands may recover some space.)") - -/* #define MK_POP3_MESSAGE_WRITE_ERROR -322 */ -ResDef(MK_POP3_MESSAGE_WRITE_ERROR, -322, -"An error occurred while saving mail messages.") - - -/* #define MK_COULD_NOT_PUT_FILE -325 FTP could not put file */ -ResDef(MK_COULD_NOT_PUT_FILE, -325, -"Could not post the file: %.80s.\n\ -For reason:\n\ - %.200s\n\n\ -You may not have permission to write to\n\ -this directory.\n\ -Check the permissions and try again.") - -/* #define MK_TIMEBOMB_WARNING_MESSAGE -326 */ -ResDef(MK_TIMEBOMB_WARNING_MESSAGE, -326, -"This is a pre-release copy of "MOZ_NAME_FULL" that\n\ -will expire at %s.\n\ -To obtain a newer pre-release version or the latest full\n\ -release of "MOZ_NAME_FULL" (which will not expire) \n\ -choose Software from the Help menu.") - -/* #define MK_UNABLE_TO_DELETE_FILE */ -ResDef(MK_UNABLE_TO_DELETE_FILE, -327, -"Could not delete file:\n\ - %s") - -/* #define MK_UNABLE_TO_DELETE_DIRECTORY */ -ResDef(MK_UNABLE_TO_DELETE_DIRECTORY, -328, -"Could not remove directory:\n\ - %s") - -/* #define MK_MKDIR_FILE_ALREADY_EXISTS */ -ResDef(MK_MKDIR_FILE_ALREADY_EXISTS, -329, -"Cannot create directory because a file or\n\ -directory of that name already exists: \n\ - %s") - -/* #define MK_COULD_NOT_CREATE_DIRECTORY */ -ResDef(MK_COULD_NOT_CREATE_DIRECTORY, -330, -"Could not create directory:\n\ - %s") - -/* #define MK_NOT_A_DIRECTORY */ -ResDef(MK_NOT_A_DIRECTORY, -331, -"Object is not a directory:\n\ - %s") - -/* define MK_COMPUSERVE_AUTH_FAILED -332 */ -ResDef(MK_COMPUSERVE_AUTH_FAILED, -332, -"Authorization failed") - -/* #define MK_RELATIVE_TIMEBOMB_MESSAGE -333 */ -ResDef(MK_RELATIVE_TIMEBOMB_MESSAGE, -333, -"This trial copy of "MOZ_NAME_PRODUCT" has expired.\n\n\ -To purchase a regular copy of "MOZ_NAME_FULL"\n(\ -which will not expire) choose Software from the Help menu.") - -/* #define MK_RELATIVE_TIMEBOMB_WARNING_MESSAGE -334 */ -ResDef(MK_RELATIVE_TIMEBOMB_WARNING_MESSAGE, -334, -"This trial copy of "MOZ_NAME_FULL" \n\ -will expire at %s.\n\n\ -To purchase a regular copy of "MOZ_NAME_FULL"\n(\ -which will not expire) choose Software from the Help menu.") - -/* #define MK_REDIRECT_ATTEMPT_NOT_ALLOWED -335 */ -ResDef(MK_REDIRECT_ATTEMPT_NOT_ALLOWED, -335, -"There was an attempt to redirect a url request,\n\ -but the attempt was not allowed by the client.") - -/* #define MK_BAD_GZIP_HEADER -336 */ -ResDef(MK_BAD_GZIP_HEADER, -336, -"Corruption was detected in the compressed GZip file that was requested") - -/* Mail/News errors */ - -ResDef(MK_MSG_CANT_COPY_TO_SAME_FOLDER, -401, - "Can't move or copy messages to the folder they're already in.") - -#ifdef XP_WIN16 -ResDef(MK_MSG_CANT_COPY_TO_QUEUE_FOLDER, -402, - "Cannot copy messages into the 'Unsent' folder:\n\ -That folder is only for holding messages which\n\ -have been deferred for later delivery.") -#else -ResDef(MK_MSG_CANT_COPY_TO_QUEUE_FOLDER, -402, - "Cannot copy messages into the 'Unsent Messages' folder:\n\ -That folder is only for holding messages which\n\ -have been deferred for later delivery.") -#endif - -ResDef(MK_MSG_CANT_COPY_TO_DRAFTS_FOLDER, -403, - "Cannot copy messages into the `unsent drafts' folder:\n\ -That folder is only for holding messages which have\n\ -have not yet been queued delivery.") - -ResDef(MK_MSG_CANT_CREATE_FOLDER, -404, - "Couldn't create the folder!") - -ResDef(MK_MSG_FOLDER_ALREADY_EXISTS, -405, - "The folder already exists.") - -ResDef(MK_MSG_FOLDER_NOT_EMPTY, -406, - "Can't delete a folder without first deleting the messages in it.") - -ResDef(MK_MSG_CANT_DELETE_FOLDER, -407, - "Can't delete a folder without first deleting the messages in it.") - -ResDef(MK_MSG_CANT_CREATE_INBOX, -408, - "Couldn't create default inbox folder!") - -ResDef(MK_MSG_CANT_CREATE_MAIL_DIR, -409, - "Couldn't create a mail folder directory. Mail will not work!") - -ResDef(MK_MSG_NO_POP_HOST, -410, - "No mail server has been specified in preferences.") - -ResDef(MK_MSG_MESSAGE_CANCELLED, -414, - "Message cancelled.") - -ResDef(MK_MSG_COULDNT_OPEN_FCC_FILE, -415, - "Couldn't open Sent Mail file. \n\ - Please verify that your Mail preferences are correct.") - -ResDef(MK_MSG_FOLDER_UNREADABLE, -416, - "Folder no longer exists?") - -ResDef(MK_MSG_FOLDER_SUMMARY_UNREADABLE, -417, - "Folder summary file no longer exists?") - -ResDef(MK_MSG_TMP_FOLDER_UNWRITABLE, -418, - "Couldn't open temporary folder file for output.") - -ResDef(MK_MSG_ID_NOT_IN_FOLDER, -419, - "The specified message doesn't exist in that folder.\n\ -It may have been deleted or moved into another folder.") - -ResDef(MK_MSG_NEWSRC_UNPARSABLE, -420, - "A newsrc file exists but is unparsable.") - -ResDef(MK_MSG_NO_RETURN_ADDRESS, -421, - "Your email address has not been specified.\n\ -Before sending mail or discussion messages, you must specify a\n\ -return address in Mail and Groups Preferences.") - -#if 0 -/* Windows and Mac resource only understand 254 chars per string */ -ResDef(MK_MSG_NO_RETURN_ADDRESS_AT, -421, - "The return email address set in Preferences is: %s\n\ -\n\ -This does not appear to be complete (it contains no `@' and host name.)\n\ -A valid email address will be of the form `USER@HOST', where USER is\n\ -usually your login ID, and HOST is the fully-specified name of the\n\ -machine to which your mail should be delivered. A fully-specified host\n\ -name will have at least one `.' in it, and will usually end in `.com',\n\ -`.edu', `.net', or a two-letter country code. If you are unsure what\n\ -your full email address is, please consult your system administrator.") - -/* Windows and Mac resource only understand 254 chars per string */ -ResDef(MK_MSG_NO_RETURN_ADDRESS_DOT, -422, - "The return email address set in Preferences is: %s\n\ -\n\ -This does not appear to be complete (it contains no `.' in the host name.)\n\ -A valid email address will be of the form `USER@HOST', where USER is\n\ -usually your login ID, and HOST is the fully-specified name of the\n\ -machine to which your mail should be delivered. A fully-specified host\n\ -name will have at least one `.' in it, and will usually end in `.com',\n\ -`.edu', `.net', or a two-letter country code. If you are unsure what\n\ -your full email address is, please consult your system administrator.") -#else -ResDef(MK_MSG_NO_RETURN_ADDRESS_AT, -423, - "The return email address set in Preferences is: %s\n\ -\n\ -This appears to be incomplete (it contains no `@'). Examples of\n\ -correct email addresses are `fred@xyz.com' and `sue@xyz.gov.au'.") - -ResDef(MK_MSG_NO_RETURN_ADDRESS_DOT, -424, - "The return email address set in Preferences is: %s\n\ -\n\ -This appears to be incomplete (it contains no `.'). Examples of\n\ -correct email addresses are `fred@xyz.com' and `sue@xyz.gov.au'.") -#endif - -ResDef(MK_MSG_NO_SMTP_HOST,-425, - "No SMTP server has been specified in Mail and Groups Preferences.") - -ResDef(MK_NNTP_CANCEL_CONFIRM, -426, - "Are you sure you want to cancel this message?") - -ResDef(MK_NNTP_CANCEL_DISALLOWED, -427, - "This message does not appear to be from you.\n\ -You may only cancel your own posts, not those made by others.") - -ResDef(MK_NNTP_CANCEL_ERROR, -428, - "Unable to cancel message!") - -ResDef(MK_NNTP_NOT_CANCELLED, -429, - "Message not cancelled.") - -ResDef(MK_NEWS_ERROR_FMT, -430, - "Error!\nDiscussion group server responded: %.512s\n") - - -ResDef(MK_MSG_NON_MAIL_FILE_READ_QUESTION, -431, - "%.300s does not appear to be a mail file.\n\ -Attempt to read it anyway?") - -ResDef(MK_MSG_NON_MAIL_FILE_WRITE_QUESTION, -432, - "%.300s does not appear to be a mail file.\n\ -Attempt to write it anyway?") - -ResDef(MK_MSG_ERROR_WRITING_NEWSRC, -433, - "Error saving newsrc file!") - -ResDef(MK_MSG_ERROR_WRITING_MAIL_FOLDER, -434, - "Error writing mail file!") - -ResDef(MK_MSG_OFFER_COMPRESS, -435, - "At least one of your mail folders is wasting a lot\n\ -of disk space. If you compress your Mail folders now,\n\ -you can recover %ld Kbytes of disk space. Compressing\n\ -folders might take a while.\n\ -\n\ -Compress folders now?") - -ResDef(MK_MSG_SEARCH_FAILED, -436, - "Not found.") - -ResDef(MK_MSG_EMPTY_MESSAGE, -437, - "You haven't typed anything, and there is no attachment.\n\ -Send anyway?") - -ResDef(MK_MSG_DOUBLE_INCLUDE, -438, - "You have included the same document twice: first as a quoted\n\ -document (meaning: with '>' at the beginning of each line), and\n\ -then as an attachment (meaning: as a second part of the message,\n\ -included after your new text).\n\ -\n\ -Send it anyway?") - -#ifdef XP_WIN16 -ResDef(MK_MSG_DELIVERY_FAILURE_1, -439, - "Delivery failed for 1 message.\n\n\ -This message has been left in the Unsent folder.\n\ -Before it can be delivered, the error must be\n\ -corrected.") - -ResDef(MK_MSG_DELIVERY_FAILURE_N, -440, - "Delivery failed for %d messages.\n\n\ -These messages have been left in the Unsent folder.\n\ -Before they can be delivered, the errors must be\n\ -corrected.") -#else -ResDef(MK_MSG_DELIVERY_FAILURE_1, -439, - "Delivery failed for 1 message.\n\n\ -This message has been left in the Unsent Messages folder.\n\ -Before it can be delivered, the error must be\n\ -corrected.") - -ResDef(MK_MSG_DELIVERY_FAILURE_N, -440, - "Delivery failed for %d messages.\n\n\ -These messages have been left in the Unsent Messages folder.\n\ -Before they can be delivered, the errors must be\n\ -corrected.") -#endif - - -ResDef(MK_MSG_MISSING_SUBJECT, -441, - "This message has no subject. Send anyway?") - -ResDef(MK_MSG_MIXED_SECURITY, -442, - "It will not be possible to send this message encrypted to all of the\n\ -addressees. Send it anyway?") - -ResDef (MK_MSG_CAN_ONLY_DELETE_MAIL_FOLDERS, -443, - "Can only delete mail folders.") - -ResDef(MK_MSG_FOLDER_BUSY, -444, -"Can't copy messages because the mail folder is in use.\n\ -Please wait until other copy operations are \n\ -complete and try again.\n" ) - -ResDef(MK_MSG_PANES_OPEN_ON_FOLDER, -445, -"Can't delete message folder '%s\' because you are viewing\n\ -its contents. Please close those windows and try again.") - -ResDef(MK_MSG_INCOMPLETE_NEWSGROUP_LIST, -446, -"The complete list of discussion groups was not retrieved for\n\ -this discussion group server. Operations will not proceed normally\n\ -until all discussion groups have been retrieved.\n\ -\n\ -Click on the 'All Groups' tab to continue retrieving\n\ -discussion groups.") - -ResDef(MK_MSG_ONLINE_IMAP_WITH_NO_BODY, -447, -"This IMAP message cannot be moved while offline. It has no attached body.") - -ResDef(MK_MSG_ONLINE_COPY_FAILED, -448, -"The IMAP message copy failed. A source message was not found.") - -ResDef(MK_MSG_ONLINE_MOVE_FAILED, -449, -"The IMAP message move failed.\n\ -The copy succeeded but a source message was not deleted.") - -ResDef(MK_MSG_CONFIRM_CONTINUE_IMAP_SYNC, -450, -"A playback operation failed. Continue?\n") - -ResDef(MK_MSG_CANT_MOVE_INBOX, -451, -"You cannot move your Inbox Folder.") - -ResDef(MK_MSG_CANT_FIND_SNM, -452, -"Could not find the summary information\n\ - for the %s IMAP folder.") - -ResDef(MK_MSG_NO_UNDO_DURING_IMAP_FOLDER_LOAD, -453, -"You cannot undo or redo a folder action while\n\ - the folder is loading.") - -ResDef(MK_MSG_MOVE_TARGET_NO_INFERIORS, -454, -"The targeted destination folder does not allow subfolders.") - -ResDef(MK_MSG_PARENT_TARGET_NO_INFERIORS, -455, -"The selected parent folder does not allow subfolders.\n\ - Try selecting the server folder and typing\n\ - 'parent/newFolder' to create a new hierarchy.") - -ResDef(MK_MSG_COPY_TARGET_NO_SELECT, -456, -"The targeted destination folder cannot hold messages.") - -ResDef(MK_MSG_TRASH_NO_INFERIORS, -457, -"This mail server cannot undo folder deletes, delete anyway?") - -ResDef(MK_MSG_CANT_COPY_TO_QUEUE_FOLDER_OLD, -458, - "Cannot copy messages into the 'Outbox' folder:\n\ -That folder is only for holding messages which\n\ -have been deferred for later delivery.") - -ResDef(MK_MSG_DELIVERY_FAILURE_1_OLD, -459, - "Delivery failed for 1 message.\n\n\ -This message has been left in the Outbox folder.\n\ -Before it can be delivered, the error must be\n\ -corrected.") - -ResDef(MK_MSG_DELIVERY_FAILURE_N_OLD, -460, - "Delivery failed for %d messages.\n\n\ -These messages have been left in the Outbox folder.\n\ -Before they can be delivered, the errors must be\n\ -corrected.") - -ResDef(MK_MSG_NO_MAIL_TO_NEWS, -461, - "You can't move a mail folder into a discussion group.") - -ResDef(MK_MSG_NO_NEWS_TO_MAIL, -462, - "You can't move a discussion group into a mail folder.") - -ResDef(MK_MSG_BOGUS_SERVER_MAILBOX_UID_STATE, -463, - "Mail Server Problem: The UID's for the messages in this\n\ - folder are not increasing. Contact your sysadmin.") - -ResDef(MK_MSG_IMAP_SERVER_NOT_IMAP4, -464, - "This mail server is not an IMAP4 mail server.") - -ResDef(MK_MSG_HTML_IMAP_NO_CACHED_BODY, -465, -"IMAP Go Online!\n\ -The body of this message has not been downloaded from \n\ -the server for reading offline. To read this message \n\ -you must first go online using the 'Go Online' menu item \n\ -in the File menu and view the message again.") - -ResDef(MK_MSG_COMPRESS_FAILED, -466, - "Compress failed.") - -ResDef(MK_MSG_LOTS_NEW_IMAP_FOLDERS, -467, -"At least 30 new IMAP folders have been found.\n\ -\n\ -Press to continue or to change\n\ -the IMAP server directory.") - -ResDef(MK_MSG_IMAP_DIR_PROMPT, -468, - "Enter IMAP server directory name.") - -ResDef(MK_MSG_NO_POST_TO_DIFFERENT_HOSTS_ALLOWED, -469, -"Posting to discussion groups on different hosts is not supported.") - -ResDef(MK_MSG_CANT_MOVE_OFFLINE_MOVE_RESULT, -470, -"This message was moved here while offline. You have to \n\ -go online to move it again.") - -ResDef(MK_MSG_SEARCH_HITS_NOT_IN_DB, -471, -"This IMAP folder is out of date. Open it again for a more complete search.") - -ResDef(MK_MSG_MAIL_DIRECTORY_CHANGED, -472, -"Your new mail directory preference\n\ -will take effect the next time\n\ -you restart Communicator.") - -END_STR(mcom_include_merrors_i_strings) - -/* WARNING: DO NOT TAKE ERROR CODE -666, it is used internally - by the message lib */ - - -/* General security error codes */ - -#define NO_SECURITY_ERROR_ENUM -#include "secerr.h" - -RES_START -BEGIN_STR(mcom_include_secerr_i_strings) - -ResDef(SEC_ERROR_IO, SEC_ERROR_BASE + 0, -"An I/O error occurred during security authorization.\n\ -Please try your connection again") - -ResDef(SEC_ERROR_LIBRARY_FAILURE, SEC_ERROR_BASE + 1, -"The security library has experienced an error.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_BAD_DATA, SEC_ERROR_BASE + 2, -"The security library has received bad data.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_OUTPUT_LEN, SEC_ERROR_BASE + 3, -"The security library has experienced an error.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_INPUT_LEN, SEC_ERROR_BASE + 4, -"The security library has experienced an error.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_INVALID_ARGS, SEC_ERROR_BASE + 5, -"The security library has experienced an error.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_INVALID_ALGORITHM, SEC_ERROR_BASE + 6, -"The security library has experienced an error.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_INVALID_AVA, SEC_ERROR_BASE + 7, -"The security library has experienced an error.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_INVALID_TIME, SEC_ERROR_BASE + 8, -"The security library has experienced an error.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_BAD_DER, SEC_ERROR_BASE + 9, -"The security library has encountered an improperly formatted\n\ -DER-encoded message.") - -ResDef(SEC_ERROR_BAD_SIGNATURE, SEC_ERROR_BASE + 10, -"The server's certificate has an invalid signature.\n\ -You will not be able to connect to this site securely.") - -ResDef(SEC_ERROR_EXPIRED_CERTIFICATE, SEC_ERROR_BASE + 11, -"This operation cannot be performed because a required\n\ -certificate has expired. Click on the `Security' icon\n\ -for more information about certificates.") - -ResDef(SEC_ERROR_REVOKED_CERTIFICATE, SEC_ERROR_BASE + 12, -"This operation cannot be performed because a required\n\ -certificate has been revoked. Click on the `Security'\n\ -icon for more information about certificates.") - -ResDef(SEC_ERROR_UNKNOWN_ISSUER, SEC_ERROR_BASE + 13, -"The certificate issuer for this server is not recognized by\n\ -"MOZ_NAME_PRODUCT". The security certificate may or may not be valid.\n\n\ -"MOZ_NAME_PRODUCT" refuses to connect to this server.") - -ResDef(SEC_ERROR_BAD_KEY, SEC_ERROR_BASE + 14, -"The server's public key is invalid.\n\ -You will not be able to connect to this site securely.") - -ResDef(SEC_ERROR_BAD_PASSWORD, SEC_ERROR_BASE + 15, -"The security password entered is incorrect.") - -ResDef(SEC_ERROR_RETRY_PASSWORD, SEC_ERROR_BASE + 16, -"You did not enter your new password correctly. Please try again.") - -ResDef(SEC_ERROR_NO_NODELOCK, SEC_ERROR_BASE + 17, -"The security library has experienced an error.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_BAD_DATABASE, SEC_ERROR_BASE + 18, -"The security library has experienced a database error.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_NO_MEMORY, SEC_ERROR_BASE + 19, -"The security library has experienced an out of memory error.\n\ -Please try to reconnect.") - -ResDef(SEC_ERROR_UNTRUSTED_ISSUER, SEC_ERROR_BASE + 20, -"The certificate issuer for this server has been marked as\n\ -not trusted by the user. "MOZ_NAME_PRODUCT" refuses to connect to this\n\ -server.") - -ResDef(SEC_ERROR_UNTRUSTED_CERT, SEC_ERROR_BASE + 21, -"The certificate for this server has been marked as not\n\ -trusted by the user. "MOZ_NAME_PRODUCT" refuses to connect to this\n\ -server.") - -ResDef(SEC_ERROR_DUPLICATE_CERT, (SEC_ERROR_BASE + 22), -"The Certificate that you are trying to download\n\ -already exists in your database.") - -ResDef(SEC_ERROR_DUPLICATE_CERT_NAME, (SEC_ERROR_BASE + 23), -"You are trying to download a certificate whose name\n\ -is the same as one that already exists in your database.\n\ -If you want to download the new certificate you should\n\ -delete the old one first.") - -ResDef(SEC_ERROR_ADDING_CERT, (SEC_ERROR_BASE + 24), -"Error adding certificate to your database") - -ResDef(SEC_ERROR_FILING_KEY, (SEC_ERROR_BASE + 25), -"Error refiling the key for this certificate") - -ResDef(SEC_ERROR_NO_KEY, (SEC_ERROR_BASE + 26), -"The Private Key for this certificate can\n\ -not be found in your key database") - -ResDef(SEC_ERROR_CERT_VALID, (SEC_ERROR_BASE + 27), -"This certificate is valid.") - -ResDef(SEC_ERROR_CERT_NOT_VALID, (SEC_ERROR_BASE + 28), -"This certificate is not valid.") - -ResDef(SEC_ERROR_CERT_NO_RESPONSE, (SEC_ERROR_BASE + 29), -"No Response") - -ResDef(SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE, (SEC_ERROR_BASE + 30), -"The certificate authority that issued this site's\n\ -certificate has expired.\n\ -Check your system date and time.") - -ResDef(SEC_ERROR_CRL_EXPIRED, (SEC_ERROR_BASE + 31), -"The certificate revocation list for this certificate authority\n\ -that issued this site's certificate has expired.\n\ -Reload a new certificate revocation list or check your system data and time.") - -ResDef(SEC_ERROR_CRL_BAD_SIGNATURE, (SEC_ERROR_BASE + 32), -"The certificate revocation list for this certificate authority\n\ -that issued this site's certificate has an invalid signature.\n\ -Reload a new certificate revocation list.") - -ResDef(SEC_ERROR_CRL_INVALID, (SEC_ERROR_BASE + 33), -"The certificate revocation list you are trying to load has\n\ -an invalid format.") - -ResDef(SEC_ERROR_EXTENSION_VALUE_INVALID,(SEC_ERROR_BASE + 34), -"Extension value is invalid.") - -ResDef(SEC_ERROR_EXTENSION_NOT_FOUND,(SEC_ERROR_BASE + 35), -"Extension not found.") - -ResDef(SEC_ERROR_CA_CERT_INVALID,(SEC_ERROR_BASE + 36), -"Issuer certificate is invalid.") - - -ResDef(SEC_ERROR_PATH_LEN_CONSTRAINT_INVALID,(SEC_ERROR_BASE + 37), -"Certificate path length constraint is invalid.") - -ResDef(SEC_ERROR_CERT_USAGES_INVALID,(SEC_ERROR_BASE + 38), -"Certificate usages is invalid.") - -ResDef(SEC_INTERNAL_ONLY, (SEC_ERROR_BASE + 39), -"**Internal ONLY module**") - -ResDef(SEC_ERROR_INVALID_KEY, (SEC_ERROR_BASE + 40), -"The system tried to use a key which does not support\n\ -the requested operation.") - -ResDef(SEC_ERROR_UNKNOWN_CRITICAL_EXTENSION,(SEC_ERROR_BASE + 41), -"Certificate contains unknown critical extension.") - -ResDef(SEC_ERROR_OLD_CRL, (SEC_ERROR_BASE + 42), -"The certificate revocation list you are trying to load is not\n\ -later than the current one.") - -ResDef(SEC_ERROR_NO_EMAIL_CERT, (SEC_ERROR_BASE + 43), -"This message cannot be encrypted or signed because you do not\n\ -yet have an email certificate. Click on the `Security' icon for more\n\ -information about certificates.") - -ResDef(SEC_ERROR_NO_RECIPIENT_CERTS_QUERY, (SEC_ERROR_BASE + 44), -"This message cannot be encrypted because you do not have\n\ -certificates for each of the recipients. Clicking on the\n\ -`Security' icon will give you more information.\n\ -\n\ -Turn off encryption and send the message anyway?") - -ResDef(SEC_ERROR_NOT_A_RECIPIENT, (SEC_ERROR_BASE + 45), -"The data cannot be decrypted because you are not a recipient;\n\ -either it was not intended for you, or a matching certificate or\n\ -Private Key cannot be found in your local database.") - -ResDef(SEC_ERROR_PKCS7_KEYALG_MISMATCH, (SEC_ERROR_BASE + 46), -"The data cannot be decrypted because the key encryption\n\ -algorithm it used does not match that of your certificate.") - -ResDef(SEC_ERROR_PKCS7_BAD_SIGNATURE, (SEC_ERROR_BASE + 47), -"Signature verification failed due to no signer found,\n\ -too many signers found, or improper or corrupted data.") - -ResDef(SEC_ERROR_UNSUPPORTED_KEYALG, (SEC_ERROR_BASE + 48), -"An unsupported or unknown key algorithm was encountered;\n\ -the current operation cannot be completed.") - -ResDef(SEC_ERROR_DECRYPTION_DISALLOWED, (SEC_ERROR_BASE + 49), -"The data cannot be decrypted because it was encrypted using an\n\ -algorithm or key size which is not allowed by this configuration.") - - -#ifdef FORTEZZA -/* Fortezza Alerts */ -ResDef(XP_SEC_FORTEZZA_BAD_CARD, (SEC_ERROR_BASE + 50), -"The Fortezza Card in Socket %d has not been properly initialized.\ - Please remove it and return it to your issuer.") - -ResDef(XP_SEC_FORTEZZA_NO_CARD, (SEC_ERROR_BASE + 51), -"No cards Found") - -ResDef(XP_SEC_FORTEZZA_NONE_SELECTED, (SEC_ERROR_BASE + 52), -"No Card Selected") - -ResDef(XP_SEC_FORTEZZA_MORE_INFO, (SEC_ERROR_BASE + 53), -"Please Select a personality to get more info on") - -ResDef(XP_SEC_FORTEZZA_PERSON_NOT_FOUND, (SEC_ERROR_BASE + 54), -"Personality not found") - -ResDef(XP_SEC_FORTEZZA_NO_MORE_INFO, (SEC_ERROR_BASE + 55), -"No more information on that Personality") - -ResDef(XP_SEC_FORTEZZA_BAD_PIN, (SEC_ERROR_BASE + 56), -"Invalid Pin") - -ResDef(XP_SEC_FORTEZZA_PERSON_ERROR, (SEC_ERROR_BASE + 57), -"Couldn't initialize personalities") -#endif /* FORTEZZA */ - -ResDef(SEC_ERROR_NO_KRL, (SEC_ERROR_BASE + 58), -"No key revocation list for this site's certificate has been found.\n\ -You must load the key revocation list before continuing.") - -ResDef(SEC_ERROR_KRL_EXPIRED, (SEC_ERROR_BASE + 59), -"The key revocation list for this site's certificate has expired.\n\ -Reload a new key revocation list.") - -ResDef(SEC_ERROR_KRL_BAD_SIGNATURE, (SEC_ERROR_BASE + 60), -"The key revocation list for this site's certificate has an invalid signature.\n\ -Reload a new key revocation list.") - -ResDef(SEC_ERROR_REVOKED_KEY, (SEC_ERROR_BASE + 61), -"The key for this site's certificate has been revoked.\n\ -You will be unable to access this site securely.") - -ResDef(SEC_ERROR_KRL_INVALID, (SEC_ERROR_BASE + 62), -"The key revocation list you are trying to load has\n\ -an invalid format.") - -ResDef(SEC_ERROR_NEED_RANDOM, (SEC_ERROR_BASE + 63), -"The security library is out of random data.") - -ResDef(SEC_ERROR_NO_MODULE, (SEC_ERROR_BASE + 64), -"The security library could not find a security module which can\n\ -perform the requested operation.") - -ResDef(SEC_ERROR_NO_TOKEN, (SEC_ERROR_BASE + 65), -"The security card or token does not exist, needs to be initialized\n\ -or has been removed.") - -ResDef(SEC_ERROR_READ_ONLY, (SEC_ERROR_BASE + 66), -"The security library has experienced a database error.\n\ -You will probably be unable to connect to this site securely.") - -ResDef(SEC_ERROR_NO_SLOT_SELECTED, (SEC_ERROR_BASE + 67), -"No slot or token was selected.") - -ResDef(SEC_ERROR_CERT_NICKNAME_COLLISION, (SEC_ERROR_BASE + 68), -"A certificate with the same name already exists.") - -ResDef(SEC_ERROR_KEY_NICKNAME_COLLISION, (SEC_ERROR_BASE + 69), -"A key with the same name already exists.") - -ResDef(SEC_ERROR_SAFE_NOT_CREATED, (SEC_ERROR_BASE + 70), -"An error occurred while creating safe object") - -ResDef(SEC_ERROR_BAGGAGE_NOT_CREATED, (SEC_ERROR_BASE + 71), -"An error occurred while creating safe object") - -ResDef(XP_JAVA_REMOVE_PRINCIPAL_ERROR, (SEC_ERROR_BASE + 72), -"Couldn't remove the principal") - -ResDef(XP_JAVA_DELETE_PRIVILEGE_ERROR, (SEC_ERROR_BASE + 73), -"Couldn't delete the privilege") - -ResDef(XP_JAVA_CERT_NOT_EXISTS_ERROR, (SEC_ERROR_BASE + 74), -"This principal doesn't have a certificate") - -ResDef(SEC_ERROR_BAD_EXPORT_ALGORITHM, (SEC_ERROR_BASE + 75), -"The operation cannot be performed because the required\n\ -algorithm is not allowed by this configuration.") - -ResDef(SEC_ERROR_EXPORTING_CERTIFICATES, (SEC_ERROR_BASE + 76), -"Unable to export certificates. An error occurred attempting to\n\ -export the certificates.") - -ResDef(SEC_ERROR_IMPORTING_CERTIFICATES, (SEC_ERROR_BASE + 77), -"An error occurred attempting to import the certificates.") - -ResDef(SEC_ERROR_PKCS12_DECODING_PFX, (SEC_ERROR_BASE + 78), -"Unable to import certificates. The file specified is either\n\ -corrupt or is not a valid file.") - -ResDef(SEC_ERROR_PKCS12_INVALID_MAC, (SEC_ERROR_BASE + 79), -"Unable to import certificates. Either the integrity password\n\ -is incorrect or the data in the file specified has been tampered\n\ -with or corrupted in some manner.") - -ResDef(SEC_ERROR_PKCS12_UNSUPPORTED_MAC_ALGORITHM, (SEC_ERROR_BASE + 80), -"Unable to import certificates. The algorithm used to generate the\n\ -integrity information for this file is not supported in the application.") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(SEC_ERROR_PKCS12_UNSUPPORTED_TRANSPORT_MODE, (SEC_ERROR_BASE + 81), -"Unable to import certificates. "MOZ_NAME_PRODUCT" only supports password\n\ -integrity and password privacy modes for importing certificates.") -#else -ResDef(SEC_ERROR_PKCS12_UNSUPPORTED_TRANSPORT_MODE, (SEC_ERROR_BASE + 81), -"Unable to import certificates. Communicator only supports password\n\ -integrity and password privacy modes for importing certificates.") -#endif - -ResDef(SEC_ERROR_PKCS12_CORRUPT_PFX_STRUCTURE, (SEC_ERROR_BASE + 82), -"Unable to import certificates. The file containing the certificates\n\ -is corrupt. Required information is either missing or invalid.") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(SEC_ERROR_PKCS12_UNSUPPORTED_PBE_ALGORITHM, (SEC_ERROR_BASE + 83), -"Unable to import certificates. The algorithm used to encrypt the\n\ -contents is not supported by "MOZ_NAME_PRODUCT".") -#else -ResDef(SEC_ERROR_PKCS12_UNSUPPORTED_PBE_ALGORITHM, (SEC_ERROR_BASE + 83), -"Unable to import certificates. The algorithm used to encrypt the\n\ -contents is not supported by Communicator.") -#endif - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(SEC_ERROR_PKCS12_UNSUPPORTED_VERSION, (SEC_ERROR_BASE + 84), -"Unable to import certificates. The file is a version not supported by\n\ -"MOZ_NAME_PRODUCT".") -#else -ResDef(SEC_ERROR_PKCS12_UNSUPPORTED_VERSION, (SEC_ERROR_BASE + 84), -"Unable to import certificates. The file is a version not supported by\n\ -Communicator.") -#endif - -ResDef(SEC_ERROR_PKCS12_PRIVACY_PASSWORD_INCORRECT, (SEC_ERROR_BASE + 85), -"Unable to import certificates. The privacy password specified is\n\ -incorrect.") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(SEC_ERROR_PKCS12_CERT_COLLISION, (SEC_ERROR_BASE + 86), -"Unable to import certificates. A certificate with the same nickname,\n\ -as one being imported already exists in your "MOZ_NAME_PRODUCT" database.") -#else -ResDef(SEC_ERROR_PKCS12_CERT_COLLISION, (SEC_ERROR_BASE + 86), -"Unable to import certificates. A certificate with the same nickname,\n\ -as one being imported already exists in your Communicator database.") -#endif - -ResDef(SEC_ERROR_USER_CANCELLED, (SEC_ERROR_BASE + 87), -"The user pressed cancel.") - -ResDef(SEC_ERROR_PKCS12_DUPLICATE_DATA, (SEC_ERROR_BASE + 88), -"Certificates could not be imported since they already exist on \ -the machine.") - -ResDef(SEC_ERROR_MESSAGE_SEND_ABORTED, (SEC_ERROR_BASE + 89), -"Message not sent.") - -ResDef(SEC_ERROR_INADEQUATE_KEY_USAGE, (SEC_ERROR_BASE + 90), -"The certificate is not approved for the attempted operation.") - -ResDef(SEC_ERROR_INADEQUATE_CERT_TYPE, (SEC_ERROR_BASE + 91), -"The certificate is not approved for the attempted application.") - -ResDef(SEC_ERROR_CERT_ADDR_MISMATCH, (SEC_ERROR_BASE + 92), -"The email address in the signing certificate does not match\n\ -the email address in the message headers. If these two\n\ -addresses do not belong to the same person, then this could\n\ -be an attempt at forgery.") - -ResDef(SEC_ERROR_PKCS12_UNABLE_TO_IMPORT_KEY, (SEC_ERROR_BASE + 93), -"Unable to import certificates. An error occurred while attempting\n\ -to import the Private Key associated with the certificate being imported.") - -ResDef(SEC_ERROR_PKCS12_IMPORTING_CERT_CHAIN, (SEC_ERROR_BASE + 94), -"Unable to import certificates. An error occurred while attempting\n\ -to import the certificate chain associated with the certificate\n\ -being imported.") - -ResDef(SEC_ERROR_PKCS12_UNABLE_TO_LOCATE_OBJECT_BY_NAME, (SEC_ERROR_BASE + 95), -"Unable to export certificates. An error occurred while trying to locate\n\ -a certificate or a key by its nickname.") - -ResDef(SEC_ERROR_PKCS12_UNABLE_TO_EXPORT_KEY, (SEC_ERROR_BASE + 96), -"Unable to export certificates. The Private Key associated with a\n\ -certificate could not be located or could not be exported from the\n\ -key database.") - -ResDef(SEC_ERROR_PKCS12_UNABLE_TO_WRITE, (SEC_ERROR_BASE + 97), -"Unable to export certificates. An error occurred while trying to write\n\ -the export file. Make sure the destination drive is not full and try\n\ -exporting again.") - -ResDef(SEC_ERROR_PKCS12_UNABLE_TO_READ, (SEC_ERROR_BASE + 98), -"Unable to import certificates. An error occurred while reading the\n\ -import file. Please make sure the file exists and is not corrupt and\n\ -then try importing the file again.") - -ResDef(SEC_ERROR_PKCS12_KEY_DATABASE_NOT_INITIALIZED, (SEC_ERROR_BASE + 99), -"Unable to export certificates. The database which contains\n\ -Private Keys has not been initialized. Either your key database\n\ -is corrupt or has been deleted. There is no key associated with\n\ -this certificate.") - -ResDef(SEC_ERROR_KEYGEN_FAIL, (SEC_ERROR_BASE + 100), -"Unable to generate Public/Private Key Pair.") - -ResDef(SEC_ERROR_INVALID_PASSWORD, (SEC_ERROR_BASE + 101), -"The password you entered is invalid. Please pick a different one.") - -ResDef(SEC_ERROR_RETRY_OLD_PASSWORD, (SEC_ERROR_BASE + 102), -"You did not enter your old password correctly. Please try again.") - -ResDef(SEC_ERROR_BAD_NICKNAME, (SEC_ERROR_BASE + 103), -"The Certificate Name you entered is already in use by another certificate.") - -ResDef(SEC_ERROR_NOT_FORTEZZA_ISSUER, (SEC_ERROR_BASE + 104), -"Server FORTEZZA chain has a non-FORTEZZA Certificate. \n\ -You will probably be unable to connect to this site securely.") - - -/* used in pk11dlgs.c */ -ResDef(SEC_ERROR_UNKNOWN, (SEC_ERROR_BASE + 105), - "Unknown") - -/* define some error messages for lm_pkcs11.c */ -ResDef(SEC_ERROR_JS_INVALID_MODULE_NAME, (SEC_ERROR_BASE + 106), -"Invalid module name.") - -ResDef(SEC_ERROR_JS_INVALID_DLL, (SEC_ERROR_BASE + 107), -"Invalid module path/filename") - -ResDef(SEC_ERROR_JS_ADD_MOD_FAILURE, (SEC_ERROR_BASE + 108), -"Unable to add module") - -ResDef(SEC_ERROR_JS_DEL_MOD_FAILURE, (SEC_ERROR_BASE + 109), - "Unable to delete module") - -ResDef(SEC_ERROR_OLD_KRL, (SEC_ERROR_BASE + 110), -"The key revocation list you are trying to load is not\n\ -later than the current one.") - -ResDef(SEC_ERROR_CKL_CONFLICT, (SEC_ERROR_BASE + 111), -"The CKL you are trying to load has a different issuer\n\ -than your current CKL. You must first delete your\n\ -current CKL.") - -ResDef(SEC_ERROR_CERT_NOT_IN_NAME_SPACE, (SEC_ERROR_BASE + 112), -"The Certifying Authority for this certifcate is not\n\ -permited to issue a certifcate with this name.") - -ResDef(SEC_ERROR_KRL_NOT_YET_VALID, (SEC_ERROR_BASE + 113), -"The key revocation list for this site's certificate\n\ -is not yet valid. Reload a new key revocation list.") - -ResDef(SEC_ERROR_CRL_NOT_YET_VALID, (SEC_ERROR_BASE + 114), -"The certificate revocation list for this site's\n\ -certificate is not yet valid. Reload a new certificate\n\ -revocation list.") - -END_STR(mcom_include_secerr_i_strings) - -/* HTML Dialog Box stuff. Moved from secerr #'s to xp_msg #'s */ -RES_START -BEGIN_STR(mcom_include_sec_dialog_strings) -/* NOTE - you can't use backslash-quote to get a quote in the html below. - * you must use \042. This is due to windows resource compiler hosage - */ -ResDef(XP_DIALOG_HEADER_STRINGS, (SEC_DIALOG_STRING_BASE + 0), "\ -%-styleinfo-%\ -
    ") - -/* NOTE - dialogs and panels share the same footer strings !! */ -ResDef(XP_DIALOG_FOOTER_STRINGS, (SEC_DIALOG_STRING_BASE + 2), "\ -
    %0%") - -ResDef(XP_DIALOG_JS_HEADER_STRINGS, (SEC_DIALOG_STRING_BASE + 3), "\ -%-styleinfo-%%0%\n%-cont-%") - -ResDef(XP_DIALOG_JS_FOOTER_STRINGS4, (SEC_DIALOG_STRING_BASE + 8), "\ -\n\ -\n\ -\n") - -ResDef(XP_DIALOG_CANCEL_BUTTON_STRINGS, (SEC_DIALOG_STRING_BASE + 9), "\ -
    ") - -ResDef(XP_DIALOG_OK_BUTTON_STRINGS, (SEC_DIALOG_STRING_BASE + 10), "\ -
    ") - -ResDef(XP_DIALOG_CONTINUE_BUTTON_STRINGS, (SEC_DIALOG_STRING_BASE + 11), "\ -
    \ -
    ") - -ResDef(XP_DIALOG_CANCEL_OK_BUTTON_STRINGS, - (SEC_DIALOG_STRING_BASE + 12), "\ -
      \ -
    ") - -ResDef(XP_DIALOG_CANCEL_CONTINUE_BUTTON_STRINGS, (SEC_DIALOG_STRING_BASE + 13), "\ -
      \ -
    ") - -ResDef(XP_PANEL_HEADER_STRINGS, (SEC_DIALOG_STRING_BASE + 14), "\ -%-styleinfo-%
    \ -") - -#ifdef XP_OS2_FIX -ResDef(XP_PANEL_FIRST_BUTTON_STRINGS, (SEC_DIALOG_STRING_BASE + 16), "\ -
    \ -value=\042%cancel%\042 onclick=\042parent.clicker(this,window.parent)\042>  
    %0%") -#else -ResDef(XP_PANEL_FIRST_BUTTON_STRINGS_1, (SEC_DIALOG_STRING_BASE + 17), "\ -type=\042button\042 name=\042button\042 value=\042%cancel%\042 \ -onclick=\042parent.clicker(this,window.parent)\042 width=80>%0%") -#endif - -#ifdef XP_OS2_FIX -ResDef(XP_PANEL_MIDDLE_BUTTON_STRINGS, (SEC_DIALOG_STRING_BASE + 18), "\ -
    \ -\ -
    %0%") -#else -ResDef(XP_PANEL_MIDDLE_BUTTON_STRINGS_1, (SEC_DIALOG_STRING_BASE + 19), "\ -onclick=\042parent.clicker(this,window.parent)\042 width=80>  \ -%0%") -#endif - -#ifdef XP_OS2_FIX -ResDef(XP_PANEL_LAST_BUTTON_STRINGS, (SEC_DIALOG_STRING_BASE + 20), "\ -
    \ -%-cont-%") -#endif - -#ifdef XP_OS2_FIX -ResDef(XP_PANEL_LAST_BUTTON_STRINGS_1, (SEC_DIALOG_STRING_BASE + 21), "\ -type=\042button\042 name=\042button\042 value=\042%back%\042 onclick=\042parent.clicker(this,window.parent)\042>
    %0%") -#else -ResDef(XP_PANEL_LAST_BUTTON_STRINGS_1, (SEC_DIALOG_STRING_BASE + 21), "\ -  \ -%0%") -#endif - -ResDef(XP_PLAIN_CERT_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 22), "\ -%0%") - -ResDef(XP_CERT_CONFIRM_STRINGS, (SEC_DIALOG_STRING_BASE + 23), "\ -%0%%1%
    %2%
    %3%") - -ResDef(XP_CERT_PAGE_STRINGS, (SEC_DIALOG_STRING_BASE + 24), "\ -%0%%1%%2%") - -ResDef(XP_SSL_SERVER_CERT1_STRINGS, (SEC_DIALOG_STRING_BASE + 25), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -\ -%1% is a site that uses encryption to protect transmitted information. \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT1_STRINGS_1, (SEC_DIALOG_STRING_BASE + 26), "\ -However, "MOZ_NAME_PRODUCT" does not recognize the authority who signed its \ -Certificate.

    Although "MOZ_NAME_PRODUCT" does not recognize the \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT1_STRINGS_2, (SEC_DIALOG_STRING_BASE + 27), "\ -signer of this Certificate, you may decide to accept it anyway so that \ -you can connect to and exchange information with this site.

    This \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT1_STRINGS_3, (SEC_DIALOG_STRING_BASE + 28), "\ -assistant will help you decide whether or not you wish to accept this \ -Certificate and to what extent.%2%") - -ResDef(XP_SSL_SERVER_CERT2_STRINGS, (SEC_DIALOG_STRING_BASE + 29), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -Here is the \ -Certificate that is being presented:


    Certificate for:
    Signed by:
    Encryption:
    %1%
    %2%
    %3% Grade (%4% with %5%-bit secret \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT2_STRINGS_2, (SEC_DIALOG_STRING_BASE + 31), "\ -key)

    The signer of the \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT2_STRINGS_3, (SEC_DIALOG_STRING_BASE + 32), "\ -Certificate promises you that the holder of this Certificate is who they \ -say they are. The encryption level is an indication of how difficult it \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT2_STRINGS_4, (SEC_DIALOG_STRING_BASE + 33), "\ -would be for someone to eavesdrop on any information exchanged between \ -you and this web site.%6%") - -ResDef(XP_SSL_SERVER_CERT3_STRINGS, (SEC_DIALOG_STRING_BASE + 34), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -Are you willing \ -to accept this certificate for the purposes of receiving encrypted \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT3_STRINGS_1, (SEC_DIALOG_STRING_BASE + 35), "\ -information from this web site?

    This means that you will be able to \ -browse through the site and receive documents from it and that all of \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT3_STRINGS_2, (SEC_DIALOG_STRING_BASE + 36), "\ -these documents are protected from observation by a third party by \ -encryption.

    Accept this \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT3_STRINGS_3, (SEC_DIALOG_STRING_BASE + 37), "\ -certificate for this session
    \ -Do not accept this certificate and do not connect\ -
    Accept this certificate forever (until it expires)
    \ -%4%") - -ResDef(XP_SSL_SERVER_CERT4_STRINGS, (SEC_DIALOG_STRING_BASE + 39), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -By accepting this \ -certificate you are ensuring that all information you exchange with this site \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT4_STRINGS_1, (SEC_DIALOG_STRING_BASE + 40), "\ -will be encrypted. However, encryption will not protect you from \ -fraud.

    To protect yourself from fraud, do not send information \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT4_STRINGS_2, (SEC_DIALOG_STRING_BASE + 41), "(\ -especially personal information, credit card numbers, or passwords) to \ -this site if you have any doubt about the site's integrity.

    For your \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT4_STRINGS_3, (SEC_DIALOG_STRING_BASE + 42), "\ -own protection, "MOZ_NAME_PRODUCT" can remind you of this at the appropriate \ -time.

    Warn me \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT4_STRINGS_4, (SEC_DIALOG_STRING_BASE + 43), "\ -before I send information to this site

    %2%") - -ResDef(XP_SSL_SERVER_CERT5A_STRINGS, (SEC_DIALOG_STRING_BASE + 44), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You have \ -finished examining the certificate presented by:
    %1%

    You have \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT5A_STRINGS_1, (SEC_DIALOG_STRING_BASE + 45), "\ -decided to refuse this ID. If, in the future, you change your mind about \ -this decision, just visit this site again and this assistant will \ -%-cont-%") - -ResDef(XP_SSL_SERVER_CERT5A_STRINGS_2, (SEC_DIALOG_STRING_BASE + 46), "\ -reappear.

    Click on the Finish button to return to the document you were\ -viewing before you attempted to connect to this site.%2%") - -ResDef(XP_SSL_SERVER_CERT5B_STRINGS, (SEC_DIALOG_STRING_BASE + 47), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You have \ -finished examining the certificate presented by:
    %1%

    You have \ -%-cont-%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_SSL_SERVER_CERT5B_STRINGS_1, (SEC_DIALOG_STRING_BASE + 48), "\ -decided to accept this certificate and have asked that "MOZ_NAME_FULL" warn \ -you before you send information to this site.

    If you \ -%-cont-%") -#else -ResDef(XP_SSL_SERVER_CERT5B_STRINGS_1, (SEC_DIALOG_STRING_BASE + 48), "\ -decided to accept this certificate and have asked that "MOZ_NAME_PRODUCT" Communicator warn \ -you before you send information to this site.

    If you \ -%-cont-%") -#endif - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_SSL_SERVER_CERT5B_STRINGS_2, (SEC_DIALOG_STRING_BASE + 49), "\ -change your mind, open Security Info from the "MOZ_NAME_PRODUCT" menu and edit \ -Site Certificates.

    Click on the Finish button to begin receiving\ -documents.%2%") -#else -ResDef(XP_SSL_SERVER_CERT5B_STRINGS_2, (SEC_DIALOG_STRING_BASE + 49), "\ -change your mind, open Security Info from the Communicator menu and edit \ -Site Certificates.

    Click on the Finish button to begin receiving\ -documents.%2%") -#endif - -ResDef(XP_SSL_SERVER_CERT5C_STRINGS, (SEC_DIALOG_STRING_BASE + 50), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You have \ -finished examining the certificate presented by:
    %1%

    You have \ -%-cont-%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_SSL_SERVER_CERT5C_STRINGS_1, (SEC_DIALOG_STRING_BASE + 51), "\ -decided to accept this certificate and have decided not to have "MOZ_NAME_PRODUCT" \ -"MOZ_NAME_PRODUCT" warn you before you send information to this site.

    If \ -%-cont-%") -#else -ResDef(XP_SSL_SERVER_CERT5C_STRINGS_1, (SEC_DIALOG_STRING_BASE + 51), "\ -decided to accept this certificate and have decided not to have "MOZ_NAME_PRODUCT" \ -Communicator warn you before you send information to this site.

    If \ -%-cont-%") -#endif - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_SSL_SERVER_CERT5C_STRINGS_2, (SEC_DIALOG_STRING_BASE + 52), "\ -you change your mind, open Security Info from the "MOZ_NAME_PRODUCT" Menu \ -edit Site Certificates.

    Click on the Finish button\ -to begin %-cont-%") -#else -ResDef(XP_SSL_SERVER_CERT5C_STRINGS_2, (SEC_DIALOG_STRING_BASE + 52), "\ -you change your mind, open Security Info from the Communicator Menu \ -edit Site Certificates.

    Click on the Finish button\ -to begin %-cont-%") -#endif - -ResDef(XP_SSL_SERVER_CERT5C_STRINGS_3, (SEC_DIALOG_STRING_BASE + 53), "\ -receiving documents.%2%") - -ResDef(XP_SSL_CERT_DOMAIN_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 54), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -The certificate \ -that the site '%1%' has presented does not contain the correct site \ -%-cont-%") - -ResDef(XP_SSL_CERT_DOMAIN_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 55), "\ -name. It is possible, though unlikely, that someone may be trying to \ -intercept your communication with this site. If you suspect the \ -%-cont-%") - -ResDef(XP_SSL_CERT_DOMAIN_DIALOG_STRINGS_2, (SEC_DIALOG_STRING_BASE + 56), "\ -certificate shown below does not belong to the site you are connecting \ -with, please cancel the connection and notify the site administrator.

    \ -%-cont-%") - -ResDef(XP_SSL_CERT_DOMAIN_DIALOG_STRINGS_3, (SEC_DIALOG_STRING_BASE + 57), "\ -Here is the Certificate that is being presented:


    Certificate for:
    Signed by:
    Encryption: \ -%-cont-%") - -ResDef(XP_SSL_CERT_DOMAIN_DIALOG_STRINGS_4, (SEC_DIALOG_STRING_BASE + 58), "\ -
    %2%
    %3%
    %4% Grade (%5% \ -with %6%-bit secret key)
    \ -
    %7%") - -ResDef(XP_PW_ENTER_NEW_STRINGS, (SEC_DIALOG_STRING_BASE + 60), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -Please enter your new password. The safest passwords are a combination \ -of letters \ -%-cont-%") - -ResDef(XP_PW_ENTER_NEW_STRINGS_1, (SEC_DIALOG_STRING_BASE + 61), "\ -and numbers, are at least 8 characters long, and contain no words from a \ -dictionary.

    Password:

    Type in \ -%-cont-%") - -ResDef(XP_PW_ENTER_NEW_STRINGS_2, (SEC_DIALOG_STRING_BASE + 62), "\ -your password, again, for verification:

    Retype Password:

    Do not forget your password! Your \ -%-cont-%") - -ResDef(XP_PW_ENTER_NEW_STRINGS_3, (SEC_DIALOG_STRING_BASE + 63), "\ -password cannot be recovered. If you forget it, you will have to obtain \ -new Certificates.") - -ResDef(XP_PW_RETRY_NEW_STRINGS, (SEC_DIALOG_STRING_BASE + 64), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You did not \ -enter your password correctly. Please try again:

    Password:

    Type in your password, again, for \ -verification:

    Retype Password:

    \ -%-cont-%") - -ResDef(XP_PW_RETRY_NEW_STRINGS_2, (SEC_DIALOG_STRING_BASE + 66), "\ -Do not forget your password! Your password cannot be recovered. If \ -you forget it, you will have to obtain new Certificates. ") - -ResDef(XP_PW_SETUP_STRINGS, (SEC_DIALOG_STRING_BASE + 67), "\ -%sec-banner-being%%0%%sec-banner-end%\ -%1%%2%%3%%4%\ -%-cont-%") - -ResDef(XP_PW_SETUP_STRINGS_1, (SEC_DIALOG_STRING_BASE + 68), "\ -\ -
    Password:
    Type it again to confirm:
    Important: \ -%-cont-%") - -ResDef(XP_PW_SETUP_STRINGS_3, (SEC_DIALOG_STRING_BASE + 70), "\ -Your password cannot be recovered. If you forget it, you will lose all of your \ -certificates.

    %-cont-%") - -ResDef(XP_PW_SETUP_STRINGS_4, (SEC_DIALOG_STRING_BASE + 71), "\ -The safest passwords are at least 8 characters long, include \ -both letters and numbers, and contain no words from a dictionary.

    \ -If you wish to change your password or other security \ -%-cont-%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_PW_SETUP_STRINGS_5, (SEC_DIALOG_STRING_BASE + 72), "\ -preferences, choose Security Info from the "MOZ_NAME_PRODUCT" menu.") -#else -ResDef(XP_PW_SETUP_STRINGS_5, (SEC_DIALOG_STRING_BASE + 72), "\ -preferences, choose Security Info from the Communicator menu.") -#endif - -/* unused (SEC_DIALOG_STRING_BASE + 73) */ - -/* unused (SEC_DIALOG_STRING_BASE + 74) */ - -/* unused (SEC_DIALOG_STRING_BASE + 75) */ - -/* unused (SEC_DIALOG_STRING_BASE + 76) */ - -/* unused (SEC_DIALOG_STRING_BASE + 77) */ - -/* unused (SEC_DIALOG_STRING_BASE + 78) */ - -/* unused (SEC_DIALOG_STRING_BASE + 79) */ - -/* unused (SEC_DIALOG_STRING_BASE + 80) */ - -/* unused (SEC_DIALOG_STRING_BASE + 81) */ - -/* unused (SEC_DIALOG_STRING_BASE + 82) */ - -ResDef(XP_PW_SETUP_REFUSED_STRINGS, (SEC_DIALOG_STRING_BASE + 83), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You have elected to operate without a password.

    If you decide that you \ -%-cont-%") - -ResDef(XP_PW_SETUP_REFUSED_STRINGS_1, (SEC_DIALOG_STRING_BASE + 84), "\ -would like to have a password to protect your Private Keys and Certificates, \ -you can set up a password in Security Preferences.") - -ResDef(XP_PW_CHANGE_STRINGS, (SEC_DIALOG_STRING_BASE + 85), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -Change the password for the %1%.

    Enter your old password:

    Enter your new password. Leave \ -the password fields blank if you don't want a password.

    \ -
    \ -%-cont-%") - -ResDef(XP_PW_CHANGE_STRINGS_2, (SEC_DIALOG_STRING_BASE + 87), "\ -New Password:
    Type it again to confirm:\ -%-cont-%") - -ResDef(XP_PW_CHANGE_STRINGS_3, (SEC_DIALOG_STRING_BASE + 88), "\ -

    Important: Your password cannot be recovered. If \ -you forget it, you will lose all of your certificates.") - -/* unused (SEC_DIALOG_STRING_BASE + 89) */ - -ResDef(XP_PW_CHANGE_FAILURE_STRINGS, (SEC_DIALOG_STRING_BASE + 90), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -Your attempt to change your password failed.

    This may be because your \ -%-cont-%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_PW_CHANGE_FAILURE_STRINGS_1, (SEC_DIALOG_STRING_BASE + 91), "\ -key database is inaccessible (which can happen if you were already \ -running a "MOZ_NAME_PRODUCT" when you started this one), or because of some other \ -%-cont-%") -#else -ResDef(XP_PW_CHANGE_FAILURE_STRINGS_1, (SEC_DIALOG_STRING_BASE + 91), "\ -key database is inaccessible (which can happen if you were already \ -running a Communicator when you started this one), or because of some other \ -%-cont-%") -#endif - -ResDef(XP_PW_CHANGE_FAILURE_STRINGS_2, (SEC_DIALOG_STRING_BASE + 92), "\ -error.

    It may indicate that your key database file has been corrupted, \ -in which case you should try to get it from of a backup, if possible. As \ -%-cont-%") - -ResDef(XP_PW_CHANGE_FAILURE_STRINGS_3, (SEC_DIALOG_STRING_BASE + 93), "\ -a last resort, you may need to delete your key database, after which you \ -will have to obtain new personal Certificates.") - -ResDef(XP_DIALOG_CANCEL_OK_MOREINFO_BUTTON_STRINGS, - (SEC_DIALOG_STRING_BASE + 94), "\ -\ -%-cont-%") - -ResDef(XP_DIALOG_CANCEL_OK_MOREINFO_BUTTON_STRINGS_1, - (SEC_DIALOG_STRING_BASE + 95), "\ -
    \ -  \ -%-cont-%") - -ResDef(XP_DIALOG_CANCEL_OK_MOREINFO_BUTTON_STRINGS_2, - (SEC_DIALOG_STRING_BASE + 96),"\ -
    ") - -/* unused (SEC_DIALOG_STRING_BASE + 97) */ - -/* unused (SEC_DIALOG_STRING_BASE + 98) */ - -ResDef(XP_PANEL_ONLY_BUTTON_STRINGS, (SEC_DIALOG_STRING_BASE + 99), "\ -

      \ -%-cont-%") - -ResDef(XP_PANEL_ONLY_BUTTON_STRINGS_1, (SEC_DIALOG_STRING_BASE + 100), "\ -
    %0%") - -ResDef(XP_NOT_IMPLEMENTED_STRINGS, (SEC_DIALOG_STRING_BASE + 101), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -This function is \ -not implemented:
    %1%
    Certificate name:
    %2%") - -ResDef(XP_CERT_VIEW_STRINGS, (SEC_DIALOG_STRING_BASE + 102), "\ -%0%%1%") - -ResDef(XP_DELETE_USER_CERT_STRINGS, (SEC_DIALOG_STRING_BASE + 103), "\ -WARNING: If you delete this Certificate you will not \ -be able to read any E-mail that has been encrypted with it.

    \ -Are you sure that you want to delete this Personal Certificate?

    %0%") - -ResDef(XP_DELETE_SITE_CERT_STRINGS, (SEC_DIALOG_STRING_BASE + 104), "\ -Are you sure that you want to delete this Site Certificate?

    %0%") - -ResDef(XP_DELETE_CA_CERT_STRINGS, (SEC_DIALOG_STRING_BASE + 105), "\ -Are you sure that you want to delete this Certificate Authority?

    %0%") - -ResDef(XP_EDIT_SITE_CERT_STRINGS, (SEC_DIALOG_STRING_BASE + 106), "\ -%0%


    This Certificate belongs to an SSL server site.
    Allow connections to this site
    \ -%-cont-%") - -ResDef(XP_EDIT_SITE_CERT_STRINGS_1, (SEC_DIALOG_STRING_BASE + 107), "\ -Do not allow connections to \ -this site
    Warn \ -%-cont-%") - -ResDef(XP_EDIT_SITE_CERT_STRINGS_2, (SEC_DIALOG_STRING_BASE + 108), "\ -before sending data to this site") - -ResDef(XP_EDIT_CA_CERT_STRINGS, (SEC_DIALOG_STRING_BASE + 109), "\ -%0%
    This Certificate belongs to a Certifying Authority
    \ -%-cont-%") - -ResDef(XP_EDIT_CA_CERT_STRINGS_1, (SEC_DIALOG_STRING_BASE + 110), "\ -%1%
    %2%
    %3%
    Warn before sending data to \ -sites certified by this authority") - -ResDef(XP_SSL_CERT_POST_WARN_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 112), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -Warning: You \ -%-cont-%") - -ResDef(XP_SSL_CERT_POST_WARN_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 113), "\ -are about to send encrypted information to the site %1%.

    It is \ -card numbers, or passwords) to this site if you are in doubt about its \ -%-cont-%") - -ResDef(XP_SSL_CERT_POST_WARN_DIALOG_STRINGS_2, (SEC_DIALOG_STRING_BASE + 114), "\ -safer not to send information (particularly personal information, credit \ -Certificate or integrity.
    Here is the Certificate for this site:


    \ -%-cont-%") - -ResDef(XP_SSL_CERT_POST_WARN_DIALOG_STRINGS_3, (SEC_DIALOG_STRING_BASE + 115), "\ -
    Certificate for:
    Signed by: \ -
    Encryption:
    %2%
    %3%
    \ -%-cont-%") - -ResDef(XP_SSL_CERT_POST_WARN_DIALOG_STRINGS_4, (SEC_DIALOG_STRING_BASE + 116), "\ -%4% Grade (%5% with %6%-bit secret key)
    \ -

    Send this information and warn again next \ -%-cont-%") - -ResDef(XP_SSL_CERT_POST_WARN_DIALOG_STRINGS_6, (SEC_DIALOG_STRING_BASE + 118), "\ -time
    Send this information \ -and do not warn again
    Do \ -not send information
    %7%") - -ResDef(XP_CA_CERT_DOWNLOAD1_STRINGS, (SEC_DIALOG_STRING_BASE + 119), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You are about to \ -%-cont-%") - -ResDef(XP_CA_CERT_DOWNLOAD1_STRINGS_1, (SEC_DIALOG_STRING_BASE + 120), "\ -go through the process of accepting a Certificate Authority. This has \ -serious implications on the security of future encryptions using \ -%-cont-%") - -ResDef(XP_CA_CERT_DOWNLOAD1_STRINGS_2, (SEC_DIALOG_STRING_BASE + 121), "\ -"MOZ_NAME_PRODUCT". This assistant will help you decide whether or not you wish to \ -accept this Certificate Authority.") - -ResDef(XP_CA_CERT_DOWNLOAD2_STRINGS, (SEC_DIALOG_STRING_BASE + 122), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -A Certificate \ -%-cont-%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_CA_CERT_DOWNLOAD2_STRINGS_1, (SEC_DIALOG_STRING_BASE + 123), "\ -Authority certifies the identity of sites on the internet. By accepting \ -this Certificate Authority, you will allow "MOZ_NAME_FULL" to connect \ -%-cont-%") -#else -ResDef(XP_CA_CERT_DOWNLOAD2_STRINGS_1, (SEC_DIALOG_STRING_BASE + 123), "\ -Authority certifies the identity of sites on the internet. By accepting \ -this Certificate Authority, you will allow "MOZ_NAME_PRODUCT" Communicator to connect \ -%-cont-%") -#endif - -ResDef(XP_CA_CERT_DOWNLOAD2_STRINGS_2, (SEC_DIALOG_STRING_BASE + 124), "\ -to and receive information from any site that this authority certifies \ -without prompting or warning you.

    If you choose to refuse this \ -%-cont-%") - -ResDef(XP_CA_CERT_DOWNLOAD2_STRINGS_3, (SEC_DIALOG_STRING_BASE + 125), "\ -Certificate Authority, you will be prompted before you connect to or \ -receive information from any site that this authority certifies. ") - -ResDef(XP_CA_CERT_DOWNLOAD3_STRINGS, (SEC_DIALOG_STRING_BASE + 126), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -Here is the \ -certificate for this Certificate Authority. Examine it carefully. The \ -%-cont-%") - -ResDef(XP_CA_CERT_DOWNLOAD3_STRINGS_1, (SEC_DIALOG_STRING_BASE + 127), "\ -Certificate Fingerprint can be used to verify that this Authority is who \ -they say they are. To do this, compare the Fingerprint against the \ -%-cont-%") - -ResDef(XP_CA_CERT_DOWNLOAD3_STRINGS_2, (SEC_DIALOG_STRING_BASE + 128), "\ -Fingerprint published by this authority in other places.


    \ -\ -%-cont-%") - -ResDef(XP_CA_CERT_DOWNLOAD3_STRINGS_3, (SEC_DIALOG_STRING_BASE + 129), "\ -
    Certificate for:
    Signed by:
    %1%
    %2%
    \ -

    ") - -ResDef(XP_CA_CERT_DOWNLOAD4_STRINGS, (SEC_DIALOG_STRING_BASE + 131), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -Are you willing \ -to accept this Certificate Authority for the purposes of certifying \ -%-cont-%") - -ResDef(XP_CA_CERT_DOWNLOAD4_STRINGS_1, (SEC_DIALOG_STRING_BASE + 132), "\ -other internet sites, email users, or software developers?

    \ -%1%%2%%3%") - -/* 133, 134 NOT USED */ - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_CA_CERT_DOWNLOAD5_STRINGS, (SEC_DIALOG_STRING_BASE + 135), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -By accepting this \ -Certificate Authority, you have told "MOZ_NAME_FULL" \ -%-cont-%") -#else -ResDef(XP_CA_CERT_DOWNLOAD5_STRINGS, (SEC_DIALOG_STRING_BASE + 135), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -By accepting this \ -Certificate Authority, you have told "MOZ_NAME_PRODUCT" Communicator to connect to \ -%-cont-%") -#endif - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_CA_CERT_DOWNLOAD5_STRINGS_1, (SEC_DIALOG_STRING_BASE + 136), "\ -to connect to and receive information from any site that it certifies \ -without warning you or prompting you.

    "MOZ_NAME_FULL" can, however, \ -warn you before \ -%-cont-%") -#else -ResDef(XP_CA_CERT_DOWNLOAD5_STRINGS_1, (SEC_DIALOG_STRING_BASE + 136), "\ -to connect to and receive information from any site that it certifies \ -without warning you or prompting you.

    "MOZ_NAME_PRODUCT" Communicator can, however, \ -warn you before \ -%-cont-%") -#endif - -ResDef(XP_CA_CERT_DOWNLOAD5_STRINGS_2, (SEC_DIALOG_STRING_BASE + 137), "\ -you send information to such a site.

    Warn me before sending information to sites \ -%-cont-%") - -ResDef(XP_CA_CERT_DOWNLOAD5_STRINGS_3, (SEC_DIALOG_STRING_BASE + 138), "\ -certified by this Certificate Authority") - -ResDef(XP_CA_CERT_DOWNLOAD6_STRINGS, (SEC_DIALOG_STRING_BASE + 139), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You have accepted \ -this Certificate Authority. You must now select a nickname that will be \ -%-cont-%") - -ResDef(XP_CA_CERT_DOWNLOAD6_STRINGS_1, (SEC_DIALOG_STRING_BASE + 140), "\ -used to identify this Certificate Authority, for example Mozilla's \ -Certificate Shack.

    Nickname: ") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_CA_CERT_DOWNLOAD7_STRINGS, (SEC_DIALOG_STRING_BASE + 142), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -By rejecting this \ -Certificate Authority, you have told "MOZ_NAME_FULL" not to connect \ -%-cont-%") -#else -ResDef(XP_CA_CERT_DOWNLOAD7_STRINGS, (SEC_DIALOG_STRING_BASE + 142), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -By rejecting this \ -Certificate Authority, you have told "MOZ_NAME_BRAND" Communicator not to connect \ -%-cont-%") -#endif - -ResDef(XP_CA_CERT_DOWNLOAD7_STRINGS_1, (SEC_DIALOG_STRING_BASE + 143), "\ -to and receive information from any site that it certifies without \ -prompting you.") - -ResDef(XP_EMPTY_STRINGS, (SEC_DIALOG_STRING_BASE + 144), "\ -%0%") - -ResDef(XP_WHICH_CERT_CLIENT_AUTH_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 145), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -The site '%1%' \ -has requested client authentication.

    Here is the \ -%-cont-%") - -ResDef(XP_WHICH_CERT_CLIENT_AUTH_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 146), "\ -site's certificate:


    \ -
    Certificate \ -for:
    Signed by:
    Encryption:
    %2%
    %3%
    %4% Grade (%5% with %6%-bit secret key)

    Select Your Certificate:%8%") - -ResDef(XP_NO_CERT_CLIENT_AUTH_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 149), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -The site '%1%' \ -has requested client authentication, but you do not have a Personal \ -%-cont-%") - -ResDef(XP_NO_CERT_CLIENT_AUTH_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 150), "\ -Certificate to authenticate yourself. The site may choose not to give \ -you access without one.%2%") - -ResDef(XP_BROWSER_SEC_INFO_ENCRYPTED_STRINGS, (SEC_DIALOG_STRING_BASE + 151), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -All of the \ -files that you have requested were encrypted.

    This means that the \ -%-cont-%") - -ResDef(XP_BROWSER_SEC_INFO_ENCRYPTED_STRINGS_1, (SEC_DIALOG_STRING_BASE + 152), "\ -files that make up the document are sent to you encrypted for privacy \ -while in transit.

    For more details on the encryption of this \ -%-cont-%") - -ResDef(XP_BROWSER_SEC_INFO_ENCRYPTED_STRINGS_2, (SEC_DIALOG_STRING_BASE + 153), "\ -document, open Document Information.

    %1%") - -ResDef(XP_BROWSER_SEC_INFO_MIXED_STRINGS, (SEC_DIALOG_STRING_BASE + 155), "\ -%0%

    Some of the \ -files that you have requested were encrypted.

    Some of these files \ -%-cont-%") - -ResDef(XP_BROWSER_SEC_INFO_MIXED_STRINGS_1, (SEC_DIALOG_STRING_BASE + 156), "\ -are sent to you encrypted for privacy while in transit. Others are not \ -encrypted and can be observed by a third party while in transit.

    To \ -%-cont-%") - -ResDef(XP_BROWSER_SEC_INFO_MIXED_STRINGS_2, (SEC_DIALOG_STRING_BASE + 157), "\ -find out exactly which files were encrypted and which were not, open \ -Document Information.

    %1%") - -ResDef(XP_BROWSER_SEC_INFO_CLEAR_STRINGS, (SEC_DIALOG_STRING_BASE + 159), "\ -%0%

    None of the \ -files that you have requested are encrypted.

    Unencrypted files can \ -%-cont-%") - -ResDef(XP_BROWSER_SEC_INFO_CLEAR_STRINGS_1, (SEC_DIALOG_STRING_BASE + 160), "\ -be observed by a third party while in transit.

    %1%") - -ResDef( XP_SMIME_RC2_CBC_40, (SEC_DIALOG_STRING_BASE + 161), \ -"RC2 encryption in CBC mode with a 40-bit key") - -ResDef( XP_SMIME_RC2_CBC_64, (SEC_DIALOG_STRING_BASE + 162), \ -"RC2 encryption in CBC mode with a 64-bit key") - -ResDef( XP_SMIME_RC2_CBC_128, (SEC_DIALOG_STRING_BASE + 163), \ -"RC2 encryption in CBC mode with a 128-bit key") - -ResDef( XP_SMIME_DES_CBC, (SEC_DIALOG_STRING_BASE + 164), \ -"DES encryption in CBC mode with a 56-bit key") - -ResDef( XP_SMIME_DES_EDE3, (SEC_DIALOG_STRING_BASE + 165), \ -"DES EDE3 encryption in CBC mode with a 168-bit key") - -ResDef( XP_SMIME_RC5PAD_64_16_40, (SEC_DIALOG_STRING_BASE + 166), \ -"RC5 encryption in CBC mode with a 40-bit key") - -ResDef( XP_SMIME_RC5PAD_64_16_64, (SEC_DIALOG_STRING_BASE + 167), \ -"RC5 encryption in CBC mode with a 64-bit key") - -ResDef( XP_SMIME_RC5PAD_64_16_128, (SEC_DIALOG_STRING_BASE + 168), \ -"RC5 encryption in CBC mode with a 128-bit key") - - -/* SEC_DIALOG_STRING_BASE + 169 thru SEC_DIALOG_STRING_BASE + 175 unused */ -/* (They used to be strings for payment stuff.) */ - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_CONFIG_NO_POLICY_STRINGS, (SEC_DIALOG_STRING_BASE + 176), \ -"No valid encryption policy file was found for this English language \n\ -version of "MOZ_NAME_PRODUCT". All encryption and decryption will be disabled.") -#else -ResDef(XP_CONFIG_NO_POLICY_STRINGS, (SEC_DIALOG_STRING_BASE + 176), \ -"No valid encryption policy file was found for this English language \n\ -version of Communicator. All encryption and decryption will be disabled.") -#endif - -ResDef(XP_CONFIG_NO_CIPHERS_STRINGS, (SEC_DIALOG_STRING_BASE + 177), \ -" (No ciphers are permitted)") - -ResDef(XP_CONFIG_MAYBE_CIPHERS_STRINGS, (SEC_DIALOG_STRING_BASE + 178), \ -" (When permitted)") - -ResDef(XP_CONFIG_SMIME_CIPHERS_STRINGS, (SEC_DIALOG_STRING_BASE + 179), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -

    Select ciphers to enable for S/MIME %1%

      %2%
    %3%") - -ResDef(XP_CONFIG_SSL2_CIPHERS_STRINGS, (SEC_DIALOG_STRING_BASE + 180), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -

    Select ciphers to enable for SSL v2 %1%

      %2%
    %3%") - -ResDef(XP_CONFIG_SSL3_CIPHERS_STRINGS, (SEC_DIALOG_STRING_BASE + 181), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -

    Select ciphers to enable for SSL v3 %1%

      %2%
    %3%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_USER_CERT_DOWNLOAD_STRINGS, (SEC_DIALOG_STRING_BASE + 182), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You have received a new Certificate. "MOZ_NAME_PRODUCT" will refer to this \ -%-cont-%") -#else -ResDef(XP_USER_CERT_DOWNLOAD_STRINGS, (SEC_DIALOG_STRING_BASE + 182), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You have received a new Certificate. Communicator will refer to this \ -%-cont-%") -#endif - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_USER_CERT_DOWNLOAD_STRINGS_1, (SEC_DIALOG_STRING_BASE + 183), "\ -Certificate by the name shown below. %1%

    Click OK to install the \ -certificate into "MOZ_NAME_PRODUCT" or click Cancel to refuse your new \ -%-cont-%") -#else -ResDef(XP_USER_CERT_DOWNLOAD_STRINGS_1, (SEC_DIALOG_STRING_BASE + 183), "\ -Certificate by the name shown below. %1%

    Click OK to install the \ -certificate into Communicator or click Cancel to refuse your new \ -%-cont-%") -#endif - -ResDef(XP_USER_CERT_DOWNLOAD_STRINGS_2, (SEC_DIALOG_STRING_BASE + 184), "\ -Certificate.


    Certificate Name: %2%

    Certificate \ -for: %3%
    Signed by: %4%


    %5%") - -ResDef(XP_USER_CERT_NICKNAME_STRINGS, (SEC_DIALOG_STRING_BASE + 186), "\ -You can use the name provided or enter a new one.") - -ResDef(XP_USER_CERT_DL_MOREINFO_STRINGS, (SEC_DIALOG_STRING_BASE + 187), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -A Certificate is arriving from %1%.

    This Certificate works in conjunction \ -%-cont-%") - -ResDef(XP_USER_CERT_DL_MOREINFO_STRINGS_1, (SEC_DIALOG_STRING_BASE + 188), "\ -with the corresponding Private Key that was generated for you when you \ -requested the Certificate. Together they can identify you to Web sites and \ -via Email.

    Certificates and Private Keys are much more secure than \ -%-cont-%") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_USER_CERT_DL_MOREINFO_STRINGS_2, (SEC_DIALOG_STRING_BASE + 189), "\ -traditional username and password security methods. For more information \ -about Certificates, choose Security Info from the "MOZ_NAME_PRODUCT" menu.") -#else -ResDef(XP_USER_CERT_DL_MOREINFO_STRINGS_2, (SEC_DIALOG_STRING_BASE + 189), "\ -traditional username and password security methods. For more information \ -about Certificates, choose Security Info from the Communicator menu.") -#endif - -ResDef(XP_USER_CERT_SAVE_STRINGS, (SEC_DIALOG_STRING_BASE + 190), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You should make a copy of your new Certificate.

    If you lose your Certificate \ -%-cont-%") - -ResDef(XP_USER_CERT_SAVE_STRINGS_1, (SEC_DIALOG_STRING_BASE + 191), "\ -it cannot be recovered. Only you hold your Private Key. Without it \ -you will not be able to read any email that you received using that \ -%-cont-%") - -ResDef(XP_USER_CERT_SAVE_STRINGS_2, (SEC_DIALOG_STRING_BASE + 192), "\ -Certificate.

    To make a copy, click Save As and decide where you \ -would like to save your Certificate. If possible, you should save it on a \ -%-cont-%") - -ResDef(XP_USER_CERT_SAVE_STRINGS_3, (SEC_DIALOG_STRING_BASE + 193), "\ -floppy disk that you keep in a safe location.

    ") - -ResDef(XP_USER_CERT_SAVE_TITLE, (SEC_DIALOG_STRING_BASE + 194), "\ -Save User Certificate") - -/* unused (SEC_DIALOG_STRING_BASE + 195) */ - -/* unused (SEC_DIALOG_STRING_BASE + 196) */ - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_KEY_GEN_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 197), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -When you click OK, "MOZ_NAME_PRODUCT" will generate a Private Key for your \ -%-cont-%") -#else -ResDef(XP_KEY_GEN_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 197), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -When you click OK, Communicator will generate a Private Key for your \ -%-cont-%") -#endif - -ResDef(XP_KEY_GEN_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 198), "\ -Certificate. This may take a few minutes.

    Important: If you \ -interrupt this process, you will have to reapply for the Certificate.\ -%1% %2% %3%

    ") - -ResDef(XP_KEY_GEN_MOREINFO_TITLE_STRING, (SEC_DIALOG_STRING_BASE + 199), "\ -Key Generation Info") - -ResDef(XP_CERT_DL_MOREINFO_TITLE_STRING, (SEC_DIALOG_STRING_BASE + 200), "\ -Certificate Download Info") - - -ResDef(XP_CERT_EXPIRED_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 201), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -%1% is a site \ -that uses encryption to protect transmitted information. However the \ -%-cont-%") - -ResDef(XP_CERT_EXPIRED_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 202), "\ -digital Certificate that identifies this site has expired. This may be \ -because the certificate has actually expired, or because the date on \ -%-cont-%") - -ResDef(XP_CERT_EXPIRED_DIALOG_STRINGS_2, (SEC_DIALOG_STRING_BASE + 203), "\ -your computer is wrong.

    The certificate expires on %2%.

    Your \ -computer's date is set to %3%. If this date is incorrect, then you \ -%-cont-%") - -ResDef(XP_CERT_EXPIRED_DIALOG_STRINGS_3, (SEC_DIALOG_STRING_BASE + 204), "\ -should reset the date on your computer.

    You may continue or cancel \ -this connection.%4%") - -ResDef(XP_CERT_NOT_YET_GOOD_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 205), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -%1% is a site \ -that uses encryption to protect transmitted information. However the \ -%-cont-%") - -ResDef(XP_CERT_NOT_YET_GOOD_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 206), "\ -digital Certificate that identifies this site is not yet valid. This \ -may be because the certificate was installed too soon by the site \ -%-cont-%") - -ResDef(XP_CERT_NOT_YET_GOOD_DIALOG_STRINGS_2, (SEC_DIALOG_STRING_BASE + 207), "\ -administrator, or because the date on your computer is wrong.

    The \ -certificate is valid beginning %2%.

    Your computer's date is set to \ -%-cont-%") - -ResDef(XP_CERT_NOT_YET_GOOD_DIALOG_STRINGS_3, (SEC_DIALOG_STRING_BASE + 208), "\ -%3%. If this date is incorrect, then you should reset the date on your \ -computer.

    You may continue or cancel this connection.%4%") - -ResDef(XP_CA_EXPIRED_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 209), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -%1% is a site \ -that uses encryption to protect transmitted information. However one of \ -%-cont-%") - -ResDef(XP_CA_EXPIRED_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 210), "\ -the Certificate Authorities that identifies this site has expired. This \ -may be because a certificate has actually expired, or because the date \ -%-cont-%") - -ResDef(XP_CA_EXPIRED_DIALOG_STRINGS_2, (SEC_DIALOG_STRING_BASE + 211), "\ -on your computer is wrong. Press the More Info button to see details of \ -the expired certificate.


    Certificate Authority:
    Expiration Date: \ -
    %2%
    %3%

    Your computer's date is set \ -%-cont-%") - -ResDef(XP_CA_EXPIRED_DIALOG_STRINGS_5, (SEC_DIALOG_STRING_BASE + 214), "\ -to %4%. If this date is incorrect, then you should reset the date on \ -your computer.

    You may continue or cancel this connection.") - -ResDef(XP_CA_NOT_YET_GOOD_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 215), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -%1% is a site \ -that uses encryption to protect transmitted information. However one of \ -%-cont-%") - -ResDef(XP_CA_NOT_YET_GOOD_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 216), "\ -the Certificate Authorities that identifies this site is not yet valid. \ -This may be because a certificate was install too soon by the site \ -%-cont-%") - -ResDef(XP_CA_NOT_YET_GOOD_DIALOG_STRINGS_2, (SEC_DIALOG_STRING_BASE + 217), "\ -administrator, or because the date on your computer is wrong. Press the \ -More Info button to see details of the expired certificate.


    Certificate \ -Authority:
    Certificate Valid On:
    %2%
    %3%
    \ -%-cont-%") - -ResDef(XP_CA_NOT_YET_GOOD_DIALOG_STRINGS_5, (SEC_DIALOG_STRING_BASE + 220), "\ -
    Your computer's date is set to %4%. If this date is incorrect, then \ -you should reset the date on your computer.

    You may continue or cancel \ -%-cont-%") - -ResDef(XP_CA_NOT_YET_GOOD_DIALOG_STRINGS_6, (SEC_DIALOG_STRING_BASE + 221), "\ -this connection.") - -ResDef(XP_SEC_CANCEL, (SEC_DIALOG_STRING_BASE + 222), "\ -Cancel") - -ResDef(XP_SEC_OK, (SEC_DIALOG_STRING_BASE + 223), "\ -OK") - -ResDef(XP_SEC_CONTINUE, (SEC_DIALOG_STRING_BASE + 224), "\ -Continue") - -/* These must match the kludge versions below */ - -ResDef(XP_SEC_NEXT, (SEC_DIALOG_STRING_BASE + 225), "\ -Next>") - -ResDef(XP_SEC_BACK, (SEC_DIALOG_STRING_BASE + 226), "\ -<Back") - -ResDef(XP_SEC_FINISHED, (SEC_DIALOG_STRING_BASE + 227), "\ -Finish") - -ResDef(XP_SEC_MOREINFO, (SEC_DIALOG_STRING_BASE + 228), "\ -More Info...") - -ResDef(XP_SEC_SHOWCERT, (SEC_DIALOG_STRING_BASE + 229), "\ -Show Certificate") - -ResDef(XP_SEC_SHOWORDER, (SEC_DIALOG_STRING_BASE + 230), "\ -Show Order") - -ResDef(XP_SEC_SHOWDOCINFO, (SEC_DIALOG_STRING_BASE + 231), "\ -Show Document Info") - -/* These must match the original versions above */ - -ResDef(XP_SEC_NEXT_KLUDGE, (SEC_DIALOG_STRING_BASE + 232), "\ -Next>") - -ResDef(XP_SEC_BACK_KLUDGE, (SEC_DIALOG_STRING_BASE + 233), "\ -The certificate that you have selected has expired and may \ -%-cont-%") - -ResDef(XP_CLIENT_CERT_EXPIRED_RENEWAL_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 265), "\ -be rejected by the server. You may press %continue% to send it \ -anyway, or %cancel% to abort this connection. To renew your \ -%-cont-%") - -ResDef(XP_CLIENT_CERT_EXPIRED_RENEWAL_DIALOG_STRINGS_2, (SEC_DIALOG_STRING_BASE + 266), "\ -certificate press the %renew% button.") - -ResDef(XP_SEC_RENEW, (SEC_DIALOG_STRING_BASE + 267), "\ -Renew") - -ResDef(XP_CLIENT_CERT_NOT_YET_GOOD_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 268), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -The certificate that you have selected is not yet valid and may \ -be rejected by the server. You may press Continue to send it \ -anyway, or Cancel to abort this connection.") - -ResDef(XP_CLCERTEXP_TITLE_STRING, (SEC_DIALOG_STRING_BASE + 269), "\ -Your Certificate Is Expired") - -ResDef(XP_ASKUSER, (SEC_DIALOG_STRING_BASE + 270), "\ -Ask every time") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_PICKAUTO, (SEC_DIALOG_STRING_BASE + 271), "\ -Let "MOZ_NAME_PRODUCT" choose automatically") -#else -ResDef(XP_PICKAUTO, (SEC_DIALOG_STRING_BASE + 271), "\ -Let Communicator choose automatically") -#endif - -ResDef(XP_HIGH_GRADE, (SEC_DIALOG_STRING_BASE + 272), "\ -1024 (High Grade)") - -ResDef(XP_MEDIUM_GRADE, (SEC_DIALOG_STRING_BASE + 273), "\ - 768 (Medium Grade)") - -ResDef(XP_LOW_GRADE, (SEC_DIALOG_STRING_BASE + 274), "\ - 512 (Low Grade)") - -ResDef(XP_VIEW_CERT_POLICY, (SEC_DIALOG_STRING_BASE + 275), "\ -View Certificate Policy") - -ResDef(XP_CHECK_CERT_STATUS, (SEC_DIALOG_STRING_BASE + 276), "\ -Check Certificate Status") - -ResDef(XP_SSL2_RC4_128, (SEC_DIALOG_STRING_BASE + 277), "\ -RC4 encryption with a 128-bit key") - -ResDef(XP_SSL2_RC2_128, (SEC_DIALOG_STRING_BASE + 278), "\ -RC2 encryption with a 128-bit key") - -ResDef(XP_SSL2_DES_192_EDE3, (SEC_DIALOG_STRING_BASE + 279), "\ -Triple DES encryption with a 168-bit key") - -ResDef(XP_SSL2_DES_64, (SEC_DIALOG_STRING_BASE + 280), "\ -DES encryption with a 56-bit key") - -ResDef(XP_SSL2_RC4_40, (SEC_DIALOG_STRING_BASE + 281), "\ -RC4 encryption with a 40-bit key") - -ResDef(XP_SSL2_RC2_40, (SEC_DIALOG_STRING_BASE + 282), "\ -RC2 encryption with a 40-bit key") - -ResDef(XP_SSL3_RSA_RC4_128_MD5, (SEC_DIALOG_STRING_BASE + 283), "\ -RC4 encryption with a 128-bit key and an MD5 MAC") - -ResDef(XP_SSL3_RSA_3DES_SHA, (SEC_DIALOG_STRING_BASE + 284), "\ -Triple DES encryption with a 168-bit key and a SHA-1 MAC") - -ResDef(XP_SSL3_RSA_DES_SHA, (SEC_DIALOG_STRING_BASE + 285), "\ -DES encryption with a 56-bit key and a SHA-1 MAC") - -ResDef(XP_SSL3_RSA_RC4_40_MD5, (SEC_DIALOG_STRING_BASE + 286), "\ -RC4 encryption with a 40-bit key and an MD5 MAC") - -ResDef(XP_SSL3_RSA_RC2_40_MD5, (SEC_DIALOG_STRING_BASE + 287), "\ -RC2 encryption with a 40-bit key and an MD5 MAC") - -ResDef(XP_SSL3_RSA_NULL_MD5, (SEC_DIALOG_STRING_BASE + 288), "\ -No encryption with an MD5 MAC") - -ResDef(XP_DIALOG_SHOW_CRLS, (SEC_DIALOG_STRING_BASE + 289), "\ -

    CRL List:

    \ -
    \ -%-cont-%") - -ResDef(XP_DIALOG_SHOW_CRLS_1, (SEC_DIALOG_STRING_BASE + 290), "\ -\ -
    %-cont-%") - -ResDef(XP_DIALOG_SHOW_CRLS_2, (SEC_DIALOG_STRING_BASE + 291), "\ -\ -
    %-cont-%") - -ResDef(XP_DIALOG_SHOW_CRLS_3, (SEC_DIALOG_STRING_BASE + 292), "\ -\ -
    %-cont-%") - -ResDef(XP_DIALOG_SHOW_CRLS_4, (SEC_DIALOG_STRING_BASE + 293), "\ -\ -
    %-cont-%") - -ResDef(XP_DIALOG_SHOW_CRLS_5, (SEC_DIALOG_STRING_BASE + 294), "\ -
    ") - -ResDef(XP_SEC_NEW, (SEC_DIALOG_STRING_BASE + 295), "New/Edit ...") - -ResDef(XP_SEC_RELOAD, (SEC_DIALOG_STRING_BASE + 296), "\ -Reload") - -ResDef(XP_SEC_DELETE, (SEC_DIALOG_STRING_BASE + 297), "\ -Delete") - -ResDef(XP_SSL3_RSA_FIPS_3DES_SHA, (SEC_DIALOG_STRING_BASE + 298), "\ -FIPS 140-1 compliant triple DES encryption and SHA-1 MAC") - -ResDef(XP_SSL3_RSA_FIPS_DES_SHA, (SEC_DIALOG_STRING_BASE + 299), "\ -FIPS 140-1 compliant DES encryption and SHA-1 MAC") - -ResDef(XP_DIALOG_EDIT_MODULE_TITLE, (SEC_DIALOG_STRING_BASE + 307), "\ -Edit Security Module") - -ResDef(XP_DIALOG_NEW_MODULE_TITLE, (SEC_DIALOG_STRING_BASE + 308), "\ -Create a New Security Module") - -/* Ciphers */ -ResDef(XP_SSL3_FORTEZZA_SHA, (SEC_DIALOG_STRING_BASE + 309), "\ -FORTEZZA encryption with a 80-bit key and an SHA-1 MAC") - -ResDef(XP_SSL3_FORTEZZA_RC4_SHA, (SEC_DIALOG_STRING_BASE + 310), "\ -FORTEZZA authentication with RC4 128-bit key and an SHA-1 MAC") - -ResDef(XP_SSL3_FORTEZZA_NULL_SHA, (SEC_DIALOG_STRING_BASE + 311), "\ -No encryption with FORTEZZA authentication and an SHA-1 MAC") - - -ResDef(XP_SEC_ENTER_PWD, (SEC_DIALOG_STRING_BASE + 312), "\ -Please enter the password or the pin for\n\ -%s.") - -ResDef(XP_SSO_GET_PW_STRINGS, (SEC_DIALOG_STRING_BASE + 313), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -The %1% has not been initialized with a User PIN or Password. In order \ -%-cont-%") - -ResDef(XP_SSO_GET_PW_STRINGS_1, (SEC_DIALOG_STRING_BASE + 314), "\ -to initialize this card, you must enter the Administration or Site Security \ -Password. If you do not know this password, please hit cancel, and \ -%-cont-%") - -ResDef(XP_SSO_GET_PW_STRINGS_2, (SEC_DIALOG_STRING_BASE + 315), "\ -take this card back to your issuer to be initialized.

    Enter adminstration \ -Password for the %2%:.") - -ResDef(XP_PW_RETRY_SSO_STRINGS, (SEC_DIALOG_STRING_BASE + 316), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -The administration password you entered for the %1% was incorrect. \ -%-cont-%") - -ResDef(XP_PW_RETRY_SSO_STRINGS_1, (SEC_DIALOG_STRING_BASE + 317), "\ -Many cards disable themselves after too many incorrect password attempts. \ -If you do not know this password, please hit cancel, and take this card \ -%-cont-%") - -ResDef(XP_PW_RETRY_SSO_STRINGS_2, (SEC_DIALOG_STRING_BASE + 318), "\ -back to your issuer to be initialized.

    Enter adminstration Password for \ -the %2%:.") - -ResDef(XP_PW_SETUP_SSO_FAIL_STRINGS, (SEC_DIALOG_STRING_BASE + 319), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -The %1% could not be initialized because of the following error:

    \ -%2%") - -ResDef(XP_SEC_EDIT, (SEC_DIALOG_STRING_BASE + 320), "\ -Edit Defaults...") - -ResDef(XP_SEC_LOGIN, (SEC_DIALOG_STRING_BASE + 321), "\ -Login") - -ResDef(XP_SEC_LOGOUT, (SEC_DIALOG_STRING_BASE + 322), "\ -Logout") - -ResDef(XP_SECURITY_ADVISOR, (SEC_DIALOG_STRING_BASE + 323), "\ -%0%%1%%2%%3%%4%%5%") - -ResDef(XP_SECURITY_ADVISOR_TITLE_STRING, (SEC_DIALOG_STRING_BASE + 324), "\ -Security Info") - -ResDef(XP_SEC_SETPASSWORD, (SEC_DIALOG_STRING_BASE + 325), "\ -Set Password...") - -ResDef(XP_SEC_NO_LOGIN_NEEDED, (SEC_DIALOG_STRING_BASE + 326), "\ -Slot or Token does not require a login.") - -ResDef(XP_SEC_ALREADY_LOGGED_IN, (SEC_DIALOG_STRING_BASE + 327), "\ -Slot or Token is already logged in.") - -ResDef(XP_KEY_GEN_TOKEN_SELECT, (SEC_DIALOG_STRING_BASE + 328), "\ -

    Select the card or database you wish to generate your key in:\ - %1% \ -%-cont-%") - -ResDef(XP_EDIT_JAVA_PRIVILEGES_STRINGS_2, (SEC_DIALOG_STRING_BASE + 341), "\ - %-cont-%") - -ResDef(XP_EDIT_JAVA_PRIVILEGES_STRINGS_3, (SEC_DIALOG_STRING_BASE + 342), "\ -\ -%-cont-%") - -ResDef(XP_EDIT_JAVA_PRIVILEGES_STRINGS_4, (SEC_DIALOG_STRING_BASE + 343), "\ - \ - \ -%-cont-%") - -ResDef(XP_EDIT_JAVA_PRIVILEGES_STRINGS_5, (SEC_DIALOG_STRING_BASE + 344), "\ -
    For this session only:
    %-cont-%") - -ResDef(XP_EDIT_JAVA_PRIVILEGES_STRINGS_6, (SEC_DIALOG_STRING_BASE + 345), "\ -\ -
    %-cont-%") - -ResDef(XP_EDIT_JAVA_PRIVILEGES_STRINGS_7, (SEC_DIALOG_STRING_BASE + 346), "\ - \ - \ -%-cont-%") - -ResDef(XP_EDIT_JAVA_PRIVILEGES_STRINGS_8, (SEC_DIALOG_STRING_BASE + 347), "\ -
    Never:
    %-cont-%") - -ResDef(XP_EDIT_JAVA_PRIVILEGES_STRINGS_9, (SEC_DIALOG_STRING_BASE + 348), "\ -\ -
    ") - -ResDef(XP_DELETE_JAVA_PRIV_STRINGS, (SEC_DIALOG_STRING_BASE + 349), "\ -Are you sure that you want to delete the %0% privileges for \ -all applets and scripts from %1%?") - -ResDef(XP_MOREINFO_JAVA_PRIV_STRINGS, (SEC_DIALOG_STRING_BASE + 350), "\ - %0% is a %1% access.
    \ -

      It consists of:
    ") - -/* 0 is cert name, 1 risk, 2 targets, 3 view cert button - */ -ResDef(XP_SIGNED_CERT_PRIV_STRINGS, (SEC_DIALOG_STRING_BASE + 351), "\ - \ -%-cont-%") - -ResDef(XP_SIGNED_CERT_PRIV_STRINGS_1, (SEC_DIALOG_STRING_BASE + 352), "\ - \ - \ -%-cont-%") - -ResDef(XP_SIGNED_CERT_PRIV_STRINGS_4, (SEC_DIALOG_STRING_BASE + 355), "\ -
    Danger \ -
    A Java applet or JavaScript script from \ -%0% is requesting unusual access to your computer or network. \ -%-cont-%") - -ResDef(XP_SIGNED_CERT_PRIV_STRINGS_2, (SEC_DIALOG_STRING_BASE + 353), "\ -You should not grant this access unless you trust that vendor or \ -distributor.
    \ - \ -%-cont-%") - -ResDef(XP_SIGNED_CERT_PRIV_STRINGS_3, (SEC_DIALOG_STRING_BASE + 354), "\ -
    The access requested is %1% \ -and consists of:
    \ - \ -
    \ -
    \ -%-cont-%") - -ResDef(XP_SIGNED_CERT_PRIV_STRINGS_5, (SEC_DIALOG_STRING_BASE + 356), "\ -
    Do you wish to grant the requested access? \ -
    \ -Yes, grant this access to all applets and scripts from %0% for this \ -session %-cont-%") - -ResDef(XP_SIGNED_CERT_PRIV_STRINGS_6, (SEC_DIALOG_STRING_BASE + 357), "\ -
    No, deny this access (This may mean the applet \ -or script cannot work properly) \ -%-cont-%") - -ResDef(XP_SIGNED_CERT_PRIV_STRINGS_7, (SEC_DIALOG_STRING_BASE + 358), "\ -
    \ -Remember this decision for all applets and scripts from %0%
    \ -") - -/* 0 is cert name, 1 risk, 2 targets. - */ -ResDef(XP_SIGNED_APPLET_PRIV_STRINGS, (SEC_DIALOG_STRING_BASE + 359), "\ - \ -%-cont-%") - -ResDef(XP_SIGNED_APPLET_PRIV_STRINGS_1, (SEC_DIALOG_STRING_BASE + 360), "\ - \ - \ -%-cont-%") - -ResDef(XP_SIGNED_APPLET_PRIV_STRINGS_3, (SEC_DIALOG_STRING_BASE + 362), "\ -
    Danger \ -
    A Java applet or JavaScript script on the \ -server \042%0%\042 is requesting unusual access to your computer \ -or network. %-cont-%") - -ResDef(XP_SIGNED_APPLET_PRIV_STRINGS_2, (SEC_DIALOG_STRING_BASE + 361), "\ -It is not digitally signed. Be aware that it may have been \ -tampered with and may cause harm to your computer.
    The access requested is %1% \ -and consists of:
    \ - \ -
    \ -
    \ -%-cont-%") - -ResDef(XP_SIGNED_APPLET_PRIV_STRINGS_4, (SEC_DIALOG_STRING_BASE + 363), "\ -
    Do you wish to grant the requested access? \ -
    \ -Yes, grant this access to all applets and scripts on the \042%0%\042 \ -server for this session \ -%-cont-%") - -ResDef(XP_SIGNED_APPLET_PRIV_STRINGS_5, (SEC_DIALOG_STRING_BASE + 364), "\ -
    No, deny this access (This may mean the applet \ -or script cannot work properly) \ -%-cont-%") - -ResDef(XP_SIGNED_APPLET_PRIV_STRINGS_6, (SEC_DIALOG_STRING_BASE + 365), "\ -
    \ -Remember this decision for all applets and scripts on the \042%0%\042 \ -server
    ") - -ResDef(XP_DIALOG_NEW_MODULE, (SEC_DIALOG_STRING_BASE + 366), "\ -Security Module Name:
    \ -Security Module File:
    ") - -ResDef(XP_SEC_MODULE_NO_LIB, (SEC_DIALOG_STRING_BASE + 367), "\ -You must specify a PKCS #11 Version 2.0 library to load\n") - -ResDef(XP_DIALOG_SLOT_INFO, (SEC_DIALOG_STRING_BASE + 368), "\ -Slot Description: %0%
    Manufacturer: %1%
    \ -Version Number: %2%
    Firmware Version: %3%
    \ -%-cont-%") - -ResDef(XP_DIALOG_SLOT_INFO_1, (SEC_DIALOG_STRING_BASE + 369), "\ -%4%Token Name: %5%
    Token Manufacturer:%6%
    \ -Token Model: %7%
    Token Serial Number:%8%
    \ -%-cont-%") - -ResDef(XP_DIALOG_SLOT_INFO_2, (SEC_DIALOG_STRING_BASE + 370), "\ -Token Version: %9%
    Token Firmware Version: %10%
    \ -Login Type: %11%
    State:%12%%13%%14%") - -ResDef(XP_DIALOG_SLOT_INFO_TITLE, (SEC_DIALOG_STRING_BASE + 371), "\ -Token/Slot Information") - -ResDef(XP_SLOT_LOGIN_REQUIRED, (SEC_DIALOG_STRING_BASE + 372), "\ -Login Required") - -ResDef(XP_SLOT_NO_LOGIN_REQUIRED, (SEC_DIALOG_STRING_BASE + 373), "\ -Public (no login required)") - -ResDef(XP_SLOT_READY, (SEC_DIALOG_STRING_BASE + 374), "\ -Ready") - -ResDef(XP_SLOT_NOT_LOGGED_IN, (SEC_DIALOG_STRING_BASE + 375), "\ -Not Logged In") - -ResDef(XP_SLOT_UNITIALIZED, (SEC_DIALOG_STRING_BASE + 376), "\ -Uninitialized") - -ResDef(XP_SLOT_NOT_PRESENT, (SEC_DIALOG_STRING_BASE + 377), "\ -Not Present") - -ResDef(XP_SLOT_DISABLED, (SEC_DIALOG_STRING_BASE + 378), "\ -Disabled(") - -ResDef(XP_SLOT_DISABLED_2, (SEC_DIALOG_STRING_BASE + 379), "\ -)") - -ResDef(XP_SLOT_PASSWORD_INIT, (SEC_DIALOG_STRING_BASE + 380), "\ - Initialize Token") - -ResDef(XP_SLOT_PASSWORD_CHANGE, (SEC_DIALOG_STRING_BASE + 381), "\ - Change Password ") - -ResDef(XP_SLOT_PASSWORD_SET, (SEC_DIALOG_STRING_BASE + 382), "\ - Set Password ") - -ResDef(XP_SLOT_PASSWORD_NO, (SEC_DIALOG_STRING_BASE + 383), "\ - No Password ") - -ResDef(XP_DOWNLOAD_EMAIL_CERT_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 384), "\ -%sec-banner-begin%%0%%sec-banner-end%\ -You are downloading the e-mail certificate of another user. After accepting \ -%-cont-%") - -ResDef(XP_DOWNLOAD_EMAIL_CERT_DIALOG_STRINGS_1, (SEC_DIALOG_STRING_BASE + 385), "\ -this certificate you will be able to send encrypted e-mail to this user. \ -Press the More Info button to see details of the e-mail certificate. \ -%-cont-%") - -ResDef(XP_DOWNLOAD_EMAIL_CERT_DIALOG_STRINGS_2, (SEC_DIALOG_STRING_BASE + 386), "\ -
    \ -\ -
    Certificate For:\ -%-cont-%") - -ResDef(XP_DOWNLOAD_EMAIL_CERT_DIALOG_STRINGS_3, (SEC_DIALOG_STRING_BASE + 387), "\ -%1%
    \ -Email Address:%2%
    \ -%-cont-%") - -ResDef(XP_DOWNLOAD_EMAIL_CERT_DIALOG_STRINGS_4, (SEC_DIALOG_STRING_BASE + 388), "\ -Certified By:%3%
    \ -\ -

    ") - -ResDef(XP_EMAIL_CERT_DOWNLOAD_TITLE_STRING, (SEC_DIALOG_STRING_BASE + 389), "\ -Download an E-Mail Certificate") - -ResDef(XP_CA_CERT_SSL_OK_STRING, (SEC_DIALOG_STRING_BASE + 390), "\ -Accept this Certificate Authority for Certifying network sites") - -ResDef(XP_CA_CERT_EMAIL_OK_STRING, (SEC_DIALOG_STRING_BASE + 391), "\ -Accept this Certificate Authority for Certifying e-mail users") - -ResDef(XP_CA_CERT_OBJECT_SIGNING_OK_STRING, (SEC_DIALOG_STRING_BASE + 392), "\ -Accept this Certificate Authority for Certifying software developers") - -ResDef(XP_CERT_MULTI_SUBJECT_SELECT_STRING, (SEC_DIALOG_STRING_BASE + 393), "\ -%0%

    %1%") - -ResDef(XP_CERT_MULTI_SUBJECT_SELECT_TITLE_STRING, (SEC_DIALOG_STRING_BASE + 394), "\ -Select A Certificate") - -ResDef(XP_CERT_SELECT_EDIT_STRING, (SEC_DIALOG_STRING_BASE + 395), "\ -Please select a certificate to edit:

    ") - -ResDef(XP_CERT_SELECT_DEL_STRING, (SEC_DIALOG_STRING_BASE + 396), "\ -Please select a certificate to delete:

    ") - -ResDef(XP_CERT_SELECT_VIEW_STRING, (SEC_DIALOG_STRING_BASE + 397), "\ -Please select a certificate to view:

    ") - -ResDef(XP_CERT_SELECT_VERIFY_STRING, (SEC_DIALOG_STRING_BASE + 398), "\ -Please select a certificate to verify:

    ") - -ResDef(XP_DEL_EMAIL_CERT_TITLE_STRING, (SEC_DIALOG_STRING_BASE + 399), "\ -Delete An E-mail Certificate") - -ResDef(XP_DELETE_EMAIL_CERT_STRINGS, (SEC_DIALOG_STRING_BASE + 400), "\ -Are you sure that you want to delete this E-mail Certificate?

    %0%") - -ResDef(XP_SET_EMAIL_CERT_STRING, (SEC_DIALOG_STRING_BASE + 401), "\ - \ -Make this the default Certificate for signed and encrypted e-mail") - -/* - * NOTE to Translators: The following strings are part of a PKCS #11 standard - * they must be exactly 32 bytes long (space padded). If they are not, - * Communicator will revert to it's old strings */ -ResDef(SEC_PK11_MANUFACTURER, (SEC_DIALOG_STRING_BASE + 402), "\ -"MOZ_NAME_COMPANY" ") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(SEC_PK11_LIBARARY, (SEC_DIALOG_STRING_BASE + 403), "\ -"MOZ_NAME_PRODUCT" Internal Crypto Svc ") -#else -ResDef(SEC_PK11_LIBARARY, (SEC_DIALOG_STRING_BASE + 403), "\ -Communicator Internal Crypto Svc") -#endif - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(SEC_PK11_TOKEN, (SEC_DIALOG_STRING_BASE + 404), "\ -"MOZ_NAME_PRODUCT" Generic Crypto Svcs ") -#else -ResDef(SEC_PK11_TOKEN, (SEC_DIALOG_STRING_BASE + 404), "\ -Communicator Generic Crypto Svcs") -#endif - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(SEC_PK11_PRIV_TOKEN, (SEC_DIALOG_STRING_BASE + 405), "\ -"MOZ_NAME_PRODUCT" Certificate DB ") -#else -ResDef(SEC_PK11_PRIV_TOKEN, (SEC_DIALOG_STRING_BASE + 405), "\ -Communicator Certificate DB ") -#endif - -/* - * NOTE to Translators: The following strings are part of a PKCS #11 standard - * they must be exactly 64 bytes long (space padded). If they are not, - * Communicator will revert to it's old strings */ -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(SEC_PK11_SLOT, (SEC_DIALOG_STRING_BASE + 406), "\ -"MOZ_NAME_PRODUCT" Internal Cryptographic Services Version 4.0 ") -#else -ResDef(SEC_PK11_SLOT, (SEC_DIALOG_STRING_BASE + 406), "\ -Communicator Internal Cryptographic Services Version 4.0 ") -#endif - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(SEC_PK11_PRIV_SLOT, (SEC_DIALOG_STRING_BASE + 407), "\ -"MOZ_NAME_PRODUCT" User Private Key and Certificate Services ") -#else -ResDef(SEC_PK11_PRIV_SLOT, (SEC_DIALOG_STRING_BASE + 407), "\ -Communicator User Private Key and Certificate Services ") -#endif - -ResDef(SEC_PK11_FIPS_SLOT, (SEC_DIALOG_STRING_BASE + 408), "\ -"MOZ_NAME_BRAND" Internal FIPS-140-1 Cryptographic Services ") - -ResDef(SEC_PK11_FIPS_PRIV_SLOT, (SEC_DIALOG_STRING_BASE + 409), "\ -"MOZ_NAME_BRAND" FIPS-140-1 User Private Key Services ") - -ResDef(XP_VERIFY_CERT_DIALOG_STRINGS, (SEC_DIALOG_STRING_BASE + 410), "\ -Verification of the selected certificate failed for the following \ -reasons:

    %0%") - -ResDef(XP_VERIFYCERT_TITLE_STRING, (SEC_DIALOG_STRING_BASE + 411), "\ -Verify A Certificate") - -ResDef(XP_VERIFY_CERT_OK_DIALOG_STRING, (SEC_DIALOG_STRING_BASE + 412), "\ -The Certificate has been successfully verified.") - -ResDef(XP_VERIFY_ERROR_EXPIRED, (SEC_DIALOG_STRING_BASE + 413), "\ -Certificate has expired") - -ResDef(XP_VERIFY_ERROR_NOT_CERTIFIED, (SEC_DIALOG_STRING_BASE + 414), "\ -Not certified for %s") - -ResDef(XP_VERIFY_ERROR_NOT_TRUSTED, (SEC_DIALOG_STRING_BASE + 415), "\ -Certificate not trusted") - -ResDef(XP_VERIFY_ERROR_NO_CA, (SEC_DIALOG_STRING_BASE + 416), "\ -Unable to find Certificate Authority") - -ResDef(XP_VERIFY_ERROR_BAD_SIG, (SEC_DIALOG_STRING_BASE + 417), "\ -Certificate signature is invalid") - -ResDef(XP_VERIFY_ERROR_BAD_CRL, (SEC_DIALOG_STRING_BASE + 418), "\ -Certificate Revocation List is invalid") - -ResDef(XP_VERIFY_ERROR_REVOKED, (SEC_DIALOG_STRING_BASE + 419), "\ -Certificate has been revoked") - -ResDef(XP_VERIFY_ERROR_NOT_CA, (SEC_DIALOG_STRING_BASE + 420), "\ -Not a valid Certificate Authority") - -ResDef(XP_VERIFY_ERROR_INTERNAL_ERROR, (SEC_DIALOG_STRING_BASE + 421), "\ -Internal Error") - -ResDef(XP_VERIFY_ERROR_SIGNING, (SEC_DIALOG_STRING_BASE + 422), "\ -Digital Signing") - -ResDef(XP_VERIFY_ERROR_ENCRYPTION, (SEC_DIALOG_STRING_BASE + 423), "\ -Encryption") - -ResDef(XP_VERIFY_ERROR_CERT_SIGNING, (SEC_DIALOG_STRING_BASE + 424), "\ -Certificate Signing") - -ResDef(XP_VERIFY_ERROR_CERT_UNKNOWN_USAGE, (SEC_DIALOG_STRING_BASE + 425), "\ -Unknown Usage") - -ResDef(XP_VERIFY_ERROR_EMAIL_CA, (SEC_DIALOG_STRING_BASE + 426), "\ -E-Mail Certification") - -ResDef(XP_VERIFY_ERROR_SSL_CA, (SEC_DIALOG_STRING_BASE + 427), "\ -Internet Site Certification") - -ResDef(XP_VERIFY_ERROR_OBJECT_SIGNING_CA, (SEC_DIALOG_STRING_BASE + 428), "\ -Software Developer Certification") - -ResDef(XP_VERIFY_ERROR_EMAIL, (SEC_DIALOG_STRING_BASE + 429), "\ -E-Mail") - -ResDef(XP_VERIFY_ERROR_SSL, (SEC_DIALOG_STRING_BASE + 430), "\ -Internet Site") - -ResDef(XP_VERIFY_ERROR_OBJECT_SIGNING, (SEC_DIALOG_STRING_BASE + 431), "\ -Software Developer") - -ResDef(XP_DIALOG_NULL_STRINGS, (SEC_DIALOG_STRING_BASE + 432), "\ -%0%") - -ResDef(XP_FIPS_MESSAGE_1, (SEC_DIALOG_STRING_BASE + 433), "\ -This will replace the "MOZ_NAME_PRODUCT" internal module with the "MOZ_NAME_PRODUCT" FIPS-140-1 \ -cryptographic module.\n\nThe FIPS-140-1 cryptographic module limits security ") - -ResDef(XP_FIPS_MESSAGE_2, (SEC_DIALOG_STRING_BASE + 434), "\ -functions to those approved by the United States Federal Government's internal \ -standards.\n\nDo you wish to delete the internal module, anyway?") - -#ifndef MOZ_COMMUNICATOR_NAME -ResDef(XP_INT_MODULE_MESSAGE_1, (SEC_DIALOG_STRING_BASE + 435), "\ -This will replace the FIPS-140-1 cryptographic module with the "MOZ_NAME_PRODUCT" \ -internal module.\n\nThis means that "MOZ_NAME_PRODUCT" will no longer be FIPS-140-1 \ -compliant (security ") -#else -ResDef(XP_INT_MODULE_MESSAGE_1, (SEC_DIALOG_STRING_BASE + 435), "\ -This will replace the FIPS-140-1 cryptographic module with the "MOZ_NAME_PRODUCT" \ -internal module.\n\nThis means that Communicator will no longer be FIPS-140-1 \ -compliant (security ") -#endif - -ResDef(XP_INT_MODULE_MESSAGE_2, (SEC_DIALOG_STRING_BASE + 436), "\ -functions to those approved by the United States Federal Government's internal \ -standards).\n\nDo you wish to delete the FIPS-140-1 module, anyway?") - -ResDef(XP_SEC_FETCH, (SEC_DIALOG_STRING_BASE + 437), "\ -Search") - -ResDef(XP_DIALOG_FETCH_TITLE, (SEC_DIALOG_STRING_BASE + 438), "\ -Search Directory for Certificates") - -ResDef(XP_DIALOG_FETCH_CANCEL_BUTTON_STRINGS, (SEC_DIALOG_STRING_BASE + 439), "\ -