Annotation of 43BSD/contrib/emacs/src/editfns.c, revision 1.1.1.1

1.1       root        1: /* Lisp functions pertaining to editing.
                      2:    Copyright (C) 1985 Richard M. Stallman.
                      3: 
                      4: This file is part of GNU Emacs.
                      5: 
                      6: GNU Emacs is distributed in the hope that it will be useful,
                      7: but WITHOUT ANY WARRANTY.  No author or distributor
                      8: accepts responsibility to anyone for the consequences of using it
                      9: or for whether it serves any particular purpose or works at all,
                     10: unless he says so in writing.  Refer to the GNU Emacs General Public
                     11: License for full details.
                     12: 
                     13: Everyone is granted permission to copy, modify and redistribute
                     14: GNU Emacs, but only under the conditions described in the
                     15: GNU Emacs General Public License.   A copy of this license is
                     16: supposed to have been given to you along with GNU Emacs so you
                     17: can know your rights and responsibilities.  It should be in a
                     18: file named COPYING.  Among other things, the copyright notice
                     19: and this notice must be preserved on all copies.  */
                     20: 
                     21: 
                     22: #include "config.h"
                     23: #include <pwd.h>
                     24: #include "lisp.h"
                     25: #include "buffer.h"
                     26: #include "window.h"
                     27: 
                     28: #define min(a, b) ((a) < (b) ? (a) : (b))
                     29: #define max(a, b) ((a) > (b) ? (a) : (b))
                     30: 
                     31: Lisp_Object ml_apply ();
                     32: 
                     33: /* Some static data, and a function to initialize it for each run */
                     34: 
                     35: static char user_real_name[12];        /* login ID of current user */
                     36: static char user_full_name[50];        /* full name of current user */
                     37: 
                     38: static char system_name[40];
                     39: static char *user_name;
                     40: 
                     41: void
                     42: init_editfns ()
                     43: {
                     44:   register char *p, *q, *r;
                     45:   register int c;
                     46:   int first;
                     47:   struct passwd *pw;   /* password entry for the current user */
                     48:   extern char *index ();
                     49: 
                     50:   /* Don't bother with this on initial start when just dumping out */
                     51:   if (!NULL (Vpurify_flag))
                     52:     return;
                     53: 
                     54:   pw = (struct passwd *) getpwuid (getuid ());
                     55:   strncpy (user_real_name, pw->pw_name, sizeof user_real_name);
                     56: 
                     57:   user_name = (char *) getenv ("USER");
                     58: #ifdef USG
                     59:   if (!user_name)
                     60:     user_name = (char *) getenv ("LOGNAME");           /* USG equivalent */
                     61: #endif
                     62:   if (!user_name)
                     63:     user_name = user_real_name;
                     64: 
                     65:   if (strcmp (user_name, user_real_name))
                     66:     pw = (struct passwd *) getpwnam (user_name);
                     67:   
                     68: #ifndef AMPERSAND_FULL_NAME
                     69:   if (pw == 0)
                     70:     strcpy (user_full_name, "unknown");
                     71:   else
                     72:     strncpy (user_full_name, USER_FULL_NAME, sizeof user_full_name);
                     73:   p = index (user_full_name, ',');
                     74:   if (p) *p = 0;
                     75: #else
                     76:   if (pw == 0)
                     77:     p = "unknown";
                     78:   else
                     79:     p = USER_FULL_NAME;
                     80:   q = user_full_name; r = user_name; first = 1;
                     81: 
                     82:   for (; (*p != 0) && (*p != ','); p++)
                     83:     {
                     84:       if (*p == '&')
                     85:        {
                     86:          if (*r != 0)
                     87:            {
                     88:              *q = *r++;
                     89:              if ((*q >= 'a') && (*q <= 'z'))
                     90:                *q -= 32;
                     91:              for (q++; *r != 0; r++)
                     92:                {
                     93:                  if (q == &user_full_name[sizeof user_full_name - 1])
                     94:                    break;
                     95:                  *q++ = *r;
                     96:                }
                     97:            }
                     98:        }
                     99:       else
                    100:        *q++ = *p;
                    101:       if (q == &user_full_name[sizeof user_full_name - 2])
                    102:        break;
                    103:     }
                    104:   *q = 0;
                    105: #endif /* AMPERSAND_FULL_NAME */
                    106: 
                    107:   p = (char *) get_system_name ();
                    108:   if (p == 0 || *p == 0)
                    109:     p = "Bogus System Name";
                    110:   strncpy (system_name, p, sizeof system_name);
                    111:   p = system_name;
                    112:   while (*p)
                    113:     {
                    114:       if (*p < ' ')
                    115:        *p = 0;
                    116:       else
                    117:        if (*p == ' ')
                    118:          *p = '-';
                    119:       p++;
                    120:     }
                    121: }
                    122: 
                    123: DEFUN ("char-to-string", Fchar_to_string, Schar_to_string, 1, 1, 0,
                    124:   "Convert arg CHAR to a string containing that character.")
                    125:   (n)
                    126:      Lisp_Object n;
                    127: {
                    128:   char c;
                    129:   CHECK_NUMBER (n, 0);
                    130: 
                    131:   c = XINT (n);
                    132:   return make_string (&c, 1);
                    133: }
                    134: 
                    135: DEFUN ("string-to-char", Fstring_to_char, Sstring_to_char, 1, 1, 0,
                    136:   "Convert arg STRING to a character, the first character of that string.")
                    137:   (str)
                    138:      Lisp_Object str;
                    139: {
                    140:   Lisp_Object val;
                    141:   CHECK_STRING (str, 0);
                    142: 
                    143:   if (XSTRING (str)->size)
                    144:     XFASTINT (val) = ((unsigned char *) XSTRING (str)->data)[0];
                    145:   else
                    146:     XFASTINT (val) = 0;
                    147:   return val;
                    148: }
                    149: 
                    150: static Lisp_Object
                    151: buildmark (val)
                    152: {
                    153:   Lisp_Object mark;
                    154:   mark = Fmake_marker ();
                    155:   Fset_marker (mark, make_number (val), Qnil);
                    156:   return mark;
                    157: }
                    158: 
                    159: DEFSIMPLE ("point", Fpoint, Spoint,
                    160:   "Return value of point, as an integer.\n\
                    161: Beginning of buffer is position (point-min)",
                    162:           Lisp_Int, XSETINT, point)
                    163: 
                    164: DEFUN ("point-marker", Fpoint_marker, Spoint_marker, 0, 0, 0,
                    165:    "Return value of point, as a marker object.")
                    166:   ()
                    167: {
                    168:   return buildmark (point);
                    169: }
                    170: 
                    171: DEFUN ("goto-char", Fgoto_char, Sgoto_char, 1, 1, "nGoto char: ",
                    172:   "One arg, a number.  Set point to that number.\n\
                    173: Beginning of buffer is position (point-min), end is (point-max).")
                    174:   (n)
                    175:      Lisp_Object n;
                    176: {
                    177:   int charno;
                    178:   CHECK_NUMBER_COERCE_MARKER (n, 0);
                    179:   charno = XINT (n);
                    180:   if (charno < FirstCharacter) charno = FirstCharacter;
                    181:   if (charno > NumCharacters) charno = NumCharacters + 1;
                    182:   SetPoint (charno);
                    183:   return n;
                    184: }
                    185: 
                    186: DEFUN ("region-beginning", Fregion_beginning, Sregion_beginning, 0, 0, 0,
                    187:   "Return position of beginning of region, as an integer.")
                    188:   ()
                    189: {
                    190:   register int tem;
                    191:   if (NULL (bf_cur->mark))
                    192:     error ("There is no region now");
                    193:   tem = marker_position (bf_cur->mark);
                    194:   return make_number (min (point, tem));
                    195: }
                    196: 
                    197: DEFUN ("region-end", Fregion_end, Sregion_end, 0, 0, 0,
                    198:   "Return position of end of region, as an integer.")
                    199:   ()
                    200: {
                    201:   register int tem;
                    202:   if (NULL (bf_cur->mark))
                    203:     error ("There is no region now");
                    204:   tem = marker_position (bf_cur->mark);
                    205:   return make_number (max (point, tem));
                    206: }
                    207: 
                    208: DEFUN ("mark", Fmark, Smark, 0, 0, 0,
                    209:   "Return this buffer's mark value as integer, or nil if no mark.")
                    210:   ()
                    211: {
                    212:   if (!NULL (bf_cur->mark))
                    213:     return Fmarker_position (bf_cur->mark);
                    214:   return Qnil;
                    215: }
                    216: 
                    217: DEFUN ("mark-marker", Fmark_marker, Smark_marker, 0, 0, 0,
                    218:   "Return this buffer's mark, as a marker object, or nil if no mark.\n\
                    219: Watch out!  Moving this marker changes the buffer's mark.")
                    220:   ()
                    221: {
                    222:   return bf_cur->mark;
                    223: }
                    224: 
                    225: DEFUN ("set-mark", Fset_mark, Sset_mark, 1, 1, "",
                    226:   "Set this buffer's mark to POS;\n\
                    227: Argument is character position, or nil to clear out the mark.")
                    228:   (pos)
                    229:      Lisp_Object pos;
                    230: {
                    231:   if (NULL (pos))
                    232:     {
                    233:       bf_cur->mark = Qnil;
                    234:       return Qnil;
                    235:     }
                    236:   CHECK_NUMBER_COERCE_MARKER (pos, 0);
                    237: 
                    238:   if (NULL (bf_cur->mark))
                    239:     bf_cur->mark = Fmake_marker ();
                    240: 
                    241:   Fset_marker (bf_cur->mark, pos, Qnil);
                    242:   return pos;
                    243: }
                    244: 
                    245: Lisp_Object
                    246: save_excursion_save ()
                    247: {
                    248:   Lisp_Object oldpoint, oldmark;
                    249:   int visible = XBUFFER (XWINDOW (selected_window)->buffer) == bf_cur;
                    250: 
                    251:   oldpoint = Fpoint_marker ();
                    252: 
                    253:   if (!NULL (bf_cur->mark))
                    254:     oldmark = Fcopy_marker (bf_cur->mark);
                    255:   else
                    256:     oldmark = Qnil;
                    257: 
                    258:   return Fcons (oldpoint, Fcons (oldmark, visible ? Qt : Qnil));
                    259: }
                    260: 
                    261: Lisp_Object
                    262: save_excursion_restore (info)
                    263:      Lisp_Object info;
                    264: {
                    265:   Lisp_Object tem;
                    266: 
                    267:   tem = Fmarker_buffer (Fcar (info));
                    268:   /* If buffer being returned to is now deleted, avoid error */
                    269:   /* Otherwise could get error here while unwinding to top level
                    270:      and crash */
                    271:   /* In that case, Fmarker_buffer returns nil now.  */
                    272:   if (NULL (tem))
                    273:     return Qnil;
                    274:   Fset_buffer (tem);
                    275:   Fgoto_char (Fcar (info));
                    276:   unchain_marker (Fcar (info));
                    277:   tem = Fcar (Fcdr (info));
                    278:   Fset_mark (tem);
                    279:   if (!NULL (tem))
                    280:     unchain_marker (tem);
                    281:   tem = Fcdr (Fcdr (info));
                    282:   if (!NULL (tem) && bf_cur != XBUFFER (XWINDOW (selected_window)->buffer))
                    283:     Fswitch_to_buffer (Fcurrent_buffer (), Qnil);
                    284:   return Qnil;
                    285: }
                    286: 
                    287: DEFUN ("save-excursion", Fsave_excursion, Ssave_excursion, 0, UNEVALLED, 0,
                    288:   "Save point (and mark), execute BODY, then restore point and mark.\n\
                    289: Executes BODY just like PROGN.  Point and mark values are restored\n\
                    290: even in case of abnormal exit (throw or error).")
                    291:   (args)
                    292:      Lisp_Object args;
                    293: {
                    294:   Lisp_Object val;
                    295:   int count = specpdl_ptr - specpdl;
                    296: 
                    297:   record_unwind_protect (save_excursion_restore, save_excursion_save ());
                    298:                         
                    299:   val = Fprogn (args);
                    300:   unbind_to (count);
                    301:   return val;
                    302: }
                    303: 
                    304: DEFSIMPLE ("buffer-size", Fbufsize, Sbufsize,
                    305:           "Return the number of characters in the current buffer.",
                    306:           Lisp_Int, XSETINT, bf_s1 + bf_s2)
                    307: 
                    308: DEFSIMPLE ("point-min", Fpoint_min, Spoint_min,
                    309:           "Return the minimum permissible value of point in the current buffer.\n\
                    310: This is 1, unless a clipping restriction is in effect.",
                    311:           Lisp_Int, XSETINT, FirstCharacter)
                    312: 
                    313: DEFUN ("point-min-marker", Fpoint_min_marker, Spoint_min_marker, 0, 0, 0,
                    314:   "Return a marker to the beginning of the currently visible part of the buffer.\n\
                    315: This is the beginning, unless a clipping restriction is in effect.")
                    316:   ()
                    317: {
                    318:   return buildmark (FirstCharacter);
                    319: }
                    320: 
                    321: DEFSIMPLE ("point-max", Fpoint_max, Spoint_max,
                    322:   "Return the maximum permissible value of point in the current buffer.\n\
                    323: This is (1+ (buffer-size)), unless a clipping restriction is in effect,\n\
                    324: in which case it is less.",
                    325:           Lisp_Int, XSETINT, NumCharacters+1)
                    326: 
                    327: DEFUN ("point-max-marker", Fpoint_max_marker, Spoint_max_marker, 0, 0, 0,
                    328:   "Return a marker to the end of the currently visible part of the buffer.\n\
                    329: This is the actual end, unless a clipping restriction is in effect.")
                    330:   ()
                    331: {
                    332:   return buildmark (NumCharacters+1);
                    333: }
                    334: 
                    335: DEFSIMPLE ("following-char", Ffollchar, Sfollchar,
                    336:           "Return the character following point, as a number.",
                    337:           Lisp_Int, XSETINT, point>NumCharacters ? 0 : CharAt(point))
                    338: DEFSIMPLE ("preceding-char", Fprevchar, Sprevchar,
                    339:           "Return the character preceding point, as a number.",
                    340:           Lisp_Int, XSETINT, point<=FirstCharacter ? 0 : CharAt(point-1))
                    341: 
                    342: DEFPRED ("bobp", Fbobp, Sbobp,
                    343:   "Return T if point is at the beginning of the buffer.\n\
                    344: If the buffer is narrowed, this means the beginning of the narrowed part.",
                    345:         point<=FirstCharacter)
                    346: DEFPRED ("eobp", Feobp, Seobp,
                    347:   "Return T if point is at the end of the buffer.\n\
                    348: If the buffer is narrowed, this means the end of the narrowed part.",
                    349:         point>NumCharacters)
                    350: DEFPRED ("bolp", Fbolp, Sbolp,
                    351:   "Return T if point is at the beginning of a line.",
                    352:         point<=FirstCharacter || CharAt(point-1)=='\n')
                    353: DEFPRED ("eolp", Feolp, Seolp,
                    354:   "Return T if point is at the end of a line.\n\
                    355: `End of a line' includes point being at the end of the buffer.",
                    356:         point>NumCharacters || CharAt(point)=='\n')
                    357: 
                    358: DEFUN ("char-after", Fchar_after, Schar_after, 1, 1, 0,
                    359:   "One arg, POS, a number.  Return the character in the current buffer\n\
                    360: at position POS.\n\
                    361: If POS is out of range, the value is NIL.")
                    362:   (pos)
                    363:      Lisp_Object pos;
                    364: {
                    365:   Lisp_Object val;
                    366:   CHECK_NUMBER_COERCE_MARKER (pos, 0);
                    367:   if (XINT (pos) < FirstCharacter || XINT (pos) > NumCharacters) return Qnil;
                    368: 
                    369:   XFASTINT (val) = CharAt(XINT (pos));
                    370:   return val;
                    371: }
                    372: 
                    373: DEFUN ("user-login-name", Fuser_login_name, Suser_login_name, 0, 0, "",
                    374:   "Return the name under which user logged in, as a string.")
                    375:   ()
                    376: {
                    377:   return build_string (user_name);
                    378: }
                    379: 
                    380: DEFUN ("user-real-login-name", Fuser_real_login_name, Suser_real_login_name,
                    381:   0, 0, "",
                    382:   "Return the name of the user's real uid, as a string.\n\
                    383: Differs from user-login-name when running under su.")
                    384:   ()
                    385: {
                    386:   return build_string (user_real_name);
                    387: }
                    388: 
                    389: DEFUN ("user-full-name", Fuser_full_name, Suser_full_name, 0, 0, "",
                    390:   "Return the full name of the user logged in, as a string.")
                    391:   ()
                    392: {
                    393:   return build_string (user_full_name);
                    394: }
                    395: 
                    396: DEFUN ("system-name", Fsystem_name, Ssystem_name, 0, 0, "",
                    397:   "Return the name of the machine you are running on, as a string.")
                    398:   ()
                    399: {
                    400:   return build_string (system_name);
                    401: }
                    402: 
                    403: DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 0, 0,
                    404:   "Return the current time, as a human-readable string.")
                    405:   ()
                    406: {
                    407:   long now = time ( (long *) 0);
                    408:   char *tem = (char *) ctime (&now);
                    409:   tem [24] = 0;
                    410:   return build_string (tem);
                    411: }
                    412: 
                    413: DEFUN ("insert", Finsert, Sinsert, 0, MANY, 0,
                    414:   "Any number of args, strings or chars.  Insert them after point, moving point forward.")
                    415:   (nargs, args)
                    416:      int nargs;
                    417:      Lisp_Object *args;
                    418: {
                    419:   int argnum;
                    420:   Lisp_Object tem;
                    421:   char str[1];
                    422: 
                    423:   for (argnum = 0; argnum < nargs; argnum++)
                    424:     {
                    425:       tem = args[argnum];
                    426:     retry:
                    427:       if (XTYPE (tem) == Lisp_Int)
                    428:        {
                    429:          str[0] = XINT (tem);
                    430:          InsCStr (str, 1);
                    431:        }
                    432:       else if (XTYPE (tem) == Lisp_String)
                    433:        {
                    434:          InsCStr (XSTRING (tem)->data, XSTRING (tem)->size);
                    435:        }
                    436:       else
                    437:        {
                    438:          tem = wrong_type_argument (Qchar_or_string_p, tem);
                    439:          goto retry;
                    440:        }
                    441:     }
                    442:   return Qnil;
                    443: }
                    444: 
                    445: DEFUN ("insert-before-markers", Finsert_before_markers, Sinsert_before_markers, 0, MANY, 0,
                    446:   "Any number of args, strings or chars.  Insert them after point,\n\
                    447: moving point forward.  Also, any markers pointing at the insertion point\n\
                    448: get relocated to point after the newly inserted text.")
                    449:   (nargs, args)
                    450:      int nargs;
                    451:      Lisp_Object *args;
                    452: {
                    453:   int argnum;
                    454:   Lisp_Object tem;
                    455:   char str[1];
                    456: 
                    457:   for (argnum = 0; argnum < nargs; argnum++)
                    458:     {
                    459:       tem = args[argnum];
                    460:     retry:
                    461:       if (XTYPE (tem) == Lisp_Int)
                    462:        {
                    463:          str[0] = XINT (tem);
                    464:          insert_before_markers (str, 1);
                    465:        }
                    466:       else if (XTYPE (tem) == Lisp_String)
                    467:        {
                    468:          insert_before_markers (XSTRING (tem)->data, XSTRING (tem)->size);
                    469:        }
                    470:       else
                    471:        {
                    472:          tem = wrong_type_argument (Qchar_or_string_p, tem);
                    473:          goto retry;
                    474:        }
                    475:     }
                    476:   return Qnil;
                    477: }
                    478: 
                    479: /* Return a string with the contents of the current region */
                    480: 
                    481: DEFUN ("buffer-substring", Fbuffer_substring, Sbuffer_substring, 2, 2, 0,
                    482:   "Return the contents of part of the current buffer as a string.\n\
                    483: The two arguments specify the start and end, as character numbers.")
                    484:   (b, e)
                    485:      Lisp_Object b, e;
                    486: {
                    487:   int beg, end;
                    488: 
                    489:   validate_region (&b, &e);
                    490:   beg = XINT (b);
                    491:   end = XINT (e);
                    492: 
                    493:   if (beg <= bf_s1 && end > bf_s1)
                    494:       GapTo (beg);
                    495:   return make_string (&CharAt (beg), end - beg);
                    496: }
                    497: 
                    498: DEFUN ("buffer-string", Fbuffer_string, Sbuffer_string, 0, 0, 0,
                    499:   "Return the contents of the current buffer as a string.")
                    500:   ()
                    501: {
                    502:   if (FirstCharacter <= bf_s1 && NumCharacters + 1 > bf_s1)
                    503:       GapTo (FirstCharacter);
                    504:   return make_string (&CharAt (FirstCharacter), NumCharacters + 1 - FirstCharacter);
                    505: }
                    506: 
                    507: DEFUN ("insert-buffer-substring", Finsert_buffer_substring, Sinsert_buffer_substring,
                    508:   1, 3, 0,
                    509:   "Insert before point a substring of the contents buffer BUFFER.\n\
                    510: BUFFER may be a buffer or a buffer name.\n\
                    511: Arguments START and END are character numbers specifying the substring.\n\
                    512: They default to the beginning and the end of BUFFER.")
                    513:   (buf, b, e)
                    514:      Lisp_Object buf, b, e;
                    515: {
                    516:     int beg, end, exch;
                    517: 
                    518:   buf = Fget_buffer (buf);
                    519:   if (XBUFFER (buf) == bf_cur)
                    520:     error ("Cannot insert buffer into itself");
                    521: 
                    522:   if (NULL (b))
                    523:     beg = XBUFFER (buf)->text.head_clip - 1;
                    524:   else
                    525:     {
                    526:       CHECK_NUMBER_COERCE_MARKER (b, 0);
                    527:       beg = XINT (b) - 1;
                    528:     }
                    529:   if (NULL (e))
                    530:     end = XBUFFER (buf)->text.size1 + XBUFFER (buf)->text.size2
                    531:                        - XBUFFER (buf)->text.tail_clip;
                    532:   else
                    533:     {
                    534:       CHECK_NUMBER_COERCE_MARKER (e, 1);
                    535:       end = XINT (e) - 1;
                    536:     }
                    537: 
                    538:   if (beg > end)
                    539:     exch = beg, beg = end, end = exch;
                    540: 
                    541:   if (!(XBUFFER (buf)->text.head_clip - 1 <= beg
                    542:        && beg <= end
                    543:         && end <= XBUFFER (buf)->text.size1 + XBUFFER (buf)->text.size2
                    544:                        - XBUFFER (buf)->text.tail_clip))
                    545:     args_out_of_range (b, e);
                    546: 
                    547:   if (beg < XBUFFER (buf)->text.size1)
                    548:     {
                    549:       InsCStr (XBUFFER (buf)->text.p1 + 1 + beg, min (end, XBUFFER (buf)->text.size1) - beg);
                    550:       beg = min (end, XBUFFER (buf)->text.size1);
                    551:     }
                    552:   if (beg < end)
                    553:     InsCStr (XBUFFER (buf)->text.p2 + 1 + beg, end - beg);
                    554: 
                    555:   return Qnil;
                    556: }
                    557: 
                    558: DEFUN ("subst-char-in-region", Fsubst_char_in_region,
                    559:   Ssubst_char_in_region, 4, 5, 0,
                    560:   "From START to END, replace FROMCHAR with TOCHAR each time it occurs.\n\
                    561: If optional arg NOUNDO is non-nil, don't record this change for undo\n\
                    562: and don't mark the buffer as really changed.")
                    563:   (start, end, fromchar, tochar, noundo)
                    564:      Lisp_Object start, end, fromchar, tochar, noundo;
                    565: {
                    566:   register int pos, stop, look;
                    567: 
                    568:   validate_region (&start, &end);
                    569:   CHECK_NUMBER (fromchar, 2);
                    570:   CHECK_NUMBER (tochar, 3);
                    571: 
                    572:   pos = XINT (start);
                    573:   stop = XINT (end);
                    574:   if (!NULL (bf_cur->read_only))
                    575:     Fbarf_if_buffer_read_only();
                    576: 
                    577:   look = XINT (fromchar);
                    578: 
                    579:   while (pos < stop)
                    580:     {
                    581:       if (CharAt (pos) == look)
                    582:        {
                    583:          if (NULL (noundo))
                    584:            RecordChange (pos, 1);
                    585:          CharAt (pos) = XINT (tochar);
                    586:        }
                    587:       pos++;
                    588:     }
                    589:   modify_region (pos, stop);
                    590: 
                    591:   return Qnil;
                    592: }
                    593: 
                    594: DEFUN ("delete-region", Fdelete_region, Sdelete_region, 2, 2, "r",
                    595:   "Delete the text between point and mark.\n\
                    596: When called from a program, expects two arguments,\n\
                    597: character numbers specifying the stretch to be deleted.")
                    598:   (b, e)
                    599:      Lisp_Object b, e;
                    600: {
                    601:   validate_region (&b, &e);
                    602:   del_range (XINT (b), XINT (e));
                    603:   return Qnil;
                    604: }
                    605: 
                    606: DEFUN ("widen", Fwiden, Swiden, 0, 0, "",
                    607:   "Remove restrictions from current buffer, allowing full text to be seen and edited.")
                    608:   ()
                    609: {
                    610:   bf_cur->text.head_clip = bf_head_clip = 1;
                    611:   bf_cur->text.tail_clip = bf_tail_clip = 0;
                    612:   clip_changed = 1;
                    613:   return Qnil;
                    614: }
                    615: 
                    616: DEFUN ("narrow-to-region", Fnarrow_to_region, Snarrow_to_region, 2, 2, "r",
                    617:   "Restrict editing in current buffer to text between present values of point and mark.\n\
                    618: Use  widen  to undo the effects of this command.\n\
                    619: Called non-interactively, takes two arguments; character numbers which\n\
                    620: specify the stretch to which to restrict.")
                    621:   (b, e)
                    622:      Lisp_Object b, e;
                    623: {
                    624:   int i;
                    625: 
                    626:   CHECK_NUMBER_COERCE_MARKER (b, 0);
                    627:   CHECK_NUMBER_COERCE_MARKER (e, 1);
                    628: 
                    629:   if (XINT (b) > XINT (e))
                    630:     {
                    631:       i = XFASTINT (b);
                    632:       b = e;
                    633:       XFASTINT (e) = i;
                    634:     }
                    635: 
                    636:   if (!(1 <= XINT (b) && XINT (b) <= XINT (e)
                    637:         && XINT (e) <= bf_s1 + bf_s2 + 1))
                    638:     args_out_of_range (b, e);
                    639: 
                    640:   bf_cur->text.head_clip = bf_head_clip = XFASTINT (b);
                    641:   bf_cur->text.tail_clip = bf_tail_clip = bf_s1 + bf_s2 + 1 - XFASTINT (e);
                    642:   if (point < XFASTINT (b))
                    643:     SetPoint (XFASTINT (b));
                    644:   if (point > XFASTINT (e))
                    645:     SetPoint (XFASTINT (e));
                    646:   clip_changed = 1;
                    647:   return Qnil;
                    648: }
                    649: 
                    650: Lisp_Object
                    651: save_restriction_save ()
                    652: {
                    653:   Lisp_Object ml, mh;
                    654:   /* Note: I tried using markers here, but it does not win
                    655:      because insertion at the end of the saved region
                    656:      does not advance mh and is considered "outside" the saved region. */
                    657:   XFASTINT (ml) = bf_head_clip;
                    658:   XFASTINT (mh) = bf_tail_clip;
                    659: 
                    660:   return Fcons (Fcurrent_buffer (), Fcons (ml, mh));
                    661: }
                    662: 
                    663: Lisp_Object
                    664: save_restriction_restore (data)
                    665:      Lisp_Object data;
                    666: {
                    667:   register struct buffer *old = bf_cur;
                    668:   register int newhead, newtail;
                    669: 
                    670:   Fset_buffer (XCONS (data)->car);
                    671: 
                    672:   data = XCONS (data)->cdr;
                    673: 
                    674:   newhead = XINT (XCONS (data)->car);
                    675:   newtail = XINT (XCONS (data)->cdr);
                    676:   if (newhead + newtail > bf_s1 + bf_s2 + 1)
                    677:     {
                    678:       newhead = 1;
                    679:       newtail = 0;
                    680:     }
                    681:   bf_cur->text.head_clip = bf_head_clip = newhead;
                    682:   bf_cur->text.tail_clip = bf_tail_clip = newtail;
                    683:   clip_changed = 1;
                    684: 
                    685:   /* If point is outside the new visible range, move it inside. */
                    686:   if (point < FirstCharacter)
                    687:     SetPoint (FirstCharacter);
                    688:   if (point > NumCharacters+1)
                    689:     SetPoint (NumCharacters+1);
                    690: 
                    691:   SetBfp (old);
                    692:   return Qnil;
                    693: }
                    694: 
                    695: DEFUN ("save-restriction", Fsave_restriction, Ssave_restriction, 0, UNEVALLED, 0,
                    696:   "Execute the body, undoing at the end any changes to current buffer's restrictions.\n\
                    697: Changes to restrictions are made by narrow-to-region or by widen.\n\
                    698: Thus, the restrictions are the same after this function as they were before it.\n\
                    699: The value returned is that returned by the last form in the body.\n\
                    700: \n\
                    701: This function can be confused if, within the body, you widen\n\
                    702: and then make changes outside the area within the saved restrictions.\n\
                    703: \n\
                    704: Note: if you are using both save-excursion and save-restriction,\n\
                    705: use save-excursion outermost.")
                    706:   (body)
                    707:      Lisp_Object body;
                    708: {
                    709:   Lisp_Object val;
                    710:   int count = specpdl_ptr - specpdl;
                    711: 
                    712:   record_unwind_protect (save_restriction_restore, save_restriction_save ());
                    713:   val = Fprogn (body);
                    714:   unbind_to (count);
                    715:   return val;
                    716: }
                    717: 
                    718: DEFUN ("message", Fmessage, Smessage, 1, MANY, 0,
                    719:   "Print a one-line message at the bottom of the screen.\n\
                    720: The first argument is a control string.\n\
                    721: It may contain %s or %d or %c to print successive following arguments.\n\
                    722: %s means print an argument as a string, %d means print as number in decimal,\n\
                    723: %c means print a number as a single character.\n\
                    724: The argument used by %s must be a string or a symbol;\n\
                    725: the argument used by %d or %c must be a number.")
                    726:   (nargs, args)
                    727:      int nargs;
                    728:      Lisp_Object *args;
                    729: {
                    730:   Lisp_Object val;
                    731: 
                    732:   val = Fformat (nargs, args);
                    733:   message ("%s", XSTRING (val)->data);
                    734:   return val;
                    735: }
                    736: 
                    737: DEFUN ("format", Fformat, Sformat, 1, MANY, 0,
                    738:   "Format a string out of a control-string and arguments.\n\
                    739: The first argument is a control string.\n\
                    740: It, and subsequent arguments substituted into it, become the value, which is a string.\n\
                    741: It may contain %s or %d or %c to substitute successive following arguments.\n\
                    742: %s means print an argument as a string, %d means print as number in decimal,\n\
                    743: %c means print a number as a single character.\n\
                    744: The argument used by %s must be a string or a symbol;\n\
                    745: the argument used by %d, %b, %o, %x or %c must be a number.")
                    746:   (nargs, args)
                    747:      int nargs;
                    748:      register Lisp_Object *args;
                    749: {
                    750:   register int i;
                    751:   register int total = 5;
                    752:   char *buf;
                    753:   register unsigned char **strings = (unsigned char **) alloca (nargs * sizeof (char *));
                    754: 
                    755:   for (i = 0; i < nargs; i++)
                    756:     {
                    757:       if (XTYPE (args[i]) == Lisp_Symbol)
                    758:        {
                    759:          strings[i] = XSYMBOL (args[i])->name->data;
                    760:          total += XSYMBOL (args[i])->name->size;
                    761:        }
                    762:       else if (XTYPE (args[i]) == Lisp_String)
                    763:        {
                    764:          strings[i] = XSTRING (args[i])->data;
                    765:          total += XSTRING (args[i])->size;
                    766:        }
                    767:       else if (XTYPE (args[i]) == Lisp_Int)
                    768:        {
                    769:          strings[i] = (unsigned char *) XINT (args[i]);
                    770:          total += 10;
                    771:        }
                    772:       else
                    773:        {
                    774:          strings[i] = (unsigned char *) "??";
                    775:          total += 2;
                    776:        }
                    777:     }
                    778: 
                    779:   /* Format it in bigger and bigger buf's until it all fits. */
                    780: 
                    781:   while (1)
                    782:     {
                    783:       buf = (char *) alloca (total + 1);
                    784:       buf[total - 1] = 0;
                    785: 
                    786:       doprnt (buf, total + 1, strings[0], strings + 1);
                    787:       if (buf[total - 1] == 0)
                    788:        break;
                    789: 
                    790:       total *= 2;
                    791:     }
                    792: 
                    793:   return build_string (buf);
                    794: }
                    795: 
                    796: /* VARARGS 1 */
                    797: Lisp_Object
                    798: #ifdef NO_ARG_ARRAY
                    799: format1 (string1, arg0, arg1, arg2, arg3, arg4)
                    800:      Lisp_Object arg0, arg1, arg2, arg3, arg4;
                    801: #else
                    802: format1 (string1)
                    803: #endif
                    804:      char *string1;
                    805: {
                    806:   char buf[100];
                    807: #ifdef NO_ARG_ARRAY
                    808:   Lisp_Object args[5];
                    809:   args[0] = arg0;
                    810:   args[1] = arg1;
                    811:   args[2] = arg2;
                    812:   args[3] = arg3;
                    813:   args[4] = arg4;
                    814:   doprnt (buf, sizeof buf, string1, args);
                    815: #else
                    816:   doprnt (buf, sizeof buf, string1, &string1 + 1);
                    817: #endif
                    818:   return build_string (buf);
                    819: }
                    820: 
                    821: DEFUN ("char-equal", Fchar_equal, Schar_equal, 2, 2, 0,
                    822:   "T if args (both characters (numbers)) match.  May ignore case.\n\
                    823: Case is ignored if the current buffer specifies to do so.")
                    824:   (c1, c2)
                    825:      Lisp_Object c1, c2;
                    826: {
                    827:   extern char downcase_table[];  /* From search.c */
                    828: 
                    829:   CHECK_NUMBER (c1, 0);
                    830:   CHECK_NUMBER (c2, 1);
                    831: 
                    832:   if (!NULL (bf_cur->case_fold_search)
                    833:       ? downcase_table[XINT (c1)] == downcase_table[XINT (c2)]
                    834:       : XINT (c1) == XINT (c2))
                    835:     return Qt;
                    836:   return Qnil;
                    837: }
                    838: 
                    839: DEFUN ("getenv", Fgetenv, Sgetenv, 1, 1, "sEnvironment variable: ",
                    840:   "One arg VAR, a string. Return the value of environment variable VAR, as a string.")
                    841:   (str)
                    842:      Lisp_Object str;
                    843: {
                    844:   char *val;
                    845:   CHECK_STRING (str, 0);
                    846:   val = (char *) getenv (XSTRING (str)->data);
                    847:   if (!val)
                    848:     return Qnil;
                    849:   return build_string (val);
                    850: }
                    851: 
                    852: void
                    853: syms_of_editfns ()
                    854: {
                    855:   defsubr (&Schar_equal);
                    856:   defsubr (&Sgoto_char);
                    857:   defsubr (&Sstring_to_char);
                    858:   defsubr (&Schar_to_string);
                    859:   defsubr (&Sbuffer_substring);
                    860:   defsubr (&Sbuffer_string);
                    861: 
                    862:   defsubr (&Spoint_marker);
                    863:   defalias (&Spoint_marker, "dot-marker");
                    864:   defsubr (&Smark_marker);
                    865:   defsubr (&Spoint);
                    866:   defalias (&Spoint, "dot");
                    867:   defsubr (&Sregion_beginning);
                    868:   defsubr (&Sregion_end);
                    869:   defsubr (&Smark);
                    870:   defsubr (&Sset_mark);
                    871:   defsubr (&Ssave_excursion);
                    872: 
                    873:   defsubr (&Sbufsize);
                    874:   defsubr (&Spoint_max);
                    875:   defsubr (&Spoint_min);
                    876:   defalias (&Spoint_max, "dot-max");
                    877:   defalias (&Spoint_min, "dot-min");
                    878:   defsubr (&Spoint_min_marker);
                    879:   defsubr (&Spoint_max_marker);
                    880: 
                    881:   defsubr (&Sbobp);
                    882:   defsubr (&Seobp);
                    883:   defsubr (&Sbolp);
                    884:   defsubr (&Seolp);
                    885:   defsubr (&Sfollchar);
                    886:   defsubr (&Sprevchar);
                    887:   defsubr (&Schar_after);
                    888:   defsubr (&Sinsert);
                    889:   defsubr (&Sinsert_before_markers);
                    890: 
                    891:   defsubr (&Suser_login_name);
                    892:   defsubr (&Suser_real_login_name);
                    893:   defsubr (&Suser_full_name);
                    894:   defsubr (&Scurrent_time_string);
                    895:   defsubr (&Sgetenv);
                    896:   defsubr (&Ssystem_name);
                    897:   defsubr (&Smessage);
                    898:   defsubr (&Sformat);
                    899: 
                    900:   defsubr (&Sinsert_buffer_substring);
                    901:   defsubr (&Ssubst_char_in_region);
                    902:   defsubr (&Sdelete_region);
                    903:   defsubr (&Swiden);
                    904:   defsubr (&Snarrow_to_region);
                    905:   defsubr (&Ssave_restriction);
                    906: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.