! ! Changes spaces to tabs (intelligently) and changes tabs to spaces. The ! spaces->tabs translation is tricky: ENTAB is designed to NOT put tabs ! into comments. The method of doing this is to NOT replace a single ! space which is on a tab stop with the tab (which would be correct). ! Most comments have only single spaces in them so this is quite effective. ! ! Note: I had a terrible time trying to make these routines work with the screen ! in UPDATE mode and using the screen image -- the data at the cursor was not ! always what I expected, even when forcing TPU to update the screen first. ! I therefore disable the display, do everything on the real data, and then ! re-enable the display. ! ! Last Modified: ! 11/13/85 G. Van Baren Initial release ! PROCEDURE LSI_ENTAB LOCAL COL, LOC, START_TAB, END_TAB, TAB_RANGE, SAVE_POS; SET(SCREEN_UPDATE, OFF); SAVE_POS := MARK(NONE); POSITION(BEGINNING_OF(CURRENT_BUFFER)); LOOP ! Find the first space. LOC := SEARCH(" ", FORWARD, EXACT); EXITIF LOC = 0; POSITION(LOC); START_TAB := MARK(NONE); LOOP ! Translate spaces into TABs while there are more spaces. Note that ! a single space on a tab stop will never be changed into a TAB ! unless it is followed by 8 more spaces. MOVE_HORIZONTAL(1); EXITIF (CURRENT_OFFSET = LENGTH(CURRENT_LINE)) OR (GET_INFO(CURRENT_BUFFER, "CHARACTER") <> " "); COL := GET_INFO(CURRENT_BUFFER, "OFFSET_COLUMN"); IF (COL / 8) * 8 = COL THEN END_TAB := MARK(NONE); TAB_RANGE := CREATE_RANGE(START_TAB, END_TAB, NONE); ! A single tab IF LENGTH(TAB_RANGE) < 9 THEN ERASE(TAB_RANGE); DELETE(TAB_RANGE); COPY_TEXT(ASCII(9)); EXITIF 1; ELSE ! There were 9 spaces -- a space on a tab stop and 8 more spaces ERASE(TAB_RANGE); DELETE(TAB_RANGE); COPY_TEXT(ASCII(9) + ASCII(9)); EXITIF 1; ENDIF; ENDIF; ENDLOOP; ENDLOOP; SET(SCREEN_UPDATE, ON); POSITION(SAVE_POS); ENDPROCEDURE PROCEDURE LSI_DETAB LOCAL COL, LOC, SAVE_POS; SET(SCREEN_UPDATE, OFF); SAVE_POS := MARK(NONE); POSITION(BEGINNING_OF(CURRENT_BUFFER)); LOOP ! Find the TAB to expand LOC := SEARCH(ASCII(9), FORWARD, EXACT); EXITIF LOC = 0; POSITION(LOC); ERASE(LOC); LOOP ! Substitute spaces until it is aligned correctly COL := GET_INFO(CURRENT_BUFFER, "OFFSET_COLUMN"); EXITIF (COL / 8) * 8 = COL; COPY_TEXT(" "); ENDLOOP; COPY_TEXT(" "); ENDLOOP; SET(SCREEN_UPDATE, ON); POSITION(SAVE_POS); ENDPROCEDURE