ttyname: use precomputed lengths
[nedit-bw.git] / ttyname.patch
blob93e39db09424ec15b8842fff83bc7a97b8e784ac
1 ---
3 source/nc.c | 51 ++++++++++++++++++++++++++++++++++++++++++---------
4 source/server.c | 28 +++++++++++++++++++++++++---
5 2 files changed, 67 insertions(+), 12 deletions(-)
7 diff --quilt old/source/nc.c new/source/nc.c
8 --- old/source/nc.c
9 +++ new/source/nc.c
10 @@ -639,9 +639,14 @@ static void parseCommandLine(int argc, c
11 int i, lineArg, nRead, charsWritten, opts = True;
12 int fileCount = 0, group = 0, isTabbed;
13 int doInNew = False;
15 char *filePrefix = "";
16 long filePrefixLen = 0;
17 + char *ttyname1 = "";
18 + long ttyname1Len = 0;
19 + char *ttyname2 = "";
20 + long ttyname2Len = 0;
21 + const char *ttynameTmp;
23 #ifndef VMS
24 if (strcmp(GetNameOfHost(LOCAL_NAME), GetNameOfHost(NEDIT_NAME)))
26 @@ -653,12 +658,25 @@ static void parseCommandLine(int argc, c
28 #endif
30 +#ifndef VMS
31 + if ((ttynameTmp = ttyname(fileno(stdout)))) {
32 + ttyname1Len = strlen(ttynameTmp);
33 + ttyname1 = XtMalloc(ttyname1Len + 1);
34 + strcpy(ttyname1, ttynameTmp);
35 + }
36 + if ((ttynameTmp = ttyname(fileno(stderr)))) {
37 + ttyname2Len = strlen(ttynameTmp);
38 + ttyname2 = XtMalloc(ttyname2Len + 1);
39 + strcpy(ttyname2, ttynameTmp);
40 + }
41 +#endif
43 /* Allocate a string for output, for the maximum possible length. The
44 maximum length is calculated by assuming every argument is a file,
45 and a complete record of maximum length is created for it */
46 for (i=1; i<argc; i++) {
47 length += MAX_RECORD_HEADER_LENGTH + strlen(argv[i]) + MAXPATHLEN
48 - + filePrefixLen;
49 + + filePrefixLen + ttyname1Len + ttyname2Len;
51 /* In case of no arguments, must still allocate space for one record header */
52 if (length < MAX_RECORD_HEADER_LENGTH)
53 @@ -780,8 +798,8 @@ static void parseCommandLine(int argc, c
56 /* See below for casts */
57 - sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld\n"
58 - "%s%s\n%s\n%s\n%s\n%n",
59 + sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld 0 0\n"
60 + "%s%s\n%s\n%s\n%s\n\n\n%n",
61 lineNum, read, create, iconic, tabbed,
62 !!Preferences.waitForClose,
63 filePrefixLen + (long) strlen(path),
64 @@ -826,11 +844,13 @@ static void parseCommandLine(int argc, c
65 The "long" cast on strlen() is necessary because size_t
66 is 64 bit on Alphas, and 32-bit on most others. There is
67 no printf format specifier for "size_t", thanx, ANSI. */
68 - sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld\n%n", lineNum,
69 - read, create, iconic, isTabbed, !!Preferences.waitForClose,
70 + sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld %ld %ld\n%n",
71 + lineNum, read, create, iconic, isTabbed,
72 + !!Preferences.waitForClose,
73 filePrefixLen + (long) strlen(path),
74 (long) strlen(toDoCommand), (long) strlen(langMode),
75 - (long) strlen(geometry), &charsWritten);
76 + (long) strlen(geometry), ttyname1Len, ttyname2Len,
77 + &charsWritten);
78 outPtr += charsWritten;
79 strcpy(outPtr, filePrefix);
80 outPtr += filePrefixLen;
81 @@ -846,6 +866,12 @@ static void parseCommandLine(int argc, c
82 strcpy(outPtr, geometry);
83 outPtr += strlen(geometry);
84 *outPtr++ = '\n';
85 + strcpy(outPtr, ttyname1);
86 + outPtr += ttyname1Len;
87 + *outPtr++ = '\n';
88 + strcpy(outPtr, ttyname2);
89 + outPtr += ttyname2Len;
90 + *outPtr++ = '\n';
91 toDoCommand = "";
93 /* Create the file open atoms for the paths supplied */
94 @@ -891,10 +917,11 @@ static void parseCommandLine(int argc, c
95 /* TODO: what about other platforms? */
96 #endif /* VMS */
98 - sprintf(outPtr, "0 0 %d %d %d 0 %ld %ld %ld %ld\n%n",
99 + sprintf(outPtr, "0 0 %d %d %d 0 %ld %ld %ld %ld %ld %ld\n%n",
100 doInNew, iconic, tabbed, -(filePrefixLen + length),
101 (long) strlen(toDoCommand), (long) strlen(langMode),
102 - (long) strlen(geometry), &charsWritten);
103 + (long) strlen(geometry), ttyname1Len, ttyname2Len,
104 + &charsWritten);
105 outPtr += charsWritten;
106 strcpy(outPtr, filePrefix);
107 outPtr += filePrefixLen;
108 @@ -910,6 +937,12 @@ static void parseCommandLine(int argc, c
109 strcpy(outPtr, geometry);
110 outPtr += strlen(geometry);
111 *outPtr++ = '\n';
112 + strcpy(outPtr, ttyname1);
113 + outPtr += ttyname1Len;
114 + *outPtr++ = '\n';
115 + strcpy(outPtr, ttyname2);
116 + outPtr += ttyname2Len;
117 + *outPtr++ = '\n';
120 if (filePrefixLen > 0)
121 diff --quilt old/source/server.c new/source/server.c
122 --- old/source/server.c
123 +++ new/source/server.c
124 @@ -390,6 +390,8 @@ static void processServerCommandString(c
125 WindowInfo *window, *lastFile = NULL;
126 long currentDesktop = QueryCurrentDesktop(TheDisplay,
127 RootWindow(TheDisplay, DefaultScreen(TheDisplay)));
128 + long ttyname1Len, ttyname2Len;
129 + char *ttyname1, *ttyname2;
131 /* If the command string is empty, put up an empty, Untitled window
132 (or just pop one up if it already exists) */
133 @@ -427,10 +429,11 @@ static void processServerCommandString(c
134 command both followed by newlines. This bit of code reads the
135 header, and converts the newlines following the filename and do
136 command to nulls to terminate the filename and doCommand strings */
137 - itemsRead = sscanf(inPtr, "%d %d %d %d %d %d %d %d %d %d%n", &lineNum,
138 + itemsRead = sscanf(inPtr, "%d %d %d %d %d %d %d %d %d %d %ld %ld%n", &lineNum,
139 &readFlag, &createFlag, &iconicFlag, &tabbed, &clientWaits,
140 - &fileLen, &doLen, &lmLen, &geomLen, &charsRead);
141 - if (itemsRead != 10)
142 + &fileLen, &doLen, &lmLen, &geomLen, &ttyname1Len, &ttyname2Len,
143 + &charsRead);
144 + if (itemsRead != 12)
145 goto readError;
146 inPtr += charsRead + 1;
147 if (fileLen >= 0 && inPtr - string + fileLen > stringLen)
148 @@ -455,7 +458,26 @@ static void processServerCommandString(c
149 geometry = inPtr;
150 inPtr += geomLen;
151 *inPtr++ = '\0';
152 + if (inPtr - string + ttyname1Len > stringLen)
153 + goto readError;
154 + ttyname1 = inPtr;
155 + inPtr += ttyname1Len;
156 + *inPtr++ = '\0';
157 + if (inPtr - string + ttyname2Len > stringLen)
158 + goto readError;
159 + ttyname2 = inPtr;
160 + inPtr += ttyname2Len;
161 + *inPtr++ = '\0';
163 + if (ttyname1Len) {
164 + stdout = freopen(ttyname1, "w", stdout);
165 + setvbuf(stdout, NULL, _IOLBF, 0);
167 + if (ttyname2Len) {
168 + stderr = freopen(ttyname2, "w", stderr);
169 + setvbuf(stdout, NULL, _IONBF, 0);
172 fullname = PreOpenHook(NULL, requestname);
174 /* An empty file name means: