coan 4.2.4
line_edit.c
Go to the documentation of this file.
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*/
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines