Annotation of GNUtools/emacs/src/print.c, revision 1.1

1.1     ! root        1: /* Lisp object printing and output streams.
        !             2:    Copyright (C) 1985, 1986, 1990 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU Emacs.
        !             5: 
        !             6: GNU Emacs is free software; you can redistribute it and/or modify
        !             7: it under the terms of the GNU General Public License as published by
        !             8: the Free Software Foundation; either version 1, or (at your option)
        !             9: any later version.
        !            10: 
        !            11: GNU Emacs is distributed in the hope that it will be useful,
        !            12: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: GNU General Public License for more details.
        !            15: 
        !            16: You should have received a copy of the GNU General Public License
        !            17: along with GNU Emacs; see the file COPYING.  If not, write to
        !            18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            19: 
        !            20: 
        !            21: #include "config.h"
        !            22: #include <stdio.h>
        !            23: #undef NULL
        !            24: #include "lisp.h"
        !            25: 
        !            26: #ifndef standalone
        !            27: #include "buffer.h"
        !            28: #include "window.h"
        !            29: #include "process.h"
        !            30: #include "dispextern.h"
        !            31: #include "termchar.h"
        !            32: #endif /* not standalone */
        !            33: 
        !            34: Lisp_Object Vstandard_output, Qstandard_output;
        !            35: 
        !            36: /* Avoid actual stack overflow in print.  */
        !            37: int print_depth;
        !            38: 
        !            39: /* Maximum length of list to print in full; noninteger means
        !            40:    effectively infinity */
        !            41: 
        !            42: Lisp_Object Vprint_length;
        !            43: 
        !            44: /* Nonzero means print newlines in strings as \n.  */
        !            45: 
        !            46: int print_escape_newlines;
        !            47: 
        !            48: /* Nonzero means print newline before next minibuffer message.
        !            49:    Defined in xdisp.c */
        !            50: 
        !            51: extern int noninteractive_need_newline;
        !            52: #ifdef MAX_PRINT_CHARS
        !            53: static int print_chars;
        !            54: static int max_print;
        !            55: #endif /* MAX_PRINT_CHARS */
        !            56: 
        !            57: /* Low level output routines for charaters and strings */
        !            58: 
        !            59: /* Lisp functions to do output using a stream
        !            60:  must have the stream in a variable called printcharfun
        !            61:  and must start with PRINTPREPARE and end with PRINTFINISH.
        !            62:  Use PRINTCHAR to output one character,
        !            63:  or call strout to output a block of characters.
        !            64:  Also, each one must have the declarations
        !            65:    struct buffer *old = current_buffer;
        !            66:    int old_point = -1, start_point;
        !            67:    Lisp_Object original;
        !            68: */ 
        !            69: 
        !            70: #define PRINTPREPARE \
        !            71:    original = printcharfun; \
        !            72:    if (NULL (printcharfun)) printcharfun = Qt; \
        !            73:    if (XTYPE (printcharfun) == Lisp_Buffer) \
        !            74:      { if (XBUFFER (printcharfun) != current_buffer) Fset_buffer (printcharfun); \
        !            75:        printcharfun = Qnil;}\
        !            76:    if (XTYPE (printcharfun) == Lisp_Marker) \
        !            77:      { if (XMARKER (original)->buffer != current_buffer) \
        !            78:          set_buffer_internal (XMARKER (original)->buffer); \
        !            79:        old_point = point; \
        !            80:        SET_PT (marker_position (printcharfun)); \
        !            81:        start_point = point; \
        !            82:        printcharfun = Qnil;}
        !            83: 
        !            84: #define PRINTFINISH \
        !            85:    if (XTYPE (original) == Lisp_Marker) \
        !            86:      Fset_marker (original, make_number (point), Qnil); \
        !            87:    if (old_point >= 0) \
        !            88:      SET_PT ((old_point >= start_point ? point - start_point : 0) + old_point); \
        !            89:    if (old != current_buffer) \
        !            90:      set_buffer_internal (old)
        !            91: 
        !            92: #define PRINTCHAR(ch) printchar (ch, printcharfun)
        !            93: 
        !            94: /* Index of first unused element of message_buf.  */
        !            95: static int printbufidx;
        !            96: 
        !            97: static void
        !            98: printchar (ch, fun)
        !            99:      unsigned char ch;
        !           100:      Lisp_Object fun;
        !           101: {
        !           102:   Lisp_Object ch1;
        !           103: 
        !           104: #ifdef MAX_PRINT_CHARS
        !           105:   if (max_print)
        !           106:     print_chars++;
        !           107: #endif /* MAX_PRINT_CHARS */
        !           108: #ifndef standalone
        !           109:   if (EQ (fun, Qnil))
        !           110:     {
        !           111:       QUIT;
        !           112:       insert (&ch, 1);
        !           113:       return;
        !           114:     }
        !           115:   if (EQ (fun, Qt))
        !           116:     {
        !           117:       if (noninteractive)
        !           118:        {
        !           119:          putchar (ch);
        !           120:          noninteractive_need_newline = 1;
        !           121:          return;
        !           122:        }
        !           123:       if (echo_area_contents != message_buf || !message_buf_print)
        !           124:        {
        !           125:          echo_area_contents = message_buf;
        !           126:          printbufidx = 0;
        !           127:          message_buf_print = 1;
        !           128:        }
        !           129:       if (printbufidx < screen_width)
        !           130:        message_buf[printbufidx++] = ch;
        !           131:       message_buf[printbufidx] = 0;
        !           132:       return;
        !           133:     }
        !           134: #endif /* not standalone */
        !           135: 
        !           136:   XFASTINT (ch1) = ch;
        !           137:   call1 (fun, ch1);
        !           138: }
        !           139: 
        !           140: static void
        !           141: strout (ptr, size, printcharfun)
        !           142:      char *ptr;
        !           143:      int size;
        !           144:      Lisp_Object printcharfun;
        !           145: {
        !           146:   int i = 0;
        !           147: 
        !           148:   if (EQ (printcharfun, Qnil))
        !           149:     {
        !           150:       insert (ptr, size >= 0 ? size : strlen (ptr));
        !           151: #ifdef MAX_PRINT_CHARS
        !           152:       if (max_print)
        !           153:         print_chars += size >= 0 ? size : strlen(ptr);
        !           154: #endif /* MAX_PRINT_CHARS */
        !           155:       return;
        !           156:     }
        !           157:   if (EQ (printcharfun, Qt))
        !           158:     {
        !           159:       i = size >= 0 ? size : strlen (ptr);
        !           160: #ifdef MAX_PRINT_CHARS
        !           161:       if (max_print)
        !           162:         print_chars += i;
        !           163: #endif /* MAX_PRINT_CHARS */
        !           164:       if (noninteractive)
        !           165:        {
        !           166:          fwrite (ptr, 1, i, stdout);
        !           167:          noninteractive_need_newline = 1;
        !           168:          return;
        !           169:        }
        !           170:       if (echo_area_contents != message_buf || !message_buf_print)
        !           171:        {
        !           172:          echo_area_contents = message_buf;
        !           173:          printbufidx = 0;
        !           174:          message_buf_print = 1;
        !           175:        }
        !           176:       if (i > screen_width - printbufidx)
        !           177:        i = screen_width - printbufidx;
        !           178:       bcopy (ptr, &message_buf[printbufidx], i);
        !           179:       printbufidx += i;
        !           180:       message_buf[printbufidx] = 0;
        !           181:       return;
        !           182:     }
        !           183:   if (size >= 0)
        !           184:     while (i < size)
        !           185:       PRINTCHAR (ptr[i++]);
        !           186:   else
        !           187:     while (ptr[i])
        !           188:       PRINTCHAR (ptr[i++]);
        !           189: }
        !           190: 
        !           191: DEFUN ("write-char", Fwrite_char, Swrite_char, 1, 2, 0,
        !           192:   "Output character CHAR to stream STREAM.\n\
        !           193: STREAM defaults to the value of `standard-output' (which see).")
        !           194:   (ch, printcharfun)
        !           195:      Lisp_Object ch, printcharfun;
        !           196: {
        !           197:   struct buffer *old = current_buffer;
        !           198:   int old_point = -1;
        !           199:   int start_point;
        !           200:   Lisp_Object original;
        !           201: 
        !           202:   if (NULL (printcharfun))
        !           203:     printcharfun = Vstandard_output;
        !           204:   CHECK_NUMBER (ch, 0);
        !           205:   PRINTPREPARE;
        !           206:   PRINTCHAR (XINT (ch));
        !           207:   PRINTFINISH;
        !           208:   return ch;
        !           209: }
        !           210: 
        !           211: write_string (data, size)
        !           212:      char *data;
        !           213:      int size;
        !           214: {
        !           215:   struct buffer *old = current_buffer;
        !           216:   Lisp_Object printcharfun;
        !           217:   int old_point = -1;
        !           218:   int start_point;
        !           219:   Lisp_Object original;
        !           220: 
        !           221:   printcharfun = Vstandard_output;
        !           222: 
        !           223:   PRINTPREPARE;
        !           224:   strout (data, size, printcharfun);
        !           225:   PRINTFINISH;
        !           226: }
        !           227: 
        !           228: write_string_1 (data, size, printcharfun)
        !           229:      char *data;
        !           230:      int size;
        !           231:      Lisp_Object printcharfun;
        !           232: {
        !           233:   struct buffer *old = current_buffer;
        !           234:   int old_point = -1;
        !           235:   int start_point;
        !           236:   Lisp_Object original;
        !           237: 
        !           238:   PRINTPREPARE;
        !           239:   strout (data, size, printcharfun);
        !           240:   PRINTFINISH;
        !           241: }
        !           242: 
        !           243: 
        !           244: #ifndef standalone
        !           245: 
        !           246: temp_output_buffer_setup (bufname)
        !           247:     char *bufname;
        !           248: {
        !           249:   register struct buffer *old = current_buffer;
        !           250:   register Lisp_Object buf;
        !           251: 
        !           252:   Fset_buffer (Fget_buffer_create (build_string (bufname)));
        !           253: 
        !           254:   current_buffer->read_only = Qnil;
        !           255:   Ferase_buffer ();
        !           256: 
        !           257:   XSET (buf, Lisp_Buffer, current_buffer);
        !           258:   specbind (Qstandard_output, buf);
        !           259: 
        !           260:   set_buffer_internal (old);
        !           261: }
        !           262: 
        !           263: Lisp_Object
        !           264: internal_with_output_to_temp_buffer (bufname, function, args)
        !           265:      char *bufname;
        !           266:      Lisp_Object (*function) ();
        !           267:      Lisp_Object args;
        !           268: {
        !           269:   int count = specpdl_ptr - specpdl;
        !           270:   Lisp_Object buf, val;
        !           271: 
        !           272:   record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
        !           273:   temp_output_buffer_setup (bufname);
        !           274:   buf = Vstandard_output;
        !           275: 
        !           276:   val = (*function) (args);
        !           277: 
        !           278:   temp_output_buffer_show (buf);
        !           279: 
        !           280:   unbind_to (count);
        !           281:   return val;
        !           282: }
        !           283: 
        !           284: DEFUN ("with-output-to-temp-buffer", Fwith_output_to_temp_buffer, Swith_output_to_temp_buffer,
        !           285:        1, UNEVALLED, 0,
        !           286:   "Binding `standard-output' to buffer named BUFNAME, execute BODY then display that buffer.\n\
        !           287: The buffer is cleared out initially, and marked as unmodified when done.\n\
        !           288: All output done by BODY is inserted in that buffer by default.\n\
        !           289: It is displayed in another window, but not selected.\n\
        !           290: The value of the last form in BODY is returned.\n\
        !           291: If variable `temp-buffer-show-hook' is non-nil, call it at the end\n\
        !           292: to get the buffer displayed.  It gets one argument, the buffer to display.")
        !           293:   (args)
        !           294:      Lisp_Object args;
        !           295: {
        !           296:   struct gcpro gcpro1;
        !           297:   Lisp_Object name;
        !           298:   int count = specpdl_ptr - specpdl;
        !           299:   Lisp_Object buf, val;
        !           300: 
        !           301:   GCPRO1(args);
        !           302:   name = Feval (Fcar (args));
        !           303:   UNGCPRO;
        !           304: 
        !           305:   CHECK_STRING (name, 0);
        !           306:   temp_output_buffer_setup (XSTRING (name)->data);
        !           307:   buf = Vstandard_output;
        !           308: 
        !           309:   val = Fprogn (Fcdr (args));
        !           310: 
        !           311:   temp_output_buffer_show (buf);
        !           312: 
        !           313:   unbind_to (count);
        !           314:   return val;
        !           315: }
        !           316: #endif /* not standalone */
        !           317: 
        !           318: static void print ();
        !           319: 
        !           320: DEFUN ("terpri", Fterpri, Sterpri, 0, 1, 0,
        !           321:   "Output a newline to STREAM (or value of standard-output).")
        !           322:   (printcharfun)
        !           323:      Lisp_Object printcharfun;
        !           324: {
        !           325:   struct buffer *old = current_buffer;
        !           326:   int old_point = -1;
        !           327:   int start_point;
        !           328:   Lisp_Object original;
        !           329: 
        !           330:   if (NULL (printcharfun))
        !           331:     printcharfun = Vstandard_output;
        !           332:   PRINTPREPARE;
        !           333:   PRINTCHAR ('\n');
        !           334:   PRINTFINISH;
        !           335:   return Qt;
        !           336: }
        !           337: 
        !           338: DEFUN ("prin1", Fprin1, Sprin1, 1, 2, 0,
        !           339:   "Output the printed representation of OBJECT, any Lisp object.\n\
        !           340: Quoting characters are printed when needed to make output that `read'\n\
        !           341: can handle, whenever this is possible.\n\
        !           342: Output stream is STREAM, or value of `standard-output' (which see).")
        !           343:   (obj, printcharfun)
        !           344:      Lisp_Object obj, printcharfun;
        !           345: {
        !           346:   struct buffer *old = current_buffer;
        !           347:   int old_point = -1;
        !           348:   int start_point;
        !           349:   Lisp_Object original;
        !           350: 
        !           351: #ifdef MAX_PRINT_CHARS
        !           352:   max_print = 0;
        !           353: #endif /* MAX_PRINT_CHARS */
        !           354:   if (NULL (printcharfun))
        !           355:     printcharfun = Vstandard_output;
        !           356:   PRINTPREPARE;
        !           357:   print_depth = 0;
        !           358:   print (obj, printcharfun, 1);
        !           359:   PRINTFINISH;
        !           360:   return obj;
        !           361: }
        !           362: 
        !           363: /* a buffer which is used to hold output being built by prin1-to-string */
        !           364: Lisp_Object Vprin1_to_string_buffer;
        !           365: 
        !           366: DEFUN ("prin1-to-string", Fprin1_to_string, Sprin1_to_string, 1, 1, 0,
        !           367:   "Return a string containing the printed representation of OBJECT,\n\
        !           368: any Lisp object.  Quoting characters are used when needed to make output\n\
        !           369: that `read' can handle, whenever this is possible.")
        !           370:   (obj)
        !           371:      Lisp_Object obj;
        !           372: {
        !           373:   struct buffer *old = current_buffer;
        !           374:   int old_point = -1;
        !           375:   int start_point;
        !           376:   Lisp_Object original, printcharfun;
        !           377:   struct gcpro gcpro1;
        !           378: 
        !           379:   printcharfun = Vprin1_to_string_buffer;
        !           380:   PRINTPREPARE;
        !           381:   print_depth = 0;
        !           382:   print (obj, printcharfun, 1);
        !           383:   /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINSH */
        !           384:   PRINTFINISH;
        !           385:   set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
        !           386:   obj = Fbuffer_string ();
        !           387:   GCPRO1 (obj);
        !           388:   Ferase_buffer ();
        !           389:   set_buffer_internal (old);
        !           390:   UNGCPRO;
        !           391:   return obj;
        !           392: }
        !           393: 
        !           394: DEFUN ("princ", Fprinc, Sprinc, 1, 2, 0,
        !           395:   "Output the printed representation of OBJECT, any Lisp object.\n\
        !           396: No quoting characters are used; no delimiters are printed around\n\
        !           397: the contents of strings.\n\
        !           398: Output stream is STREAM, or value of standard-output (which see).")
        !           399:   (obj, printcharfun)
        !           400:      Lisp_Object obj, printcharfun;
        !           401: {
        !           402:   struct buffer *old = current_buffer;
        !           403:   int old_point = -1;
        !           404:   int start_point;
        !           405:   Lisp_Object original;
        !           406: 
        !           407:   if (NULL (printcharfun))
        !           408:     printcharfun = Vstandard_output;
        !           409:   PRINTPREPARE;
        !           410:   print_depth = 0;
        !           411:   print (obj, printcharfun, 0);
        !           412:   PRINTFINISH;
        !           413:   return obj;
        !           414: }
        !           415: 
        !           416: DEFUN ("print", Fprint, Sprint, 1, 2, 0,
        !           417:   "Output the printed representation of OBJECT, with newlines around it.\n\
        !           418: Quoting characters are printed when needed to make output that `read'\n\
        !           419: can handle, whenever this is possible.\n\
        !           420: Output stream is STREAM, or value of `standard-output' (which see).")
        !           421:   (obj, printcharfun)
        !           422:      Lisp_Object obj, printcharfun;
        !           423: {
        !           424:   struct buffer *old = current_buffer;
        !           425:   int old_point = -1;
        !           426:   int start_point;
        !           427:   Lisp_Object original;
        !           428:   struct gcpro gcpro1;
        !           429: 
        !           430: #ifdef MAX_PRINT_CHARS
        !           431:   print_chars = 0;
        !           432:   max_print = MAX_PRINT_CHARS;
        !           433: #endif /* MAX_PRINT_CHARS */
        !           434:   if (NULL (printcharfun))
        !           435:     printcharfun = Vstandard_output;
        !           436:   GCPRO1 (obj);
        !           437:   PRINTPREPARE;
        !           438:   print_depth = 0;
        !           439:   PRINTCHAR ('\n');
        !           440:   print (obj, printcharfun, 1);
        !           441:   PRINTCHAR ('\n');
        !           442:   PRINTFINISH;
        !           443: #ifdef MAX_PRINT_CHARS
        !           444:   max_print = 0;
        !           445:   print_chars = 0;
        !           446: #endif /* MAX_PRINT_CHARS */
        !           447:   UNGCPRO;
        !           448:   return obj;
        !           449: }
        !           450: 
        !           451: static void
        !           452: print (obj, printcharfun, escapeflag)
        !           453: #ifndef RTPC_REGISTER_BUG
        !           454:      register Lisp_Object obj;
        !           455: #else
        !           456:      Lisp_Object obj;
        !           457: #endif
        !           458:      register Lisp_Object printcharfun;
        !           459:      int escapeflag;
        !           460: {
        !           461:   char buf[30];
        !           462: 
        !           463:   QUIT;
        !           464: 
        !           465:   print_depth++;
        !           466:   if (print_depth > 200)
        !           467:     error ("Apparently circular structure being printed");
        !           468: #ifdef MAX_PRINT_CHARS
        !           469:   if (max_print && print_chars > max_print)
        !           470:     {
        !           471:       PRINTCHAR ('\n');
        !           472:       print_chars = 0;
        !           473:     }
        !           474: #endif /* MAX_PRINT_CHARS */
        !           475: 
        !           476: #ifdef SWITCH_ENUM_BUG
        !           477:   switch ((int) XTYPE (obj))
        !           478: #else
        !           479:   switch (XTYPE (obj))
        !           480: #endif
        !           481:     {
        !           482:     default:
        !           483:       /* We're in trouble if this happens!
        !           484:         Probably should just abort () */
        !           485:       strout ("#<EMACS BUG: INVALID DATATYPE ", -1, printcharfun);
        !           486:       sprintf (buf, "(#o%3o)", (int) XTYPE (obj));
        !           487:       strout (buf, -1, printcharfun);
        !           488:       strout (" Save your buffers immediately and please report this bug>",
        !           489:              -1, printcharfun);
        !           490:       break;
        !           491: 
        !           492:     case Lisp_Int:
        !           493:       sprintf (buf, "%d", XINT (obj));
        !           494:       strout (buf, -1, printcharfun);
        !           495:       break;
        !           496: 
        !           497:     case Lisp_String:
        !           498:       if (!escapeflag)
        !           499:        strout (XSTRING (obj)->data, XSTRING (obj)->size, printcharfun);
        !           500:       else
        !           501:        {
        !           502:          register int i;
        !           503:          register unsigned char *p = XSTRING (obj)->data;
        !           504:          register unsigned char c;
        !           505: 
        !           506:          PRINTCHAR ('\"');
        !           507:          for (i = XSTRING (obj)->size; i > 0; i--)
        !           508:            {
        !           509:              QUIT;
        !           510:              c = *p++;
        !           511:              if (c == '\n' && print_escape_newlines)
        !           512:                {
        !           513:                  PRINTCHAR ('\\');
        !           514:                  PRINTCHAR ('n');
        !           515:                }
        !           516:              else
        !           517:                {
        !           518:                  if (c == '\"' || c == '\\')
        !           519:                    PRINTCHAR ('\\');
        !           520:                  PRINTCHAR (c);
        !           521:                }
        !           522:            }
        !           523:          PRINTCHAR ('\"');
        !           524:        }
        !           525:       break;
        !           526: 
        !           527:     case Lisp_Symbol:
        !           528:       {
        !           529:        register int confusing;
        !           530:        register unsigned char *p = XSYMBOL (obj)->name->data;
        !           531:        register unsigned char *end = p + XSYMBOL (obj)->name->size;
        !           532:        register unsigned char c;
        !           533: 
        !           534:        if (p != end && (*p == '-' || *p == '+')) p++;
        !           535:         if (p == end)
        !           536:          confusing = 0;
        !           537:        else
        !           538:          {
        !           539:            while (p != end && *p >= '0' && *p <= '9')
        !           540:              p++;
        !           541:            confusing = (end == p);
        !           542:          }
        !           543: 
        !           544:        p = XSYMBOL (obj)->name->data;
        !           545:        while (p != end)
        !           546:          {
        !           547:            QUIT;
        !           548:            c = *p++;
        !           549:            if (escapeflag)
        !           550:              {
        !           551:                if (c == '\"' || c == '\\' || c == '\'' || c == ';' || c == '#' ||
        !           552:                    c == '(' || c == ')' || c == ',' || c =='.' || c == '`' ||
        !           553:                    c == '[' || c == ']' || c == '?' || c <= 040 || confusing)
        !           554:                  PRINTCHAR ('\\'), confusing = 0;
        !           555:              }
        !           556:            PRINTCHAR (c);
        !           557:          }
        !           558:       }
        !           559:       break;
        !           560: 
        !           561:     case Lisp_Cons:
        !           562:       PRINTCHAR ('(');
        !           563:       {
        !           564:        register int i = 0;
        !           565:        register int max = 0;
        !           566: 
        !           567:        if (XTYPE (Vprint_length) == Lisp_Int)
        !           568:          max = XINT (Vprint_length);
        !           569:        while (CONSP (obj))
        !           570:          {
        !           571:            if (i++)
        !           572:              PRINTCHAR (' ');
        !           573:            if (max && i > max)
        !           574:              {
        !           575:                strout ("...", 3, printcharfun);
        !           576:                break;
        !           577:              }
        !           578:            print (Fcar (obj), printcharfun, escapeflag);
        !           579:            obj = Fcdr (obj);
        !           580:          }
        !           581:       }
        !           582:       if (!NULL (obj) && !CONSP (obj))
        !           583:        {
        !           584:          strout (" . ", 3, printcharfun);
        !           585:          print (obj, printcharfun, escapeflag);
        !           586:        }
        !           587:       PRINTCHAR (')');
        !           588:       break;
        !           589: 
        !           590:     case Lisp_Vector:
        !           591:       PRINTCHAR ('[');
        !           592:       {
        !           593:        register int i;
        !           594:        register Lisp_Object tem;
        !           595:        for (i = 0; i < XVECTOR (obj)->size; i++)
        !           596:          {
        !           597:            if (i) PRINTCHAR (' ');
        !           598:            tem = XVECTOR (obj)->contents[i];
        !           599:            print (tem, printcharfun, escapeflag);
        !           600:          }
        !           601:       }
        !           602:       PRINTCHAR (']');
        !           603:       break;
        !           604: 
        !           605: #ifndef standalone
        !           606:     case Lisp_Buffer:
        !           607:       if (NULL (XBUFFER (obj)->name))
        !           608:        strout ("#<killed buffer>", -1, printcharfun);
        !           609:       else if (escapeflag)
        !           610:        {
        !           611:          strout ("#<buffer ", -1, printcharfun);
        !           612:          strout (XSTRING (XBUFFER (obj)->name)->data, -1, printcharfun);
        !           613:          PRINTCHAR ('>');
        !           614:        }
        !           615:       else
        !           616:        strout (XSTRING (XBUFFER (obj)->name)->data, -1, printcharfun);
        !           617:       break;
        !           618: 
        !           619:     case Lisp_Process:
        !           620:       if (escapeflag)
        !           621:        {
        !           622:          strout ("#<process ", -1, printcharfun);
        !           623:          strout (XSTRING (XPROCESS (obj)->name)->data, -1, printcharfun);
        !           624:          PRINTCHAR ('>');
        !           625:        }
        !           626:       else
        !           627:        strout (XSTRING (XPROCESS (obj)->name)->data, -1, printcharfun);
        !           628:       break;
        !           629: 
        !           630:     case Lisp_Window:
        !           631:       strout ("#<window ", -1, printcharfun);
        !           632:       sprintf (buf, "%d", XFASTINT (XWINDOW (obj)->sequence_number));
        !           633:       strout (buf, -1, printcharfun);
        !           634:       if (!NULL (XWINDOW (obj)->buffer))
        !           635:        {
        !           636:          unsigned char *p = XSTRING (XBUFFER (XWINDOW (obj)->buffer)->name)->data;
        !           637:          strout (" on ", -1, printcharfun);
        !           638:          strout (p, -1, printcharfun);
        !           639:        }
        !           640:       PRINTCHAR ('>');
        !           641:       break;
        !           642: 
        !           643:     case Lisp_Window_Configuration:
        !           644:       strout ("#<window-configuration>", -1, printcharfun);
        !           645:       break;
        !           646: 
        !           647:     case Lisp_Marker:
        !           648:       strout ("#<marker ", -1, printcharfun);
        !           649:       if (!(XMARKER (obj)->buffer))
        !           650:        strout ("in no buffer", -1, printcharfun);
        !           651:       else
        !           652:        {
        !           653:          sprintf (buf, "at %d", marker_position (obj));
        !           654:          strout (buf, -1, printcharfun);
        !           655:          strout (" in ", -1, printcharfun);
        !           656:          strout (XSTRING (XMARKER (obj)->buffer->name)->data, -1, printcharfun);
        !           657:        }
        !           658:       PRINTCHAR ('>');
        !           659:       break;
        !           660: #endif /* standalone */
        !           661: 
        !           662:     case Lisp_Subr:
        !           663:       strout ("#<subr ", -1, printcharfun);
        !           664:       strout (XSUBR (obj)->symbol_name, -1, printcharfun);
        !           665:       PRINTCHAR ('>');
        !           666:       break;
        !           667:     }
        !           668: 
        !           669:   print_depth--;
        !           670: }
        !           671: 
        !           672: void
        !           673: syms_of_print ()
        !           674: {
        !           675:   DEFVAR_LISP ("standard-output", &Vstandard_output,
        !           676:     "Function print uses by default for outputting a character.\n\
        !           677: This may be any function of one argument.\n\
        !           678: It may also be a buffer (output is inserted before point)\n\
        !           679: or a marker (output is inserted and the marker is advanced)\n\
        !           680: or the symbol t (output appears in the minibuffer line).");
        !           681:   Vstandard_output = Qt;
        !           682:   Qstandard_output = intern ("standard-output");
        !           683:   staticpro (&Qstandard_output);
        !           684: 
        !           685:   DEFVAR_LISP ("print-length", &Vprint_length,
        !           686:     "Maximum length of list to print before abbreviating.\
        !           687: `nil' means no limit.");
        !           688:   Vprint_length = Qnil;
        !           689: 
        !           690:   DEFVAR_BOOL ("print-escape-newlines", &print_escape_newlines,
        !           691:     "Non-nil means print newlines in strings as backslash-n.");
        !           692:   print_escape_newlines = 0;
        !           693: 
        !           694:   /* prin1_to_string_buffer initialized in init_buffer_once in buffer.c */
        !           695:   staticpro (&Vprin1_to_string_buffer);
        !           696: 
        !           697:   defsubr (&Sprin1);
        !           698:   defsubr (&Sprin1_to_string);
        !           699:   defsubr (&Sprinc);
        !           700:   defsubr (&Sprint);
        !           701:   defsubr (&Sterpri);
        !           702:   defsubr (&Swrite_char);
        !           703: #ifndef standalone
        !           704:   defsubr (&Swith_output_to_temp_buffer);
        !           705: #endif /* not standalone */
        !           706: }

unix.superglobalmegacorp.com

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