This is replace.c in view mode; [Download] [Up]
/* * Copyright (c) 1992, 1995 John E. Davis (davis@space.mit.edu) * All Rights Reserved. */ #include <config.h> #include <stdio.h> #include <string.h> #include <slang.h> #include "buffer.h" #include "replace.h" #include "search.h" #include "screen.h" #include "ins.h" #include "ledit.h" #include "misc.h" #include "paste.h" int Replace_Preserve_Case = 0; /* returns the length of the region inserted. */ int replace_chars (int *np, char *neew) { int len, n; int preserve_case; char *old = NULL; int i; CHECK_READ_ONLY if ((n = *np) < 0) return 0; len = strlen (neew); preserve_case = (Replace_Preserve_Case && (len == n)); push_mark (); if (preserve_case) push_mark (); n = forwchars (np); if (preserve_case) { if (n == len) { if (NULL == (old = make_buffer_substring(&n))) return 0; } else { preserve_case = 0; pop_mark (&Number_Zero); } } delete_region (); if (preserve_case) { unsigned char ch; for (i = 0; i < len; i++) { ch = (unsigned char) old[i]; if (ch == UPPER_CASE(ch)) { if (ch == LOWER_CASE(ch)) old[i] = neew[i]; else old[i] = UPPER_CASE(neew[i]); } else old[i] = LOWER_CASE(neew[i]); } neew = old; } ins_chars((unsigned char *) neew, len); if (preserve_case) SLFREE (old); return len; } int replace_next(char *old, char *neew) { int n; if (search(old, 1, 0) == 0) return(0); n = strlen (old); (void) replace_chars (&n, neew); return(1); } /* This code implements a kill ring of sorts. It could be done in S-Lang but * S-Lang cannot handle strings with embedded NULL characters. I do not * want to lose compatability with C or I would allow S-Lang strings to handle * the NULL chars. */ #ifndef Sixteen_Bit_System # define MAX_KILL_ARRAY_SIZE 16 int Kill_Array_Size = MAX_KILL_ARRAY_SIZE; typedef struct { unsigned char *buf; int len; } Char_Array_Type; Char_Array_Type Kill_Array [MAX_KILL_ARRAY_SIZE]; void copy_region_to_kill_array (int *np) { int n = *np; unsigned char *buf; if (n < 0) n = 0; n = n % MAX_KILL_ARRAY_SIZE; if ((buf = Kill_Array[n].buf) != NULL) SLFREE (buf); Kill_Array[n].buf = (unsigned char *) make_buffer_substring (&Kill_Array[n].len); } void insert_from_kill_array (int *np) { int n = *np; unsigned char *buf; CHECK_READ_ONLY_VOID if (n < 0) n = 0; n = n % MAX_KILL_ARRAY_SIZE; if ((buf = Kill_Array[n].buf) == NULL) return; ins_chars (buf, Kill_Array[n].len); } void append_region_to_kill_array (int *np) { int n = *np, len, oldlen; unsigned char *buf, *newbuf; if (n < 0) n = 0; n = n % MAX_KILL_ARRAY_SIZE; buf = (unsigned char *) make_buffer_substring (&len); if (buf == NULL) return; oldlen = Kill_Array[n].len; newbuf = (unsigned char *) SLREALLOC (Kill_Array[n].buf, oldlen + len + 1); if (newbuf != NULL) { MEMCPY ((char *) newbuf + oldlen, (char *) buf, len); Kill_Array[n].buf = newbuf; Kill_Array[n].len = oldlen + len; } SLFREE (buf); } #endif /* NOT 16bit system */ static int bol_bsearch_char (int *ch) { char buf[2]; buf[0] = (unsigned char) (*ch); buf[1] = 0; return bol_bsearch (buf); } static int bol_fsearch_char (int *ch) { char buf[2]; buf[0] = (unsigned char) (*ch); buf[1] = 0; return bol_fsearch (buf); } static int fsearch_char (int *ch) { char buf[2]; buf[0] = (unsigned char) (*ch); buf[1] = 0; return search_forward (buf); } static int bsearch_char (int *ch) { char buf[2]; buf[0] = (unsigned char) (*ch); buf[1] = 0; return search_backward (buf); } static int ffind_char (int *ch) { char buf[2]; buf[0] = (unsigned char) (*ch); buf[1] = 0; return forward_search_line (buf); } static int bfind_char (int *ch) { char buf[2]; buf[0] = (unsigned char) (*ch); buf[1] = 0; return backward_search_line (buf); } SLang_Name_Type Jed_Other_Intrinsics [] = { MAKE_INTRINSIC(".fsearch", search_forward, INT_TYPE, 1), /* Prototype: Integer fsearch (String str); * This function may be used to search forward in buffer looking for the * string @str@. If not found, this functions returns zero. However, * if found, the length of the string is returned and the current point * is moved to the to the start of the match. It respects the setting * of the variable @CASE_SEARCH@. If the string that one is searching * for is known to be at the beginning of a line, the function * @bol_fsearch@ should be used instead. * * Note: This function cannot find a match that crosses lines. * Related Functions: @ffind@, @fsearch_char@, @bsearch@, @bol_fsearch@, @re_fsearch@, @looking_at@ * Related Variables: @CASE_SEARCH@ */ MAKE_INTRINSIC(".bsearch", search_backward, INT_TYPE, 1), /* Prototype: Integer bsearch (String str); * The @bsearch@ function searches backward from the current position * for the string @str@. If @str@ is found, this function will return * the length of @str@ and move the current position to the beginning of * the matched text. If a match is not found, zero will be returned and * the position will not change. It respects the value of the variable * @CASE_SEARCH@. * * Related Functions: @fsearch@, @bol_bsearch@, @re_bsearch@ */ MAKE_INTRINSIC(".bfind", backward_search_line, INT_TYPE, 1), /* Prototype: Integer bfind (String str); * @bfind@ searches backward from the current position to the beginning * of the line for the string @str@. If a match is found, the length of * @str@ is returned and the current point is moved to the start of the * match. If no match is found, zero is returned. * Note: This function respects the setting of the @CASE_SEARCH@ variable. * Related Functions: @bsearch@, @ffind@, @bol_bsearch@, @re_bsearch@ * Related Variables: @CASE_SEARCH@ */ MAKE_INTRINSIC(".ffind", forward_search_line, INT_TYPE, 1), /* Prototype: Integer ffind (String s); * @ffind@ searches forward from the current position to the end of the * line for the string @str@. If a match is found, the length of @str@ * is returned and the current point is moved to the start of the match. * If no match is found, zero is returned. * Note: This function respects the setting of the @CASE_SEARCH@ variable. * To perform a search that includes multiple lines, use the @fsearch@ * function. * Related Functions: @fsearch@, @bfind@, @re_fsearch@, @bol_fsearch@ */ MAKE_INTRINSIC(".bol_fsearch", bol_fsearch, INT_TYPE, 1), /* Prototype: Integer bol_fsearch (str); * @bol_fsearch@ searches forward from the current point until the end * of the buffer for occurrences of the string @str@ at the beginning of * a line. If a match is found, the length of @str@ is returned and the * current point is moved to the start of the match. If no match is * found, zero is returned. * Note: @bol_fsearch@ is much faster than using @re_fsearch@ to perform * a search that matches the beginning of a line. * * Related Functions: @bol_bsearch@, @fsearch@, @ffind@, @re_fsearch@ * Related Variables: @CASE_SEARCH@ */ MAKE_INTRINSIC(".bol_bsearch", bol_bsearch, INT_TYPE, 1), /* Prototype: Integer bol_bsearch (str); * @bol_bsearch@ searches backward from the current point until the * beginning of the buffer for the occurrences of the string @str@ at * the beginning of a line. If a match is found, the length of @str@ is * returned and the current point is moved to the start of the match. If * no match is found, zero is returned. * * Note: @bol_bsearch@ is much faster than using @re_bsearch@ to perform * a search that matches the beginning of a line. * * Related Functions: @bol_fsearch@, @bsearch@, @bfind@, @re_bsearch@ * Related Variables: @CASE_SEARCH@ */ MAKE_INTRINSIC(".bol_fsearch_char", bol_fsearch_char, INT_TYPE, 1), /* Prototype: Integer bol_fsearch_char (Integer ch); * This function searches forward for a character @ch@ at the beginning * of a line. If it is found, @1@ is returned; otherwise @0@ is returned. * Related functions: @bol_fsearch@, @bol_bsearch_char@, @fsearch_char@ * Related variables: @CASE_SEARCH@ */ MAKE_INTRINSIC(".bol_bsearch_char", bol_bsearch_char, INT_TYPE, 1), /* Prototype: Integer bol_fsearch_char (Integer ch); * This function searches backward for a character @ch@ at the beginning * of a line. If it is found, @1@ is returned; otherwise @0@ is returned. * Related functions: @bol_bsearch@, @bol_fsearch_char@, @bsearch_char@ * Related variables: @CASE_SEARCH@ */ MAKE_INTRINSIC(".fsearch_char", fsearch_char, INT_TYPE, 1), /* Prototype: Integer fsearch_char (Integer ch); * This function searches forward for a character @ch@. If it is * found, @1@ is returned; otherwise @0@ is returned. * Related functions: @fsearch@, @ffind_char@, @bsearch_char@ * Related variables: @CASE_SEARCH@ */ MAKE_INTRINSIC(".bsearch_char", bsearch_char, INT_TYPE, 1), /* Prototype: Integer fsearch_char (Integer ch); * This function searches backward for a character @ch@. If it is * found, @1@ is returned; otherwise @0@ is returned. * Related functions: @fsearch_char@, @ffind_char@, @fsearch@ * Related variables: @CASE_SEARCH@ */ MAKE_INTRINSIC(".bfind_char", bfind_char, INT_TYPE, 1), /* Prototype: Integer fsearch_char (Integer ch); * This function searches backward on the current line for a character * @ch@. If it is found, @1@ is returned; otherwise @0@ is returned. * Related functions: @fsearch_char@, @ffind_char@, @fsearch@ * Related variables: @CASE_SEARCH@ */ MAKE_INTRINSIC(".ffind_char", ffind_char, INT_TYPE, 1), /* Prototype: Integer fsearch_char (Integer ch); * This function searches forwardward on the current line for a character * @ch@. If it is found, @1@ is returned; otherwise @0@ is returned. * Related functions: @fsearch_char@, @bfind_char@, @fsearch@ * Related variables: @CASE_SEARCH@ */ MAKE_INTRINSIC(".replace", replace_cmd, VOID_TYPE, 2), /* Prototype: Void replace(String old, String new); * This function may be used to replace all occurances of the string * @old@ with the string, @new@, from current editing point to the end * of the buffer. The editing point is returned to the initial location. * That is, this function does not move the editing point. * Related Functions: @replace_chars@, @fsearch@, @re_fsearch@, @bsearch@, @ffind@, @del@ * Related Variables: @REPLACE_PRESERVE_CASE@ */ MAKE_INTRINSIC(".replace_chars", replace_chars, INT_TYPE, 2), /* Prototype: Void replace_chars (Integer n, String new); * This function may be used to replace the next @n@ characters at the * editing position by the string @new@. After the replacement, the editing * point will be moved to the end of the inserted string. The length of * the replacement string @new@ is returned. * Related Functions: @fsearch@, @re_fsearch@, @bsearch@, @ffind@, @del@ * Related Variables: @REPLACE_PRESERVE_CASE@ */ MAKE_INTRINSIC(".regexp_nth_match", regexp_nth_match, VOID_TYPE, 1), /* Prototype: String regexp_nth_match (Integer n); * This function returns the nth sub-expression matched by the last regular * expression search. If the parameter @n@ is zero, the entire match is * returned. * Note: The value returned by this function is meaningful only if the * editing point has not been moved since the match. * Related Functions: @re_fsearch@, @re_bsearch@ */ MAKE_INTRINSIC(".replace_match", replace_match, INT_TYPE, 2), /* Prototype: Integer replace_match(String s, Integer how); * This function replaces text previously matched with @re_fsearch@ or * @re_bsearch@ at the current editing point with string @s@. If @how@ is * zero, @s@ is a specially formatted string of the form described below. * If @how@ is non-zero, @s@ is regarded as a simple string and is used * literally. If the replacement fails, this function returns zero * otherwise, it returns non-zero. */ MAKE_INTRINSIC(".re_fsearch", re_search_forward, INT_TYPE, 1), /* Prototype: Integer re_fsearch(String pattern); * Search forward for regular expression @pattern@. This function returns * the 1 + length of the string matched. If no match is found, it returns * 0. * * Related Functions: @fsearch@, @bol_fsearch@, @re_bsearch@ */ MAKE_INTRINSIC(".re_bsearch", re_search_backward, INT_TYPE, 1), /* Prototype: Integer re_bsearch(String pattern); * Search backward for regular expression @pattern@. This function returns * the 1 + length of the string matched. If no match is found, it returns * 0. * * Related Functions: @bsearch@, @bol_bsearch@, @re_fsearch@ */ MAKE_VARIABLE(".REPLACE_PRESERVE_CASE_INTERNAL", &Replace_Preserve_Case, INT_TYPE, 0), /* Prototype: Integer REPLACE_PRESERVE_CASE_INTERNAL = 0; * This variable affects the @replace@ function. If the length of the * old string is the same as the new string and this variable is * non-zero, then then the case of the old string will be preserved by * the replace function. For example, if @REPLACE_PRESERVE_CASE_INTERNAL@ * is non-zero, and @"abCdE"@ is replaced by @"tuvwx"@, then @"tuVwX"@ will * actually be used. * Note: This variable's value automatically gets reset to zero after every * keystroke. */ MAKE_VARIABLE(".CASE_SEARCH", &Case_Sensitive, INT_TYPE, 0), /* Prototype: Integer CASE_SEARCH = 0; * if 1, searches are case sensitive. If 0, they are not */ SLANG_END_TABLE };
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.