home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / HyperCard / reg_exp.XFCN / XCmdGlue.c < prev    next >
Text File  |  1989-09-18  |  12KB  |  389 lines

  1. /*
  2.     XCmdGlue.inc.c  Definitions for calling all standard 
  3.     HyperCard callback routines from C.
  4.     
  5.       ©Apple Computer, Inc. 1987
  6.     All Rights Reserved.
  7. */
  8. #include <MacTypes.h>
  9. #include "HyperXCmd.h"
  10.  
  11. pascal void SendCardMessage(paramPtr,msg)
  12.     XCmdBlockPtr    paramPtr;    StringPtr    msg;
  13.     /* Send a HyperCard message (a command with arguments) to the current card.
  14.        msg is a pointer to a Pascal format string.  */
  15. {
  16.     paramPtr->inArgs[0] = (long)msg;
  17.     paramPtr->request = xreqSendCardMessage;
  18.     DoJsr(paramPtr);
  19. }
  20.  
  21. pascal Handle EvalExpr(paramPtr,expr)
  22.     XCmdBlockPtr    paramPtr;    StringPtr    expr;
  23.     /* Evaluate a HyperCard expression and return the answer.  The answer is
  24.        a handle to a zero-terminated string. */
  25. {
  26.     paramPtr->inArgs[0] = (long)expr;
  27.     paramPtr->request = xreqEvalExpr;
  28.     DoJsr(paramPtr);
  29.     return (Handle)paramPtr->outArgs[0];
  30. }
  31.  
  32.  
  33. pascal long StringLength(paramPtr,strPtr)
  34.     XCmdBlockPtr    paramPtr;    StringPtr    strPtr;
  35. /* Count the characters from where strPtr points until the next zero byte. 
  36.    Does not count the zero itself.  strPtr must be a zero-terminated string. */
  37. {
  38.     paramPtr->inArgs[0] = (long)strPtr;
  39.     paramPtr->request = xreqStringLength;
  40.     DoJsr(paramPtr);
  41.     return (long)paramPtr->outArgs[0];
  42. }
  43.  
  44.  
  45. pascal Ptr StringMatch(paramPtr,pattern,target)
  46.     XCmdBlockPtr    paramPtr;    StringPtr    pattern;    Ptr    target;
  47. /* Perform case-insensitive match looking for pattern anywhere in
  48.    target, returning a pointer to first character of the first match,
  49.    in target or NIL if no match found.  pattern is a Pascal string,
  50.    and target is a zero-terminated string. */
  51. {
  52.     paramPtr->inArgs[0] = (long)pattern;
  53.     paramPtr->inArgs[1] = (long)target;
  54.     paramPtr->request = xreqStringMatch;
  55.     DoJsr(paramPtr);
  56.     return (Ptr)paramPtr->outArgs[0];
  57. }
  58.  
  59.  
  60. pascal void SendHCMessage(paramPtr,msg)
  61.     XCmdBlockPtr    paramPtr;    StringPtr    msg;
  62.     /* Send a HyperCard message (a command with arguments) to HyperCard.
  63.        msg is a pointer to a Pascal format string.  */
  64. {
  65.     paramPtr->inArgs[0] = (long)msg;
  66.     paramPtr->request = xreqSendHCMessage;
  67.     DoJsr(paramPtr);
  68. }
  69.  
  70. pascal void ZeroBytes(paramPtr,dstPtr,longCount)
  71.     XCmdBlockPtr    paramPtr;    Ptr    dstPtr;    long    longCount;
  72. /* Write zeros into memory starting at destPtr and going for longCount 
  73.    number of bytes. */
  74. {
  75.     paramPtr->inArgs[0] = (long)dstPtr;
  76.     paramPtr->inArgs[1] = longCount;
  77.     paramPtr->request = xreqZeroBytes;
  78.     DoJsr(paramPtr);
  79. }
  80.  
  81.  
  82. pascal Handle PasToZero(paramPtr,pasStr)
  83.     XCmdBlockPtr    paramPtr;    StringPtr    pasStr;
  84. /* Convert a Pascal string to a zero-terminated string.  Returns a handle
  85.    to a new zero-terminated string.  The caller must dispose the handle.
  86.    You'll need to do this for any result or argument you send from 
  87.    your XCMD to HyperTalk. */
  88. {
  89.     paramPtr->inArgs[0] = (long)pasStr;
  90.     paramPtr->request = xreqPasToZero;
  91.     DoJsr(paramPtr);
  92.     return (Handle)paramPtr->outArgs[0];
  93. }
  94.  
  95.  
  96. pascal void ZeroToPas(paramPtr,zeroStr,pasStr)
  97.     XCmdBlockPtr    paramPtr;    char    *zeroStr;    StringPtr    pasStr;
  98. /* Fill the Pascal string with the contents of the zero-terminated
  99.    string.  You create the Pascal string and pass it in as a VAR 
  100.    parameter.  Useful for converting the arguments of any XCMD to 
  101.    Pascal strings. */
  102. {
  103.     paramPtr->inArgs[0] = (long)zeroStr;
  104.     paramPtr->inArgs[1] = (long)pasStr;
  105.     paramPtr->request = xreqZeroToPas;
  106.     DoJsr(paramPtr);
  107. }
  108.  
  109. pascal long StrToLong(paramPtr,strPtr)
  110.     XCmdBlockPtr    paramPtr;    Str31 *    strPtr;
  111. /* Convert a string of ASCII decimal digits to an unsigned long integer. */
  112. {
  113.     paramPtr->inArgs[0] = (long)strPtr;
  114.     paramPtr->request = xreqStrToLong;
  115.     DoJsr(paramPtr);
  116.     return (long)paramPtr->outArgs[0];
  117. }
  118.  
  119.  
  120. pascal long StrToNum(paramPtr,str)
  121.     XCmdBlockPtr    paramPtr;    Str31 *     str;
  122. /* Convert a string of ASCII decimal digits to a signed long integer.
  123.    Negative sign is allowed. */
  124. {
  125.     paramPtr->inArgs[0] = (long)str;
  126.     paramPtr->request = xreqStrToNum;
  127.     DoJsr(paramPtr);
  128.     return paramPtr->outArgs[0];
  129. }
  130.  
  131.  
  132. pascal Boolean StrToBool(paramPtr,str)
  133.     XCmdBlockPtr    paramPtr;    Str31 *     str;
  134. /* Convert the Pascal strings 'true' and 'false' to booleans. */
  135. {
  136.     paramPtr->inArgs[0] = (long)str;
  137.     paramPtr->request = xreqStrToBool;
  138.     DoJsr(paramPtr);
  139.     return (Boolean)paramPtr->outArgs[0];
  140. }
  141.  
  142.  
  143. pascal void StrToExt(paramPtr,str,myext)
  144.     XCmdBlockPtr    paramPtr;    Str31 *     str;    extended *    myext;
  145.  /* Convert a string of ASCII decimal digits to an extended long integer.
  146.     Instead of returning a new extended, as Pascal does, it expects you 
  147.     to create myext and pass it in to be filled. */
  148. {
  149.     paramPtr->inArgs[0] = (long)str;
  150.     paramPtr->inArgs[1] = (long)myext;
  151.     paramPtr->request = xreqStrToExt;
  152.     DoJsr(paramPtr);
  153. }
  154.  
  155.  
  156. pascal void LongToStr(paramPtr,posNum,mystr)
  157.     XCmdBlockPtr    paramPtr;    long     posNum;    Str31 *    mystr;
  158.  /* Convert an unsigned long integer to a Pascal string.  Instead of 
  159.     returning a new string, as Pascal does, it expects you to 
  160.     create mystr and pass it in to be filled. */
  161. {
  162.     paramPtr->inArgs[0] = (long)posNum;
  163.     paramPtr->inArgs[1] = (long)mystr;
  164.     paramPtr->request = xreqLongToStr;
  165.     DoJsr(paramPtr);
  166. }
  167.  
  168.  
  169. pascal void NumToStr(paramPtr,num,mystr)
  170.     XCmdBlockPtr    paramPtr;    long     num;    Str31 *    mystr;
  171.  /* Convert a signed long integer to a Pascal string.  Instead of 
  172.     returning a new string, as Pascal does, it expects you to 
  173.     create mystr and pass it in to be filled. */
  174. {
  175.     paramPtr->inArgs[0] = num;
  176.     paramPtr->inArgs[1] = (long)mystr;
  177.     paramPtr->request = xreqNumToStr;
  178.     DoJsr(paramPtr);
  179. }
  180.  
  181.  
  182. pascal void NumToHex(paramPtr,num,nDigits,mystr)
  183.     XCmdBlockPtr    paramPtr;    long     num;
  184.     short    nDigits;            Str31 *    mystr;
  185. /* Convert an unsigned long integer to a hexadecimal number and put it
  186.    into a Pascal string.  Instead of returning a new string, as 
  187.    Pascal does, it expects you to create mystr and pass it in to be filled. */
  188. {
  189.     paramPtr->inArgs[0] = num;
  190.     paramPtr->inArgs[1] = nDigits;
  191.     paramPtr->inArgs[2] = (long)mystr;
  192.     paramPtr->request = xreqNumToHex;
  193.     DoJsr(paramPtr);
  194. }
  195.  
  196.  
  197. pascal void BoolToStr(paramPtr,bool,mystr)
  198.     XCmdBlockPtr    paramPtr;    Boolean    bool;    Str31 *    mystr;
  199.  /* Convert a boolean to 'true' or 'false'.  Instead of returning 
  200.     a new string, as Pascal does, it expects you to create mystr
  201.     and pass it in to be filled. */
  202. {
  203.     paramPtr->inArgs[0] = (long)bool;
  204.     paramPtr->inArgs[1] = (long)mystr;
  205.     paramPtr->request = xreqBoolToStr;
  206.     DoJsr(paramPtr);
  207. }
  208.  
  209.  
  210. pascal void ExtToStr(paramPtr,myext,mystr)
  211.     XCmdBlockPtr    paramPtr;    extended *    myext;    Str31 *    mystr;
  212.  /* Convert an extended long integer to decimal digits in a string.  
  213.     Instead of returning a new string, as Pascal does, it expects 
  214.     you to create mystr and pass it in to be filled. */
  215. {
  216.     paramPtr->inArgs[0] = (long)myext;
  217.     paramPtr->inArgs[1] = (long)mystr;
  218.     paramPtr->request = xreqExtToStr;
  219.     DoJsr(paramPtr);
  220. }
  221.  
  222.  
  223. pascal Handle GetGlobal(paramPtr,globName)
  224.     XCmdBlockPtr    paramPtr;    StringPtr    globName;
  225. /* Return a handle to a zero-terminated string containing the value of 
  226.    the specified HyperTalk global variable. */
  227. {
  228.     paramPtr->inArgs[0] = (long)globName;
  229.     paramPtr->request = xreqGetGlobal;
  230.     DoJsr(paramPtr);
  231.     return (Handle)paramPtr->outArgs[0];
  232. }
  233.  
  234. pascal void SetGlobal(paramPtr,globName,globValue)
  235.     XCmdBlockPtr    paramPtr;    StringPtr    globName;    Handle    globValue;
  236. /* Set the value of the specified HyperTalk global variable to be
  237.    the zero-terminated string in globValue.  The contents of the 
  238.    Handle are copied, so you must still dispose it afterwards.  */
  239. {
  240.     paramPtr->inArgs[0] = (long)globName;
  241.     paramPtr->inArgs[1] = (long)globValue;
  242.     paramPtr->request = xreqSetGlobal;
  243.     DoJsr(paramPtr);
  244. }
  245.  
  246.  
  247. pascal Handle GetFieldByName(paramPtr,cardFieldFlag,fieldName)
  248.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  249.     StringPtr    fieldName;
  250. /* Return a handle to a zero-terminated string containing the value of 
  251.    field fieldName on the current card.  You must dispose the handle. */
  252. {
  253.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  254.     paramPtr->inArgs[1] = (long)fieldName;
  255.     paramPtr->request = xreqGetFieldByName;
  256.     DoJsr(paramPtr);
  257.     return (Handle)paramPtr->outArgs[0];
  258. }
  259.  
  260.  
  261. pascal Handle GetFieldByNum(paramPtr,cardFieldFlag,fieldNum)
  262.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  263.     short    fieldNum;
  264. /* Return a handle to a zero-terminated string containing the value of 
  265.    field fieldNum on the current card.  You must dispose the handle. */
  266. {
  267.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  268.     paramPtr->inArgs[1] = fieldNum;
  269.     paramPtr->request = xreqGetFieldByNum;
  270.     DoJsr(paramPtr);
  271.     return (Handle)paramPtr->outArgs[0];
  272. }
  273.  
  274.  
  275. pascal Handle GetFieldByID(paramPtr,cardFieldFlag,fieldID)
  276.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  277.     short    fieldID;
  278. /* Return a handle to a zero-terminated string containing the value of 
  279.    the field whise ID is fieldID.  You must dispose the handle. */
  280. {
  281.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  282.     paramPtr->inArgs[1] = fieldID;
  283.     paramPtr->request = xreqGetFieldByID;
  284.     DoJsr(paramPtr);
  285.     return (Handle)paramPtr->outArgs[0];
  286. }
  287.  
  288.  
  289. pascal void SetFieldByName(paramPtr,cardFieldFlag,fieldName,fieldVal)
  290.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  291.     StringPtr    fieldName;    Handle    fieldVal;
  292. /* Set the value of field fieldName to be the zero-terminated string 
  293.    in fieldVal.  The contents of the Handle are copied, so you must 
  294.    still dispose it afterwards. */
  295. {
  296.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  297.     paramPtr->inArgs[1] = (long)fieldName;
  298.     paramPtr->inArgs[2] = (long)fieldVal;
  299.     paramPtr->request = xreqSetFieldByName;
  300.     DoJsr(paramPtr);
  301. }
  302.  
  303.  
  304. pascal void SetFieldByNum(paramPtr,cardFieldFlag,fieldNum,fieldVal)
  305.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  306.     short    fieldNum;            Handle    fieldVal;
  307. /* Set the value of field fieldNum to be the zero-terminated string 
  308.    in fieldVal.  The contents of the Handle are copied, so you must 
  309.    still dispose it afterwards. */
  310. {
  311.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  312.     paramPtr->inArgs[1] = fieldNum;
  313.     paramPtr->inArgs[2] = (long)fieldVal;
  314.     paramPtr->request = xreqSetFieldByNum;
  315.     DoJsr(paramPtr);
  316. }
  317.  
  318.  
  319. pascal void SetFieldByID(paramPtr,cardFieldFlag,fieldID,fieldVal)
  320.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  321.     short    fieldID;            Handle    fieldVal;
  322. /* Set the value of the field whose ID is fieldID to be the zero-
  323.    terminated string in fieldVal.  The contents of the Handle are 
  324.    copied, so you must still dispose it afterwards. */
  325. {
  326.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  327.     paramPtr->inArgs[1] = fieldID;
  328.     paramPtr->inArgs[2] = (long)fieldVal;
  329.     paramPtr->request = xreqSetFieldByID;
  330.     DoJsr(paramPtr);
  331. }
  332.  
  333.  
  334. pascal Boolean StringEqual(paramPtr,str1,str2)
  335.     XCmdBlockPtr    paramPtr;    Str31 *     str1;    Str31 *     str2;
  336. /* Return true if the two strings have the same characters.  
  337.    Case insensitive compare of the strings. */
  338. {
  339.     paramPtr->inArgs[0] = (long)str1;
  340.     paramPtr->inArgs[1] = (long)str2;
  341.     paramPtr->request = xreqStringEqual;
  342.     DoJsr(paramPtr);
  343.     return (Boolean)paramPtr->outArgs[0];
  344. }
  345.  
  346.  
  347. pascal void ReturnToPas(paramPtr,zeroStr,pasStr)
  348.     XCmdBlockPtr    paramPtr;    Ptr    zeroStr;    StringPtr    pasStr;
  349. /* zeroStr points into a zero-terminated string.  Collect the 
  350.    characters from there to the next carriage Return and return 
  351.    them in the Pascal string pasStr.  If a Return is not found, 
  352.    collect chars until the end of the string. */
  353. {
  354.     paramPtr->inArgs[0] = (long)zeroStr;
  355.     paramPtr->inArgs[1] = (long)pasStr;
  356.     paramPtr->request = xreqReturnToPas;
  357.     DoJsr(paramPtr);
  358. }
  359.  
  360.  
  361. pascal void ScanToReturn(paramPtr,scanHndl)
  362.     XCmdBlockPtr    paramPtr;    Ptr *    scanHndl;
  363. /* Move the pointer scanPtr along a zero-terminated 
  364.    string until it points at a Return character
  365.    or a zero byte.  */
  366. {
  367.     paramPtr->inArgs[0] = (long)scanHndl;
  368.     paramPtr->request = xreqScanToReturn;
  369.     DoJsr(paramPtr);
  370. }
  371.  
  372.  
  373. pascal void ScanToZero(paramPtr,scanHndl)
  374.     XCmdBlockPtr    paramPtr;    Ptr *    scanHndl;
  375. /* Move the pointer scanPtr along a zero-terminated 
  376.    string until it points at a zero byte.  */
  377. {
  378.     paramPtr->inArgs[0] = (long)scanHndl;
  379.     paramPtr->request = xreqScanToZero;
  380.     DoJsr(paramPtr);
  381. }
  382.  
  383.  
  384. pascal void DoJsr(paramPtr)
  385.     XCmdBlockPtr    paramPtr;
  386. {
  387.     CallPascal(paramPtr->entryPoint);
  388. }
  389.