
/*************************************************************
*       phraseXcmd.c v1.0
*       chunk words into phrases
*       needs: ANSI-A4, MacTraps, HyperXCmd.h,
*               XCmdGlue.inc.c, and phrase.c
*       THINK C v4.0
*       Richard Rathe 8/90
*/

extern int __GetA4(void);       /* prototype for #includes */

#include <HyperXCmd.h>          /* for XCmdBlock struct */
#include <MacTypes.h>           /* for Handle, etc. */
#include <SetUpA4.h>            /* for register A4 functions */
#include <string.h>             /* for strlen and strcpy */

#include "phrase.h"             /* for #defines and prototypes */

#define NO_ERROR        0       /* all is well */
#define PARAM_ERR       1       /* wrong number of params error */
#define SIZE_ERR        2       /* text too big error */

#define SEGMENT         30000   /* max size for HyperCard containers */

                                /* prototype */
extern void     phraseXcmd(char *in,char *out,char *stop,XCmdBlockPtr paramPtr);

pascal void main(paramPtr)      /* XFCN entry point */
        XCmdBlockPtr paramPtr;
{
        int error;
        char *text,*list,*stoplist;
        
        RememberA0();           /* so we can recover */
        SetUpA4();              /* so we can find literals */
        
        error = NO_ERROR;       /* clear error flag */
        
        if (paramPtr->paramCount != 2)  /* need two parameters */
                error = PARAM_ERR;
        
        HLock(paramPtr->params[0]);     /* lock handles */
        HLock(paramPtr->params[1]);
        
        text = *(paramPtr->params[0]);          /* get first param */
        stoplist = *(paramPtr->params[1]);      /* get second param */

        
        if(strlen(text) > SEGMENT / MAXWORD)    /* check size */
                error = SIZE_ERR;

        paramPtr->returnValue = NewHandle(SEGMENT);     /* get storage */
        HLock(paramPtr->returnValue);
        list = *(paramPtr->returnValue);
        
        if(error == NO_ERROR)                           /* if no error */
                phraseXcmd(text,list,stoplist,paramPtr);/* call phrase */
        else if(error == PARAM_ERR)                     /* else give message */
                strcpy(list,"error: syntax is \"put phrase(<source>,<stoplist>)
                        into destination\"");
        else if(error == SIZE_ERR)
                strcpy(list,"error: source text too large!");

        HUnlock(paramPtr->params[0]);           /* unlock handles */
        HUnlock(paramPtr->params[1]);
        HUnlock(paramPtr->returnValue);

        RestoreA4();                            /* restore A4 */
}

/* replacement for phrase() with wait cursor call added */

void phraseXcmd(char *in,char *out,char *stop,XCmdBlockPtr paramPtr)
{
        char flag;
        char buf[MAXCHAR];
        char HCmessage[MAXCHAR / 2];
        
        strcpy(HCmessage,"set cursor to busy"); /* init message */
        CtoPstr(HCmessage);                     /* convert to pascal string */

        *out = EOS;                             /* just to be sure */

        while(*(in = getword(in,buf,&flag)) != EOS)     /* get a word */
        {
                addword(out,buf,stop,flag);             /* add it */
                        /* spin the beachball */
                SendCardMessage(paramPtr,(StringPtr) HCmessage);
        }

        addword(out,buf,stop,flag);                     /* last word */
}

