home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 15 / BBS in a box XV-2.iso / Files II / Prog / M / MacPerl 4.13 source.sit / Perl Source ƒ / MacPerl / MPAEUtils.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-27  |  4.6 KB  |  207 lines  |  [TEXT/MPS ]

  1. /*********************************************************************
  2. Project    :    MacPerl            -    Real Perl Application
  3. File        :    MPAEUtils.c        -
  4. Author    :    Matthias Neeracher
  5.  
  6. A lot of this code is borrowed from 7Edit written by
  7. Apple Developer Support UK
  8.  
  9. Language    :    MPW C
  10.  
  11. $Log: MPAEUtils.c,v $
  12. Revision 1.1  1994/02/27  22:59:32  neeri
  13. Initial revision
  14.  
  15. Revision 0.1  1993/05/29  00:00:00  neeri
  16. Compiles correctly
  17.  
  18. *********************************************************************/
  19.  
  20. #pragma segment Main
  21.  
  22. #include "MPAEUtils.h"
  23. #include "MPUtils.h"
  24.  
  25. #include <AERegistry.h>
  26.  
  27.  
  28. /**-----------------------------------------------------------------------
  29.     Utility Routines for getting data from AEDesc's
  30.   -----------------------------------------------------------------------**/
  31.  
  32. pascal void GetRawDataFromDescriptor(
  33.     const AEDesc *theDesc,
  34.     Ptr     destPtr,
  35.     Size    destMaxSize,
  36.     Size    *actSize)
  37. {
  38.     Size copySize;
  39.  
  40.     if (theDesc->dataHandle) {
  41.         HLock((Handle)theDesc->dataHandle);
  42.         *actSize = GetHandleSize((Handle)theDesc->dataHandle);
  43.  
  44.         copySize = LesserOf(*actSize, destMaxSize);
  45.  
  46.         BlockMove(*theDesc->dataHandle, destPtr, copySize);
  47.  
  48.         HUnlock((Handle)theDesc->dataHandle);
  49.     } else
  50.         *actSize = 0;
  51. } /*GetRawDataFromDescriptor*/
  52.  
  53. pascal OSErr GetPStringFromDescriptor(const AEDesc *sourceDesc, char *resultStr)
  54. {
  55.     OSErr        myErr;
  56.     Size     stringSize;
  57.     AEDesc   resultDesc;
  58.  
  59.     resultStr[0] = 0;
  60.  
  61.     if (myErr = AECoerceDesc(sourceDesc, typeChar, &resultDesc))
  62.         return myErr;
  63.  
  64.     GetRawDataFromDescriptor(&resultDesc, (Ptr)&resultStr[1], 255, &stringSize);
  65.  
  66.     if (stringSize<256)
  67.         resultStr[0] = (char)stringSize;
  68.     else
  69.         myErr = errAECoercionFail;
  70.  
  71.     if (resultDesc.dataHandle)
  72.         AEDisposeDesc(&resultDesc);
  73.  
  74.     return myErr;
  75. }
  76.  
  77. pascal OSErr GetIntegerFromDescriptor(const AEDesc *sourceDesc, short *result)
  78. {
  79.     OSErr   myErr;
  80.     Size    intSize;
  81.     AEDesc  resultDesc;
  82.  
  83.     *result = 0;
  84.  
  85.     if (myErr = AECoerceDesc(sourceDesc, typeShortInteger, &resultDesc))
  86.         return myErr;
  87.  
  88.     GetRawDataFromDescriptor(&resultDesc, (Ptr)result, 2, &intSize);
  89.     if (intSize>2)
  90.         myErr = errAECoercionFail;
  91.  
  92.     if (resultDesc.dataHandle)
  93.         AEDisposeDesc(&resultDesc);
  94.  
  95.     return myErr;
  96. }
  97.  
  98. pascal OSErr GetBooleanFromDescriptor(const AEDesc *sourceDesc, Boolean *result)
  99. {
  100.     OSErr  myErr;
  101.     Size   boolSize;
  102.     AEDesc resultDesc;
  103.  
  104.     *result = false;
  105.  
  106.     if (myErr = AECoerceDesc(sourceDesc, typeBoolean,&resultDesc))
  107.         return myErr;
  108.  
  109.     GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Boolean), &boolSize);
  110.     if (boolSize>sizeof(Boolean))
  111.         myErr = errAECoercionFail;
  112.  
  113.     if (resultDesc.dataHandle)
  114.         AEDisposeDesc(&resultDesc);
  115.  
  116.     return myErr;
  117. }
  118.  
  119. pascal OSErr GetLongIntFromDescriptor(const AEDesc *sourceDesc, long   *result)
  120. {
  121.     OSErr   myErr;
  122.     Size    intSize;
  123.     AEDesc  resultDesc;
  124.  
  125.     *result = 0;
  126.  
  127.     if (myErr = AECoerceDesc(sourceDesc, typeLongInteger, &resultDesc))
  128.         return myErr;
  129.  
  130.     GetRawDataFromDescriptor(&resultDesc, (Ptr)result, 4, &intSize);
  131.     if (intSize>4)
  132.         myErr = errAECoercionFail;
  133.  
  134.     if (resultDesc.dataHandle)
  135.         AEDisposeDesc(&resultDesc);
  136.  
  137.     return myErr;
  138. } /*GetLongIntFromDescriptor*/
  139.  
  140. pascal OSErr GetRectFromDescriptor(const AEDesc *sourceDesc, Rect *result)
  141. {
  142.     OSErr   myErr;
  143.     Size    rectSize;
  144.     AEDesc  resultDesc;
  145.  
  146.     SetRect(result,0,0,0,0);
  147.  
  148.     if (myErr = AECoerceDesc(sourceDesc,typeQDRectangle,&resultDesc))
  149.         return myErr;
  150.  
  151.     GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Rect),  &rectSize);
  152.     if (rectSize<sizeof(Rect))
  153.         myErr = errAECoercionFail;
  154.  
  155.     if (resultDesc.dataHandle)
  156.         AEDisposeDesc(&resultDesc);
  157.  
  158.     return myErr;
  159. } /*GetRectFromDescriptor*/
  160.  
  161. pascal OSErr GetPointFromDescriptor(const AEDesc *sourceDesc, Point  *result)
  162. {
  163.     OSErr   myErr;
  164.     Size    ptSize;
  165.     AEDesc  resultDesc;
  166.  
  167.     SetPt(result,0,0);
  168.  
  169.     if (myErr = AECoerceDesc(sourceDesc,typeQDPoint,&resultDesc))
  170.         return myErr;
  171.  
  172.     GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Point), &ptSize);
  173.     if (ptSize<sizeof(Point))
  174.         myErr = errAECoercionFail;
  175.  
  176.     if (resultDesc.dataHandle)
  177.         AEDisposeDesc(&resultDesc);
  178.  
  179.     return myErr;
  180. } /*GetPointFromDescriptor*/
  181.  
  182.  
  183. /*
  184.     Name:    PutStyledTextFromDescIntoTEHandle
  185.     Purpose: Takes the text in an AEDesc containing typeIntlText and puts it in
  186.              a styled text edit record at the current insertion point.
  187.                      Looks for typeIntlText, typeStyledText, typeChar in that order.
  188. */
  189.  
  190. pascal OSErr GetTextFromDescIntoTEHandle(const AEDesc *sourceTextDesc, TEHandle theHTE)
  191. {
  192.     AEDesc rawTextDesc;
  193.     OSErr  myErr;
  194.  
  195.     if (myErr = AECoerceDesc(sourceTextDesc, typeChar, &rawTextDesc))
  196.         return myErr;
  197.  
  198.     HLock((Handle)rawTextDesc.dataHandle);
  199.     TEInsert((*rawTextDesc.dataHandle), GetHandleSize(rawTextDesc.dataHandle), theHTE);
  200.     HUnlock((Handle)rawTextDesc.dataHandle);
  201.  
  202.     if (rawTextDesc.dataHandle)
  203.         AEDisposeDesc(&rawTextDesc);
  204.  
  205.     return noErr;
  206. }
  207.