1 /*- 2 * Copyright (c) 1992, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rodney Ruddock of the University of Guelph. 7 * 8 * %sccs.include.redist.c% 9 */ 10 11 #ifndef lint 12 static char sccsid[] = "@(#)m.c 8.1 (Berkeley) 05/31/93"; 13 #endif /* not lint */ 14 15 #include <sys/types.h> 16 17 #include <regex.h> 18 #include <setjmp.h> 19 #include <stdio.h> 20 #include <string.h> 21 22 #ifdef DBI 23 #include <db.h> 24 #endif 25 26 #include "ed.h" 27 #include "extern.h" 28 29 /* 30 * Move the specified lines to the new location. It's quick 'cause 31 * just a couple of pointers are redirected. 32 */ 33 void 34 m(inputt, errnum) 35 FILE *inputt; 36 int *errnum; 37 { 38 LINE *l_dest=NULL, *l_old_top, *l_old_bottom; 39 40 /* Set l_dest here. */ 41 if (((ss = getc(inputt)) != '\n') && (ss != EOF)) { 42 for (;;) { 43 if (ss != ' ') { 44 ungetc(ss, inputt); 45 break; 46 } 47 ss = getc(inputt); 48 } 49 l_dest = address_conv(NULL, inputt, errnum); 50 } else 51 (ungetc(ss, inputt), *errnum = -1); 52 if (*errnum < 0) { 53 strcpy(help_msg, "bad destination address"); 54 return; 55 } 56 *errnum = 0; 57 if (rol(inputt, errnum)) 58 return; 59 60 if (Start_default && End_default) 61 Start = End = current; 62 else 63 if (Start_default) 64 Start = End; 65 if (Start == NULL) { 66 strcpy(help_msg, "buffer empty"); 67 *errnum = -1; 68 return; 69 } 70 Start_default = End_default = 0; 71 72 /* Do some address checking. */ 73 if ((l_dest) && ((l_dest == Start) || 74 (address_check(l_dest, Start) == -1)) && 75 (address_check(End, l_dest) == -1)) { 76 ungetc(ss, inputt); 77 *errnum = -1; 78 strcpy(help_msg, "destination address in address range"); 79 return; 80 } 81 change_flag = 1; 82 if (g_flag == 0) 83 u_clr_stk(); 84 85 /* 86 * Some more address checking. These are "legal" command constructions 87 * but are kind-a useless since the buffer doesn't change. 88 */ 89 *errnum = 1; 90 if ((Start == l_dest) || (End == l_dest)) 91 return; 92 if ((Start == top) && (End == bottom)) 93 return; 94 if ((Start == top) && (l_dest == NULL)) 95 return; 96 *errnum = 0; 97 98 l_old_top = top; 99 l_old_bottom = bottom; 100 101 sigspecial++; 102 103 if (Start == top) { 104 top = End->below; 105 u_add_stk(&(End->below->above)); 106 top->above = NULL; 107 } else 108 if (End == bottom) { 109 bottom = Start->above; 110 u_add_stk(&(Start->above->below)); 111 bottom->below = NULL; 112 } else { 113 u_add_stk(&(Start->above->below)); 114 Start->above->below = End->below; 115 u_add_stk(&(End->below->above)); 116 End->below->above = Start->above; 117 } 118 119 if (l_dest == NULL) { 120 u_add_stk(&(Start->above)); 121 Start->above = NULL; 122 u_add_stk(&(End->below)); 123 End->below = l_old_top; 124 u_add_stk(&(l_old_top->above)); 125 l_old_top->above = End; 126 top = Start; 127 } else 128 if (l_dest == l_old_bottom) { 129 u_add_stk(&(End->below)); 130 End->below = NULL; 131 u_add_stk(&(Start->above)); 132 Start->above = l_dest; 133 u_add_stk(&(l_dest->below)); 134 l_dest->below = Start; 135 bottom = End; 136 } else { 137 u_add_stk(&(Start->above)); 138 Start->above = l_dest; 139 u_add_stk(&(End->below)); 140 End->below = l_dest->below; 141 u_add_stk(&(l_dest->below->above)); 142 l_dest->below->above = End; 143 u_add_stk(&(l_dest->below)); 144 l_dest->below = Start; 145 } 146 147 if (l_dest) 148 l_dest->below = Start; 149 current = Start; 150 151 sigspecial--; 152 153 *errnum = 1; 154 } 155