diff options
Diffstat (limited to 'sys/nmemio/zzfoo.gx')
-rw-r--r-- | sys/nmemio/zzfoo.gx | 587 |
1 files changed, 587 insertions, 0 deletions
diff --git a/sys/nmemio/zzfoo.gx b/sys/nmemio/zzfoo.gx new file mode 100644 index 00000000..5de60c5b --- /dev/null +++ b/sys/nmemio/zzfoo.gx @@ -0,0 +1,587 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +# Test procedures for the NMEMIO interface. +# + +include <mach.h> + + +define MT_HEAP 0 # test heap memory +define MT_STACK 1 # test stack memory + + +task memtest = t_memtest, + stack = t_stack, + realloc = t_realloc + + +# MEMTEST -- Task to test new memio interface. + +procedure t_memtest () + +int model, nerr +pointer str, ptr + +bool clgetb() + +begin + if (clgetb ("stack")) + model = MT_STACK + else + model = MT_HEAP + + # Check we can allocate a large array. + if (model == MT_HEAP) { + call eprintf ("\nBegin large heap malloc tests ....\n\n") + call malloc (str, 256000, TY_STRUCT) + call mfree (str, TY_STRUCT) + call eprintf ("Done\n\n") + + # Print the memory layout. + $for (csiblrdx) + call mt_print (TY_PIXEL) + $endfor + call mt_print (TY_STRUCT) + call mt_print (TY_POINTER) + } + + # Test Mem common assignments + call eprintf ("\nBegin assignment tests ....\n\n"); + call mt_auto_b ("bool ", model) + call mt_auto_c ("char ", model) + call mt_auto_s ("short ", model) + call mt_auto_i ("int ", model) + call mt_auto_l ("long ", model) + call mt_auto_r ("real ", model) + call mt_auto_d ("double ", model) + call mt_auto_x ("complex", model) + call eprintf ("\nEnd assignment tests ....\n\n"); + + + # Test string memory + call eprintf ("Begin Memc test\t\t"); + call calloc (str, SZ_LINE, TY_CHAR) + call aclrc (Memc[str], SZ_LINE) + call strcpy ("test string", Memc[str], SZ_LINE) + call eprintf ("str = '%s' ch[2] = '%c' (should be 's')\n") + call pargstr (Memc[str]) + call pargc (Memc[str+2]) + call mfree (str, TY_CHAR) + + + # Test the struct memory + call eprintf ("\n\n") + call eprintf ("Begin struct test\n") + call mt_struct (model) + call eprintf ("Done\n") + + + # Test memory overflow and then underflow detection. + call eprintf ("\n\n") + call eprintf ("Testing overflow:\t") + nerr = 0 + $for (csiblrdx) + iferr ( call mt_overflow (TY_PIXEL) ) + nerr = nerr + 1; + $endfor + iferr ( call mt_overflow (TY_STRUCT) ) + nerr = nerr + 1; + iferr ( call mt_overflow (TY_POINTER) ) + nerr = nerr + 1; + call eprintf ("No. errors detected = %d of 10\t\tDone\n") + call pargi (nerr) + + + call eprintf ("Testing underflow:\t") + nerr = 0 + $for (csiblrdx) + iferr ( call mt_underflow (TY_PIXEL) ) + nerr = nerr + 1; + $endfor + iferr ( call mt_underflow (TY_STRUCT) ) + nerr = nerr + 1; + iferr ( call mt_underflow (TY_POINTER) ) + nerr = nerr + 1; + call eprintf ("No. errors detected = %d of 10\t\tDone\n") + call pargi (nerr) + + + # Note this test will leak 1024 bytes because of the error recovery. + call eprintf ("Testing invalid free:\t") + call calloc (ptr, 256, TY_REAL) + iferr ( call mfree (ptr, TY_INT) ) + call eprintf ("Detected\t\t\t\t") + else + call eprintf ("Undetected\t\t\t\t") + call eprintf ("Done\n") + + call eprintf ("Testing double free:\t") + call calloc (ptr, 256, TY_INT) + call mfree (ptr, TY_INT) + iferr ( call mfree (ptr, TY_INT) ) + call eprintf ("Detected\t\t\t\t") + else + call eprintf ("Undetected\t\t\t\t") + call eprintf ("Done\n") + + call eprintf ("Testing NULL free:\t") + iferr ( call mfree (NULL, TY_INT) ) + call eprintf ("Detected\t\t\t\t") + else + call eprintf ("Undetected\t\t\t\t") + call eprintf ("Done\n") + + call eprintf ("Testing recovered free:\n") + call calloc (str, SZ_LINE, TY_CHAR) + call eprintf ("Done\n") + + call eprintf ("\n\nEnd of NMEMIO tests\n") +end + + + +# Test the SALLOC routine, which allocates storage on the stack. + +procedure t_stack () + +int bufsize +pointer sp, junk +int clglpi() + +begin + call smark (sp) + + while (clglpi ("buffer_size", bufsize) != EOF) { + call salloc (junk, bufsize, TY_CHAR) + call printf ("buffer pointer=%d, size=%d\n") + call pargi (junk) + call pargi (bufsize) + call flush (STDOUT) + } + + call sfree (sp) +end + + +# Test the REALLOC procedure, used to change the size of a buffer. +# Work with two buffers, so that memory can be fragmented, forcing buffers +# to move. + +procedure t_realloc() + +pointer a, b +int i, sza, new_sza, szb, new_szb + +begin + sza = SZ_FNAME + szb = SZ_LINE + + call malloc (a, sza, TY_CHAR) + call malloc (b, szb, TY_CHAR) + call strcpy ("abcdefghijk", Memc[a], ARB) + call strcpy ("0123456789", Memc[b], ARB) + + call eprintf ("a is at %d, size %d: %s\n") + call pargi (a) + call pargi (sza) + call pargstr (Memc[a]) + call eprintf ("b is at %d, size %d: %s\n") + call pargi (b) + call pargi (szb) + call pargstr (Memc[b]) + call eprintf ("-------------------------------\n") + + for (i=1; i <= 10; i=i+1) { + if (i < 5) { + new_sza = sza + 512 ; new_szb = szb + 256 + } else { + new_sza = sza + 256 ; new_szb = szb + 512 + } + call realloc (a, new_sza, TY_CHAR) + call realloc (b, new_szb, TY_CHAR) + + call eprintf ("%2d: a buf %d, size %d --> %d: %s\n") + call pargi (i) + call pargi (a) + call pargi (sza) + call pargi (new_sza) + call pargstr (Memc[a]) + call eprintf ("%2d: b buf %d, size %d --> %d: %s\n") + call pargi (i) + call pargi (b) + call pargi (szb) + call pargi (new_szb) + call pargstr (Memc[b]) + + sza = new_sza + szb = new_szb + } + + call mfree (a, TY_CHAR) + call mfree (b, TY_CHAR) +end + + + +define SZ_TEST 640 +define F_I1 Memi[$1] +define F_I2 Memi[$1+1] +define F_L1 Meml[$1+2] +define F_L2 Meml[$1+3] +define F_R1 Memr[$1+4] +define F_R2 Memr[$1+5] +define F_D1 Memd[P2D($1+8)] +define F_D2 Memd[P2D($1+10)] +define F_I3 Memi[$1+12] +define F_I4 Memi[$1+13] +define F_S1 Mems[P2S($1+14)] +define F_S2 Mems[P2S($1+15)] + + +procedure mt_struct (model) + +int model + +pointer sp, str +real x, y, z +double d1, d2, d3 + +int locva() + +begin + if (model == MT_HEAP) { + call malloc (str, SZ_TEST, TY_STRUCT) + } else { + call smark (sp) + call salloc (str, SZ_TEST, TY_STRUCT) + } + + + F_I1(str) = 1 + F_I2(str) = 2 + F_L1(str) = 3 + F_L2(str) = 4 + F_R1(str) = 5.0 + F_R2(str) = 6.0 + F_D1(str) = 7.0 + F_D2(str) = 8.0 + F_I3(str) = 9 + F_I4(str) = 10 + F_S1(str) = 11 + F_S2(str) = 12 + + x = 2.717 ; d1 = F_R1(str) + y = 2.717 ; d2 = 3.14159d0 ; + z = double(x) ; d3 = double(3.14159) + + call eprintf ("\nd1=%.6g d2=%.6g d3=%.6g x=%.6g y=%.6g z=%.6g)\n\n") + call pargd (d1) ; call pargd (d2) ; call pargd (d3) + call pargr (x) ; call pargr (y) ; call pargr (z) + + call eprintf ("Done Setting values ....\n\ntest = %d %d %d\n\n") + call pargi (str) + call pargi (locva(str)) + call pargi (locva(F_I1(str))) + + # call mdump (str, 64) + + call eprintf ("I1 = %4d I2 = %4d \t%d %d\n") + call pargi (F_I1(str)) ; call pargi (F_I2(str)) + call pargi (locva(F_I1(str))) ; call pargi (locva(F_I2(str))) + + call eprintf ("L1 = %4d L2 = %4d \t%d %d\n") + call pargl (F_L1(str)) ; call pargl (F_L2(str)) + call pargi (locva(F_L1(str))) ; call pargi (locva(F_L2(str))) + + call eprintf ("R1 = %4.1f R2 = %4.1f \t%d %d\n") + call pargr (F_R1(str)) ; call pargr (F_R2(str)) + call pargi (locva(F_R1(str))) ; call pargi (locva(F_R2(str))) + + call eprintf ("D1 = %4.1f D2 = %4.1f \t%d %d\n") + call pargd (F_D1(str)) ; call pargd (F_D2(str)) + call pargi (locva(F_D1(str))) ; call pargi (locva(F_D2(str))) + + call eprintf ("I3 = %4d I4 = %4d \t%d %d\n") + call pargi (F_I3(str)) ; call pargi (F_I4(str)) + call pargi (locva(F_I3(str))) ; call pargi (locva(F_I4(str))) + + call eprintf ("S1 = %4d S2 = %4d \t%d %d\n") + call pargs (F_S1(str)) ; call pargs (F_S2(str)) + call pargi (locva(F_S1(str))) ; call pargi (locva(F_S2(str))) + + + if (model == MT_HEAP) + call mfree (str, TY_STRUCT) + else + call sfree (sp) +end + + +define NVALS 3 + +procedure mt_print (dtype) + +int dtype + +int i, locva(), coerce() +real x +double xx +pointer p, bp, lwl + +begin + call calloc (p, NVALS, dtype) + bp = coerce (p, dtype, TY_INT) + + # Set the values. + for (i=0; i < NVALS; i=i+1) { + x = i ; xx = i + switch (dtype) { + case TY_BOOL: Memb[p+i] = TRUE + case TY_CHAR: Memc[p+i] = 'a' + i + case TY_SHORT: Mems[p+i] = i + case TY_INT: Memi[p+i] = i + case TY_LONG: Meml[p+i] = i + case TY_REAL: Memr[p+i] = x + case TY_DOUBLE: Memd[p+i] = xx + case TY_COMPLEX: Memx[p+i] = cmplx(x,-x) + + case TY_STRUCT: Memi[p+i] = i + case TY_POINTER: Memi[p+i] = i + } + } + + # Print the ptr header. + call eprintf ("\n") + call eprintf (" p = 0x%-15x %-16d\t%d\n") + call pargi (p) ; call pargi (p) ; call pargi (locva(Memi[bp])) + call eprintf (" fwa = 0x%-15x %-16d\t%d\n") + call pargi (bp-5) ; call pargi (Memi[bp-5]) + call pargi (locva (Memi[bp-5])) + call eprintf (" lwl = 0x%-15x %-16d\t%d\n") + call pargi (bp-4) ; call pargi (Memi[bp-4]) + call pargi (locva (Memi[bp-4])) + call eprintf (" dtype = 0x%-15x %-16d\t%d\n") + call pargi (bp-3) ; call mptype (dtype) + call pargi (locva (Memi[bp-3])) + call eprintf (" nelem = 0x%-15x %-16d\t%d\n") + call pargi (bp-2) ; call pargi (Memi[bp-2]) + call pargi (locva (Memi[bp-2])) + call eprintf ("L sentinal = 0x%-15x %-16d\t%d\n") + call pargi (bp-1) ; call pargi (Memi[bp-1]) + call pargi (locva (Memi[bp-1])) + + + # Print the values. + call eprintf (" data = ") + for (i=0; i < NVALS; i=i+1) { + switch (dtype) { + case TY_BOOL: + call eprintf (" %3b\t\t\t\t\t%-15d") + call pargb (Memb[p+i]) + call pargi (locva(Memb[p+i])) + case TY_CHAR: + call eprintf (" %3c\t\t\t\t\t%-15d") + call pargc (Memc[p+i]) + call pargi (locva(Memc[p+i])) + case TY_SHORT: + call eprintf (" %3d\t\t\t\t\t%-15d") + call pargs (Mems[p+i]) + call pargi (locva(Mems[p+i])) + case TY_INT: + call eprintf (" %3d\t\t\t\t\t%-15d") + call pargi (Memi[p+i]) + call pargi (locva(Memi[p+i])) + case TY_LONG: + call eprintf (" %3d\t\t\t\t\t%-15d") + call pargl (Meml[p+i]) + call pargi (locva(Meml[p+i])) + case TY_REAL: + call eprintf (" %3g\t\t\t\t\t%-15d") + call pargr (Memr[p+i]) + call pargi (locva(Memr[p+i])) + case TY_DOUBLE: + call eprintf (" %3g\t\t\t\t\t%-15d") + call pargd (Memd[p+i]) + call pargi (locva(Memd[p+i])) + case TY_COMPLEX: + call eprintf (" %3x\t\t\t\t\t%-15d") + call pargx (Memx[p+i]) + call pargi (locva(Memx[p+i])) + case TY_STRUCT: + call eprintf (" %3d\t\t\t\t\t%-15d") + call pargi (Memi[p+i]) + call pargi (locva(Memi[p+i])) + case TY_POINTER: + call eprintf (" %3d\t\t\t\t\t%-15d") + call pargi (Memi[p+i]) + call pargi (locva(Memi[p+i])) + } + call eprintf ("\n") + if (i < (NVALS-1)) + call eprintf ("\t\t") + } + + lwl = Memi[bp-4] + call eprintf ("U sentinal = 0x%-15x %-15d\t\t%d\n\n") + call pargi (lwl) ; call pargi (Memi[lwl]) + call pargi (locva (Memi[lwl])) + + call mfree (p, dtype) +end + + +procedure mt_overflow (dtype) + +int dtype + +int i +real x +double xx +pointer p + +begin + call calloc (p, NVALS, dtype) + + # Set the values. + for (i=0; i < NVALS + 4; i=i+1) { + x = i ; xx = i + switch (dtype) { + case TY_BOOL: Memb[p+i] = TRUE + case TY_CHAR: Memc[p+i] = 'a' + i + case TY_SHORT: Mems[p+i] = i + case TY_INT: Memi[p+i] = i + case TY_LONG: Meml[p+i] = i + case TY_REAL: Memr[p+i] = x + case TY_DOUBLE: Memd[p+i] = xx + case TY_COMPLEX: Memx[p+i] = cmplx(x,-x) + case TY_STRUCT: Memi[p+i] = i + case TY_POINTER: Memi[p+i] = i + } + } + + call mfree (p, dtype) +end + + +procedure mt_underflow (dtype) + +int dtype + +int i +real x +double xx +pointer p + +begin + call calloc (p, NVALS, dtype) + + # Set the values. + for (i=0; i < NVALS; i=i+1) { + x = i ; xx = i + switch (dtype) { + case TY_BOOL: Memb[p+i] = TRUE ; Memb[p-1] = FALSE + case TY_CHAR: Memc[p+i] = 'a' + i ; Memc[p-1] = '0' + case TY_SHORT: Mems[p+i] = i ; Mems[p-1] = 999 + case TY_INT: Memi[p+i] = i ; Memi[p-1] = 999 + case TY_LONG: Meml[p+i] = i ; Meml[p-1] = 999 + case TY_REAL: Memr[p+i] = x ; Memr[p-1] = 999 + case TY_DOUBLE: Memd[p+i] = xx ; Memd[p-1] = 999 + case TY_COMPLEX: Memx[p+i] = cmplx(x,-x) ; Memx[p-1] = 999 + case TY_STRUCT: Memi[p+i] = i ; Memi[p-1] = 999 + case TY_POINTER: Memi[p+i] = i ; Memi[p-1] = 999 + } + } + + call mfree (p, dtype) +end + + +procedure mptype (dtype) +int dtype +begin + switch (dtype) { + case TY_BOOL: call pargstr ("TY_BOOL ") + case TY_CHAR: call pargstr ("TY_CHAR ") + case TY_SHORT: call pargstr ("TY_SHORT ") + case TY_INT: call pargstr ("TY_INT ") + case TY_LONG: call pargstr ("TY_LONG ") + case TY_REAL: call pargstr ("TY_REAL ") + case TY_DOUBLE: call pargstr ("TY_DOUBLE ") + case TY_COMPLEX: call pargstr ("TY_COMPLEX") + case TY_STRUCT: call pargstr ("TY_STRUCT ") + case TY_POINTER: call pargstr ("TY_POINTER") + } +end + + + +# Generic Mem_ test assignment. + +define NAVALS 4 + +$for (bcsilrdx) + +procedure mt_auto_$t (ty, model) + +char ty[ARB] +int model + +int i +real x +pointer sp, ip + +begin + call eprintf (" %s\t ") + call pargstr (ty) + + if (model == MT_HEAP) { + call malloc (ip, NAVALS, TY_PIXEL) + } else { + call smark (sp) + call salloc (ip, NAVALS, TY_PIXEL) + } + + + call eprintf ("0x%-15x %-15d\t ") + call pargi(ip) + call pargi(ip) + + x = 0.0 + $if (datatype == b) + for (i=0; i < NAVALS; i=i+1) + Mem$t[ip+i] = TRUE + call eprintf ("[ %b %b %b %b ]\n") + $endif + $if (datatype == c) + for (i=0; i < NAVALS; i=i+1) + Mem$t[ip+i] = 'a' + i + call eprintf ("[ %-3c %-3c %-3c %-3c ]\n") + $endif + $if (datatype == x) + for (i=0; i < NAVALS; i=i+1) { + x = i + Mem$t[ip+i] = cmplx(x,0.1) + } + call eprintf ("[ %x %x %x %x ]\n") + $endif + $if (datatype == sil) + for (i=0; i < NAVALS; i=i+1) + Mem$t[ip+i] = i + call eprintf ("[ %-3d %-3d %-3d %-3d ]\n") + $endif + $if (datatype == rd) + for (i=0; i < NAVALS; i=i+1) + Mem$t[ip+i] = i + call eprintf ("[ %-3g %-3g %-3g %-3g ]\n") + $endif + for (i=0; i < NAVALS; i=i+1) + call parg$t (Mem$t[ip+i]) + + + if (model == MT_HEAP) + call mfree (ip, TY_PIXEL) + else + call sfree (sp) +end + +$endfor |