[futurebasic] Re: HANDANDHAND failure

Message: < previous - next > : Reply : Subscribe : Cleanse
Home   : March 1998 : Group Archive : Group : All Groups

From: Osamu Shigematsu <shige@...>
Date: Sun, 29 Mar 98 00:40:03 +0900
Hello, again.


>Well, I am quite sure I read somewhere that the handles should be locked
>before calling that function.

If so, you'd better call FN MOVEHHI before lock the handle. You know, 
what the hadle is, and the deffernce between handle and pointer. The 
reason why we use handle is that handle is relocatable. You must lock it 
when toolbox call ask the pointer, or when you do not want it moved.

The following codes are my long string data solution. If err, return NIL 
handle. We don't have to check err every time, at least, and at last, 
only chech the handle is nil or not. (If nil, we got an err.)

LOCAL FN disposeh(hndl&)
  DIM state%
  
  LONG IF hndl&
    state% = FN HGETSTATE(hndl&)
    LONG IF state% AND _resource%
      CALL RELEASERESOURCE(hndl&)
    XELSE
      DEF DISPOSEH(hndl&)
    END IF
    hndl& = _nil
  END IF
END FN = hndl&

LOCAL FN handNnum(hndl&,num%)
  DIM osErr%
  DIM size&
  DIM state%
  
  LONG IF hndl&<>_nil
    state% = FN HGETSTATE(hndl&)
    size& = FN GETHANDLESIZE(hndl&)
    osErr% = FN HUNLOCK(hndl&)
    osErr% = FN SETHANDLESIZE(hndl&,size&+2)
    LONG IF osErr%=_noErr
      osErr% = FN HLOCK(hndl&)
      % [hndl&],num%
      osErr% = FN HSETSTATE(hndl&,state%)
    XELSE
      hndl& = FN disposeh(hndl&)
    END IF
  END IF
END FN = hndl&

LOCAL FN handNlnum(hndl&,num&)
  DIM osErr%
  DIM size&
  DIM state%
  
  LONG IF hndl&<>_nil
    state% = FN HGETSTATE(hndl&)
    size& = FN GETHANDLESIZE(hndl&)
    osErr% = FN HUNLOCK(hndl&)
    osErr% = FN SETHANDLESIZE(hndl&,size&+4)
    LONG IF osErr%=_noErr
      osErr% = FN HLOCK(hndl&)
      & [hndl&],num&
      osErr% = FN HSETSTATE(hndl&,state%)
    XELSE
      hndl& = FN disposeh(hndl&)
    END IF
  END IF
END FN = hndl&

LOCAL FN handNstr(hndl&,txt$)
  DIM osErr%
  DIM size&
  DIM state%
  
  LONG IF hndl&<>_nil
    state% = FN HGETSTATE(hndl&)
    size& = FN GETHANDLESIZE(hndl&)
    osErr% = FN HUNLOCK(hndl&)
    osErr% = FN SETHANDLESIZE(hndl&,size&+LEN(txt$))
    LONG IF osErr%=_noErr
      osErr% = FN HLOCK(hndl&)
      BLOCKMOVE @txt$+1,[hndl&]+size&,LEN(txt$)
      osErr% = FN HSETSTATE(hndl&,state%)
    XELSE
      hndl& = FN disposeh(hndl&)
    END IF
  END IF
END FN = hndl&

LOCAL FN strNhand(hndl&,txt$)
  DIM osErr%
  DIM size&
  DIM state%
  
  LONG IF hndl&<>_nil
    state% = FN HGETSTATE(hndl&)
    size& = FN GETHANDLESIZE(hndl&)
    osErr% = FN HUNLOCK(hndl&)
    osErr% = FN SETHANDLESIZE(hndl&,size&+LEN(txt$))
    LONG IF osErr%=_noErr
      osErr% = FN HLOCK(hndl&)
      BLOCKMOVE [hndl&],[hndl&]+LEN(txt$),size&
      BLOCKMOVE @txt$+1,[hndl&],LEN(txt$)
      osErr% = FN HSETSTATE(hndl&,state%)
    XELSE
      hndl& = FN disposeh(hndl&)
    END IF
  END IF
END FN = hndl&

LOCAL FN handNhand(aHndl&,bHndl&)
  DIM osErr%
  DIM aState%,bState%
  
  LONG IF aHndl&<>_nil AND bHndl&<>_nil
    aState% = FN HGETSTATE(aHndl&)
    bState% = FN HGETSTATE(bHndl&)
    osErr% = FN HUNLOCK(aHndl&)
    osErr% = FN HUNLOCK(bHndl&)
    osErr% = FN HANDANDHAND(aHndl&,bHndl&)
    LONG IF osErr% = _noErr
      osErr% = FN HSETSTATE(bHndl&,bState%)
    XELSE
      'out of mem
      bHndl& = FN disposeh(bHndl&)
    END IF
    osErr% = FN HSETSTATE(aHndl&,aState%)
  END IF
END FN = bHndl&

LOCAL FN getItem(hndl&,item%,delimiter$)
  DIM osErr%
  DIM count%,sOfs&,eOfs&,size&,delLen%
  DIM newHndl&,state%
  
  newHndl& = _nil
  LONG IF hndl&<>_nil
    size& = FN GETHANDLESIZE(hndl&)
    delLen% = LEN(delimiter$)
    count% = 0
    eOfs& = -delLen%
    DO
      INC(count%)
      sOfs& = eOfs&+delLen%
      LONG IF sOfs&<=size&
        eOfs& = FN MUNGER(hndl&,sOfs&,@delimiter$+1,delLen%,_nil,_nil)
      XELSE
        eOfs& = -1
      END IF
    UNTIL count%=item% OR eOfs&<0
    
    LONG IF count%=item% AND eOfs&<0 AND item%<>1
      eOfs& = size&
    END IF
    
    LONG IF eOfs&>=0
      size& = eOfs&-sOfs&
      newHndl& = FN NEWHANDLE(size&)
      LONG IF newHndl&<>_nil
        state% = FN HGETSTATE(hndl&)
        osErr% = FN HLOCK(hndl&)
        osErr% = FN HLOCK(newHndl&)
        BLOCKMOVE [hndl&]+sOfs&,[newHndl&],size&
        osErr% = FN HUNLOCK(newHndl&)
        osErr% = FN HSETSTATE(hndl&,state%)
      END IF
    END IF
  END IF
END FN = newHndl&

LOCAL FN pickUp(hndl&,s$,e$)
  DIM temp&,result&
  
  temp& = FN getItem(hndl&,2,s$)
  result& = FN getItem(temp&,1,e$)
  temp& = FN disposeh(temp&) 
END FN = result&

LOCAL FN replaceSS(hndl&,s$,t$)
  DIM osErr%
  DIM offset&
  DIM state%
  
  LONG IF hndl&<>_nil AND LEN(s$)>0
    offset& = 0
    state% = FN HGETSTATE(hndl&)
    osErr% = FN HUNLOCK(hndl&)
    DO
      offset& = FN MUNGER(hndl&,offset&,@s$+1,LEN(s$),@t$+1,LEN(t$))
    UNTIL offset&<0
    osErr% = FN HSETSTATE(hndl&,state%)
  END IF
END FN

LOCAL FN replaceSH(hndl&,s$,tHndl&)
  DIM osErr%
  DIM offset&
  DIM state%
  DIM tSize&,tState%
  
  LONG IF hndl&<>_nil AND LEN(s$)>0 AND tHndl&<>_nil
    offset& = 0
    state% = FN HGETSTATE(hndl&)
    osErr% = FN HUNLOCK(hndl&)
    tSize& = FN GETHANDLESIZE(tHndl&)
    tState% = FN HGETSTATE(tHndl&)
    osErr% = FN HLOCK(tHndl&)
    DO
      offset& = FN MUNGER(hndl&,offset&,@s$+1,LEN(s$),[tHndl&],tSize&)
    UNTIL offset&<0
    osErr% = FN HSETSTATE(hndl&,state%)
    osErr% = FN HSETSTATE(tHndl&,tState%)
  END IF
END FN

LOCAL FN str2hand(t$)
  DIM osErr%
  DIM hndl&
  
  hndl& = FN NEWHANDLE(LEN(t$))
  LONG IF hndl&
    osErr% = FN HLOCK(hndl&)
    BLOCKMOVE @t$+1,[hndl&],LEN(t$)
    osErr% = FN HUNLOCK(hndl&)
  END IF
END FN = hndl&

LOCAL FN hand2str$(hndl&,maxLen%)
  DIM osErr%
  DIM t$,size&,state%
  
  t$ = ""
  LONG IF hndl&<>_nil
    IF maxLen%>255 THEN maxLen% = 255
    size& = FN GETHANDLESIZE(hndl&)
    IF size&>maxLen% THEN size& = maxLen%
    state% = FN HGETSTATE(hndl&)
    osErr% = FN HLOCK(hndl&)
    BLOCKMOVE [hndl&],@t$+1,size&
    POKE @t$,size&
    osErr% = FN HSETSTATE(hndl&,state%)
  END IF
END FN = t$


************************************************************
* Osamu Shigematsu                                         *             
* mail: shige@... / a1297991@...        *
* homepage : http://www.ravi.ne.jp/FBII/                   *
************************************************************