|
|
1.1 root 1: #line 1 "MSGTOQWK.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6: #include "qwk.h"
7: #include "etext.h"
8:
9: /****************************************************************************/
10: /* Converts message 'msg' to QWK format, writing to file 'qwk_fp'. */
11: /* mode determines how to handle Ctrl-A codes */
12: /****************************************************************************/
13: ulong msgtoqwk(smbmsg_t msg, FILE *qwk_fp, int mode, int subnum
14: , int conf)
15: {
16: uchar str[512],from[512],to[512],ch,tear=0,tearwatch=0,HUGE16 *buf,*p;
17: ushort xlat;
18: long l,size=0,offset;
19: int i;
20:
21: offset=ftell(qwk_fp);
22: memset(str,SP,128);
23: fwrite(str,128,1,qwk_fp); /* Init header to space */
24:
25: if(msg.from_net.addr && (uint)subnum==INVALID_SUB) {
26: if(mode&TO_QNET)
27: sprintf(from,"%.128s",msg.from);
28: else if(msg.from_net.type==NET_FIDO)
29: sprintf(from,"%.128s@%.128s"
30: ,msg.from,faddrtoa(*(faddr_t *)msg.from_net.addr));
31: else if(msg.from_net.type==NET_INTERNET)
32: sprintf(from,"%.128s",msg.from_net.addr);
33: else
34: sprintf(from,"%.128s@%.128s",msg.from,msg.from_net.addr);
35: if(strlen(from)>25) {
36: sprintf(str,"From: %.128s\xe3\xe3",from);
37: fwrite(str,strlen(str),1,qwk_fp);
38: size+=strlen(str);
39: sprintf(from,"%.128s",msg.from); } }
40: else {
41: sprintf(from,"%.128s",msg.from);
42: if(msg.hdr.attr&MSG_ANONYMOUS && !SYSOP) /* from user */
43: strcpy(from,text[Anonymous]); }
44:
45: if(msg.to_net.addr && (uint)subnum==INVALID_SUB) {
46: if(msg.to_net.type==NET_FIDO)
47: sprintf(to,"%.128s@%s",msg.to,faddrtoa(*(faddr_t *)msg.to_net.addr));
48: else if(msg.to_net.type==NET_INTERNET)
49: sprintf(to,"%.128s",msg.to_net.addr);
50: else if(msg.to_net.type==NET_QWK) {
51: if(mode&TO_QNET) {
52: p=strchr(msg.to_net.addr,'/');
53: if(p) { /* Another hop */
54: p++;
55: strcpy(to,"NETMAIL");
56: sprintf(str,"%.128s@%.128s\xe3",msg.to,p);
57: fwrite(str,strlen(str),1,qwk_fp);
58: size+=strlen(str); }
59: else
60: sprintf(to,"%.128s",msg.to); }
61: else
62: sprintf(to,"%.128s@%.128s",msg.to,msg.to_net.addr); }
63: else
64: sprintf(to,"%.128s@%.128s",msg.to,msg.to_net.addr);
65: if(strlen(to)>25) {
66: sprintf(str,"To: %.128s\xe3\xe3",to);
67: fwrite(str,strlen(str),1,qwk_fp);
68: size+=strlen(str);
69: if(msg.to_net.type==NET_QWK)
70: strcpy(to,"NETMAIL");
71: else
72: sprintf(to,"%.128s",msg.to); } }
73: else
74: sprintf(to,"%.128s",msg.to);
75:
76: if(msg.from_net.type==NET_QWK && mode&VIA && !msg.forwarded) {
77: sprintf(str,"@VIA:%.128s\xe3",msg.from_net.addr);
78: fwrite(str,strlen(str),1,qwk_fp);
79: size+=strlen(str); }
80:
81: if(msg.hdr.when_written.zone && mode&TZ) {
82: sprintf(str,"@TZ:%04x\xe3",msg.hdr.when_written.zone);
83: fwrite(str,strlen(str),1,qwk_fp);
84: size+=strlen(str); }
85:
86: p=0;
87: for(i=0;i<msg.total_hfields;i++) {
88: if(msg.hfield[i].type==SENDER)
89: p=msg.hfield_dat[i];
90: if(msg.hfield[i].type==FORWARDED && p) {
91: sprintf(str,"Forwarded from %s on %s\xe3",p
92: ,timestr((time_t *)msg.hfield_dat[i]));
93: fwrite(str,strlen(str),1,qwk_fp);
94: size+=strlen(str); } }
95:
96: buf=smb_getmsgtxt(&smb,&msg,1);
97: if(!buf)
98: return(0);
99:
100: for(l=0;buf[l];l++) {
101: ch=buf[l];
102:
103: if(ch==LF) {
104: if(tear)
105: tear++; /* Count LFs after tearline */
106: if(tear>3) /* more than two LFs after the tear */
107: tear=0;
108: if(tearwatch==4) { /* watch for LF---LF */
109: tear=1;
110: tearwatch=0; }
111: else if(!tearwatch)
112: tearwatch=1;
113: else
114: tearwatch=0;
115: ch=0xe3;
116: fputc(ch,qwk_fp); /* Replace LF with funky char */
117: size++;
118: continue; }
119:
120: if(ch==CR) { /* Ignore CRs */
121: if(tearwatch<4) /* LF---CRLF is okay */
122: tearwatch=0; /* LF-CR- is not okay */
123: continue; }
124:
125: if(ch==SP && tearwatch==4) { /* watch for "LF--- " */
126: tear=1;
127: tearwatch=0; }
128:
129: if(ch=='-') { /* watch for "LF---" */
130: if(l==0 || (tearwatch && tearwatch<4))
131: tearwatch++;
132: else
133: tearwatch=0; }
134: else
135: tearwatch=0;
136:
137: if((uint)subnum!=INVALID_SUB && sub[subnum]->misc&SUB_ASCII) {
138: if(ch<SP && ch!=1)
139: ch='.';
140: else if(ch>0x7f)
141: ch='*'; }
142:
143: if(ch==0xE3) /* funky char */
144: ch='*';
145:
146: if(ch==1) { /* ctrl-a */
147: ch=buf[++l];
148: if(!ch)
149: break;
150: if(mode&A_EXPAND) {
151: str[0]=0;
152: switch(toupper(ch)) { /* non-color codes */
153: case 'L':
154: strcpy(str,"\x1b[2J");
155: break;
156: case 'W':
157: strcpy(str,ansi(LIGHTGRAY));
158: break;
159: case 'K':
160: strcpy(str,ansi(BLACK));
161: break;
162: case 'H':
163: strcpy(str,ansi(HIGH));
164: break;
165: case 'I':
166: strcpy(str,ansi(BLINK));
167: break;
168: case 'N': /* Normal */
169: strcpy(str,"\x1b[0m");
170: break;
171: case '0':
172: strcpy(str,"\x1b[40m");
173: break;
174: case '7':
175: strcpy(str,ansi(LIGHTGRAY<<4));
176: break;
177: case 'R': /* Color codes */
178: strcpy(str,ansi(RED));
179: break;
180: case 'G':
181: strcpy(str,ansi(GREEN));
182: break;
183: case 'B':
184: strcpy(str,ansi(BLUE));
185: break;
186: case 'C':
187: strcpy(str,ansi(CYAN));
188: break;
189: case 'M':
190: strcpy(str,ansi(MAGENTA));
191: break;
192: case 'Y': /* Yellow */
193: strcpy(str,ansi(BROWN));
194: break;
195: case '1':
196: strcpy(str,ansi(RED<<4));
197: break;
198: case '2':
199: strcpy(str,ansi(GREEN<<4));
200: break;
201: case '3':
202: strcpy(str,ansi(BROWN<<4));
203: break;
204: case '4':
205: strcpy(str,ansi(BLUE<<4));
206: break;
207: case '5':
208: strcpy(str,ansi(MAGENTA<<4));
209: break;
210: case '6':
211: strcpy(str,ansi(CYAN<<4));
212: break; }
213: if(str[0]) {
214: fwrite(str,strlen(str),1,qwk_fp);
215: size+=strlen(str); }
216: continue; } /* End Expand */
217:
218: if(mode&A_LEAVE) {
219: fputc(1,qwk_fp);
220: fputc(ch,qwk_fp);
221: size+=2L; }
222: else /* Strip */
223: if(toupper(ch)=='L') {
224: fputc(FF,qwk_fp);
225: size++; }
226: continue; } /* End of Ctrl-A shit */
227: fputc(ch,qwk_fp);
228: size++; }
229:
230: LFREE(buf);
231: if(ch!=0xE3) {
232: fputc(0xE3,qwk_fp); /* make sure it ends in CRLF */
233: size++; }
234:
235: if(mode&TAGLINE && !(sub[subnum]->misc&SUB_NOTAG)) {
236: if(!tear) /* no tear line */
237: strcpy(str,"\1n---\xe3"); /* so add one */
238: else
239: strcpy(str,"\1n");
240: if(sub[subnum]->misc&SUB_ASCII) ch='*';
241: else ch='�';
242: sprintf(tmp," %c \1g%s\1n %c %.127s\xe3"
243: ,ch,decrypt(Synchronet,0),ch,sub[subnum]->tagline);
244: strcat(str,tmp);
245: if(!(mode&A_LEAVE))
246: remove_ctrl_a(str);
247: fwrite(str,strlen(str),1,qwk_fp);
248: size+=strlen(str); }
249:
250: while(size%128L) { /* Pad with spaces */
251: size++;
252: fputc(SP,qwk_fp); }
253:
254: unixtodos(msg.hdr.when_written.time,&date,&curtime);
255:
256: sprintf(tmp,"%02u-%02u-%02u%02u:%02u"
257: ,date.da_mon,date.da_day,date.da_year-1900
258: ,curtime.ti_hour,curtime.ti_min);
259:
260: if(msg.hdr.attr&MSG_PRIVATE) {
261: if(msg.hdr.attr&MSG_READ)
262: ch='*'; /* private, read */
263: else
264: ch='+'; /* private, unread */ }
265: else {
266: if(msg.hdr.attr&MSG_READ)
267: ch='-'; /* public, read */
268: else
269: ch=' '; /* public, unread */ }
270:
271:
272: sprintf(str,"%c%-7lu%-13.13s%-25.25s"
273: "%-25.25s%-25.25s%12s%-8lu%-6lu\xe1%c%c%c%c%c"
274: ,ch /* message status flag */
275: ,mode&REP ? (ulong)conf /* conference or */
276: : msg.hdr.number /* message number */
277: ,tmp /* date and time */
278: ,to /* To: */
279: ,from /* From: */
280: ,msg.subj /* Subject */
281: ,nulstr /* Password */
282: ,msg.hdr.thread_orig /* Message Re: Number */
283: ,(size/128L)+1 /* Number of 128byte blocks */
284: ,(char)conf&0xff /* Conference number lo byte */
285: ,(ushort)conf>>8 /* hi byte */
286: ,SP /* not used */
287: ,SP /* not used */
288: ,useron.rest&FLAG('Q') ? '*' : SP /* Net tag line */
289: );
290:
291: fseek(qwk_fp,offset,SEEK_SET);
292: fwrite(str,128,1,qwk_fp);
293: fseek(qwk_fp,size,SEEK_CUR);
294:
295: return(size);
296: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.