003 File Manager
Current Path:
/usr/src/contrib/nvi/vi
usr
/
src
/
contrib
/
nvi
/
vi
/
📁
..
📄
extern.h
(4.47 KB)
📄
getc.c
(4.47 KB)
📄
v_at.c
(2.63 KB)
📄
v_ch.c
(5.44 KB)
📄
v_cmd.c
(12.03 KB)
📄
v_delete.c
(2.28 KB)
📄
v_ex.c
(13.78 KB)
📄
v_increment.c
(5.4 KB)
📄
v_init.c
(2.33 KB)
📄
v_itxt.c
(12.1 KB)
📄
v_left.c
(6.25 KB)
📄
v_mark.c
(5.25 KB)
📄
v_match.c
(3.87 KB)
📄
v_paragraph.c
(7.83 KB)
📄
v_put.c
(2.81 KB)
📄
v_redraw.c
(627 B)
📄
v_replace.c
(5.32 KB)
📄
v_right.c
(3.02 KB)
📄
v_screen.c
(1.34 KB)
📄
v_scroll.c
(11.57 KB)
📄
v_search.c
(13.59 KB)
📄
v_section.c
(6.21 KB)
📄
v_sentence.c
(8.21 KB)
📄
v_status.c
(658 B)
📄
v_txt.c
(76.56 KB)
📄
v_ulcase.c
(3.38 KB)
📄
v_undo.c
(4.19 KB)
📄
v_util.c
(2.85 KB)
📄
v_word.c
(12.82 KB)
📄
v_xchar.c
(2.09 KB)
📄
v_yank.c
(2.2 KB)
📄
v_z.c
(3.38 KB)
📄
v_zexit.c
(940 B)
📄
vi.c
(29.95 KB)
📄
vi.h
(15.76 KB)
📄
vs_line.c
(14.42 KB)
📄
vs_msg.c
(21.57 KB)
📄
vs_refresh.c
(23.58 KB)
📄
vs_relative.c
(6.96 KB)
📄
vs_smap.c
(27.8 KB)
📄
vs_split.c
(21.91 KB)
Editing: v_ulcase.c
/*- * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * Copyright (c) 1992, 1993, 1994, 1995, 1996 * Keith Bostic. All rights reserved. * * See the LICENSE file for redistribution information. */ #include "config.h" #include <sys/types.h> #include <sys/queue.h> #include <sys/time.h> #include <bitstring.h> #include <ctype.h> #include <errno.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "../common/common.h" #include "vi.h" static int ulcase(SCR *, recno_t, CHAR_T *, size_t, size_t, size_t); /* * v_ulcase -- [count]~ * Toggle upper & lower case letters. * * !!! * Historic vi didn't permit ~ to cross newline boundaries. I can * think of no reason why it shouldn't, which at least lets the user * auto-repeat through a paragraph. * * !!! * In historic vi, the count was ignored. It would have been better * if there had been an associated motion, but it's too late to make * that the default now. * * PUBLIC: int v_ulcase(SCR *, VICMD *); */ int v_ulcase(SCR *sp, VICMD *vp) { recno_t lno; size_t cno, lcnt, len; u_long cnt; CHAR_T *p; lno = vp->m_start.lno; cno = vp->m_start.cno; for (cnt = F_ISSET(vp, VC_C1SET) ? vp->count : 1; cnt > 0; cno = 0) { /* SOF is an error, EOF is an infinite count sink. */ if (db_get(sp, lno, 0, &p, &len)) { if (lno == 1) { v_emsg(sp, NULL, VIM_EMPTY); return (1); } --lno; break; } /* Empty lines decrement the count by one. */ if (len == 0) { --cnt; vp->m_final.cno = 0; continue; } if (cno + cnt >= len) { lcnt = len - 1; cnt -= len - cno; vp->m_final.cno = len - 1; } else { lcnt = cno + cnt - 1; cnt = 0; vp->m_final.cno = lcnt + 1; } if (ulcase(sp, lno, p, len, cno, lcnt)) return (1); if (cnt > 0) ++lno; } vp->m_final.lno = lno; return (0); } /* * v_mulcase -- [count]~[count]motion * Toggle upper & lower case letters over a range. * * PUBLIC: int v_mulcase(SCR *, VICMD *); */ int v_mulcase(SCR *sp, VICMD *vp) { CHAR_T *p; size_t len; recno_t lno; for (lno = vp->m_start.lno;;) { if (db_get(sp, lno, DBG_FATAL, &p, &len)) return (1); if (len != 0 && ulcase(sp, lno, p, len, lno == vp->m_start.lno ? vp->m_start.cno : 0, !F_ISSET(vp, VM_LMODE) && lno == vp->m_stop.lno ? vp->m_stop.cno : len)) return (1); if (++lno > vp->m_stop.lno) break; } /* * XXX * I didn't create a new motion command when I added motion semantics * for ~. While that's the correct way to do it, that choice would * have required changes all over the vi directory for little gain. * Instead, we pretend it's a yank command. Note, this means that we * follow the cursor motion rules for yank commands, but that seems * reasonable to me. */ return (0); } /* * ulcase -- * Change part of a line's case. */ static int ulcase(SCR *sp, recno_t lno, CHAR_T *lp, size_t len, size_t scno, size_t ecno) { size_t blen; int change, rval; ARG_CHAR_T ch; CHAR_T *p, *t, *bp; GET_SPACE_RETW(sp, bp, blen, len); MEMMOVE(bp, lp, len); change = rval = 0; for (p = bp + scno, t = bp + ecno + 1; p < t; ++p) { ch = (UCHAR_T)*p; if (ISLOWER(ch)) { *p = TOUPPER(ch); change = 1; } else if (ISUPPER(ch)) { *p = TOLOWER(ch); change = 1; } } if (change && db_set(sp, lno, bp, len)) rval = 1; FREE_SPACEW(sp, bp, blen); return (rval); }
Upload File
Create Folder