BCXLogo   BCX Console Demonstration Program S153.bas

 TYPE LIST
   Cnt AS integer
   b[32] AS CHAR
   nxt AS LIST PTR
   prv AS LIST PTR
 END TYPE
 
 CONST sp = 0
 
 DIM Head AS LIST PTR
 
 DIM a$,buffer$[40], i, j
 
 a$ = "this is a test"
 i = SPLIT(buffer$,a$," ", sp)
 FOR j = 0 TO i - 1
   CALL AddString(buffer$[j])
 NEXT
 a$ = "the quick brown fox jumped over the lazy dog"
 i = SPLIT(buffer$,a$," ", sp)
 FOR j = 0 TO i - 1
   CALL AddString(buffer$[j])
 NEXT
 a$ = "to error is human to really screw up requires a computer"
 i = SPLIT(buffer$,a$," ", sp)
 FOR j = 0 TO i - 1
   CALL AddString(buffer$[j])
 NEXT
 a$ = "if a function takes up more space than can fit on a screen it has an error in it"
 i = SPLIT(buffer$,a$," ", sp)
 FOR j = 0 TO i - 1
   CALL AddString(buffer$[j])
 NEXT
 
 CALL OutPutData()
 !fflush(stdout);
 getchar();
 
 SUB OutPutData
   IF Head THEN
     WHILE Head->prv
       Head = Head->prv
     WEND
     WHILE Head
       PRINT Head->b$; Head->Cnt
       Head = Head->nxt
     WEND
   END IF
 END SUB
 
 SUB AddString(a$)
   DIM RAW PHead AS LIST PTR
   DIM RAW CHead AS LIST PTR
   DIM RAW NHead AS LIST PTR
 
   IF !(Head) THEN
     Head = MakeRecord()
     Head->b$ = a$
     Head->Cnt = 1
     EXIT SUB
   END IF
 
   CHead = Head
   WHILE CHead->b$ < a$
     IF CHead->nxt THEN
       CHead = CHead->nxt
     ELSE
       PHead = CHead
       CHead->nxt = MakeRecord()
       CHead = CHead->nxt
       CHead->b$ = a$
       CHead->Cnt = 1
       CHead->prv = PHead
       EXIT SUB
     END IF
   WEND
 
   IF CHead->b$ = a$ THEN
     CHead->Cnt++
     EXIT SUB
   END IF
 
   WHILE CHead->b$ > a$
     IF CHead->prv THEN
       CHead = CHead->prv
     ELSE
       PHead = CHead
       CHead->prv = MakeRecord()
       CHead = CHead->prv
       CHead->b$ = a$
       CHead->Cnt = 1
       CHead->nxt = PHead
       EXIT SUB
     END IF
   WEND
 
   IF CHead->b$ = a$ THEN
     CHead->Cnt++
     EXIT SUB
   END IF
 
   NHead = MakeRecord()
   NHead->b$ = a$
   NHead->Cnt = 1
 
   PHead = CHead->nxt
   CHead->nxt = NHead
   NHead->nxt = PHead
   NHead->prv = CHead
   PHead->prv = NHead
 
 END SUB
 
 FUNCTION MakeRecord() AS LIST PTR
 !   return(calloc(1, sizeof(LIST)));
 END FUNCTION