void meUndoAddReplaceBgn(meLine *elinep, meUShort elineo) { if(meModeTest(frameCur->bufferCur->mode,MDUNDO)) { meUndoNode *nn ; int len ; if(elinep == frameCur->bufferCur->baseLine) { elinep = meLineGetPrev(elinep) ; elineo = meLineGetLength(elinep) ; } if(elinep == frameCur->windowCur->dotLine) len = elineo - frameCur->windowCur->dotOffset ; else { meLine *ll = frameCur->windowCur->dotLine ; len = meLineGetLength(ll) - frameCur->windowCur->dotOffset + elineo+1 ; while((ll = meLineGetNext(ll)) != elinep) len += meLineGetLength(ll)+1 ; } if((nn = meUndoCreateNode(sizeof(meUndoNode)+len)) != NULL) { meLine *ll = frameCur->windowCur->dotLine ; meUByte *dd=nn->str, *ss=ll->text+frameCur->windowCur->dotOffset ; nn->type |= meUNDO_DELETE ; /* This should be zero because added on the end call. */ nn->count = 0; if(elinep == frameCur->windowCur->dotLine) { for(; len ; len--) *dd++ = *ss++ ; } else { len = meLineGetLength(ll) - frameCur->windowCur->dotOffset ; for(; len ; len--) *dd++ = *ss++ ; *dd++ = meCHAR_NL ; while((ll = meLineGetNext(ll)) != elinep) { len = meLineGetLength(ll) ; ss = ll->text ; for(; len ; len--) *dd++ = *ss++ ; *dd++ = meCHAR_NL ; } ss = ll->text ; for(; elineo ; elineo--) *dd++ = *ss++ ; } *dd = '\0' ; } } }
/* * This routine figures out the * bounds of the region in the current window, and * fills in the fields of the "meRegion" structure pointed * to by "rp". Because the dot and mark are usually very * close together, we scan outward from dot looking for * mark. This should save time. Return a standard code. * Callers of this routine should be prepared to get * an "meABORT" status; we might make this have the * conform thing later. */ int getregion(register meRegion *rp) { meLine *lp, *elp; long size; if (frameCur->windowCur->markLine == NULL) return noMarkSet() ; if(frameCur->windowCur->dotLine == frameCur->windowCur->markLine) { rp->line = frameCur->windowCur->dotLine; if (frameCur->windowCur->dotOffset < frameCur->windowCur->markOffset) { rp->offset = frameCur->windowCur->dotOffset; rp->size = (long)(frameCur->windowCur->markOffset-frameCur->windowCur->dotOffset); } else { rp->offset = frameCur->windowCur->markOffset; rp->size = (long)(frameCur->windowCur->dotOffset-frameCur->windowCur->markOffset); } rp->lineNo = frameCur->windowCur->dotLineNo; return meTRUE ; } if(frameCur->windowCur->dotLineNo < frameCur->windowCur->markLineNo) { elp = frameCur->windowCur->markLine ; lp = frameCur->windowCur->dotLine ; rp->lineNo = frameCur->windowCur->dotLineNo ; rp->offset = frameCur->windowCur->dotOffset ; size = frameCur->windowCur->dotOffset ; size = frameCur->windowCur->markOffset + meLineGetLength(lp) - size - frameCur->windowCur->dotLineNo + frameCur->windowCur->markLineNo ; } else { elp = frameCur->windowCur->dotLine ; lp = frameCur->windowCur->markLine ; rp->lineNo = frameCur->windowCur->markLineNo ; rp->offset = frameCur->windowCur->markOffset ; size = frameCur->windowCur->markOffset ; size = frameCur->windowCur->dotOffset + meLineGetLength(lp) - size + frameCur->windowCur->dotLineNo - frameCur->windowCur->markLineNo ; } rp->line = lp ; while((lp=meLineGetNext(lp)) != elp) size += meLineGetLength(lp) ; rp->size = size ; return meTRUE ; }
void meUndoAddUnnarrow(meInt sln, meInt eln, meInt name, meScheme scheme, meInt markupCmd, meLine *markupLine) { meUndoNarrow *nn ; int ll ; ll = (markupLine) ? meLineGetLength(markupLine):0 ; if((frameCur->bufferCur->undoHead != NULL) && ((nn = (meUndoNarrow*) meUndoCreateNode(sizeof(meUndoNarrow)+ll)) != NULL)) { nn->type |= meUNDO_SPECIAL|meUNDO_NARROW ; nn->udata.dotp = sln ; nn->count = eln ; nn->name = name ; nn->scheme = scheme ; nn->markupCmd = markupCmd ; if(markupLine != NULL) { nn->markupFlag = meTRUE ; meStrcpy(nn->str,meLineGetText(markupLine)) ; } else nn->markupFlag = meFALSE ; } }
void meUndoAddDelChars(meInt numChars) { meUndoNode *nn ; if(numChars < 0) numChars = 0 ; if(meModeTest(frameCur->bufferCur->mode,MDUNDO) && ((nn = meUndoCreateNode(sizeof(meUndoNode)+numChars)) != NULL)) { meLine *ll = frameCur->windowCur->dotLine ; int len ; meUByte *dd=nn->str, *ss=ll->text+frameCur->windowCur->dotOffset ; nn->type |= meUNDO_DELETE ; nn->count = 0; if((len = meLineGetLength(ll) - frameCur->windowCur->dotOffset) < numChars) { for(;;) { numChars-=len+1 ; for(; len ; len--) *dd++ = *ss++ ; ll = meLineGetNext(ll) ; ss = ll->text ; /* A bit of a bodge here to cope with the bogus last line * If the last but 1 line's '\n' is about to be removed * don't actually store the '\n' as this is automatically * added by the system */ if((numChars == 0) && (ll == frameCur->bufferCur->baseLine)) break ; *dd++ = meCHAR_NL ; if(numChars <= (len=meLineGetLength(ll))) break ; } } for(; numChars ; numChars--) *dd++ = *ss++ ; *dd = '\0' ; } }
int insMacro(int f, int n) { meWindow *wp ; register meLine *lp, *slp ; meMacro *mac ; meUByte buf[meBUF_SIZE_MAX] ; meInt nol, lineNo, len ; int ii ; meStrcpy(buf,"define-macro ") ; if((mac=userGetMacro(buf+13, meBUF_SIZE_MAX-13)) == NULL) return false ; if((ii=bufferSetEdit()) <= 0) /* Check we can change the buffer */ return ii ; frameCur->windowCur->dotOffset = 0 ; slp = frameCur->windowCur->dotLine ; lineNo = frameCur->windowCur->dotLineNo ; nol = addLine(slp,buf) ; len = meStrlen(buf) + 9 ; lp = meLineGetNext(mac->hlp); /* First line. */ while (lp != mac->hlp) { nol += addLine(slp,lp->text) ; len += meLineGetLength(lp) + 1 ; lp = meLineGetNext(lp); } nol += addLine(slp,(meUByte *)"!emacro") ; frameCur->bufferCur->lineCount += nol ; meFrameLoopBegin() ; for (wp=loopFrame->windowList; wp!=NULL; wp=wp->next) { if (wp->buffer == frameCur->bufferCur) { if(wp->dotLineNo >= lineNo) wp->dotLineNo += nol ; if(wp->markLineNo >= lineNo) wp->markLineNo += nol ; wp->updateFlags |= WFMAIN|WFMOVEL ; } } meFrameLoopEnd() ; #if MEOPT_UNDO meUndoAddInsChars(len) ; #endif return true ; }
/* NOTE: Narrow undos are only added if there is already an * undo. This is so the state of the buffer will be correct * for the previous undo */ void meUndoAddNarrow(meInt sln, meInt name, meInt markupCmd, meLine *firstLine) { meUndoNarrow *nn ; int ll ; ll = (markupCmd > 0) ? meLineGetLength(firstLine):0 ; if((frameCur->bufferCur->undoHead != NULL) && ((nn = (meUndoNarrow *) meUndoCreateNode(sizeof(meUndoNarrow)+ll)) != NULL)) { nn->type |= meUNDO_SPECIAL|meUNDO_NARROW|meUNDO_NARROW_ADD ; nn->udata.dotp = sln ; nn->count = 0 ; nn->name = name ; nn->markupCmd = markupCmd ; if(markupCmd > 0) meStrcpy(nn->str,meLineGetText(firstLine)) ; } }
/* * Copy all of the characters in the * region to the kill buffer. Don't move dot * at all. This is a bit like a kill region followed * by a yank. Bound to "M-W". */ int copyRegion(int f, int n) { meRegion region ; meLine *line; meUByte *ss, *dd ; meInt left, ii, ret ; #if MEOPT_NARROW meUShort eoffset ; meLine *markLine, *dotLine, *elp ; meInt markLineNo, dotLineNo, expandNarrows=meFALSE ; meUShort markOffset, dotOffset ; #endif if(getregion(®ion) <= 0) return meFALSE ; left = region.size ; line = region.line ; #if MEOPT_NARROW if((n & 0x01) && (frameCur->bufferCur->narrow != NULL) && (frameCur->windowCur->dotLine != frameCur->windowCur->markLine)) { /* expand narrows that are within the region */ expandNarrows = meTRUE ; dotLine = frameCur->windowCur->dotLine ; dotLineNo = frameCur->windowCur->dotLineNo ; dotOffset = frameCur->windowCur->dotOffset ; markLine = frameCur->windowCur->markLine ; markLineNo = frameCur->windowCur->markLineNo ; markOffset = frameCur->windowCur->markOffset ; if(line == dotLine) { elp = markLine ; eoffset = markOffset ; } else { elp = dotLine ; eoffset = dotOffset ; } left += meBufferRegionExpandNarrow(frameCur->bufferCur,&line,region.offset,elp,eoffset,0) ; if(((frameCur->windowCur->dotLine != dotLine) && dotOffset) || ((frameCur->windowCur->markLine != markLine) && markOffset)) { ret = mlwrite(MWABORT,(meUByte *)"[Bad region definition]") ; goto copy_region_exit ; } } #endif if(lastflag != meCFKILL) /* Kill type command. */ killSave(); if(left == 0) { thisflag = meCFKILL ; ret = meTRUE ; goto copy_region_exit ; } if((dd = killAddNode(left)) == NULL) { ret = meFALSE ; goto copy_region_exit ; } if((ii = region.offset) == meLineGetLength(line)) goto add_newline ; /* Current offset. */ ss = line->text+ii ; ii = meLineGetLength(line) - ii ; goto copy_middle ; while(left) { ss = line->text ; ii = meLineGetLength(line) ; copy_middle: /* Middle of line. */ if(ii > left) { ii = left ; left = 0 ; } else left -= ii ; while(ii--) *dd++ = *ss++ ; add_newline: if(left != 0) { *dd++ = meCHAR_NL ; line = meLineGetNext(line); left-- ; } } thisflag = meCFKILL ; ret = meTRUE ; copy_region_exit: #if MEOPT_NARROW if(expandNarrows) { meBufferCollapseNarrowAll(frameCur->bufferCur) ; frameCur->windowCur->dotLine = dotLine ; frameCur->windowCur->dotLineNo = dotLineNo ; frameCur->windowCur->dotOffset = dotOffset ; frameCur->windowCur->markLine = markLine ; frameCur->windowCur->markLineNo = markLineNo ; frameCur->windowCur->markOffset = markOffset ; } #endif return ret ; }
static int findHelpItem(meUByte *item, int silent) { meWindow *wp ; meBuffer *bp, *hbp ; meLine *lp, *elp ; int sectLen, itemLen, ii ; meUByte *ss, cc, sect[5] ; itemLen = meStrlen(item) ; if((item[itemLen-1] == ')') && ((item[(ii=itemLen-3)] == '(') || (item[(ii=itemLen-4)] == '(') )) { sectLen = itemLen-ii-2 ; meStrcpy(sect,item+ii) ; itemLen = ii ; item[itemLen] = '\0' ; } else { sectLen = 0 ; sect[0] = '\0' ; sect[1] = '\0' ; } if((hbp=helpBufferFind()) == NULL) return meABORT ; elp = hbp->baseLine ; try_again: lp = meLineGetNext(elp) ; while(lp != elp) { if((lp->text[0] == '!') && (!sectLen || ((sect[1] == lp->text[2]) && (((sectLen == 1) && (lp->text[3] == ' ')) || (sect[2] == lp->text[3]))))) { if((cc=lp->text[1]) == ' ') { ii = meLineGetLength(lp) - 4 ; if(ii != itemLen) ii = -1 ; } else { ii = cc - '0' ; if(ii > itemLen) ii = -1 ; } if((ii > 0) && !meStrncmp(item,lp->text+4,ii)) break ; } lp = meLineGetNext(lp) ; } if(lp == elp) { meMacro *mac ; if(!meModeTest(hbp->mode,MDLOCK)) { if(helpBufferLoad(hbp) == meABORT) return meABORT ; goto try_again ; } if((getMacroTypeS(item) == TKCMD) && ((ii = decode_fncname(item,1)) >= CK_MAX) && ((mac = getMacro(ii)) != NULL) && (mac->hlp->flag & meMACRO_FILE)) { meModeClear(hbp->mode,MDVIEW) ; if(mac->fname != NULL) execFile(mac->fname,0,1) ; else execFile(mac->name,0,1) ; helpBufferReset(hbp) ; if(!(mac->hlp->flag & meMACRO_FILE)) goto try_again ; } if(!silent) mlwrite(MWABORT,(meUByte *)"[Can't find help on %s%s]",item,sect); return meABORT ; } if((wp = meWindowPopup(BhelpN,BFND_CREAT|BFND_CLEAR|WPOP_USESTR,NULL)) == NULL) return false ; if((sectLen == 0) && (lp->text[2] != ' ')) { ss = sect ; *ss++ = '(' ; *ss++ = lp->text[2] ; if(lp->text[3] != ' ') *ss++ = lp->text[3] ; *ss++ = ')' ; *ss = '\0' ; } bp = wp->buffer ; /* Add the header */ { meUByte buff[meBUF_SIZE_MAX] ; sprintf((char *)buff,"\033cD%s%s\033cA",lp->text+4,sect) ; addLineToEob(bp,buff) ; addLineToEob(bp,(meUByte *)"\n\033lsMicroEmacs\033lm[Home]\033le \033lsCommand G\033lm[Commands]\033le \033lsVariable \033lm[Variables]\033le \033lsMacro Lan\033lm[Macro-Dev]\033le \033lsGlobal G\033lm[Glossary]\033le") ; memset(buff,boxChars[BCEW],78) ; buff[78] = '\n' ; buff[79] = '\0' ; addLineToEob(bp,buff) ; } while(((lp=meLineGetNext(lp)) != elp) && (lp->text[0] == '!')) ; while((lp != elp) && ((cc=lp->text[0]) != '!')) { if(cc == '|') { if(meStrcmp(item,lp->text+1)) lp = meLineGetNext(lp) ; } else if(cc == '$') { if(lp->text[1] == 'a') { if(sect[1] == '5') { meUByte line[meBUF_SIZE_MAX], *ss ; if((ss = getval(item)) != NULL) { addLineToEob(bp,(meUByte *)"\n\n\033cEVALUE\033cA\n") ; meStrcpy(line," \"") ; meStrncpy(line+5,ss,meBUF_SIZE_MAX-13) ; line[meBUF_SIZE_MAX-2] = '\0' ; meStrcat(line,"\"") ; addLineToEob(bp,line) ; } } if(sect[1] == '2') { if((ii = decode_fncname(item,1)) >= 0) { meBind *ktp ; meUByte line[meBUF_SIZE_MAX], *ss ; addLineToEob(bp,(meUByte *)"\n\n\033cEBINDINGS\033cA\n") ; meStrcpy(line," ") ; ss = line+4 ; for(ktp = &keytab[0] ; ktp->code != ME_INVALID_KEY ; ktp++) { if(ktp->index == ii) { *ss++ = '"' ; meGetStringFromKey(ktp->code,ss); ss += meStrlen(ss) ; *ss++ = '"' ; *ss++ = ' ' ; } } if(ss == line+4) meStrcpy(ss,"none") ; else *ss = '\0' ; addLineToEob(bp,line) ; } } } } else addLineToEob(bp,lp->text) ; lp = meLineGetNext(lp) ; } /* Add the footer */ { meUByte buff[meBUF_SIZE_MAX] ; buff[0] = '\n' ; memset(buff+1,boxChars[BCEW],78) ; sprintf((char *)buff+79,"\n\033lsCopyright\033lm%s\033le",meCopyright) ; addLineToEob(bp,buff) ; } bp->dotLine = meLineGetNext(bp->baseLine); bp->dotOffset = 0 ; bp->dotLineNo = 0 ; meModeClear(bp->mode,MDEDIT) ; /* don't flag this as a change */ meModeSet(bp->mode,MDVIEW) ; /* put this buffer view mode */ resetBufferWindows(bp) ; /* Update the window */ mlerase(MWCLEXEC); /* clear the mode line */ return true ; }