DC가 긴 숫자를 분할하여 인쇄하는 이유는 무엇입니까?

DC가 긴 숫자를 분할하여 인쇄하는 이유는 무엇입니까?

유틸리티 를 실행할 때 dc매우 큰 숫자를 입력하면 다음과 같이 표시됩니다.

99999999999999999999999999999999999999999999999999999999999999999999

인쇄물을 사용하면 다음과 같은 결과를 p얻습니다.

999999999999999999999999999999999999999999999999999999999999999999999\
999

69비트 후에 출력을 분할하는 이유는 무엇입니까?

답변1

최소한 GNU 구현의 경우 dc70자가 하드 코딩되어 있습니다 DEFAULT_LINE_MAX. 물론 DC_LINE_LENGTH환경 변수를 설정하여 이를 무시할 수도 있습니다. 에서 dc/numeric.c:

559 static int out_col = 0;
560 static int line_max = -1;       /* negative means "need to check environment" */
561 #define DEFAULT_LINE_MAX 70
562 
563 static void
564 set_line_max_from_environment(void)
565 {
566         const char *env_line_len = getenv("DC_LINE_LENGTH");
567         line_max = DEFAULT_LINE_MAX;
568         errno = 0;
569         if (env_line_len) {
570                 char *endptr;
571                 long proposed_line_len = strtol(env_line_len, &endptr, 0);
572                 line_max = (int)proposed_line_len;
573 
574                 /* silently enforce sanity */
575                 while (isspace(*endptr))
576                         ++endptr;
577                 if (*endptr || errno || line_max != proposed_line_len
578                                         || line_max < 0 || line_max == 1)
579                         line_max = DEFAULT_LINE_MAX;
580         }
581 }
582 

그래서

$ dc
999999999999999999999999999999999999999999999999999999999999999999999999
p
999999999999999999999999999999999999999999999999999999999999999999999\
999
q

하지만

$ DC_LINE_LENGTH=0 dc
999999999999999999999999999999999999999999999999999999999999999999999999
p
999999999999999999999999999999999999999999999999999999999999999999999999
q
$ 

답변2

터미널은 전통적으로 80x24(또는 그 이상)이며 이러한 환경에서는 긴 줄 바꿈이 문제가 될 수 있으며 이는 UNIX의 전통적인 긴 줄 바꿈 사용을 설명할 수 있습니다 \.

이는 매우 오래된 제한사항입니다 dc(1).버전 6 AT&T UNIX출처는 다음과 같습니다:

dc1.s:ll:   70.         /line length

(레트로 컴퓨팅을 수행하는 사람은 왜 긴 줄이 문제인지 자세히 말해 줄 수 있습니다. 누군가는 당시의 라인 프린터에 아마도 마법의 긴 줄 줄 바꿈 기능이 없었을 것이라고 의심할 수도 있습니다. 따라서 무언가를 올바르게 인쇄하려면 실제로 페이지에 맞춰야 합니다...)

관련 정보