home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / c / crcbbs.arc / CRCPC1D.C < prev   
Text File  |  1985-10-22  |  10KB  |  363 lines

  1. #include    "crcpchdr.h"
  2.  
  3. create_file(c,args,opts)
  4. char c, *args, *opts;
  5. {
  6. char filename[17], *t1, *t2, *t3;
  7. if (!has_auth("W",cur_dir,cur_root)) return(not_auth('W',cur_dir,cur_root));
  8. threeparse(args,&t1,&t2,&t3);
  9. uppercase(t1); uppercase(t2);    
  10.  
  11. if (!*t1) {
  12.     if (!find_option(opts,'q') && beginner) disp_msg(13);
  13.     t1 = disp_reply(file_prompt(beginner,"create/edit"),filename,14);
  14.     if (!*t1) return(nothing_done());
  15.     }
  16. if (check_fn(t1,TRUE)) return;
  17. if (check_rsvf(t1,TRUE)) return;    /* Can't use reserved filename */
  18. if (!*t2) t2 = t1;         /* No second file specified: dest = source */
  19. if (check_fn(t2,TRUE)) return;
  20. if (check_rsvf(t2,TRUE)) return;    /* Can't use reserved filename */
  21.  
  22. /* NOTE: SYSEDIT does NOT need CUR_DIR and CUR_ROOT as arguments - can
  23.     now use alternate directory path root/dir */
  24. sysedit(cur_dir,cur_root,t2,cur_dir,cur_root,t1,opts);
  25. }
  26.  
  27. xfer_file(c,args,opts)
  28. char c,*args,*opts;
  29. {
  30. int noargs, quiet;
  31. char *prompt, acctype;
  32. char buff[27];
  33.  
  34. acctype = 'R';
  35. quiet = find_option(opts,'q');
  36. noargs = !(*args);        /* There were no arguments on command line */
  37. if (!has_auth(&acctype,cur_dir,cur_root)) goto nopsorry;
  38. stptok(args,buff,sizeof(buff),"");    /* Truncate if necessary */
  39. if (buff[0]) goto gotaf1;        /* !(noargs) */
  40. if (!quiet && beginner) disp_msg(21);
  41. oops:
  42.  
  43. if (beginner) prompt = "Enter '?', or 'R' to receive, or 'S' to send file: ";
  44. else prompt = "<R>eceive or <S>end or ?: ";
  45. disp_reply(prompt,buff,25);
  46. gotaf1:
  47. buff[0] = toupper(buff[0]);
  48. if (buff[0]=='R') {
  49.     acctype = 'W';
  50.     if (!has_auth(&acctype,cur_dir,cur_root)) goto nopsorry;
  51.     up_load(buff,opts);    /* Pass parms */
  52.     return;
  53.     }
  54. else if (buff[0]=='?') help(XFF_HLP,opts);
  55. else if (buff[0]=='S') return(down_load(buff,opts));    /* again */
  56. else if (buff[0]=='\0') return(nothing_done());
  57. if (noargs) goto oops;        /* Loop only if no arguments at beginning */
  58. return;
  59.  
  60. nopsorry: return(not_auth(acctype,cur_dir,cur_root));
  61. }
  62.  
  63.  
  64. /* char *parms points to '[arg1]': arg1=[d:]name[.ext]  */
  65. static char *askfilename(parms,opts)
  66. char *parms, *opts;
  67. {
  68. char *prompt, *badchptr;
  69. static char buff[17];
  70. int quiet;
  71.  
  72. quiet = find_option(opts,'q');
  73. if (!*parms && !quiet && beginner) disp_msg(22);
  74. forever {
  75.     if (*parms) stptok(parms,buff,17,"");
  76.     else {
  77.         if (beginner) prompt="Press <ENTER> or enter a valid file name (d:name.ext) ";
  78.         else prompt = "Filename: ";
  79.         disp_reply(prompt,buff,15);
  80.         }
  81.     if (!buff[0]) break;
  82.     prompt = stpblk(rtrim(buff));
  83.     if (badchptr=stpbrk(prompt,INVDOSFNCHR)) bad_fn(*badchptr);
  84.     else return(prompt);
  85.     parms = "";
  86.     }
  87. return(buff);
  88. }
  89.  
  90. /* char *parms points to '[arg1]': arg1=A[????] or X[?????]  */
  91. static char xfertype(parms,opts)
  92. char *parms, *opts;
  93. {
  94. char *prompt;
  95. static char buff[9];
  96.  
  97. if (!*parms && beginner && !find_option(opts,'q')) disp_msg(24);
  98.  
  99. forever {
  100.     if (*parms) buff[0]=*parms;
  101.     else {
  102.         if (beginner) prompt="Enter '?', or 'A' for Ascii transfer or 'X' for XMODEM: ";
  103.         else prompt = "<A>scii <X>modem or ?: ";
  104.         disp_reply(prompt,buff,7);
  105.         }
  106.     if ((buff[0]=toupper(buff[0]))=='A') return 'A';
  107.     else if (buff[0]=='X') {
  108.         if (*wordlen!='8') {
  109.             disp_msg(27);
  110.             return('\0');
  111.             }
  112.         return 'X';
  113.         }
  114.     else if (buff[0]=='\0') return '\0';
  115.     else if (buff[0]=='?') help(XFF2_HLP,opts);
  116.     parms = "";
  117.     inv_arg();
  118.     }
  119. }
  120.  
  121. /* char *parms points to 'xx [arg1 [arg2]]': arg2=[d:]name[.ext]  */
  122. static down_load(parms,opts)
  123. char *parms, *opts;
  124. {
  125. char xt, *fn, *prompt, buff[6];
  126. int bsav;
  127. FILE *fp;
  128. int quiet;
  129. int outwidth, outlength;
  130.  
  131. quiet = find_option(opts,'q');
  132. parms = skptok(parms);    /* Skip 'xx' */
  133. xt = xfertype(parms,opts);     /* Get Xfertype from PARMS, or prompt */
  134. if (!xt) return(nothing_done());
  135. parms = skptok(parms);    /* Skip possible arg1 */
  136. fn = askfilename(parms,opts);
  137. if (!*fn) return(nothing_done());
  138. uppercase(fn);
  139. if ((fp=fopen(fn,"r"))==NULL) return(not_open());
  140. bsav = beginner;
  141. beginner = FALSE;
  142. if (xt=='A' && !quiet) see_dtables('@',"","");
  143. else if (!quiet) printf("XMODEM protocol used.\r\n");
  144. beginner = bsav;
  145. printf("Ready to send file: %s\r\n",fn);
  146. cr();
  147. if (beginner) prompt="Enter 'Y' when ready for file transfer or press <ENTER>: ";
  148. else prompt="'Y' when ready: ";
  149. disp_reply(prompt,buff,4);
  150. if (toupper(buff[0])!='Y') {
  151.     fclose(fp);
  152.     nothing_done();
  153.     return;
  154.     }
  155. if (xt=='A') {
  156.     if (beginner) ctlsctlk();
  157.     printf(dn_tab.before);
  158.     outwidth = utwidth;
  159.     outlength = utlength;
  160.     utwidth = utlength = 0;    /* So no CR/LF or 'More ?' is written to STDOUT */
  161.     fileterm(fp,"t");    /* "t" (text option) is opposite to 'p' option */
  162.     fclose(fp);
  163.     printf(dn_tab.after);
  164.     utwidth = outwidth;        /* Get back user t-settings */
  165.     utlength = outlength;
  166.     printf("\r\nText transfer complete\r\n");
  167.     }
  168. else {
  169.     fclose(fp);
  170.     xsendf(fn,opts);
  171.     }
  172. record_fxf(DOWNLOAD,xt,fn);        /* Update: FXFER user record */
  173. cr();
  174. if (!quiet && beginner) printf("Returning from send file transfer section\r\n");
  175. }
  176.  
  177.  
  178. /* char *parms points to 'xx [arg1 [arg2]]': arg2=[d:]name[.ext]  */
  179. static up_load(parms,opts)
  180. char *parms, *opts;
  181. {
  182. char xt, *fn, *ll, *prompt, buff[6];
  183. FILE *fp;
  184. int quiet;
  185. long getfree();
  186.  
  187.  
  188. printf("There are %ld bytes free in the file system\r\n",getfree(0));
  189. quiet = find_option(opts,'q');
  190. parms = skptok(parms);    /* Skip 'xx' */
  191. xt = xfertype(parms,opts);    /* Get Xfertype from PARMS, or prompt */
  192. if (!xt) return(nothing_done());
  193. parms = skptok(parms);    /* Skip possible arg1 */
  194. fn = askfilename(parms,opts);
  195. if (!*fn) return(nothing_done());
  196. if ((fp=fopen(uppercase(fn),"r"))!=NULL) {
  197.     printf("File `%s' already exists.\r\n",fn);
  198.     fclose(fp);
  199.     return;
  200.     }
  201. if (!quiet) {
  202.     if (xt=='A') printf("ASCII file transfer\r\n");
  203.     else printf("XMODEM protocol used.\r\n");
  204.     }
  205. printf("Ready to receive file: %s\r\n",fn);
  206. cr();
  207. if (beginner) prompt="Enter 'Y' to continue or press <ENTER>: ";
  208. else prompt="'Y' continues: ";
  209. disp_reply(prompt,buff,4);
  210. if (toupper(buff[0])!='Y') return(nothing_done());
  211. if (xt=='A') finput(fn,opts);
  212. else {
  213.     if (!quiet && beginner) 
  214.         printf("If problem occurs, please wait for the abort -- about 30 sec\r\n\r\n");
  215.     xreadf(fn,opts);
  216.     }
  217. record_fxf(UPLOAD,xt,fn);        /* Update: FXFER user record */
  218. cr();
  219. if (!quiet && beginner) printf("Returning from receive file transfer section\r\n");
  220. }
  221.  
  222.  
  223. static record_fxf(what,type,file)
  224. int what;
  225. char type;
  226. char *file;
  227. {
  228. char *tokptr;
  229. int upl, dnl;
  230.  
  231. if (*fxfer) {
  232.     upl = mxti(fxfer,1);
  233.     dnl = mxti(fxfer,2);
  234.     }
  235. else upl = dnl = 0;
  236.  
  237. sprintf(fxfer,"%d %d ",what==UPLOAD?upl+1:upl,what==DOWNLOAD?dnl+1:dnl);
  238.  
  239. if (what==UPLOAD) tokptr = "UPLOAD ";
  240. else tokptr = "DOWNLOAD ";
  241.  
  242. strcat(fxfer,tokptr);
  243. strcat(fxfer,date());
  244. strcat(fxfer," ");
  245. strcat(fxfer,file);
  246. strcat(fxfer,type=='A'?" ASCII":" XMODEM");
  247. }
  248.  
  249.  
  250. static set_dntab(whatfor,table,maxlen,args,opts)
  251. char *whatfor, *table;
  252. int maxlen;
  253. char *args,*opts;
  254. {
  255. int quiet;
  256.  
  257. uppercase(whatfor);
  258. quiet = find_option(opts,'q');
  259. if (!*args) {
  260.     printf("Enter decimal list for '%s' text transfer protocol below:\r\n",whatfor);
  261.     if (!quiet && beginner) {
  262.         mputs("Press <ENTER> to leave untouched; enter '*' to zap.\r\n");
  263.         printf("Use comma to delimit codes; up to %d allowed\r\n\r\n",maxlen-1);
  264.         }
  265.     disp_reply("",workstr,LINESIZE);
  266.     }
  267. else stptok(args,workstr,LINESIZE," ");
  268. if (!*workstr) return(nothing_done());
  269. else if (workstr[0]=='*') *table = '\0';
  270. else if (bin_list(table,workstr,maxlen)!=NULL && !quiet) 
  271.     printf("'%s' text transfer table has been updated\r\n",whatfor);
  272. }
  273.  
  274. static set_dtables(args,opts)
  275. char *args, *opts;
  276. {
  277. char buff[6];
  278. char *which;
  279.  
  280. if (!find_option(opts,'q') && beginner) disp_msg(23);
  281. set_dntab("BEFORE",dn_tab.before,sizeof(dn_tab.before),args,opts);
  282. set_dntab("AFTER",dn_tab.after,sizeof(dn_tab.after),skptok(args),opts);
  283. }
  284.  
  285.  
  286. see_dtables(c,args,opts)
  287. char c, *args, *opts;
  288. {
  289. char charlist[LINESIZE];
  290. char *ll, buff[6];
  291. int quiet;
  292.  
  293. quiet = find_option(opts,'q');
  294. buff[0] = 'Y';
  295. if (find_option(opts,'c')) goto chgitn;
  296. if (!quiet && beginner) disp_msg(25);
  297. if (!quiet) printf("ASCII file transfer protocol settings:\r\n");
  298. if (dn_tab.before[0]!='\0') {
  299.     ll = dec_list(charlist,dn_tab.before,sizeof(charlist));
  300.     if (beginner) printf("ASCII code(s) '%s' will be sent before file transmission\r\n",ll);
  301.     else printf("'%s' prepended to data\r\n",ll);
  302.     }
  303. if (dn_tab.after[0]!='\0') {
  304.     ll = dec_list(charlist,dn_tab.after,sizeof(charlist));
  305.     if (beginner) printf("ASCII code(s) '%s' will be sent after file transmission\r\n",ll);
  306.     else printf("'%s' appended to data\r\n",ll);
  307.     }
  308. if (!(dn_tab.after[0]|dn_tab.before[0])) printf("None\r\n");
  309. disp_reply("Enter 'Y' to change code sequence or press <ENTER>: ",buff,4);
  310. chgitn:
  311. if (toupper(buff[0])=='Y') set_dtables(args,opts);
  312. else nothing_done();
  313. }
  314.  
  315.  
  316. static int sysedit(destdir,destroot,destfile,sourcedir,sourceroot,sourcefile,opts)
  317. char sourcedir[], sourceroot[], sourcefile[], 
  318.     destdir[], destroot[], destfile[];
  319. char *opts;
  320. {
  321. int rc;
  322. char *select, *getenv();
  323. char sourcefn[DIRSIZE+17], destfn[DIRSIZE+17];
  324.  
  325. if (sysdir(sourcedir,sourceroot)) return(baddir(sourcedir));
  326. else if (sysdir(destdir,destroot)) return(baddir(destdir));
  327.  
  328. /* Zap global status variable to say: Don't force the guy off now */
  329. noforcenow = TRUE;
  330.  
  331. if (find_option(opts,'2')) select=alt_editor;    /* Global sys variables */
  332. else select=sys_editor;
  333.  
  334. if (strcmp(sourcedir,cur_dir) || strcmp(sourceroot,cur_root)) {
  335.     prefix_dir(disk_buffer,sourcedir,sourceroot);
  336.     prefix_dir(sourcefn,sourcefile,disk_buffer);
  337.     }
  338. else strcpy(sourcefn,sourcefile);
  339.  
  340. if (strcmp(destdir,cur_dir) || strcmp(destroot,cur_root)) {
  341.     prefix_dir(disk_buffer,destdir,destroot);
  342.     prefix_dir(destfn,destfile,disk_buffer);
  343.     }
  344. else strcpy(destfn,destfile);
  345.  
  346. if (select!=NULL) {
  347.     sprintf(disk_buffer,"%s %s %s",select,sourcefn,destfn);
  348.     cr();
  349.     if (debug) printf("calling dos: '%s'\r\n",disk_buffer);
  350.     rc = system(disk_buffer);
  351.     cr();
  352.     if (rc) printf("DOS ERROR %d from invoking editor\r\n",rc);
  353.     }
  354. else {
  355.     printf("Editor: not available.\r\n");
  356.     rc = 98;
  357.     }
  358.                     /* All done */
  359. noforcenow = FALSE;    /* Can force him now if he spent too much time here */
  360. return(rc);                /* Return with status */
  361. }
  362. 
  363.