Hallo, IBMler!
Bekanntlich geht movea nicht im free code.
Manche empfehlen statt dessen memcpy zu nehmen. Memcpy kopiert aber den gesamten Speicherbereich. Substrings von arrays muss man mit %subarr kopieren.
Daher habe ich eine Prozedur selbst gestrickt, die alles macht.
MfG
Thomas J. Fuchs
Code:
h text('movea in free code')
h dftname(MOVEA)
h copyright('(C) Copyright APL Services 2010-08-07')
/if defined(*crtrpgmod)
h nomain option(*srcstmt:*nodebugio) aut(*all) fixnbr(*zoned:*inputpacked)
h truncnbr(*yes) ccsid(*char:*jobrun)
/endif
//‚Include Global Header Files
/include qrpglesrc,prototypes
//‚Required Prototypes
//‚movea in free code
d*movea pr
d* * value options(*string) Pointer from
d* * value options(*string) Pointer to
d* 10i 0 const options(*nopass) Length from
d* 10i 0 const options(*nopass) Elements from
d* 10i 0 const options(*nopass) Length to
d* 10i 0 const options(*nopass) Elements to
d* 10a const options(*nopass:*trim) *KEEP/*CLEAR
//‚Binding Source Entry
// EXPORT SYMBOL('MOVEA') /* movea in free code */
/*-------------------------------------------------------------------*/
//‚movea in free code
pmovea b export
d pi
d ptr_from * value options(*string) Pointer from
d ptr_to * value options(*string) Pointer to
d len_from 10i 0 const options(*nopass) Length from
d elem_from 10i 0 const options(*nopass) Elements from
d len_to 10i 0 const options(*nopass) Length to
d elem_to 10i 0 const options(*nopass) Elements to
d pi_option 10a const options(*nopass:*trim) *KEEP/*CLEAR
//‚Local Variables
doption s 10a inz
dpos_from s 10i 0 inz
dpos_to s 10i 0 inz
dstring_from s 32767a inz varying
dstring_to s 32767a inz varying
dstrlen_from s 10i 0 inz
dstrlen_to s 10i 0 inz
dwrkstr s 32767a inz
//‚Local Constants
dlo c x'8182838485868788899192939495969798-
d 99A2A3A4A5A6A7A8A943CCDC'
dnull c x'00'
dup c x'C1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8-
d D9E2E3E4E5E6E7E8E936ECFC'
/free
if %parms>=7;
option=%xlate(lo:up:pi_option);
if option<>'*KEEP' and option<>'*CLEAR';
option='*KEEP';
endif;
endif;
if %len(%str(ptr_from))>0;
string_from=%str(ptr_from);
strlen_from=%len(%trim(string_from))+1;
if %parms>=6;
pos_from=(elem_from-1)*len_from+1;
pos_to=(elem_to-1)*len_to+1;
if %parms>=7 and option='*KEEP';
string_to=%str(ptr_to);
strlen_to=%len(%trim(string_to))+1;
clear wrkstr;
wrkstr=string_to;
%subst(wrkstr:pos_to)=%triml(string_from);
elseif %parms>=7 and option='*CLEAR';
string_to=%str(ptr_to);
strlen_to=%len(%trim(string_to))+1;
clear string_to;
if len_from>len_to;
%len(string_to)=len_from;
endif;
%subst(wrkstr:pos_to:strlen_from)=string_from;
if len_to>len_from;
%subst(wrkstr:len_to+1)=null;
endif;
else;
%subst(wrkstr:pos_to:strlen_from)=string_from;
endif;
%str(ptr_to:%len(%trimr(wrkstr))+1)=wrkstr;
else;
if %parms<3;
string_to=%str(ptr_to);
strlen_to=%len(%trim(string_to))+1;
strlen_from+=strlen_to;
endif;
%str(ptr_to:strlen_from)=string_from;
endif;
endif;
return;
/end-free
pmovea e
/*-------------------------------------------------------------------*/
Folgendes Testprogramm zeigt die Funktion der Prozedur movea:
Code:
h text('movea in free code')
h dftname(MOVEAL)
h copyright('(C) Copyright APL Services 2010-08-07')
/if defined(*crtbndrpg)
h dftactgrp(*no) actgrp(*caller)
/endif
dmovea pr
d * value options(*string) Pointer from
d * value options(*string) Pointer to
d 10i 0 const options(*nopass) Length from
d 10i 0 const options(*nopass) Elements from
d 10i 0 const options(*nopass) Length to
d 10i 0 const options(*nopass) Elements to
d 10a const options(*nopass:*trim) *KEEP/*CLEAR
darr_days s 1a inz dim(31)
darr1 s 10a inz dim(10)
darr2 s 10a inz dim(10)
dbrk s 1a inz
ddays s 31a inz('0000000001000000000000001000000-
d ')
delem s 10i 0 inz(3)
dname s 10a inz('Fuchs')
dstring s 30a inz('Müller Maier Schmidt Schulze')
/free
movea(%addr(name):%addr(arr1));
clear brk;
movea(%addr(arr1):%addr(arr2));
clear brk;
movea(%addr(arr1):%addr(arr2):%len(name):1:%len(name):3);
clear brk;
movea(%addr(string):%addr(arr2):%len(string):1:%size(arr2):4:'*KEEP');
clear brk;
name='1234567890';
movea(%addr(name):%addr(arr2):%len(name):1:%size(arr2):10:'*KEEP');
clear brk;
movea(%addr(arr2):%addr(arr1):%size(arr2):1:%size(arr1):2:'*KEEP');
clear brk;
name='Elem 6';
movea(%addr(name):%addr(arr1):%len(name):1:%size(arr1):6:'*KEEP');
clear brk;
movea(%addr(string):%addr(arr1):%len(string):1:%size(arr1:*all):1:
'*CLEAR');
clear brk;
movea(%addr(arr1):%addr(arr2));
clear brk;
movea(%addr(days):%addr(arr_days));
clear brk;
arr_days(1)=*on;
arr_days(31)=*on;
movea(%addr(arr_days):%addr(days));
clear brk;
*inlr=*on;
return;
/end-free
pmovea b export
d pi
d ptr_from * value options(*string) Pointer from
d ptr_to * value options(*string) Pointer to
d len_from 10i 0 const options(*nopass) Length from
d elem_from 10i 0 const options(*nopass) Elements from
d len_to 10i 0 const options(*nopass) Length to
d elem_to 10i 0 const options(*nopass) Elements to
d pi_option 10a const options(*nopass:*trim) *KEEP/*CLEAR
//‚Local Variables
doption s 10a inz
dpos_from s 10i 0 inz
dpos_to s 10i 0 inz
dstring_from s 32767a inz varying
dstring_to s 32767a inz varying
dstrlen_from s 10i 0 inz
dstrlen_to s 10i 0 inz
dwrkstr s 32767a inz
//‚Local Constants
dlo c x'8182838485868788899192939495969798-
d 99A2A3A4A5A6A7A8A943CCDC'
dnull c x'00'
dup c x'C1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8-
d D9E2E3E4E5E6E7E8E936ECFC'
/free
if %parms>=7;
option=%xlate(lo:up:pi_option);
if option<>'*KEEP' and option<>'*CLEAR';
option='*KEEP';
endif;
endif;
if %len(%str(ptr_from))>0;
string_from=%str(ptr_from);
strlen_from=%len(%trim(string_from))+1;
if %parms>=6;
pos_from=(elem_from-1)*len_from+1;
pos_to=(elem_to-1)*len_to+1;
if %parms>=7 and option='*KEEP';
string_to=%str(ptr_to);
strlen_to=%len(%trim(string_to))+1;
clear wrkstr;
wrkstr=string_to;
clear brk;
%subst(wrkstr:pos_to)=%triml(string_from);
clear brk;
elseif %parms>=7 and option='*CLEAR';
string_to=%str(ptr_to);
strlen_to=%len(%trim(string_to))+1;
clear string_to;
if len_from>len_to;
%len(string_to)=len_from;
endif;
clear brk;
%subst(wrkstr:pos_to:strlen_from)=string_from;
if len_to>len_from;
%subst(wrkstr:len_to+1)=null;
endif;
else;
%subst(wrkstr:pos_to:strlen_from)=string_from;
endif;
%str(ptr_to:%len(%trimr(wrkstr))+1)=wrkstr;
else;
if %parms<3;
string_to=%str(ptr_to);
strlen_to=%len(%trim(string_to))+1;
strlen_from+=strlen_to;
clear brk;
endif;
%str(ptr_to:strlen_from)=string_from;
endif;
endif;
return;
/end-free
pmovea e
Bookmarks