home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / lang / skel_azt.sha / crsm.c < prev    next >
C/C++ Source or Header  |  1986-07-08  |  3KB  |  113 lines

  1.  
  2. /*    crsm -- CR state machine to force all textedit lines to end with CR
  3.  *    The intent is to force 4 kinds of end-of-line to become a single CR:
  4.  *        1. CR
  5.  *        2. LF
  6.  *        3. CRLF
  7.  *        4. LFCR
  8.  *
  9.  *    There are 4 states:
  10.  *        1. examine characters until end
  11.  *            on CR enter state 2 with next character
  12.  *            on LF enter state 3 with this character
  13.  *            on other characters, remain in state 1 with next character
  14.  *        2. examine characters
  15.  *            on end return to state 1 to terminate
  16.  *            on LF delete a character and remain in state 2 with next
  17.  *                character (which is in this position after the delete)
  18.  *            on CR remain in state 2 with next character
  19.  *            on other characters, return to state 1 with next character
  20.  *        3. replace the LF with a CR, examine next character
  21.  *            on end return to state 1 to terminate
  22.  *            on CR enter state 4
  23.  *            on LF remain in state 3
  24.  *            on other characters, return to state 1 with this character
  25.  *        4. delete the extraneous CR, examine next character (which is
  26.  *                in this position after the delete)
  27.  *            on end return to state 1 to terminate
  28.  *            on CR transfer to state 2 with next character
  29.  *            transfer to LF and other check in state 3 with next character
  30.  */
  31.  
  32. #include    <textedit.h>
  33.  
  34. void
  35. crsm()
  36. {
  37.     char    *cp;
  38.     extern    TEHandle    hTE;
  39.     Boolean    run;
  40.     extern Boolean    crsmccr(), crsmeof(), crsmfcr();
  41.  
  42.     cp = *((*hTE)->hText);
  43.     run = TRUE;
  44.     while (run) {
  45.         if (*cp == '\r')                /* state 1 */
  46.             run = crsmfcr(++cp);        /* enter state 2 */
  47.         else if (*cp == '\n')
  48.             run = crsmccr(cp);            /* enter state 3 */
  49.         else
  50.             run = !crsmeof(cp++);
  51.     };
  52. }    /* end of crsm() */
  53.  
  54. Boolean
  55. crsmccr(cp)                                /* state 3 */
  56. char    *cp;
  57. {
  58.     extern Boolean    crsmeof(), crsmfcr();
  59.     extern void    crsmdch();
  60.  
  61.     while (TRUE) {
  62.         *cp++ = '\r';
  63.         if (crsmeof(cp))
  64.             return(FALSE);
  65.         if (*cp == '\r') {                /* enter state 4 */
  66.             crsmdch(cp);                /* state 4 */
  67.             if (crsmeof(cp))
  68.                 return(FALSE);            /* return to state 1 to exit */
  69.             if (*cp == '\r')
  70.                 return(crsmfcr(++cp));    /* enter state 2 */
  71.         };
  72.         if (*cp != '\n')
  73.             return(TRUE);                /* return to state 1 */
  74.     };
  75. }    /* end of crsmccr() */
  76.  
  77. void
  78. crsmdch(cp)
  79. char    *cp;
  80. {
  81.     extern    TEHandle    hTE;
  82.  
  83.     (*hTE)->selStart = (short)(cp - *((*hTE)->hText));
  84.     (*hTE)->selEnd = (*hTE)->selStart;
  85.     TEDelete(hTE);
  86. }    /* end of crsmdch() */
  87.  
  88. Boolean
  89. crsmeof(cp)
  90. char    *cp;
  91. {
  92.     extern    TEHandle    hTE;
  93.  
  94.     return(cp >= ((*hTE)->teLength + *((*hTE)->hText)));
  95. }    /* end of crsmeof */
  96.  
  97. Boolean
  98. crsmfcr(cp)                                /* state 2 */
  99. char    *cp;
  100. {
  101.     extern Boolean    crsmccr(), crsmeof();
  102.     extern void    crsmdch();
  103.  
  104.     while (TRUE) {
  105.         if (crsmeof(cp))
  106.             return(FALSE);                /* return to state 1 to exit */
  107.         if (*cp == '\n')
  108.             crsmdch(cp);
  109.         else if (*cp++ != '\r')
  110.             return(TRUE);                /* return to state 1 */
  111.     };
  112. }    /* end of crsmfcr */
  113.