coan 4.2.4
|
00001 /*************************************************************************** 00002 * Copyright (C) 2004, 2006 Symbian Software Ltd. * 00003 * All rights reserved. * 00004 * * 00005 * Contributed originally by Mike Kinghan, imk@strudl.org * 00006 * * 00007 * Redistribution and use in source and binary forms, with or without * 00008 * modification, are permitted provided that the following conditions * 00009 * are met: * 00010 * * 00011 * Redistributions of source code must retain the above copyright * 00012 * notice, this list of conditions and the following disclaimer. * 00013 * * 00014 * Redistributions in binary form must reproduce the above copyright * 00015 * notice, this list of conditions and the following disclaimer in the * 00016 * documentation and/or other materials provided with the distribution. * 00017 * * 00018 * Neither the name of Symbian Software Ltd. nor the names of its * 00019 * contributors may be used to endorse or promote products derived from * 00020 * this software without specific prior written permission. * 00021 * * 00022 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * 00023 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * 00024 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * 00025 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * 00026 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * 00027 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * 00028 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * 00029 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * 00030 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,* 00031 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF * 00032 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * 00033 * DAMAGE. * 00034 * * 00035 **************************************************************************/ 00036 #include "line_edit.h" 00037 #include "io.h" 00038 #include "report.h" 00039 #include "line_despatch.h" 00040 00048 00049 00056 #define DELETE_CHARS(start,end) memset(start,DELETEABLE_CHR,end - start) 00057 00058 00070 static void 00071 tail_edit(char *where, const char *what) 00072 { 00073 assert(LINE_START <= where && 00074 where < LINE_END); 00075 ensure_buf(strlen(what)); 00076 strcpy(where,what); 00077 } 00078 00081 /* API ********************************************************************/ 00082 00083 void 00084 keywordedit(const char *replacement) 00085 { 00086 tail_edit(GET_PUBLIC(line_edit,keyword),replacement); 00087 ++SET_PUBLIC(line_despatch,lines_changed); 00088 print(); 00089 } 00090 00091 00092 void 00093 delete_paren(size_t lparen_off, size_t rparen_off) 00094 { 00095 char * lparen = LINE_START + lparen_off; 00096 char * rparen = LINE_START + rparen_off; 00097 for( ;*lparen != '(' && lparen < rparen; ++lparen){} 00098 for( ;*rparen != ')' && rparen > lparen; --rparen){} 00099 if (*lparen == '(' && *rparen == ')' ) { 00100 if ((!is_symbol_inner_char(lparen[-1]) || 00101 !is_symbol_inner_char(lparen[1])) 00102 && 00103 (!is_symbol_inner_char(rparen[-1]) || 00104 !is_symbol_inner_char(rparen[1]))) { 00105 *lparen = DELETEABLE_LPAREN; 00106 *rparen = DELETEABLE_RPAREN; 00107 ++SET_PUBLIC(line_edit,parens_deleted); 00108 } 00109 } 00110 } 00111 00112 extern void 00113 restore_paren(size_t lparen_off, size_t rparen_off) 00114 { 00115 char * lparen = LINE_START + lparen_off; 00116 char * rparen = LINE_START + rparen_off; 00117 for( ;*lparen != DELETEABLE_LPAREN && lparen < rparen; ++lparen){} 00118 for( ;*rparen != DELETEABLE_RPAREN && rparen > lparen; --rparen){} 00119 if (*lparen == DELETEABLE_LPAREN && *rparen == DELETEABLE_RPAREN ) { 00120 *lparen = '('; 00121 *rparen = ')'; 00122 --SET_PUBLIC(line_edit,parens_deleted); 00123 } 00124 } 00125 void 00126 restore_all_paren(void) 00127 { 00128 char *buf = GET_PUBLIC(io,line_start); 00129 for ( ; *buf; ++buf) { 00130 if (*buf == DELETEABLE_LPAREN) { 00131 *buf = '('; 00132 } else if (*buf == DELETEABLE_RPAREN) { 00133 *buf = ')'; 00134 } 00135 }; 00136 } 00137 00138 void 00139 cut_text(char const *start, char const *end) 00140 { 00141 char *s = (char *)start; 00142 char *e = (char *)end; 00143 SET_PUBLIC(line_edit,ops_cut) = true; 00144 DELETE_CHARS(s,e); 00145 /* Never delete the terminal newline in directive*/ 00146 if (!*e) { 00147 e[-1] = '\n'; 00148 } 00149 } 00150 00151 void 00152 truncate_line(size_t off) 00153 { 00154 assert(off < GET_PUBLIC(io,line_len)); 00155 LINE_START[off] = '\0'; 00156 SET_PUBLIC(io,line_len) = off; 00157 } 00158 00159 00163 NO_PRIVATE_STATE(line_edit); 00168 IMPLEMENT(line_edit,ZERO_INITABLE); 00172 /* EOF*/