|
|
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.