Annotation of 43BSDReno/contrib/emacs-18.55/src/print.c, revision 1.1

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

unix.superglobalmegacorp.com

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