Annotation of 43BSDReno/contrib/emacs-18.55/src/print.c, revision 1.1.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.