1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650 |
- #define BUILDING_OPENDOORS
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include "OpenDoor.h"
- #include "ODTypes.h"
- #include "ODGen.h"
- #include "ODCore.h"
- #include "ODKrnl.h"
- #include "ODStat.h"
- #include "ODCom.h"
- #include "ODScrn.h"
- #define IS_EOL_CHAR(ch) ((ch) == '\n' || (ch) == '\r' || (ch) == '\0')
- #define LINE_ARRAY_GROW_SIZE 20
- #define BUFFER_GROW_SIZE 4096
- #define ANSI_SCROLL_DISTANCE 7
- #define PRE_DRAIN_TIME 10000
- #define MAX_TAB_STOP_SIZE 8
- #define DEFAULT_TAB_STOP_SIZE 8
- #define DEFAULT_LINE_BREAK "\n"
- #define REDRAW_NO_BOUNDARY 0xffff
- static tODEditOptions ODEditOptionsDefault =
- {
- 1, 1, 80, 23,
- FORMAT_PARAGRAPH_BREAKS,
- NULL,
- NULL,
- EFLAG_NORMAL,
- };
- typedef struct
- {
- char *pszEditBuffer;
- UINT unBufferSize;
- tODEditOptions *pUserOptions;
- UINT unCurrentLine;
- UINT unCurrentColumn;
- UINT unLineScrolledToTop;
- UINT unAreaWidth;
- UINT unAreaHeight;
- char **papchStartOfLine;
- UINT unLineArraySize;
- UINT unLinesInBuffer;
- BOOL bInsertMode;
- UINT unTabStopSize;
- UINT unScrollDistance;
- char *pszLineBreak;
- char *pszParagraphBreak;
- BOOL bWordWrapLongLines;
- void *pRememberBuffer;
- } tEditInstance;
- static BOOL ODEditSetupInstance(tEditInstance *pEditInstance,
- char *pszBufferToEdit, UINT unBufferSize, tODEditOptions *pUserOptions);
- static void ODEditRedrawArea(tEditInstance *pEditInstance);
- static void ODEditDrawAreaLine(tEditInstance *pEditInstance,
- UINT unAreaLineToDraw);
- static INT ODEditMainLoop(tEditInstance *pEditInstance);
- static void ODEditGotoPreviousLine(tEditInstance *pEditInstance);
- static void ODEditGotoNextLine(tEditInstance *pEditInstance);
- static BOOL ODEditScrollArea(tEditInstance *pEditInstance, INT nDistance);
- static BOOL ODEditRecommendFullRedraw(tEditInstance *pEditInstance,
- UINT unEstPartialRedrawBytes, BOOL bDefault);
- static UINT ODEditEstDrawBytes(tEditInstance *pEditInstance,
- UINT unStartRedrawLine, UINT unStartRedrawColumn, UINT unFinishRedrawLine,
- UINT unFinishRedrawColumn);
- static UINT ODEditGetCurrentLineInArea(tEditInstance *pEditInstance);
- static void ODEditUpdateCursorPos(tEditInstance *pEditInstance);
- static void ODEditUpdateCursorIfMoved(tEditInstance *pEditInstance);
- static tODResult ODEditEnterText(tEditInstance *pEditInstance,
- char *pszEntered, BOOL bInsertMode);
- static void ODEditSetBreakSequence(tEditInstance *pEditInstance,
- char chFirstEOLChar, char chSecondEOLChar);
- static BOOL ODEditCursorLeft(tEditInstance *pEditInstance);
- static void ODEditDeleteCurrentChar(tEditInstance *pEditInstance);
- static void ODEditDeleteCurrentLine(tEditInstance *pEditInstance);
- static BOOL ODEditPastEndOfCurLine(tEditInstance *pEditInstance);
- static size_t ODEditRememberBufferSize(tEditInstance *pEditInstance);
- static void ODEditRememberArea(tEditInstance *pEditInstance,
- void *pRememberedArea);
- static void ODEditRedrawChanged(tEditInstance *pEditInstance,
- void *pRememberedArea, UINT unUpperBoundary, UINT unLowerBoundary);
- static BOOL ODEditDetermineChanged(tEditInstance *pEditInstance,
- void *pRememberedArea, UINT unUpperBoundary, UINT unLowerBoundary,
- UINT *punStartRedrawLine, UINT *punStartRedrawColumn,
- UINT *punFinishRedrawLine, UINT *punFinishRedrawColumn);
- static void ODEditRedrawSubArea(tEditInstance *pEditInstance,
- UINT unStartRedrawLine, UINT unStartRedrawColumn, UINT unFinishRedrawLine,
- UINT unFinishRedrawColumn);
- static void ODEditGetActualCurPos(tEditInstance *pEditInstance,
- UINT *punRow, UINT *punColumn);
- static BOOL ODEditIsEOLForMode(tEditInstance *pEditInstance, char chToTest);
- static BOOL ODEditBufferFormatAndIndex(tEditInstance *pEditInstance);
- static UINT ODEditBufferGetLineLength(tEditInstance *pEditInstance,
- UINT unBufferLine);
- static UINT ODEditBufferGetTotalLines(tEditInstance *pEditInstance);
- static char *ODEditBufferGetCharacter(tEditInstance *pEditInstance,
- UINT unBufferLine, UINT unBufferColumn);
- static tODResult ODEditBufferMakeSpace(tEditInstance *pEditInstance,
- UINT unLine, UINT unColumn, UINT unNumChars);
- static tODResult ODEditTryToGrow(tEditInstance *pEditInstance,
- UINT unSizeNeeded);
- ODAPIDEF INT ODCALL od_multiline_edit(char *pszBufferToEdit, UINT unBufferSize,
- tODEditOptions *pEditOptions)
- {
- tEditInstance EditInstance;
- INT nToReturn;
-
- TRACE(TRACE_API, "od_node_open()");
-
- if(!bODInitialized) od_init();
- OD_API_ENTRY();
-
- if(pszBufferToEdit == NULL || unBufferSize == 0)
- {
- od_control.od_error = ERR_PARAMETER;
- OD_API_EXIT();
- return(OD_MULTIEDIT_ERROR);
- }
-
- if(!(od_control.user_ansi || od_control.user_avatar))
- {
- od_control.od_error = ERR_NOGRAPHICS;
- OD_API_EXIT();
- return(OD_MULTIEDIT_ERROR);
- }
-
- if(!ODEditSetupInstance(&EditInstance, pszBufferToEdit, unBufferSize,
- pEditOptions))
- {
- OD_API_EXIT();
- return(OD_MULTIEDIT_ERROR);
- }
-
-
- if(!ODEditBufferFormatAndIndex(&EditInstance))
- {
- od_control.od_error = ERR_MEMORY;
- OD_API_EXIT();
- return(OD_MULTIEDIT_ERROR);
- }
-
- ODStatStartArrowUse();
-
-
-
-
- ODWaitDrain(PRE_DRAIN_TIME);
-
- ODEditRedrawArea(&EditInstance);
-
- nToReturn = ODEditMainLoop(&EditInstance);
-
- ODStatEndArrowUse();
-
-
- EditInstance.pUserOptions->pszFinalBuffer = EditInstance.pszEditBuffer;
- EditInstance.pUserOptions->unFinalBufferSize = unBufferSize;
- OD_API_EXIT();
- return(nToReturn);
- }
- static BOOL ODEditSetupInstance(tEditInstance *pEditInstance,
- char *pszBufferToEdit, UINT unBufferSize, tODEditOptions *pUserOptions)
- {
- ASSERT(pEditInstance != NULL);
- ASSERT(pszBufferToEdit != NULL);
-
- pEditInstance->pszEditBuffer = pszBufferToEdit;
- pEditInstance->unBufferSize = unBufferSize;
- if(pUserOptions == NULL)
- {
-
- pEditInstance->pUserOptions = &ODEditOptionsDefault;
- }
- else
- {
-
- pEditInstance->pUserOptions = pUserOptions;
-
-
- if(pUserOptions->nAreaLeft == 0)
- {
- pUserOptions->nAreaLeft = ODEditOptionsDefault.nAreaLeft;
- }
- if(pUserOptions->nAreaRight == 0)
- {
- pUserOptions->nAreaRight = ODEditOptionsDefault.nAreaRight;
- }
- if(pUserOptions->nAreaTop == 0)
- {
- pUserOptions->nAreaTop = ODEditOptionsDefault.nAreaTop;
- }
- if(pUserOptions->nAreaBottom == 0)
- {
- pUserOptions->nAreaBottom = ODEditOptionsDefault.nAreaBottom;
- }
- }
- pEditInstance->unCurrentLine = 0;
- pEditInstance->unCurrentColumn = 0;
- pEditInstance->unLineScrolledToTop = 0;
- pEditInstance->papchStartOfLine = NULL;
- pEditInstance->unLineArraySize = 0;
- pEditInstance->unLinesInBuffer = 0;
- pEditInstance->unAreaWidth = (UINT)pEditInstance->pUserOptions->
- nAreaRight - (UINT)pEditInstance->pUserOptions->nAreaLeft + 1;
- pEditInstance->unAreaHeight = (UINT)pEditInstance->pUserOptions->
- nAreaBottom - (UINT)pEditInstance->pUserOptions->nAreaTop + 1;
- pEditInstance->bInsertMode = TRUE;
- pEditInstance->unTabStopSize = DEFAULT_TAB_STOP_SIZE;
-
-
-
- switch(pEditInstance->pUserOptions->TextFormat)
- {
- case FORMAT_FTSC_MESSAGE:
-
-
- pEditInstance->pszLineBreak = "";
- pEditInstance->pszParagraphBreak = "\r";
- break;
- case FORMAT_PARAGRAPH_BREAKS:
-
-
- pEditInstance->pszLineBreak = "";
- pEditInstance->pszParagraphBreak = NULL;
- break;
- case FORMAT_LINE_BREAKS:
- case FORMAT_NO_WORDWRAP:
-
-
-
-
- pEditInstance->pszLineBreak = NULL;
- pEditInstance->pszParagraphBreak = "";
- break;
- default:
-
- od_control.od_error = ERR_PARAMETER;
- return(FALSE);
- }
-
-
- pEditInstance->bWordWrapLongLines = (pEditInstance->pUserOptions->TextFormat
- != FORMAT_NO_WORDWRAP);
-
- pEditInstance->pRememberBuffer =
- malloc(ODEditRememberBufferSize(pEditInstance));
-
- if(pEditInstance->pRememberBuffer == NULL)
- {
- od_control.od_error = ERR_MEMORY;
- return(FALSE);
- }
-
-
- if(od_control.user_avatar || od_control.baud == 0)
- {
- pEditInstance->unScrollDistance = 1;
- }
-
-
-
- else
- {
- pEditInstance->unScrollDistance = MIN(ANSI_SCROLL_DISTANCE,
- pEditInstance->pUserOptions->nAreaBottom
- - pEditInstance->pUserOptions->nAreaTop);
- }
-
- return(TRUE);
- }
- static void ODEditRedrawArea(tEditInstance *pEditInstance)
- {
- UINT unAreaLine;
- ASSERT(pEditInstance != NULL);
- ODScrnEnableCaret(FALSE);
-
-
-
- if(od_control.baud != 0) ODComClearOutbound(hSerialPort);
-
- for(unAreaLine = 0; unAreaLine < pEditInstance->unAreaHeight; ++unAreaLine)
- {
- ODEditDrawAreaLine(pEditInstance, unAreaLine);
- }
- ODScrnEnableCaret(TRUE);
- }
- static void ODEditDrawAreaLine(tEditInstance *pEditInstance,
- UINT unAreaLineToDraw)
- {
- UINT unBufferLine;
- UINT unLineLength;
- ASSERT(pEditInstance != NULL);
- ASSERT(unAreaLineToDraw >= 0);
- ASSERT(unAreaLineToDraw < pEditInstance->unAreaHeight);
-
- unBufferLine = unAreaLineToDraw + pEditInstance->unLineScrolledToTop;
-
- od_set_cursor((UINT)pEditInstance->pUserOptions->nAreaTop
- + unAreaLineToDraw, (UINT)pEditInstance->pUserOptions->nAreaLeft);
-
- if(unBufferLine < pEditInstance->unLinesInBuffer)
- {
-
- unLineLength = ODEditBufferGetLineLength(pEditInstance, unBufferLine);
- od_disp(ODEditBufferGetCharacter(pEditInstance, unBufferLine, 0),
- unLineLength, TRUE);
- }
- else
- {
- unLineLength = 0;
- }
-
- if(pEditInstance->pUserOptions->nAreaRight == OD_SCREEN_WIDTH)
- {
-
- od_clr_line();
- }
- else
- {
-
-
- od_repeat(' ', (BYTE)(pEditInstance->unAreaWidth - unLineLength));
- }
- }
- static INT ODEditMainLoop(tEditInstance *pEditInstance)
- {
- tODInputEvent InputEvent;
- ASSERT(pEditInstance != NULL);
-
- ODEditUpdateCursorPos(pEditInstance);
-
- for(;;)
- {
- od_get_input(&InputEvent, OD_NO_TIMEOUT, GETIN_NORMAL);
- if(InputEvent.EventType == EVENT_EXTENDED_KEY)
- {
- switch(InputEvent.chKeyPress)
- {
- case OD_KEY_UP:
-
-
- if(pEditInstance->unCurrentLine > 0)
- {
- ODEditGotoPreviousLine(pEditInstance);
- ODEditUpdateCursorPos(pEditInstance);
- }
- break;
- case OD_KEY_DOWN:
-
-
- if(pEditInstance->unCurrentLine
- < ODEditBufferGetTotalLines(pEditInstance) - 1)
- {
- ODEditGotoNextLine(pEditInstance);
- ODEditUpdateCursorPos(pEditInstance);
- }
- break;
- case OD_KEY_LEFT:
-
- if(ODEditCursorLeft(pEditInstance))
- {
-
-
- ODEditUpdateCursorPos(pEditInstance);
- }
- break;
- case OD_KEY_RIGHT:
-
-
- if(pEditInstance->bWordWrapLongLines)
- {
- if(pEditInstance->unCurrentColumn < ODEditBufferGetLineLength
- (pEditInstance, pEditInstance->unCurrentLine))
- {
- ++pEditInstance->unCurrentColumn;
- ODEditUpdateCursorPos(pEditInstance);
- }
- else if(pEditInstance->unCurrentLine
- < ODEditBufferGetTotalLines(pEditInstance) - 1)
- {
- ODEditGotoNextLine(pEditInstance);
- pEditInstance->unCurrentColumn = 0;
- ODEditUpdateCursorPos(pEditInstance);
- }
- }
-
-
- else
- {
- if(pEditInstance->unCurrentColumn
- < pEditInstance->unAreaWidth - 1)
- {
- ++pEditInstance->unCurrentColumn;
- ODEditUpdateCursorPos(pEditInstance);
- }
- }
- break;
- case OD_KEY_HOME:
- pEditInstance->unCurrentColumn = 0;
- ODEditUpdateCursorPos(pEditInstance);
- break;
- case OD_KEY_END:
- pEditInstance->unCurrentColumn = ODEditBufferGetLineLength(
- pEditInstance, pEditInstance->unCurrentLine);
- ODEditUpdateCursorPos(pEditInstance);
- break;
- case OD_KEY_PGUP:
- if(pEditInstance->unLineScrolledToTop > 0)
- {
- UINT unDistance = MIN(pEditInstance->unAreaHeight - 1,
- pEditInstance->unLineScrolledToTop);
- ODEditScrollArea(pEditInstance, -((INT)unDistance));
- pEditInstance->unCurrentLine -= unDistance;
- ODEditUpdateCursorPos(pEditInstance);
- }
- else if(pEditInstance->unCurrentLine != 0)
- {
- pEditInstance->unCurrentLine = 0;
- ODEditUpdateCursorPos(pEditInstance);
- }
- break;
- case OD_KEY_PGDN:
- if(pEditInstance->unLineScrolledToTop <
- pEditInstance->unLinesInBuffer - 1)
- {
- UINT unDistance = MIN(pEditInstance->unAreaHeight - 1,
- pEditInstance->unLinesInBuffer
- - pEditInstance->unLineScrolledToTop - 1);
- ODEditScrollArea(pEditInstance, (INT)unDistance);
- pEditInstance->unCurrentLine = MIN(
- pEditInstance->unCurrentLine + unDistance,
- pEditInstance->unLinesInBuffer - 1);
- ODEditUpdateCursorPos(pEditInstance);
- }
- break;
- case OD_KEY_INSERT:
-
- pEditInstance->bInsertMode = !pEditInstance->bInsertMode;
- break;
- case OD_KEY_DELETE:
-
-
-
- if(ODEditPastEndOfCurLine(pEditInstance))
- {
-
-
- switch(ODEditBufferMakeSpace(pEditInstance,
- pEditInstance->unCurrentLine,
- pEditInstance->unCurrentColumn, 0))
- {
- case kODRCUnrecoverableFailure:
-
-
-
- od_control.od_error = ERR_MEMORY;
- return(OD_MULTIEDIT_ERROR);
- case kODRCSuccess:
-
- ODEditDeleteCurrentChar(pEditInstance);
- break;
- default:
-
- od_putch('\a');
- }
- }
- else
- {
-
-
- ODEditDeleteCurrentChar(pEditInstance);
- }
- break;
- }
- }
- else if(InputEvent.EventType == EVENT_CHARACTER)
- {
- if(InputEvent.chKeyPress == 25)
- {
-
- ODEditDeleteCurrentLine(pEditInstance);
- }
- else if(InputEvent.chKeyPress == 26
- || InputEvent.chKeyPress == 27)
- {
-
-
-
- if(pEditInstance->pUserOptions->pfMenuCallback != NULL)
- {
-
- switch((*pEditInstance->pUserOptions->pfMenuCallback)(NULL))
- {
- case EDIT_MENU_EXIT_EDITOR:
- return(OD_MULTIEDIT_SUCCESS);
- case EDIT_MENU_DO_NOTHING:
-
- break;
- default:
- ASSERT(FALSE);
- }
-
- ODEditUpdateCursorPos(pEditInstance);
- }
- else
- {
-
-
- return(OD_MULTIEDIT_SUCCESS);
- }
- }
- else if(InputEvent.chKeyPress == '\b')
- {
-
-
-
- BOOL bDelete = !ODEditPastEndOfCurLine(pEditInstance);
-
- if(ODEditCursorLeft(pEditInstance))
- {
-
-
- if(bDelete)
- {
- ODEditDeleteCurrentChar(pEditInstance);
- }
- else
- {
-
-
- ODEditUpdateCursorPos(pEditInstance);
- }
- }
- }
- else if(InputEvent.chKeyPress == '\t')
- {
- char szTextToAdd[MAX_TAB_STOP_SIZE + 1];
- UINT unTargetColumn;
- UINT unTargetDistance;
-
-
- ASSERT(pEditInstance->unTabStopSize <= MAX_TAB_STOP_SIZE);
- unTargetColumn = ((pEditInstance->unCurrentColumn / pEditInstance->
- unTabStopSize) + 1) * pEditInstance->unTabStopSize;
-
- if(pEditInstance->bInsertMode)
- {
-
-
- unTargetDistance = unTargetColumn -
- pEditInstance->unCurrentColumn;
- ASSERT(unTargetDistance <= MAX_TAB_STOP_SIZE);
-
-
- memset(szTextToAdd, ' ', unTargetDistance);
- szTextToAdd[unTargetDistance] = '\0';
-
- if(ODEditEnterText(pEditInstance, szTextToAdd, TRUE) ==
- kODRCUnrecoverableFailure)
- {
- od_control.od_error = ERR_MEMORY;
- return(OD_MULTIEDIT_ERROR);
- }
- }
-
- else
- {
-
- UINT unWrapColumn = pEditInstance->bWordWrapLongLines ?
- ODEditBufferGetLineLength(pEditInstance,
- pEditInstance->unCurrentLine)
- : pEditInstance->unAreaWidth;
- if(unTargetColumn < unWrapColumn)
- {
- pEditInstance->unCurrentColumn = unTargetColumn;
- ODEditUpdateCursorPos(pEditInstance);
- }
- else if(pEditInstance->unCurrentLine
- < ODEditBufferGetTotalLines(pEditInstance) - 1)
- {
- ODEditGotoNextLine(pEditInstance);
- pEditInstance->unCurrentColumn = 0;
- ODEditUpdateCursorPos(pEditInstance);
- }
- }
- }
- else if(InputEvent.chKeyPress == '\r')
- {
- char *pszTextToAdd;
-
-
- if(pEditInstance->bInsertMode || pEditInstance->unCurrentLine
- >= ODEditBufferGetTotalLines(pEditInstance) - 1)
- {
- if(!pEditInstance->bInsertMode)
- {
-
-
- pEditInstance->unCurrentColumn = ODEditBufferGetLineLength(
- pEditInstance, pEditInstance->unCurrentLine);
- }
-
- if(pEditInstance->pszLineBreak != NULL
- && strlen(pEditInstance->pszLineBreak) > 0)
- {
- pszTextToAdd = pEditInstance->pszLineBreak;
- }
- else if(pEditInstance->pszParagraphBreak != NULL
- && strlen(pEditInstance->pszParagraphBreak) > 0)
- {
- pszTextToAdd = pEditInstance->pszParagraphBreak;
- }
- else
- {
- pszTextToAdd = DEFAULT_LINE_BREAK;
- }
-
- if(ODEditEnterText(pEditInstance, pszTextToAdd, TRUE) ==
- kODRCUnrecoverableFailure)
- {
- od_control.od_error = ERR_MEMORY;
- return(OD_MULTIEDIT_ERROR);
- }
- }
- else
- {
-
-
-
- ODEditGotoNextLine(pEditInstance);
- pEditInstance->unCurrentColumn = 0;
- ODEditUpdateCursorPos(pEditInstance);
- }
- }
- else if(InputEvent.chKeyPress >= 32)
- {
- char szTextToAdd[2];
- szTextToAdd[0] = InputEvent.chKeyPress;
- szTextToAdd[1] = '\0';
-
- if(ODEditEnterText(pEditInstance, szTextToAdd,
- (BOOL)(pEditInstance->bInsertMode
- || ODEditPastEndOfCurLine(pEditInstance)))
- == kODRCUnrecoverableFailure)
- {
- od_control.od_error = ERR_MEMORY;
- return(OD_MULTIEDIT_ERROR);
- }
- }
- }
- }
- }
- static void ODEditGotoPreviousLine(tEditInstance *pEditInstance)
- {
- ASSERT(pEditInstance != NULL);
-
-
- if(pEditInstance->unCurrentLine == 0) return;
-
-
- if(ODEditGetCurrentLineInArea(pEditInstance) == 0)
- {
- ODEditScrollArea(pEditInstance,
- -(INT)(MIN(pEditInstance->unScrollDistance,
- pEditInstance->unCurrentLine)));
- }
-
- --pEditInstance->unCurrentLine;
- }
- static void ODEditGotoNextLine(tEditInstance *pEditInstance)
- {
- ASSERT(pEditInstance != NULL);
-
-
- if(pEditInstance->unCurrentLine
- >= ODEditBufferGetTotalLines(pEditInstance) - 1)
- {
- return;
- }
-
- if(ODEditGetCurrentLineInArea(pEditInstance)
- == pEditInstance->unAreaHeight - 1)
- {
- ODEditScrollArea(pEditInstance,
- (INT)MIN(pEditInstance->unScrollDistance,
- ODEditBufferGetTotalLines(pEditInstance)
- - pEditInstance->unCurrentLine));
- }
-
- ++pEditInstance->unCurrentLine;
- }
- static BOOL ODEditScrollArea(tEditInstance *pEditInstance, INT nDistance)
- {
- BOOL bUseScrollCommand = FALSE;
- UINT unAreaLine;
- UINT unBufferLine;
- UINT unFirstAreaLineToDraw;
- UINT unLastAreaLineToDraw;
- UINT unPositiveDistance;
- ASSERT(pEditInstance);
-
- if(nDistance == 0)
- {
- return(TRUE);
- }
-
-
- else if(nDistance < 0)
- {
- unPositiveDistance = (UINT)-nDistance;
- }
- else
- {
- unPositiveDistance = (UINT)nDistance;
- }
-
-
-
- if(od_control.user_avatar
- && ((INT)pEditInstance->unAreaHeight) - ((INT)unPositiveDistance) > 1)
- {
-
-
-
-
-
- UINT unEstimatedScrollData = ((pEditInstance->unAreaWidth + 4) *
- unPositiveDistance) + 7;
- if(!ODEditRecommendFullRedraw(pEditInstance, unEstimatedScrollData,
- TRUE))
- {
- bUseScrollCommand = TRUE;
- }
- }
-
- if(od_control.baud == 0)
- {
- bUseScrollCommand = TRUE;
- }
-
-
-
-
- if(bUseScrollCommand)
- {
-
- od_scroll(pEditInstance->pUserOptions->nAreaLeft,
- pEditInstance->pUserOptions->nAreaTop,
- pEditInstance->pUserOptions->nAreaRight,
- pEditInstance->pUserOptions->nAreaBottom,
- nDistance, SCROLL_NO_CLEAR);
-
-
-
-
-
- if(nDistance > 0)
- {
- ASSERT(pEditInstance->unLineScrolledToTop + unPositiveDistance
- < pEditInstance->unLinesInBuffer);
- pEditInstance->unLineScrolledToTop += unPositiveDistance;
- unFirstAreaLineToDraw = pEditInstance->unAreaHeight
- - (UINT)unPositiveDistance;
- unLastAreaLineToDraw = pEditInstance->unAreaHeight - 1;
- }
-
-
- else
- {
- ASSERT(pEditInstance->unLineScrolledToTop >= unPositiveDistance);
- pEditInstance->unLineScrolledToTop -= unPositiveDistance;
- unFirstAreaLineToDraw = 0;
- unLastAreaLineToDraw = unPositiveDistance - 1;
- }
- ODScrnEnableCaret(FALSE);
-
- unBufferLine = unFirstAreaLineToDraw
- + pEditInstance->unLineScrolledToTop;
- for(unAreaLine = unFirstAreaLineToDraw; unAreaLine <=
- unLastAreaLineToDraw; ++unAreaLine, ++unBufferLine)
- {
-
- ODEditDrawAreaLine(pEditInstance, unAreaLine);
- }
- ODScrnEnableCaret(TRUE);
- }
-
- else
- {
-
- if(nDistance > 0)
- {
- pEditInstance->unLineScrolledToTop += unPositiveDistance;
- }
- else
- {
- pEditInstance->unLineScrolledToTop -= unPositiveDistance;
- }
-
- ODEditRedrawArea(pEditInstance);
- }
- return(bUseScrollCommand);
- }
- static BOOL ODEditRecommendFullRedraw(tEditInstance *pEditInstance,
- UINT unEstPartialRedrawBytes, BOOL bDefault)
- {
- int nOutboundBufferBytes;
- UINT unEstFullRedrawBytes;
-
- if(od_control.baud == 0)
- {
- return(bDefault);
- }
-
-
-
-
-
-
-
-
-
- ODComOutbound(hSerialPort, &nOutboundBufferBytes);
- if(nOutboundBufferBytes == SIZE_NON_ZERO)
- {
-
-
-
- return(bDefault);
- }
-
- unEstFullRedrawBytes = ODEditEstDrawBytes(pEditInstance, 0,
- 0, pEditInstance->unAreaHeight - 1, pEditInstance->unAreaWidth);
-
-
-
- if(unEstPartialRedrawBytes + (UINT)nOutboundBufferBytes
- > unEstFullRedrawBytes)
- {
- return(TRUE);
- }
- else
- {
- return(FALSE);
- }
- }
- static UINT ODEditEstDrawBytes(tEditInstance *pEditInstance,
- UINT unStartRedrawLine, UINT unStartRedrawColumn, UINT unFinishRedrawLine,
- UINT unFinishRedrawColumn)
- {
- UINT unAreaLine;
- UINT unBufferLine;
- UINT unLineLength;
- UINT unByteTally = 0;
-
-
-
-
-
-
-
- if(unStartRedrawLine == unFinishRedrawLine)
- {
- return(unFinishRedrawColumn - unStartRedrawColumn);
- }
-
-
- for(unAreaLine = unStartRedrawLine,
- unBufferLine = pEditInstance->unLineScrolledToTop + unStartRedrawLine;
- unAreaLine <= unFinishRedrawLine;
- ++unAreaLine, ++unBufferLine)
- {
-
- if(unBufferLine < pEditInstance->unLinesInBuffer)
- {
- unLineLength = ODEditBufferGetLineLength(pEditInstance, unBufferLine);
- if(unAreaLine == unStartRedrawLine)
- {
- unLineLength -= unStartRedrawColumn;
- }
- }
- else
- {
- unLineLength = 0;
- }
-
-
-
-
- unByteTally += unLineLength + 7;
- }
- return(unByteTally);
- }
- static UINT ODEditGetCurrentLineInArea(tEditInstance *pEditInstance)
- {
- ASSERT(pEditInstance != NULL);
- return(pEditInstance->unCurrentLine - pEditInstance->unLineScrolledToTop);
- }
- static void ODEditUpdateCursorPos(tEditInstance *pEditInstance)
- {
- ASSERT(pEditInstance != NULL);
-
- od_set_cursor(ODEditGetCurrentLineInArea(pEditInstance)
- + pEditInstance->pUserOptions->nAreaTop,
- pEditInstance->unCurrentColumn + pEditInstance->pUserOptions->nAreaLeft);
- }
- static void ODEditUpdateCursorIfMoved(tEditInstance *pEditInstance)
- {
- UINT unActualRow;
- UINT unActualColumn;
- ODEditGetActualCurPos(pEditInstance, &unActualRow, &unActualColumn);
- if(!(unActualRow == ODEditGetCurrentLineInArea(pEditInstance)
- + pEditInstance->pUserOptions->nAreaTop
- && unActualColumn == pEditInstance->unCurrentColumn
- + pEditInstance->pUserOptions->nAreaLeft))
- {
- ODEditUpdateCursorPos(pEditInstance);
- }
- }
- static tODResult ODEditEnterText(tEditInstance *pEditInstance,
- char *pszEntered, BOOL bInsertMode)
- {
- UINT unNumCharsToAdd;
- char *pch;
- tODResult Result;
- ASSERT(pEditInstance != NULL);
- ASSERT(pszEntered != NULL);
-
- ODEditRememberArea(pEditInstance, pEditInstance->pRememberBuffer);
-
- unNumCharsToAdd = strlen(pszEntered);
-
- if(bInsertMode)
- {
- Result = ODEditBufferMakeSpace(pEditInstance,
- pEditInstance->unCurrentLine, pEditInstance->unCurrentColumn,
- unNumCharsToAdd);
- if(Result != kODRCSuccess)
- {
-
- od_putch('\a');
- return(Result);
- }
- }
-
- pch = ODEditBufferGetCharacter(pEditInstance,
- pEditInstance->unCurrentLine, pEditInstance->unCurrentColumn);
- memcpy(pch, pszEntered, unNumCharsToAdd);
-
-
-
- for(pch = pszEntered; *pch != '\0'; ++pch)
- {
- if(IS_EOL_CHAR(*pch))
- {
-
-
- pEditInstance->unCurrentColumn = 0;
- pEditInstance->unCurrentLine++;
-
-
- if(IS_EOL_CHAR(pch[1]) && pch[1] != '\0' && pch[1] != *pch)
- {
- ++pch;
- }
- }
- else
- {
-
- pEditInstance->unCurrentColumn++;
- }
- }
-
- if(!ODEditBufferFormatAndIndex(pEditInstance))
- {
- return(kODRCUnrecoverableFailure);
- }
-
-
- if(ODEditGetCurrentLineInArea(pEditInstance)
- >= pEditInstance->unAreaHeight)
- {
-
-
-
-
- UINT unScrollDistance = MAX(pEditInstance->unScrollDistance,
- ODEditGetCurrentLineInArea(pEditInstance) -
- pEditInstance->unAreaHeight + 1);
-
- if(ODEditScrollArea(pEditInstance, (INT)unScrollDistance))
- {
-
-
-
- ODEditRedrawChanged(pEditInstance, pEditInstance->pRememberBuffer,
- 0, pEditInstance->unAreaHeight - unScrollDistance);
- }
- }
-
- ODEditRedrawChanged(pEditInstance, pEditInstance->pRememberBuffer,
- REDRAW_NO_BOUNDARY, REDRAW_NO_BOUNDARY);
-
- return(kODRCSuccess);
- }
- static void ODEditSetBreakSequence(tEditInstance *pEditInstance,
- char chFirstEOLChar, char chSecondEOLChar)
- {
- char *pszSequence;
- ASSERT(pEditInstance != NULL);
- if(pEditInstance->pszParagraphBreak != NULL
- && pEditInstance->pszLineBreak != NULL)
- {
-
-
-
- return;
- }
-
-
-
- if(chFirstEOLChar == '\r' && chSecondEOLChar == '\0')
- {
- pszSequence = "\r";
- }
- else if(chFirstEOLChar == '\n' && chSecondEOLChar == '\0')
- {
- pszSequence = "\n";
- }
- else if(chFirstEOLChar == '\n' && chSecondEOLChar == '\r')
- {
- pszSequence = "\n\r";
- }
- else if(chFirstEOLChar == '\r' && chSecondEOLChar == '\n')
- {
- pszSequence = "\r\n";
- }
- else
- {
-
-
- pszSequence = NULL;
- ASSERT(FALSE);
- }
-
- if(pEditInstance->pszParagraphBreak == NULL)
- {
- pEditInstance->pszParagraphBreak = pszSequence;
- }
- if(pEditInstance->pszLineBreak == NULL)
- {
- pEditInstance->pszLineBreak = pszSequence;
- }
- }
- static BOOL ODEditCursorLeft(tEditInstance *pEditInstance)
- {
- ASSERT(pEditInstance != NULL);
-
-
-
- if(pEditInstance->bWordWrapLongLines &&
- pEditInstance->unCurrentColumn > ODEditBufferGetLineLength
- (pEditInstance, pEditInstance->unCurrentLine))
- {
- pEditInstance->unCurrentColumn = ODEditBufferGetLineLength
- (pEditInstance, pEditInstance->unCurrentLine);
- return(TRUE);
- }
-
- else if(pEditInstance->unCurrentColumn > 0)
- {
-
- --pEditInstance->unCurrentColumn;
- return(TRUE);
- }
- else if(pEditInstance->bWordWrapLongLines)
- {
-
-
- if(pEditInstance->unCurrentLine > 0)
- {
- ODEditGotoPreviousLine(pEditInstance);
- pEditInstance->unCurrentColumn = ODEditBufferGetLineLength(
- pEditInstance, pEditInstance->unCurrentLine);
- return(TRUE);
- }
- }
-
- return(FALSE);
- }
- static void ODEditDeleteCurrentChar(tEditInstance *pEditInstance)
- {
- char *pch;
- ASSERT(pEditInstance != NULL);
-
- ODEditRememberArea(pEditInstance, pEditInstance->pRememberBuffer);
-
- pch = ODEditBufferGetCharacter(pEditInstance,
- pEditInstance->unCurrentLine, pEditInstance->unCurrentColumn);
- memmove(pch, pch + 1, strlen(pch + 1) + 1);
-
- ODEditBufferFormatAndIndex(pEditInstance);
-
- ODEditRedrawChanged(pEditInstance, pEditInstance->pRememberBuffer,
- REDRAW_NO_BOUNDARY, REDRAW_NO_BOUNDARY);
- }
- static void ODEditDeleteCurrentLine(tEditInstance *pEditInstance)
- {
- char *pszStartOfThisLine;
- char *pszStartOfNextLine;
- ASSERT(pEditInstance != NULL);
-
- ODEditRememberArea(pEditInstance, pEditInstance->pRememberBuffer);
-
- pszStartOfThisLine = ODEditBufferGetCharacter(pEditInstance,
- pEditInstance->unCurrentLine, 0);
- if(pEditInstance->unLinesInBuffer == pEditInstance->unCurrentLine + 1)
- {
-
-
- *pszStartOfThisLine = '\0';
- }
- else
- {
-
-
-
- pszStartOfNextLine = ODEditBufferGetCharacter(pEditInstance,
- pEditInstance->unCurrentLine + 1, 0);
- memmove(pszStartOfThisLine, pszStartOfNextLine,
- strlen(pszStartOfNextLine) + 1);
- }
-
- pEditInstance->unCurrentColumn = 0;
-
- ODEditBufferFormatAndIndex(pEditInstance);
-
- ODEditRedrawChanged(pEditInstance, pEditInstance->pRememberBuffer,
- REDRAW_NO_BOUNDARY, REDRAW_NO_BOUNDARY);
- }
- static BOOL ODEditPastEndOfCurLine(tEditInstance *pEditInstance)
- {
- ASSERT(pEditInstance != NULL);
- return(pEditInstance->unCurrentColumn >
- ODEditBufferGetLineLength(pEditInstance, pEditInstance->unCurrentLine));
- }
- static size_t ODEditRememberBufferSize(tEditInstance *pEditInstance)
- {
- ASSERT(pEditInstance != NULL);
- return((pEditInstance->unAreaWidth + 1)
- * pEditInstance->unAreaHeight);
- }
- static void ODEditRememberArea(tEditInstance *pEditInstance,
- void *pRememberedArea)
- {
- UINT unDataLineOffset = 0;
- UINT unDataLineSize;
- UINT unAreaLine;
- UINT unBufferLine;
- UINT unLineLength;
- char *pchStartOfLine;
- char *pchDataLocation;
- ASSERT(pEditInstance != NULL);
- ASSERT(pRememberedArea != NULL);
-
- unDataLineSize = pEditInstance->unAreaWidth + 1;
- pchDataLocation = (char *)pRememberedArea + unDataLineOffset;
- for(unBufferLine = pEditInstance->unLineScrolledToTop, unAreaLine = 0;
- unAreaLine < pEditInstance->unAreaHeight;
- ++unAreaLine, ++unBufferLine)
- {
-
- if(unBufferLine < pEditInstance->unLinesInBuffer)
- {
-
- unLineLength = ODEditBufferGetLineLength(pEditInstance, unBufferLine);
-
- pchStartOfLine = ODEditBufferGetCharacter(pEditInstance, unBufferLine,
- 0);
- }
- else
- {
-
- unLineLength = 0;
- pchStartOfLine = "";
- }
-
- memcpy(pchDataLocation, pchStartOfLine, unLineLength);
- pchDataLocation[unLineLength] = '\0';
-
- pchDataLocation += unDataLineSize;
- }
- }
- static void ODEditRedrawChanged(tEditInstance *pEditInstance,
- void *pRememberedArea, UINT unUpperBoundary, UINT unLowerBoundary)
- {
- UINT unStartRedrawLine;
- UINT unStartRedrawColumn;
- UINT unFinishRedrawLine;
- UINT unFinishRedrawColumn;
- UINT unEstPartialRedrawBytes;
- ASSERT(pEditInstance != NULL);
- ASSERT(pRememberedArea != NULL);
-
-
- if(!ODEditDetermineChanged(pEditInstance, pRememberedArea, unUpperBoundary,
- unLowerBoundary, &unStartRedrawLine, &unStartRedrawColumn,
- &unFinishRedrawLine, &unFinishRedrawColumn))
- {
-
- ODEditUpdateCursorIfMoved(pEditInstance);
- return;
- }
-
-
-
-
-
-
- unEstPartialRedrawBytes = ODEditEstDrawBytes(pEditInstance,
- unStartRedrawLine, unStartRedrawColumn, unFinishRedrawLine,
- unFinishRedrawColumn);
- if(ODEditRecommendFullRedraw(pEditInstance, unEstPartialRedrawBytes,
- FALSE))
- {
-
- ODEditRedrawArea(pEditInstance);
-
- ODEditUpdateCursorPos(pEditInstance);
- }
- else
- {
-
-
-
- ODEditRedrawSubArea(pEditInstance, unStartRedrawLine, unStartRedrawColumn,
- unFinishRedrawLine, unFinishRedrawColumn);
-
-
- ODEditUpdateCursorIfMoved(pEditInstance);
- }
- }
- static BOOL ODEditDetermineChanged(tEditInstance *pEditInstance,
- void *pRememberedArea, UINT unUpperBoundary, UINT unLowerBoundary,
- UINT *punStartRedrawLine, UINT *punStartRedrawColumn,
- UINT *punFinishRedrawLine, UINT *punFinishRedrawColumn)
- {
- BOOL bFoundStart = FALSE;
- BOOL bFoundFinish = FALSE;
- UINT unDataLineOffset = 0;
- UINT unDataLineSize;
- UINT unAreaLine;
- UINT unLineLength;
- UINT unColumn;
- UINT unBufferLine;
- char *pchCurrent;
- char *pchRemembered;
-
- unDataLineSize = pEditInstance->unAreaWidth + 1;
-
-
- if(unUpperBoundary == REDRAW_NO_BOUNDARY) unUpperBoundary = 0;
-
-
- if(unLowerBoundary == REDRAW_NO_BOUNDARY)
- {
- unLowerBoundary = pEditInstance->unAreaHeight;
- }
-
-
- for(unBufferLine = pEditInstance->unLineScrolledToTop + unUpperBoundary,
- unAreaLine = unUpperBoundary; unAreaLine < unLowerBoundary;
- ++unAreaLine, ++unBufferLine)
- {
-
- pchRemembered = (char *)pRememberedArea + unDataLineOffset
- + unDataLineSize * unAreaLine;
-
- if(unBufferLine < pEditInstance->unLinesInBuffer)
- {
-
- pchCurrent = ODEditBufferGetCharacter(pEditInstance, unBufferLine, 0);
-
- unLineLength = ODEditBufferGetLineLength(pEditInstance, unBufferLine);
- }
- else
- {
- pchCurrent = "";
- unLineLength = 0;
- }
-
- unColumn = 0;
-
- for(;; ++unColumn, ++pchCurrent, ++pchRemembered)
- {
-
- BOOL bEndOfRemembered = (*pchRemembered == '\0');
-
- BOOL bEndOfCurrent = (unColumn == unLineLength);
-
-
-
- if(!(bEndOfRemembered && bEndOfCurrent))
- {
- if(bEndOfRemembered || bEndOfCurrent
- || *pchCurrent != *pchRemembered)
- {
- if(bFoundStart)
- {
- bFoundFinish = FALSE;
- }
- else
- {
-
- bFoundStart = TRUE;
- *punStartRedrawLine = unAreaLine;
- *punStartRedrawColumn = unColumn;
- }
- }
- }
-
-
- if(bFoundStart && !bFoundFinish)
- {
- if(*pchCurrent == *pchRemembered)
- {
- bFoundFinish = TRUE;
- *punFinishRedrawLine = unAreaLine;
- *punFinishRedrawColumn = unColumn;
- }
- else if(bEndOfRemembered)
- {
- bFoundFinish = TRUE;
- *punFinishRedrawLine = unAreaLine;
- *punFinishRedrawColumn = unLineLength;
- }
- else if(bEndOfCurrent)
- {
- bFoundFinish = TRUE;
- *punFinishRedrawLine = unAreaLine;
- *punFinishRedrawColumn = unColumn + strlen(pchRemembered);
- }
- }
-
- if(bEndOfRemembered || bEndOfCurrent)
- {
-
- break;
- }
- }
- }
-
- if(!bFoundStart)
- {
-
- return(FALSE);
- }
-
-
- if(!bFoundFinish)
- {
- *punFinishRedrawLine = unLowerBoundary;
- *punFinishRedrawColumn = unColumn;
- }
-
- return(TRUE);
- }
- static void ODEditRedrawSubArea(tEditInstance *pEditInstance,
- UINT unStartRedrawLine, UINT unStartRedrawColumn, UINT unFinishRedrawLine,
- UINT unFinishRedrawColumn)
- {
- UINT unAreaLine;
- UINT unLineLength;
- UINT unBufferLine;
- char *pchCurrent;
- UINT unStartColumn;
- UINT unFinishColumn;
- UINT unScrnStartColumn;
- UINT unTextLength;
-
- for(unBufferLine = pEditInstance->unLineScrolledToTop + unStartRedrawLine,
- unAreaLine = unStartRedrawLine; unAreaLine <= unFinishRedrawLine;
- ++unBufferLine, ++unAreaLine)
- {
- BOOL bFirstLine = (unAreaLine == unStartRedrawLine);
- BOOL bLastLine = (unAreaLine == unFinishRedrawLine);
- UINT unScrnRow = (UINT)pEditInstance->pUserOptions->nAreaTop
- + unAreaLine;
-
- if(unBufferLine < pEditInstance->unLinesInBuffer)
- {
- pchCurrent = ODEditBufferGetCharacter(pEditInstance, unBufferLine, 0);
- unTextLength = unLineLength =
- ODEditBufferGetLineLength(pEditInstance, unBufferLine);
- }
- else
- {
- pchCurrent = "";
- unTextLength = unLineLength = 0;
- }
-
- if(bFirstLine)
- {
- UINT unActualRow;
- UINT unActualColumn;
- ODEditGetActualCurPos(pEditInstance, &unActualRow, &unActualColumn);
- unStartColumn = unStartRedrawColumn;
- unScrnStartColumn = (UINT)pEditInstance->pUserOptions->nAreaLeft
- + unStartColumn;
- if(unScrnRow != unActualRow || unScrnStartColumn != unActualColumn)
- {
- od_set_cursor(unScrnRow, unScrnStartColumn);
- }
- pchCurrent += unStartRedrawColumn;
- unTextLength -= unStartRedrawColumn;
- }
- else
- {
- unStartColumn = 0;
- unScrnStartColumn = (UINT)pEditInstance->pUserOptions->nAreaLeft;
- od_set_cursor(unScrnRow, unScrnStartColumn);
- }
-
- if(bLastLine)
- {
- if(unFinishRedrawColumn < unLineLength)
- {
- unTextLength -= unLineLength - unFinishRedrawColumn;
- }
- unFinishColumn = unFinishRedrawColumn;
- }
- else
- {
- unFinishColumn = pEditInstance->unAreaWidth;
- }
-
- if(unStartColumn < unLineLength)
- {
- od_disp(pchCurrent, unTextLength, TRUE);
- unStartColumn += unTextLength;
- }
-
- if(unFinishColumn == pEditInstance->unAreaWidth)
- {
-
-
- if(pEditInstance->pUserOptions->nAreaRight == OD_SCREEN_WIDTH)
- {
-
- od_clr_line();
- }
- else
- {
-
-
- od_repeat(' ', (BYTE)(pEditInstance->unAreaWidth - unLineLength));
- }
- }
- else if(unStartColumn < unFinishColumn)
- {
- od_repeat(' ', (BYTE)(unFinishColumn - unStartColumn));
- }
- }
- }
- static void ODEditGetActualCurPos(tEditInstance *pEditInstance,
- UINT *punRow, UINT *punColumn)
- {
- tODScrnTextInfo TextInfo;
- ASSERT(pEditInstance != NULL);
- ASSERT(punRow != NULL);
- ASSERT(punColumn != NULL);
- UNUSED(pEditInstance);
-
- ODScrnGetTextInfo(&TextInfo);
- *punRow = (UINT)TextInfo.cury;
- *punColumn = (UINT)TextInfo.curx;
- }
- static BOOL ODEditIsEOLForMode(tEditInstance *pEditInstance, char chToTest)
- {
- switch(pEditInstance->pUserOptions->TextFormat)
- {
- case FORMAT_FTSC_MESSAGE:
- return(chToTest == '\r' || chToTest == '\0');
- default:
- return(IS_EOL_CHAR(chToTest));
- }
- }
- static BOOL ODEditBufferFormatAndIndex(tEditInstance *pEditInstance)
- {
- char *pch;
- char *pchLastSpace;
- UINT unProcessingColumn;
- UINT unProcessingLine;
- BOOL bAtEndOfBuffer = FALSE;
- BOOL bLineEndedByBreak;
- BOOL bFTSCMode =
- (pEditInstance->pUserOptions->TextFormat == FORMAT_FTSC_MESSAGE);
- ASSERT(pEditInstance != NULL);
-
- unProcessingLine = 0;
-
- pch = pEditInstance->pszEditBuffer;
- ASSERT(pch != NULL);
-
- while(!bAtEndOfBuffer)
- {
-
- if(bFTSCMode)
- {
-
- while(*pch == 0x01)
- {
-
- while(!ODEditIsEOLForMode(pEditInstance, *pch)) ++pch;
- if(*pch == '\0')
- {
-
-
- bAtEndOfBuffer = TRUE;
- }
- else
- {
-
-
- ++pch;
- }
- }
- continue;
- }
-
-
-
- ASSERT(unProcessingLine <= pEditInstance->unLineArraySize);
- if(unProcessingLine == pEditInstance->unLineArraySize)
- {
-
- UINT unNewArraySize = pEditInstance->unLineArraySize
- + LINE_ARRAY_GROW_SIZE;
-
- char **papchNewLineArray = (char **)realloc(
- pEditInstance->papchStartOfLine, unNewArraySize * sizeof(char *));
-
- if(papchNewLineArray == NULL)
- {
- return(FALSE);
- }
-
-
- pEditInstance->papchStartOfLine = papchNewLineArray;
- pEditInstance->unLineArraySize = unNewArraySize;
- }
-
- pEditInstance->papchStartOfLine[unProcessingLine] = pch;
-
- pchLastSpace = NULL;
-
- bLineEndedByBreak = TRUE;
- unProcessingColumn = 0;
- while(!ODEditIsEOLForMode(pEditInstance, *pch))
- {
-
-
- if(*pch == ' ') pchLastSpace = pch;
-
-
- if(bFTSCMode)
- {
- if(*pch == 0x0a || ((unsigned char)*pch) == 0x8d)
- {
-
-
-
- memmove(pch, pch + 1, strlen(pch + 1) + 1);
- continue;
- }
- }
-
- ++unProcessingColumn;
-
-
- if(unProcessingColumn >= pEditInstance->unAreaWidth - 1)
- {
- if(pEditInstance->bWordWrapLongLines)
- {
-
-
-
- if(pchLastSpace != NULL && pchLastSpace < pch)
- {
-
- unProcessingColumn -= (UINT)(pch - pchLastSpace);
-
- pch = pchLastSpace;
- }
- }
-
-
- if(unProcessingLine == pEditInstance->unCurrentLine
- && unProcessingColumn < pEditInstance->unCurrentColumn)
- {
-
- pEditInstance->unCurrentLine++;
-
-
- pEditInstance->unCurrentColumn -= unProcessingColumn;
- }
-
- bLineEndedByBreak = FALSE;
- break;
- }
-
- ++pch;
- }
-
-
- if(*pch == '\0')
- {
- bAtEndOfBuffer = TRUE;
- }
-
-
- else
- {
- char chFirstEOLChar = *pch;
- char chSecondEOLChar = '\0';
-
- ++pch;
-
-
-
- if(ODEditIsEOLForMode(pEditInstance, chFirstEOLChar) && *pch != '\0'
- && ODEditIsEOLForMode(pEditInstance, *pch)
- && *pch != chFirstEOLChar)
- {
- chSecondEOLChar = *pch;
- ++pch;
- }
-
-
-
-
-
- if(bLineEndedByBreak)
- {
- ODEditSetBreakSequence(pEditInstance, chFirstEOLChar,
- chSecondEOLChar);
- }
- }
-
- unProcessingLine++;
- }
-
-
- pEditInstance->unLinesInBuffer = unProcessingLine;
-
- return(TRUE);
- }
- static UINT ODEditBufferGetLineLength(tEditInstance *pEditInstance,
- UINT unBufferLine)
- {
- char *pch;
- char *pchStartOfLine;
- UINT unCharsBeforeEOL;
- ASSERT(pEditInstance != NULL);
- ASSERT(unBufferLine < pEditInstance->unLinesInBuffer);
- ASSERT(pEditInstance->unLinesInBuffer <= pEditInstance->unLineArraySize);
-
- pchStartOfLine
- = ODEditBufferGetCharacter(pEditInstance, unBufferLine, 0);
-
- for(pch = pchStartOfLine, unCharsBeforeEOL = 0;
- !ODEditIsEOLForMode(pEditInstance, *pch);
- ++unCharsBeforeEOL, ++pch);
-
-
- if(unBufferLine >= pEditInstance->unLinesInBuffer - 1)
- {
- return(unCharsBeforeEOL);
- }
-
-
-
-
-
- else
- {
- return(MIN(unCharsBeforeEOL, (UINT)(ODEditBufferGetCharacter(
- pEditInstance, unBufferLine + 1, 0) - pchStartOfLine)));
- }
- }
- static UINT ODEditBufferGetTotalLines(tEditInstance *pEditInstance)
- {
- ASSERT(pEditInstance != NULL);
- ASSERT(pEditInstance->unLinesInBuffer <= pEditInstance->unLineArraySize);
-
- return(pEditInstance->unLinesInBuffer);
- }
- static char *ODEditBufferGetCharacter(tEditInstance *pEditInstance,
- UINT unBufferLine, UINT unBufferColumn)
- {
- ASSERT(pEditInstance != NULL);
- ASSERT(unBufferLine < pEditInstance->unLinesInBuffer);
- ASSERT(pEditInstance->unLinesInBuffer <= pEditInstance->unLineArraySize);
- ASSERT(unBufferColumn <= ODEditBufferGetLineLength(pEditInstance, unBufferLine));
-
-
- return(pEditInstance->papchStartOfLine[unBufferLine] + unBufferColumn);
- }
- static tODResult ODEditBufferMakeSpace(tEditInstance *pEditInstance,
- UINT unLine, UINT unColumn, UINT unNumChars)
- {
- UINT unLineLength;
- UINT unBufferUsed;
- UINT unBufferUnused;
- UINT unRemainingBufferBytes;
- UINT unCount;
- char *pchBufferPos;
- tODResult Result;
- ASSERT(pEditInstance != NULL);
- ASSERT(unLine < pEditInstance->unLinesInBuffer);
-
- unLineLength = ODEditBufferGetLineLength(pEditInstance, unLine);
-
-
-
-
- if(unColumn > unLineLength)
- {
- UINT unExtendLineBy = unColumn - unLineLength;
- unColumn -= unExtendLineBy;
- unNumChars += unExtendLineBy;
- }
-
-
- unBufferUsed = strlen(pEditInstance->pszEditBuffer) + 1;
- unBufferUnused = pEditInstance->unBufferSize - unBufferUsed;
- if(unBufferUnused < unNumChars)
- {
-
-
- Result = ODEditTryToGrow(pEditInstance, unBufferUsed + unNumChars);
- if(Result != kODRCSuccess)
- {
-
-
- return(Result);
- }
- }
-
-
- pchBufferPos = ODEditBufferGetCharacter(pEditInstance, unLine, unColumn);
- unRemainingBufferBytes = strlen(pchBufferPos) + 1;
- memmove(pchBufferPos + unNumChars, pchBufferPos, unRemainingBufferBytes);
-
- for(unCount = 0; unCount < unNumChars; ++unCount)
- {
- *pchBufferPos++ = ' ';
- }
-
- return(kODRCSuccess);
- }
- static tODResult ODEditTryToGrow(tEditInstance *pEditInstance,
- UINT unSizeNeeded)
- {
- BOOL bFullReIndexRequired = FALSE;
- ASSERT(pEditInstance != NULL);
- ASSERT(unSizeNeeded > pEditInstance->unBufferSize);
- if(pEditInstance->pUserOptions->pfBufferRealloc != NULL)
- {
-
-
- UINT unNewBufferSize = MAX(pEditInstance->unBufferSize
- + BUFFER_GROW_SIZE, unSizeNeeded);
- char *pszNewBuffer = (char *)((*pEditInstance->pUserOptions->
- pfBufferRealloc)(pEditInstance->pszEditBuffer, unNewBufferSize));
-
-
-
- if(pszNewBuffer == NULL)
- {
- return(kODRCSafeFailure);
- }
-
-
-
- if(pszNewBuffer != pEditInstance->pszEditBuffer)
- {
- bFullReIndexRequired = TRUE;
- }
-
- pEditInstance->pszEditBuffer = pszNewBuffer;
- pEditInstance->unBufferSize = unNewBufferSize;
- }
- else
- {
-
- return(kODRCSafeFailure);
- }
-
- if(bFullReIndexRequired)
- {
- if(!ODEditBufferFormatAndIndex(pEditInstance))
- {
-
- return(kODRCUnrecoverableFailure);
- }
- bFullReIndexRequired = FALSE;
- }
-
-
- return(kODRCSuccess);
- }
|