delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2015/05/14/12:34:59

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
X-Recipient: djgpp AT delorie DOT com
X-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20120113;
h=mime-version:in-reply-to:references:date:message-id:subject:from:to
:content-type;
bh=+ZsywSv7UZvB/SL3MAgdhLpwGc2ruQ/G4m98LCZ7IgY=;
b=aXAdp8uFBBqSY3rehwG4QK0ImfoHsM2saBu8UpO1WgdU9MqA0ji/tasjALcZZCKlDl
NMv0y3QfB9ZWTqXI77FZHx8try5/ledk5n6fHskyS5dJl70/jfjvJrAroldC70cq0Wzr
QmgteHc7KH1JsuObfZCFbzuBaElzoX/sunRZ7nYHE8A/AkIfkaZSJ5AvukPZcK950P4p
iS/qJ/hF4anXh7VA19yHL4KkxqTrpbwCFpLwl7M40s01CKgydBLTOIP+j05mVfSmEgOk
2o+kCpKssjQk9horJyZyZkERjvbUJShuOKN4bRyqjx94FeDllr49xm0fG/aki1Ue37SD
JBtw==
MIME-Version: 1.0
X-Received: by 10.107.138.130 with SMTP id c2mr6429782ioj.74.1431621286669;
Thu, 14 May 2015 09:34:46 -0700 (PDT)
In-Reply-To: <83vbfvi3t1.fsf@gnu.org>
References: <CAA2C=vCgLHdH3BJxastGzUsJzhiRddytiYwB1MP_aaiiVpC4nA AT mail DOT gmail DOT com>
<83k2wcjt8e DOT fsf AT gnu DOT org>
<CAA2C=vB-YiGkyx5dJpa=hcBh0O4_NiEKh2tKm5OHyNX3vW7HsQ AT mail DOT gmail DOT com>
<83bnhojnwh DOT fsf AT gnu DOT org>
<CAA2C=vAEKFUktuYXGN_eYUEY0JuHQgXR_-q-N8xox=7PHPEqqw AT mail DOT gmail DOT com>
<838ucsjnbl DOT fsf AT gnu DOT org>
<CAA2C=vAK_T9ixd6YpNrd2LYL80Lau-Dbf+T5vo89AdYXS0WYOw AT mail DOT gmail DOT com>
<83vbfvi3t1 DOT fsf AT gnu DOT org>
Date: Thu, 14 May 2015 19:34:46 +0300
Message-ID: <CAA2C=vAUa61rumTN9fyCDdtdGXzqfzZLdtz4Nw+8gWX-J-x0bg@mail.gmail.com>
Subject: Re: bad pragma in dir.h? (and our structrure packing)
From: "Ozkan Sezer (sezeroz AT gmail DOT com)" <djgpp AT delorie DOT com>
To: djgpp AT delorie DOT com
Reply-To: djgpp AT delorie DOT com
Errors-To: nobody AT delorie DOT com
X-Mailing-List: djgpp AT delorie DOT com
X-Unsubscribes-To: listserv AT delorie DOT com

--001a113f284e3eb22105160d4e5d
Content-Type: text/plain; charset=UTF-8

On 5/14/15, Eli Zaretskii (eliz AT gnu DOT org) <djgpp AT delorie DOT com> wrote:
>> Date: Wed, 13 May 2015 23:27:39 +0300
>> From: "Ozkan Sezer (sezeroz AT gmail DOT com)" <djgpp AT delorie DOT com>
>>
>> > If you (or someone else) can verify that the size of the structure and
>> > the offsets of each member are the same in both C and C++ programs,
>> > then I see no reason to keep the attribute on every member.
>>
>> I did the following as a foo.c and foo.cc:
>>
>> #define COMPILE_TIME_ASSERT(name, x) \
>>   typedef int _djchk_ ## name[(x) * 2 - 1]
>>
>> #include "dos.h"
>> COMPILE_TIME_ASSERT(find_t,sizeof(struct _find_t)==286);
>>
>> #include "dir.h"
>> COMPILE_TIME_ASSERT(ffblk,sizeof(struct ffblk)==290);
>> COMPILE_TIME_ASSERT(ffblklfn,sizeof(struct ffblklfn)==318);
>>
>> #include "coff.h"
>> COMPILE_TIME_ASSERT(exln,sizeof(struct external_lineno)==6);
>> COMPILE_TIME_ASSERT(exse,sizeof(struct external_syment)==18);
>> COMPILE_TIME_ASSERT(exau,sizeof(union external_auxent)==18);
>> COMPILE_TIME_ASSERT(exrl,sizeof(struct external_reloc)==10);
>>
>> Compiled using existing and modified headers for djgpp using gcc/g++
>> v3.4.6 and 5.1.0, no errors.  I also compiled its coff.h-only parts
>> for linux (i686 gcc-4.3.0 and clang-3.4.2), osx (ppc gcc-4.0.1 and
>> x86_64 gcc-4.2.1), mingw (gcc-3.4.5), mingw-w64 (x86_64 gcc-4.5.4):
>> no errors.
>>
>> Diff for the modified headers is attached (1.patch)
>> Ideas?
>
> LGTM, thanks.
>

OK, fixed the broken pragma in dir.h as of r1.7.

Moved the packed attributes from members to structures as
of dir.h r1.8, dos.h r1.16 and coff.h r1.8.


>> On 5/13/15, Andris Pavenis (andris DOT pavenis AT iki DOT fi) <djgpp AT delorie DOT com>
>> wrote:
>> > I guess it would be a good idea to have small test in build process to
>> > verify that offsets of
>> > members are correct for structures intended for DOS calls. So build
>> > would
>> > fail if something is
>> > wrong with member packing
>> >
>> > Andris
>>
>> We can add compile-time asserts like the above to the headers: ideas?
>
> I think a test in djtst would be better.
>
> Thanks.
>

I would feel safer if the compile time asserts reside in the relevant
headers and checked every time something is compiled against them.

How about the following patch: (also attached as 3a.patch)

coff.h, dos.h, dir.h: conditionalize packed pragma to gcc < 3.
add compile time assertions to make sure of correct structure packing.

Index: include/coff.h
===================================================================
RCS file: /cvs/djgpp/djgpp/include/coff.h,v
retrieving revision 1.8
diff -u -r1.8 coff.h
--- include/coff.h	14 May 2015 16:23:05 -0000	1.8
+++ include/coff.h	14 May 2015 16:32:23 -0000
@@ -150,6 +150,9 @@
  * grouping will have l_lnno = 0 and in place of physical address will be the
  * symbol table index of the function name.
  */
+#if (__GNUC__ < 3)
+#pragma pack(1)
+#endif
 struct external_lineno {
   union {
     ULONG32 l_symndx;				/* function name symbol index, iff l_lnno == 0 */
@@ -157,10 +160,14 @@
   } l_addr;
   unsigned short l_lnno;			/* line number */
 } __attribute__((packed));
-
+#if (__GNUC__ < 3)
+#pragma pack()
+#endif

 #define LINENO	struct external_lineno
 #define LINESZ	sizeof(LINENO)
+/* make sure that structure packing is correct */
+typedef int _DJCHK_EXTLINENO[(LINESZ==6)*3 - 1];


 /********************** SYMBOLS **********************/
@@ -169,6 +176,9 @@
 #define E_FILNMLEN	14	/* # characters in a file name		*/
 #define E_DIMNUM	4	/* # array dimensions in auxiliary entry */

+#if (__GNUC__ < 3)
+#pragma pack(1)
+#endif
 struct external_syment
 {
   union {
@@ -184,12 +194,18 @@
   unsigned char e_sclass;
   unsigned char e_numaux;
 } __attribute__((packed));
+#if (__GNUC__ < 3)
+#pragma pack()
+#endif

 #define N_BTMASK	(0xf)
 #define N_TMASK		(0x30)
 #define N_BTSHFT	(4)
 #define N_TSHIFT	(2)

+#if (__GNUC__ < 3)
+#pragma pack(1)
+#endif
 union external_auxent {
   struct {
     ULONG32 x_tagndx;					/* str, un, or enum tag indx */
@@ -233,11 +249,17 @@
   } __attribute__((packed)) x_tv;			/* info about .tv section (in
auxent of symbol .tv)) */

 } __attribute__((packed));
+#if (__GNUC__ < 3)
+#pragma pack()
+#endif

 #define SYMENT	struct external_syment
 #define SYMESZ	sizeof(SYMENT)
 #define AUXENT	union external_auxent
 #define AUXESZ	sizeof(AUXENT)
+/* make sure that structure packing is correct */
+typedef int _DJCHK_EXTSYMENT[(SYMESZ==18)*3 - 1];
+typedef int _DJCHK_EXTAUXENT[(AUXESZ==18)*3 - 1];


 #define _ETEXT	"etext"
@@ -325,16 +347,22 @@
 /********************** RELOCATION DIRECTIVES **********************/


-
+#if (__GNUC__ < 3)
+#pragma pack(1)
+#endif
 struct external_reloc {
   ULONG32        r_vaddr;
   ULONG32        r_symndx;
   unsigned short r_type;
 } __attribute__((packed));
-
+#if (__GNUC__ < 3)
+#pragma pack()
+#endif

 #define RELOC struct external_reloc
 #define RELSZ sizeof(RELOC)
+/* make sure that structure packing is correct */
+typedef int _DJCHK_EXTRELOC[(RELSZ==10)*3 - 1];

 #define RELOC_REL32	20	/* 32-bit PC-relative address */
 #define RELOC_ADDR32	6	/* 32-bit absolute address */
Index: include/dir.h
===================================================================
RCS file: /cvs/djgpp/djgpp/include/dir.h,v
retrieving revision 1.8
diff -u -r1.8 dir.h
--- include/dir.h	14 May 2015 16:23:05 -0000	1.8
+++ include/dir.h	14 May 2015 16:32:23 -0000
@@ -24,8 +24,9 @@
    hold the extra information.  Fields marked LFN are only valid if the magic
    is set to LFN32 */

-/* This is for g++ 2.7.2 and below */
+#if (__GNUC__ < 3) /* This is for g++ 2.7.2 and below */
 #pragma pack(1)
+#endif

 struct ffblk {
   char lfn_magic[6];			/* LFN */
@@ -54,7 +55,12 @@
   char               fd_name[14];
 } __attribute__((packed));

+#if (__GNUC__ < 3)
 #pragma pack()
+#endif
+/* make sure that structure packing is correct */
+typedef int _DJCHK_FFBLK0[(sizeof(struct ffblk)   ==290)*3 - 1];
+typedef int _DJCHK_FFBLK1[(sizeof(struct ffblklfn)==318)*3 - 1];

 #define FA_RDONLY       1
 #define FA_HIDDEN       2
Index: include/dos.h
===================================================================
RCS file: /cvs/djgpp/djgpp/include/dos.h,v
retrieving revision 1.16
diff -u -r1.16 dos.h
--- include/dos.h	14 May 2015 16:23:05 -0000	1.16
+++ include/dos.h	14 May 2015 16:32:23 -0000
@@ -214,6 +214,9 @@
 };
 #define dostime_t _dostime_t

+#if (__GNUC__ < 3)
+#pragma pack(1)
+#endif
 struct _find_t {
   char reserved[21];
   unsigned char attrib;
@@ -222,7 +225,12 @@
   unsigned long size;
   char name[256];
 } __attribute__((packed));
+#if (__GNUC__ < 3)
+#pragma pack()
+#endif
 #define find_t _find_t
+/* make sure that structure packing is correct */
+typedef int _DJCHK_FIND_T[(sizeof(struct _find_t)==286)*3 - 1];

 struct _diskfree_t {
   unsigned short total_clusters;

--
O.S.

--001a113f284e3eb22105160d4e5d
Content-Type: application/octet-stream; name="3a.patch"
Content-Disposition: attachment; filename="3a.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: file0

Y29mZi5oLCBkb3MuaCwgZGlyLmg6IGNvbmRpdGlvbmFsaXplIHBhY2tlZCBwcmFnbWEgdG8gZ2Nj
IDwgMy4KYWRkIGNvbXBpbGUgdGltZSBhc3NlcnRpb25zIHRvIG1ha2Ugc3VyZSBvZiBjb3JyZWN0
IHN0cnVjdHVyZSBwYWNraW5nLgoKSW5kZXg6IGluY2x1ZGUvY29mZi5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNT
IGZpbGU6IC9jdnMvZGpncHAvZGpncHAvaW5jbHVkZS9jb2ZmLmgsdgpyZXRyaWV2aW5nIHJldmlz
aW9uIDEuOApkaWZmIC11IC1yMS44IGNvZmYuaAotLS0gaW5jbHVkZS9jb2ZmLmgJMTQgTWF5IDIw
MTUgMTY6MjM6MDUgLTAwMDAJMS44CisrKyBpbmNsdWRlL2NvZmYuaAkxNCBNYXkgMjAxNSAxNjoz
MjoyMyAtMDAwMApAQCAtMTUwLDYgKzE1MCw5IEBACiAgKiBncm91cGluZyB3aWxsIGhhdmUgbF9s
bm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQogICog
c3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgogICovCisjaWYgKF9fR05V
Q19fIDwgMykKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmCiBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5v
IHsKICAgdW5pb24gewogICAgIFVMT05HMzIgbF9zeW1uZHg7CQkJCS8qIGZ1bmN0aW9uIG5hbWUg
c3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAgKi8KQEAgLTE1NywxMCArMTYwLDE0IEBACiAg
IH0gbF9hZGRyOwogICB1bnNpZ25lZCBzaG9ydCBsX2xubm87CQkJLyogbGluZSBudW1iZXIgKi8K
IH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KKyNpZiAoX19HTlVDX18gPCAzKQorI3ByYWdt
YSBwYWNrKCkKKyNlbmRpZgogCiAjZGVmaW5lIExJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5v
CiAjZGVmaW5lIExJTkVTWglzaXplb2YoTElORU5PKQorLyogbWFrZSBzdXJlIHRoYXQgc3RydWN0
dXJlIHBhY2tpbmcgaXMgY29ycmVjdCAqLwordHlwZWRlZiBpbnQgX0RKQ0hLX0VYVExJTkVOT1so
TElORVNaPT02KSozIC0gMV07CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAq
KioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTY5LDYgKzE3Niw5IEBACiAjZGVmaW5lIEVfRklM
Tk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwogI2RlZmluZSBFX0RJ
TU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KIAorI2lm
IChfX0dOVUNfXyA8IDMpCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgogc3RydWN0IGV4dGVybmFs
X3N5bWVudAogewogICB1bmlvbiB7CkBAIC0xODQsMTIgKzE5NCwxOCBAQAogICB1bnNpZ25lZCBj
aGFyIGVfc2NsYXNzOwogICB1bnNpZ25lZCBjaGFyIGVfbnVtYXV4OwogfSBfX2F0dHJpYnV0ZV9f
KChwYWNrZWQpKTsKKyNpZiAoX19HTlVDX18gPCAzKQorI3ByYWdtYSBwYWNrKCkKKyNlbmRpZgog
CiAjZGVmaW5lIE5fQlRNQVNLCSgweGYpCiAjZGVmaW5lIE5fVE1BU0sJCSgweDMwKQogI2RlZmlu
ZSBOX0JUU0hGVAkoNCkKICNkZWZpbmUgTl9UU0hJRlQJKDIpCiAKKyNpZiAoX19HTlVDX18gPCAz
KQorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYKIHVuaW9uIGV4dGVybmFsX2F1eGVudCB7CiAgIHN0
cnVjdCB7CiAgICAgVUxPTkczMiB4X3RhZ25keDsJCQkJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFn
IGluZHggKi8KQEAgLTIzMywxMSArMjQ5LDE3IEBACiAgIH0gX19hdHRyaWJ1dGVfXygocGFja2Vk
KSkgeF90djsJCQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9s
IC50dikpICovCiAKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjaWYgKF9fR05VQ19fIDwg
MykKKyNwcmFnbWEgcGFjaygpCisjZW5kaWYKIAogI2RlZmluZSBTWU1FTlQJc3RydWN0IGV4dGVy
bmFsX3N5bWVudAogI2RlZmluZSBTWU1FU1oJc2l6ZW9mKFNZTUVOVCkKICNkZWZpbmUgQVVYRU5U
CXVuaW9uIGV4dGVybmFsX2F1eGVudAogI2RlZmluZSBBVVhFU1oJc2l6ZW9mKEFVWEVOVCkKKy8q
IG1ha2Ugc3VyZSB0aGF0IHN0cnVjdHVyZSBwYWNraW5nIGlzIGNvcnJlY3QgKi8KK3R5cGVkZWYg
aW50IF9ESkNIS19FWFRTWU1FTlRbKFNZTUVTWj09MTgpKjMgLSAxXTsKK3R5cGVkZWYgaW50IF9E
SkNIS19FWFRBVVhFTlRbKEFVWEVTWj09MTgpKjMgLSAxXTsKIAogCiAjZGVmaW5lIF9FVEVYVAki
ZXRleHQiCkBAIC0zMjUsMTYgKzM0NywyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKiogUkVM
T0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCiAKIAotCisjaWYgKF9f
R05VQ19fIDwgMykKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmCiBzdHJ1Y3QgZXh0ZXJuYWxfcmVs
b2MgewogICBVTE9ORzMyICAgICAgICByX3ZhZGRyOwogICBVTE9ORzMyICAgICAgICByX3N5bW5k
eDsKICAgdW5zaWduZWQgc2hvcnQgcl90eXBlOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsK
LQorI2lmIChfX0dOVUNfXyA8IDMpCisjcHJhZ21hIHBhY2soKQorI2VuZGlmCiAKICNkZWZpbmUg
UkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCiAjZGVmaW5lIFJFTFNaIHNpemVvZihSRUxPQykK
Ky8qIG1ha2Ugc3VyZSB0aGF0IHN0cnVjdHVyZSBwYWNraW5nIGlzIGNvcnJlY3QgKi8KK3R5cGVk
ZWYgaW50IF9ESkNIS19FWFRSRUxPQ1soUkVMU1o9PTEwKSozIC0gMV07CiAKICNkZWZpbmUgUkVM
T0NfUkVMMzIJMjAJLyogMzItYml0IFBDLXJlbGF0aXZlIGFkZHJlc3MgKi8KICNkZWZpbmUgUkVM
T0NfQUREUjMyCTYJLyogMzItYml0IGFic29sdXRlIGFkZHJlc3MgKi8KSW5kZXg6IGluY2x1ZGUv
ZGlyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2cy9kamdwcC9kamdwcC9pbmNsdWRlL2Rpci5o
LHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjgKZGlmZiAtdSAtcjEuOCBkaXIuaAotLS0gaW5jbHVk
ZS9kaXIuaAkxNCBNYXkgMjAxNSAxNjoyMzowNSAtMDAwMAkxLjgKKysrIGluY2x1ZGUvZGlyLmgJ
MTQgTWF5IDIwMTUgMTY6MzI6MjMgLTAwMDAKQEAgLTI0LDggKzI0LDkgQEAKICAgIGhvbGQgdGhl
IGV4dHJhIGluZm9ybWF0aW9uLiAgRmllbGRzIG1hcmtlZCBMRk4gYXJlIG9ubHkgdmFsaWQgaWYg
dGhlIG1hZ2ljCiAgICBpcyBzZXQgdG8gTEZOMzIgKi8KIAotLyogVGhpcyBpcyBmb3IgZysrIDIu
Ny4yIGFuZCBiZWxvdyAqLworI2lmIChfX0dOVUNfXyA8IDMpIC8qIFRoaXMgaXMgZm9yIGcrKyAy
LjcuMiBhbmQgYmVsb3cgKi8KICNwcmFnbWEgcGFjaygxKQorI2VuZGlmCiAKIHN0cnVjdCBmZmJs
ayB7CiAgIGNoYXIgbGZuX21hZ2ljWzZdOwkJCS8qIExGTiAqLwpAQCAtNTQsNyArNTUsMTIgQEAK
ICAgY2hhciAgICAgICAgICAgICAgIGZkX25hbWVbMTRdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNr
ZWQpKTsKIAorI2lmIChfX0dOVUNfXyA8IDMpCiAjcHJhZ21hIHBhY2soKQorI2VuZGlmCisvKiBt
YWtlIHN1cmUgdGhhdCBzdHJ1Y3R1cmUgcGFja2luZyBpcyBjb3JyZWN0ICovCit0eXBlZGVmIGlu
dCBfREpDSEtfRkZCTEswWyhzaXplb2Yoc3RydWN0IGZmYmxrKSAgID09MjkwKSozIC0gMV07Cit0
eXBlZGVmIGludCBfREpDSEtfRkZCTEsxWyhzaXplb2Yoc3RydWN0IGZmYmxrbGZuKT09MzE4KSoz
IC0gMV07CiAKICNkZWZpbmUgRkFfUkRPTkxZICAgICAgIDEKICNkZWZpbmUgRkFfSElEREVOICAg
ICAgIDIKSW5kZXg6IGluY2x1ZGUvZG9zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2cy9kamdw
cC9kamdwcC9pbmNsdWRlL2Rvcy5oLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE2CmRpZmYgLXUg
LXIxLjE2IGRvcy5oCi0tLSBpbmNsdWRlL2Rvcy5oCTE0IE1heSAyMDE1IDE2OjIzOjA1IC0wMDAw
CTEuMTYKKysrIGluY2x1ZGUvZG9zLmgJMTQgTWF5IDIwMTUgMTY6MzI6MjMgLTAwMDAKQEAgLTIx
NCw2ICsyMTQsOSBAQAogfTsKICNkZWZpbmUgZG9zdGltZV90IF9kb3N0aW1lX3QKIAorI2lmIChf
X0dOVUNfXyA8IDMpCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgogc3RydWN0IF9maW5kX3Qgewog
ICBjaGFyIHJlc2VydmVkWzIxXTsKICAgdW5zaWduZWQgY2hhciBhdHRyaWI7CkBAIC0yMjIsNyAr
MjI1LDEyIEBACiAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKICAgY2hhciBuYW1lWzI1Nl07CiB9IF9f
YXR0cmlidXRlX18oKHBhY2tlZCkpOworI2lmIChfX0dOVUNfXyA8IDMpCisjcHJhZ21hIHBhY2so
KQorI2VuZGlmCiAjZGVmaW5lIGZpbmRfdCBfZmluZF90CisvKiBtYWtlIHN1cmUgdGhhdCBzdHJ1
Y3R1cmUgcGFja2luZyBpcyBjb3JyZWN0ICovCit0eXBlZGVmIGludCBfREpDSEtfRklORF9UWyhz
aXplb2Yoc3RydWN0IF9maW5kX3QpPT0yODYpKjMgLSAxXTsKIAogc3RydWN0IF9kaXNrZnJlZV90
IHsKICAgdW5zaWduZWQgc2hvcnQgdG90YWxfY2x1c3RlcnM7Cg==
--001a113f284e3eb22105160d4e5d--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019