home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / hc / xcmd_glu.sit / XCmdGlue.inc.c < prev    next >
Text File  |  1987-08-06  |  20KB  |  692 lines

  1. /*
  2.     XCmdGlue.inc.c  Definitions for calling all standard 
  3.     HyperCard callback routines from C.  Include "HyperXCmd.h" 
  4.     before your program and this file after it.  Arguments are slightly 
  5.     different from Pascal.  The first argument is always a pointer to
  6.     the parameter block that HyperCard passed to the XCMD or XFCN.
  7.     This file derived from the Pascal interface, which is included as
  8.     comments.
  9.     
  10.       ⌐Apple Computer, Inc. 1987
  11.     All Rights Reserved.
  12.  
  13.     See CFlash.C for an example of how to include this module in your 
  14.     C program.
  15. */
  16.  
  17.  
  18. /*  Do a simple jump subroutine to a procedure with no arguments.  The 
  19.     address of the procedure is in the argument.   Declared above in 
  20.     HyperXCmd.h.  */
  21. /*    typedef void (*MyProcPtr) ();  */
  22. /*  PROCEDURE DoJsr(addr: ProcPtr); INLINE $205F,$4E90;  */
  23.  
  24.  
  25. pascal void SendCardMessage(paramPtr,msg)
  26.     XCmdBlockPtr    paramPtr;    StringPtr    msg;
  27.     /* Send a HyperCard message (a command with arguments) to the current card.
  28.        msg is a pointer to a Pascal format string.  */
  29. {
  30.     paramPtr->inArgs[0] = (long)msg;
  31.     paramPtr->request = xreqSendCardMessage;
  32.     ((MyProcPtr) (paramPtr->entryPoint))();
  33. }
  34. /*    PROCEDURE SendCardMessage(msg: Str255);
  35. BEGIN
  36.   WITH paramPtr^ DO
  37.     BEGIN
  38.       inArgs[1] := ORD(@msg);
  39.       request := xreqSendCardMessage;
  40.       DoJsr(entryPoint);
  41.     END;
  42. END;   */
  43.  
  44.  
  45.  
  46. pascal Handle EvalExpr(paramPtr,expr)
  47.     XCmdBlockPtr    paramPtr;    StringPtr    expr;
  48.     /* Evaluate a HyperCard expression and return the answer.  The answer is
  49.        a handle to a zero-terminated string. */
  50. {
  51.     paramPtr->inArgs[0] = (long)expr;
  52.     paramPtr->request = xreqEvalExpr;
  53.     ((MyProcPtr) (paramPtr->entryPoint))();
  54.     return (Handle)paramPtr->outArgs[0];
  55. }
  56. /*  FUNCTION EvalExpr(expr: Str255): Handle;
  57. BEGIN
  58.   WITH paramPtr^ DO
  59.     BEGIN
  60.       inArgs[1] := ORD(@expr);
  61.       request := xreqEvalExpr;
  62.       DoJsr(entryPoint);
  63.       EvalExpr := Handle(outArgs[1]);
  64.     END;
  65. END;   */
  66.  
  67.  
  68. pascal long StringLength(paramPtr,strPtr)
  69.     XCmdBlockPtr    paramPtr;    StringPtr    strPtr;
  70. /* Count the characters from where strPtr points until the next zero byte. 
  71.    Does not count the zero itself.  strPtr must be a zero-terminated string. */
  72. {
  73.     paramPtr->inArgs[0] = (long)strPtr;
  74.     paramPtr->request = xreqStringLength;
  75.     ((MyProcPtr) (paramPtr->entryPoint))();
  76.     return (long)paramPtr->outArgs[0];
  77. }
  78. /*    FUNCTION StringLength(strPtr: Ptr): LongInt;
  79. BEGIN
  80.   WITH paramPtr^ DO
  81.     BEGIN
  82.       inArgs[1] := ORD(strPtr);
  83.       request := xreqStringLength;
  84.       DoJsr(entryPoint);
  85.       StringLength := outArgs[1];
  86.     END;
  87. END;   */
  88.  
  89.  
  90. pascal Ptr StringMatch(paramPtr,pattern,target)
  91.     XCmdBlockPtr    paramPtr;    StringPtr    pattern;    Ptr    target;
  92. /* Perform case-insensitive match looking for pattern anywhere in
  93.    target, returning a pointer to first character of the first match,
  94.    in target or NIL if no match found.  pattern is a Pascal string,
  95.    and target is a zero-terminated string. */
  96. {
  97.     paramPtr->inArgs[0] = (long)pattern;
  98.     paramPtr->inArgs[1] = (long)target;
  99.     paramPtr->request = xreqStringMatch;
  100.     ((MyProcPtr) (paramPtr->entryPoint))();
  101.     return (Ptr)paramPtr->outArgs[0];
  102. }
  103. /*    FUNCTION StringMatch(pattern: Str255; target: Ptr): Ptr;
  104. BEGIN
  105.   WITH paramPtr^ DO
  106.     BEGIN
  107.       inArgs[1] := ORD(@pattern);
  108.       inArgs[2] := ORD(target);
  109.       request := xreqStringMatch;
  110.       DoJsr(entryPoint);
  111.       StringMatch := Ptr(outArgs[1]);
  112.     END;
  113. END;   */
  114.  
  115.  
  116. pascal void ZeroBytes(paramPtr,dstPtr,longCount)
  117.     XCmdBlockPtr    paramPtr;    Ptr    dstPtr;    long    longCount;
  118. /* Write zeros into memory starting at destPtr and going for longCount 
  119.    number of bytes. */
  120. {
  121.     paramPtr->inArgs[0] = (long)dstPtr;
  122.     paramPtr->inArgs[1] = longCount;
  123.     paramPtr->request = xreqZeroBytes;
  124.     ((MyProcPtr) (paramPtr->entryPoint))();
  125. }
  126. /*    PROCEDURE ZeroBytes(dstPtr: Ptr; longCount: LongInt);
  127. BEGIN
  128.   WITH paramPtr^ DO
  129.     BEGIN
  130.       inArgs[1] := ORD(dstPtr);
  131.       inArgs[2] := longCount;
  132.       request := xreqZeroBytes;
  133.       DoJsr(entryPoint);
  134.     END;
  135. END;   */
  136.  
  137.  
  138. pascal Handle PasToZero(paramPtr,pasStr)
  139.     XCmdBlockPtr    paramPtr;    StringPtr    pasStr;
  140. /* Convert a Pascal string to a zero-terminated string.  Returns a handle
  141.    to a new zero-terminated string.  The caller must dispose the handle.
  142.    You'll need to do this for any result or argument you send from 
  143.    your XCMD to HyperTalk. */
  144. {
  145.     paramPtr->inArgs[0] = (long)pasStr;
  146.     paramPtr->request = xreqPasToZero;
  147.     ((MyProcPtr) (paramPtr->entryPoint))();
  148.     return (Handle)paramPtr->outArgs[0];
  149. }
  150. /*    FUNCTION PasToZero(str: Str255): Handle;
  151. BEGIN
  152.   WITH paramPtr^ DO
  153.     BEGIN
  154.       inArgs[1] := ORD(@str);
  155.       request := xreqPasToZero;
  156.       DoJsr(entryPoint);
  157.       PasToZero := Handle(outArgs[1]);
  158.     END;
  159. END;   */
  160.  
  161.  
  162. pascal void ZeroToPas(paramPtr,zeroStr,pasStr)
  163.     XCmdBlockPtr    paramPtr;    char    *zeroStr;    StringPtr    pasStr;
  164. /* Fill the Pascal string with the contents of the zero-terminated
  165.    string.  You create the Pascal string and pass it in as a VAR 
  166.    parameter.  Useful for converting the arguments of any XCMD to 
  167.    Pascal strings. */
  168. {
  169.     paramPtr->inArgs[0] = (long)zeroStr;
  170.     paramPtr->inArgs[1] = (long)pasStr;
  171.     paramPtr->request = xreqZeroToPas;
  172.     ((MyProcPtr) (paramPtr->entryPoint))();
  173. }
  174. /*  PROCEDURE ZeroToPas(zeroStr: Ptr; VAR pasStr: Str255);
  175. BEGIN
  176.   WITH paramPtr^ DO
  177.     BEGIN
  178.       inArgs[1] := ORD(zeroStr);
  179.       inArgs[2] := ORD(@pasStr);
  180.       request := xreqZeroToPas;
  181.       DoJsr(entryPoint);
  182.     END;
  183. END;  */
  184.  
  185.  
  186. pascal long StrToLong(paramPtr,strPtr)
  187.     XCmdBlockPtr    paramPtr;    Str31 *    strPtr;
  188. /* Convert a string of ASCII decimal digits to an unsigned long integer. */
  189. {
  190.     paramPtr->inArgs[0] = (long)strPtr;
  191.     paramPtr->request = xreqStrToLong;
  192.     ((MyProcPtr) (paramPtr->entryPoint))();
  193.     return (long)paramPtr->outArgs[0];
  194. }
  195. /*    FUNCTION StrToLong(str: Str31): LongInt;
  196. BEGIN
  197.   WITH paramPtr^ DO
  198.     BEGIN
  199.       inArgs[1] := ORD(@str);
  200.       request := xreqStrToLong;
  201.       DoJsr(entryPoint);
  202.       StrToLong := outArgs[1];
  203.     END;
  204. END;   */
  205.  
  206.  
  207. pascal long StrToNum(paramPtr,str)
  208.     XCmdBlockPtr    paramPtr;    Str31 *     str;
  209. /* Convert a string of ASCII decimal digits to a signed long integer.
  210.    Negative sign is allowed. */
  211. {
  212.     paramPtr->inArgs[0] = (long)str;
  213.     paramPtr->request = xreqStrToNum;
  214.     ((MyProcPtr) (paramPtr->entryPoint))();
  215.     return paramPtr->outArgs[0];
  216. }
  217. /*    FUNCTION StrToNum(str: Str31): LongInt;
  218. BEGIN
  219.   WITH paramPtr^ DO
  220.     BEGIN
  221.       inArgs[1] := ORD(@str);
  222.       request := xreqStrToNum;
  223.       DoJsr(entryPoint);
  224.       StrToNum := outArgs[1];
  225.     END;
  226. END;  */
  227.  
  228.  
  229. pascal Boolean StrToBool(paramPtr,str)
  230.     XCmdBlockPtr    paramPtr;    Str31 *     str;
  231. /* Convert the Pascal strings 'true' and 'false' to booleans. */
  232. {
  233.     paramPtr->inArgs[0] = (long)str;
  234.     paramPtr->request = xreqStrToBool;
  235.     ((MyProcPtr) (paramPtr->entryPoint))();
  236.     return (Boolean)paramPtr->outArgs[0];
  237. }
  238. /*    FUNCTION StrToBool(str: Str31): BOOLEAN;
  239. BEGIN
  240.   WITH paramPtr^ DO
  241.     BEGIN
  242.       inArgs[1] := ORD(@str);
  243.       request := xreqStrToBool;
  244.       DoJsr(entryPoint);
  245.       StrToBool := BOOLEAN(outArgs[1]);
  246.     END;
  247. END;   */
  248.  
  249.  
  250. pascal void StrToExt(paramPtr,str,myext)
  251.     XCmdBlockPtr    paramPtr;    Str31 *     str;    extended *    myext;
  252.  /* Convert a string of ASCII decimal digits to an extended long integer.
  253.     Instead of returning a new extended, as Pascal does, it expects you 
  254.     to create myext and pass it in to be filled. */
  255. {
  256.     paramPtr->inArgs[0] = (long)str;
  257.     paramPtr->inArgs[1] = (long)myext;
  258.     paramPtr->request = xreqStrToExt;
  259.     ((MyProcPtr) (paramPtr->entryPoint))();
  260. }
  261. /*    FUNCTION StrToExt(str: Str31): Extended;
  262. VAR x: Extended;
  263. BEGIN
  264.   WITH paramPtr^ DO
  265.     BEGIN
  266.       inArgs[1] := ORD(@str);
  267.       inArgs[2] := ORD(@x);
  268.       request := xreqStrToExt;
  269.       DoJsr(entryPoint);
  270.       StrToExt := x;
  271.     END;
  272. END;   */
  273.  
  274.  
  275. pascal void LongToStr(paramPtr,posNum,mystr)
  276.     XCmdBlockPtr    paramPtr;    long     posNum;    Str31 *    mystr;
  277.  /* Convert an unsigned long integer to a Pascal string.  Instead of 
  278.     returning a new string, as Pascal does, it expects you to 
  279.     create mystr and pass it in to be filled. */
  280. {
  281.     paramPtr->inArgs[0] = (long)posNum;
  282.     paramPtr->inArgs[1] = (long)mystr;
  283.     paramPtr->request = xreqLongToStr;
  284.     ((MyProcPtr) (paramPtr->entryPoint))();
  285. }
  286. /*    FUNCTION LongToStr(posNum: LongInt): Str31;
  287. VAR str: Str31;
  288. BEGIN
  289.   WITH paramPtr^ DO
  290.     BEGIN
  291.       inArgs[1] := posNum;
  292.       inArgs[2] := ORD(@str);
  293.       request := xreqLongToStr;
  294.       DoJsr(entryPoint);
  295.       LongToStr := str;
  296.     END;
  297. END;   */
  298.  
  299.  
  300. pascal void NumToStr(paramPtr,num,mystr)
  301.     XCmdBlockPtr    paramPtr;    long     num;    Str31 *    mystr;
  302.  /* Convert a signed long integer to a Pascal string.  Instead of 
  303.     returning a new string, as Pascal does, it expects you to 
  304.     create mystr and pass it in to be filled. */
  305. {
  306.     paramPtr->inArgs[0] = num;
  307.     paramPtr->inArgs[1] = (long)mystr;
  308.     paramPtr->request = xreqNumToStr;
  309.     ((MyProcPtr) (paramPtr->entryPoint))();
  310. }
  311. /*    FUNCTION NumToStr(num: LongInt): Str31;
  312. VAR str: Str31;
  313. BEGIN
  314.   WITH paramPtr^ DO
  315.     BEGIN
  316.       inArgs[1] := num;
  317.       inArgs[2] := ORD(@str);
  318.       request := xreqNumToStr;
  319.       DoJsr(entryPoint);
  320.       NumToStr := str;
  321.     END;
  322. END;   */
  323.  
  324.  
  325. pascal void NumToHex(paramPtr,num,nDigits,mystr)
  326.     XCmdBlockPtr    paramPtr;    long     num;
  327.     short    nDigits;            Str31 *    mystr;
  328. /* Convert an unsigned long integer to a hexadecimal number and put it
  329.    into a Pascal string.  Instead of returning a new string, as 
  330.    Pascal does, it expects you to create mystr and pass it in to be filled. */
  331. {
  332.     paramPtr->inArgs[0] = num;
  333.     paramPtr->inArgs[1] = nDigits;
  334.     paramPtr->inArgs[2] = (long)mystr;
  335.     paramPtr->request = xreqNumToHex;
  336.     ((MyProcPtr) (paramPtr->entryPoint))();
  337. }
  338. /*    FUNCTION NumToHex(num: LongInt; nDigits: INTEGER): Str31;
  339. VAR str: Str31;
  340. BEGIN
  341.   WITH paramPtr^ DO
  342.     BEGIN
  343.       inArgs[1] := num;
  344.       inArgs[2] := nDigits;
  345.       inArgs[3] := ORD(@str);
  346.       request := xreqNumToHex;
  347.       DoJsr(entryPoint);
  348.       NumToHex := str;
  349.     END;
  350. END;   */
  351.  
  352.  
  353. pascal void BoolToStr(paramPtr,bool,mystr)
  354.     XCmdBlockPtr    paramPtr;    Boolean    bool;    Str31 *    mystr;
  355.  /* Convert a boolean to 'true' or 'false'.  Instead of returning 
  356.     a new string, as Pascal does, it expects you to create mystr
  357.     and pass it in to be filled. */
  358. {
  359.     paramPtr->inArgs[0] = (long)bool;
  360.     paramPtr->inArgs[1] = (long)mystr;
  361.     paramPtr->request = xreqBoolToStr;
  362.     ((MyProcPtr) (paramPtr->entryPoint))();
  363. }
  364. /*    FUNCTION BoolToStr(bool: BOOLEAN): Str31;
  365. VAR str: Str31;
  366. BEGIN
  367.   WITH paramPtr^ DO
  368.     BEGIN
  369.       inArgs[1] := LongInt(bool);
  370.       inArgs[2] := ORD(@str);
  371.       request := xreqBoolToStr;
  372.       DoJsr(entryPoint);
  373.       BoolToStr := str;
  374.     END;
  375. END;   */
  376.  
  377.  
  378. pascal void ExtToStr(paramPtr,myext,mystr)
  379.     XCmdBlockPtr    paramPtr;    extended *    myext;    Str31 *    mystr;
  380.  /* Convert an extended long integer to decimal digits in a string.  
  381.     Instead of returning a new string, as Pascal does, it expects 
  382.     you to create mystr and pass it in to be filled. */
  383. {
  384.     paramPtr->inArgs[0] = (long)myext;
  385.     paramPtr->inArgs[1] = (long)mystr;
  386.     paramPtr->request = xreqExtToStr;
  387.     ((MyProcPtr) (paramPtr->entryPoint))();
  388. }
  389. /*    FUNCTION ExtToStr(num: Extended): Str31;
  390. VAR str: Str31;
  391. BEGIN
  392.   WITH paramPtr^ DO
  393.     BEGIN
  394.       inArgs[1] := ORD(@num);
  395.       inArgs[2] := ORD(@str);
  396.       request := xreqExtToStr;
  397.       DoJsr(entryPoint);
  398.       ExtToStr := str;
  399.     END;
  400. END;   */
  401.  
  402.  
  403. pascal Handle GetGlobal(paramPtr,globName)
  404.     XCmdBlockPtr    paramPtr;    StringPtr    globName;
  405. /* Return a handle to a zero-terminated string containing the value of 
  406.    the specified HyperTalk global variable. */
  407. {
  408.     paramPtr->inArgs[0] = (long)globName;
  409.     paramPtr->request = xreqGetGlobal;
  410.     ((MyProcPtr) (paramPtr->entryPoint))();
  411.     return (Handle)paramPtr->outArgs[0];
  412. }
  413. /*    FUNCTION GetGlobal(globName: Str255): Handle;
  414. BEGIN
  415.   WITH paramPtr^ DO
  416.     BEGIN
  417.       inArgs[1] := ORD(@globName);
  418.       request := xreqGetGlobal;
  419.       DoJsr(entryPoint);
  420.       GetGlobal := Handle(outArgs[1]);
  421.     END;
  422. END;   */
  423.  
  424.  
  425. pascal void SetGlobal(paramPtr,globName,globValue)
  426.     XCmdBlockPtr    paramPtr;    StringPtr    globName;    Handle    globValue;
  427. /* Set the value of the specified HyperTalk global variable to be
  428.    the zero-terminated string in globValue.  The contents of the 
  429.    Handle are copied, so you must still dispose it afterwards.  */
  430. {
  431.     paramPtr->inArgs[0] = (long)globName;
  432.     paramPtr->inArgs[1] = (long)globValue;
  433.     paramPtr->request = xreqSetGlobal;
  434.     ((MyProcPtr) (paramPtr->entryPoint))();
  435. }
  436. /*    PROCEDURE SetGlobal(globName: Str255; globValue: Handle);
  437. BEGIN
  438.   WITH paramPtr^ DO
  439.     BEGIN
  440.       inArgs[1] := ORD(@globName);
  441.       inArgs[2] := ORD(globValue);
  442.       request := xreqSetGlobal;
  443.       DoJsr(entryPoint);
  444.     END;
  445. END;   */
  446.  
  447.  
  448. pascal Handle GetFieldByName(paramPtr,cardFieldFlag,fieldName)
  449.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  450.     StringPtr    fieldName;
  451. /* Return a handle to a zero-terminated string containing the value of 
  452.    field fieldName on the current card.  You must dispose the handle. */
  453. {
  454.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  455.     paramPtr->inArgs[1] = (long)fieldName;
  456.     paramPtr->request = xreqGetFieldByName;
  457.     ((MyProcPtr) (paramPtr->entryPoint))();
  458.     return (Handle)paramPtr->outArgs[0];
  459. }
  460. /*    FUNCTION GetFieldByName(cardFieldFlag: BOOLEAN; fieldName: Str255): Handle;
  461. BEGIN
  462.   WITH paramPtr^ DO
  463.     BEGIN
  464.       inArgs[1] := ORD(cardFieldFlag);
  465.       inArgs[2] := ORD(@fieldName);
  466.       request := xreqGetFieldByName;
  467.       DoJsr(entryPoint);
  468.       GetFieldByName := Handle(outArgs[1]);
  469.     END;
  470. END;   */
  471.  
  472.  
  473. pascal Handle GetFieldByNum(paramPtr,cardFieldFlag,fieldNum)
  474.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  475.     short    fieldNum;
  476. /* Return a handle to a zero-terminated string containing the value of 
  477.    field fieldNum on the current card.  You must dispose the handle. */
  478. {
  479.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  480.     paramPtr->inArgs[1] = fieldNum;
  481.     paramPtr->request = xreqGetFieldByNum;
  482.     ((MyProcPtr) (paramPtr->entryPoint))();
  483.     return (Handle)paramPtr->outArgs[0];
  484. }
  485. /*    FUNCTION GetFieldByNum(cardFieldFlag: BOOLEAN; fieldNum: INTEGER): Handle;
  486. BEGIN
  487.   WITH paramPtr^ DO
  488.     BEGIN
  489.       inArgs[1] := ORD(cardFieldFlag);
  490.       inArgs[2] := fieldNum;
  491.       request := xreqGetFieldByNum;
  492.       DoJsr(entryPoint);
  493.       GetFieldByNum := Handle(outArgs[1]);
  494.     END;
  495. END;   */
  496.  
  497.  
  498. pascal Handle GetFieldByID(paramPtr,cardFieldFlag,fieldID)
  499.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  500.     short    fieldID;
  501. /* Return a handle to a zero-terminated string containing the value of 
  502.    the field whise ID is fieldID.  You must dispose the handle. */
  503. {
  504.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  505.     paramPtr->inArgs[1] = fieldID;
  506.     paramPtr->request = xreqGetFieldByID;
  507.     ((MyProcPtr) (paramPtr->entryPoint))();
  508.     return (Handle)paramPtr->outArgs[0];
  509. }
  510. /*    FUNCTION GetFieldByID(cardFieldFlag: BOOLEAN; fieldID: INTEGER): Handle;
  511. BEGIN
  512.   WITH paramPtr^ DO
  513.     BEGIN
  514.       inArgs[1] := ORD(cardFieldFlag);
  515.       inArgs[2] := fieldID;
  516.       request := xreqGetFieldByID;
  517.       DoJsr(entryPoint);
  518.       GetFieldByID := Handle(outArgs[1]);
  519.     END;
  520. END;   */
  521.  
  522.  
  523. pascal void SetFieldByName(paramPtr,cardFieldFlag,fieldName,fieldVal)
  524.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  525.     StringPtr    fieldName;    Handle    fieldVal;
  526. /* Set the value of field fieldName to be the zero-terminated string 
  527.    in fieldVal.  The contents of the Handle are copied, so you must 
  528.    still dispose it afterwards. */
  529. {
  530.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  531.     paramPtr->inArgs[1] = (long)fieldName;
  532.     paramPtr->inArgs[2] = (long)fieldVal;
  533.     paramPtr->request = xreqSetFieldByName;
  534.     ((MyProcPtr) (paramPtr->entryPoint))();
  535. }
  536. /*    PROCEDURE SetFieldByName(cardFieldFlag: BOOLEAN; fieldName: Str255; fieldVal: Handle);
  537. BEGIN
  538.   WITH paramPtr^ DO
  539.     BEGIN
  540.       inArgs[1] := ORD(cardFieldFlag);
  541.       inArgs[2] := ORD(@fieldName);
  542.       inArgs[3] := ORD(fieldVal);
  543.       request := xreqSetFieldByName;
  544.       DoJsr(entryPoint);
  545.     END;
  546. END;   */
  547.  
  548.  
  549. pascal void SetFieldByNum(paramPtr,cardFieldFlag,fieldNum,fieldVal)
  550.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  551.     short    fieldNum;            Handle    fieldVal;
  552. /* Set the value of field fieldNum to be the zero-terminated string 
  553.    in fieldVal.  The contents of the Handle are copied, so you must 
  554.    still dispose it afterwards. */
  555. {
  556.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  557.     paramPtr->inArgs[1] = fieldNum;
  558.     paramPtr->inArgs[2] = (long)fieldVal;
  559.     paramPtr->request = xreqSetFieldByNum;
  560.     ((MyProcPtr) (paramPtr->entryPoint))();
  561. }
  562. /*    PROCEDURE SetFieldByNum(cardFieldFlag: BOOLEAN; fieldNum: INTEGER; fieldVal: Handle);
  563. BEGIN
  564.   WITH paramPtr^ DO
  565.     BEGIN
  566.       inArgs[1] := ORD(cardFieldFlag);
  567.       inArgs[2] := fieldNum;
  568.       inArgs[3] := ORD(fieldVal);
  569.       request := xreqSetFieldByNum;
  570.       DoJsr(entryPoint);
  571.     END;
  572. END;   */
  573.  
  574.  
  575. pascal void SetFieldByID(paramPtr,cardFieldFlag,fieldID,fieldVal)
  576.     XCmdBlockPtr    paramPtr;    Boolean    cardFieldFlag;
  577.     short    fieldID;            Handle    fieldVal;
  578. /* Set the value of the field whose ID is fieldID to be the zero-
  579.    terminated string in fieldVal.  The contents of the Handle are 
  580.    copied, so you must still dispose it afterwards. */
  581. {
  582.     paramPtr->inArgs[0] = (long)cardFieldFlag;
  583.     paramPtr->inArgs[1] = fieldID;
  584.     paramPtr->inArgs[2] = (long)fieldVal;
  585.     paramPtr->request = xreqSetFieldByID;
  586.     ((MyProcPtr) (paramPtr->entryPoint))();
  587. }
  588. /*    PROCEDURE SetFieldByID(cardFieldFlag: BOOLEAN; fieldID: INTEGER; fieldVal: Handle);
  589. BEGIN
  590.   WITH paramPtr^ DO
  591.     BEGIN
  592.       inArgs[1] := ORD(cardFieldFlag);
  593.       inArgs[2] := fieldID;
  594.       inArgs[3] := ORD(fieldVal);
  595.       request := xreqSetFieldByID;
  596.       DoJsr(entryPoint);
  597.     END;
  598. END;   */
  599.  
  600.  
  601. pascal Boolean StringEqual(paramPtr,str1,str2)
  602.     XCmdBlockPtr    paramPtr;    Str31 *     str1;    Str31 *     str2;
  603. /* Return true if the two strings have the same characters.  
  604.    Case insensitive compare of the strings. */
  605. {
  606.     paramPtr->inArgs[0] = (long)str1;
  607.     paramPtr->inArgs[1] = (long)str2;
  608.     paramPtr->request = xreqStringEqual;
  609.     ((MyProcPtr) (paramPtr->entryPoint))();
  610.     return (Boolean)paramPtr->outArgs[0];
  611. }
  612. /*    FUNCTION StringEqual(str1,str2: Str255): BOOLEAN;
  613. BEGIN
  614.   WITH paramPtr^ DO
  615.     BEGIN
  616.       inArgs[1] := ORD(@str1);
  617.       inArgs[2] := ORD(@str2);
  618.       request := xreqStringEqual;
  619.       DoJsr(entryPoint);
  620.       StringEqual := BOOLEAN(outArgs[1]);
  621.     END;
  622. END;   */
  623.  
  624.  
  625. pascal void ReturnToPas(paramPtr,zeroStr,pasStr)
  626.     XCmdBlockPtr    paramPtr;    Ptr    zeroStr;    StringPtr    pasStr;
  627. /* zeroStr points into a zero-terminated string.  Collect the 
  628.    characters from there to the next carriage Return and return 
  629.    them in the Pascal string pasStr.  If a Return is not found, 
  630.    collect chars until the end of the string. */
  631. {
  632.     paramPtr->inArgs[0] = (long)zeroStr;
  633.     paramPtr->inArgs[1] = (long)pasStr;
  634.     paramPtr->request = xreqReturnToPas;
  635.     ((MyProcPtr) (paramPtr->entryPoint))();
  636. }
  637. /*    PROCEDURE ReturnToPas(zeroStr: Ptr; VAR pasStr: Str255);
  638. BEGIN
  639.   WITH paramPtr^ DO
  640.     BEGIN
  641.       inArgs[1] := ORD(zeroStr);
  642.       inArgs[2] := ORD(@pasStr);
  643.       request := xreqReturnToPas;
  644.       DoJsr(entryPoint);
  645.     END;
  646. END;   */
  647.  
  648.  
  649. pascal void ScanToReturn(paramPtr,scanHndl)
  650.     XCmdBlockPtr    paramPtr;    Ptr *    scanHndl;
  651. /* Move the pointer scanPtr along a zero-terminated 
  652.    string until it points at a Return character
  653.    or a zero byte.  */
  654. {
  655.     paramPtr->inArgs[0] = (long)scanHndl;
  656.     paramPtr->request = xreqScanToReturn;
  657.     ((MyProcPtr) (paramPtr->entryPoint))();
  658. }
  659. /*    PROCEDURE ScanToReturn(VAR scanPtr: Ptr);
  660. BEGIN
  661.   WITH paramPtr^ DO
  662.     BEGIN
  663.       inArgs[1] := ORD(@scanPtr);
  664.       request := xreqScanToReturn;
  665.       DoJsr(entryPoint);
  666.     END;
  667. END;   */
  668.  
  669.  
  670. pascal void ScanToZero(paramPtr,scanHndl)
  671.     XCmdBlockPtr    paramPtr;    Ptr *    scanHndl;
  672. /* Move the pointer scanPtr along a zero-terminated 
  673.    string until it points at a zero byte.  */
  674. {
  675.     paramPtr->inArgs[0] = (long)scanHndl;
  676.     paramPtr->request = xreqScanToZero;
  677.     ((MyProcPtr) (paramPtr->entryPoint))();
  678. }
  679. /*    PROCEDURE ScanToZero(VAR scanPtr: Ptr);
  680. BEGIN
  681.   WITH paramPtr^ DO
  682.     BEGIN
  683.       inArgs[1] := ORD(@scanPtr);
  684.       request := xreqScanToZero;
  685.       DoJsr(entryPoint);
  686.     END;
  687. END;   */
  688.  
  689.  
  690.  
  691.  
  692.