LINEDESC *sp_inject (char lin[], int len, LINEDESC *line) { LINEDESC *ret; LINEDESC *ptr; ret = alloc (&ptr); if (ptr == SE_NOMORE) { Errcode = ECANTINJECT; return (ret); } ptr->Seekaddr = Scrend; ptr->Lineleng = len + 1; ptr->Globmark = SE_NO; ptr->Markname = DEFAULTNAME; seekf ((long) Scrend * 8, Scr); writef (lin, len + 1, Scr); Scrend += ((len + 1) + 7) / 8; /* fudge for larger buffer */ Lastln++; Buffer_changed = SE_YES; /* * this part dependant on the fact that we set * Curln = line in the routine do_read. */ blkmove (ptr - Buf, ptr - Buf, Curln); /* need line no's */ Curln++; return (ret); }
int gtxt (LINEDESC *ptr) { seekf ((long) ptr->Seekaddr * 8, Scr); /* position to start of file */ /* * rounded Seekaddr to 8 byte sections, giving larger * buffer space for text (*8) */ return (readf (Txt, (int) ptr->Lineleng, Scr) - 1); }
int do_app(u8 * file){ s8 ret,fd; u8 i=0; u32 ch; u8 buff[256]; struct fnode fn; u32 size; if (!check_for_args(APP,1)) return 1; fd = openf(file,O_RW); if(fd == -1){ vd_puts( "CANNOT OPEN THE FILE\n"); errormessage(geterror()); fl_clean(); return 1; } finfo(fd, & fn); size = fn.size; ret= seekf(fd, size,SEEK_BEG); while(1){ ch=getche(); if(ch == 1) break; if (ch == 13 || ch == 10 ){ printf("\n");ch='\n'; } if (i == 255){ i=0; ret = writef(fd,buff,256); if(ret == -1){ vd_puts("SORRY SORRY CANNOT WRITE TO FILE SO REMOVING IT\n"); errormessage(geterror()); unlinkf(file); fl_clean(); return 1; } } buff[i++] = (u8)ch; } ret = writef(fd,buff,i); if(ret == -1){ vd_puts("SORRY SORRY CANNOT WRITE TO FILE SO REMOVING IT\n"); errormessage(geterror()); unlinkf(file); fl_clean(); return 1; } puts(" "); closef(fd); fl_clean(); return 0; }
void garbage_collect (void) { char new_name [MAXLINE]; int i, new_scrend; int new_fd; LINEDESC *p; makscr (&new_fd, new_name, MAXLINE); remark ("collecting garbage"); new_scrend = 0; for (p = Limbo, i = 1; i <= Limcnt; p++, i++) { gtxt (p); seekf ((long) new_scrend * 8, new_fd); writef (Txt, (int) p->Lineleng, new_fd); p->Seekaddr = new_scrend; new_scrend += (p->Lineleng + 7) / 8; } for (p = Line0, i = 0; i <= Lastln; p++, i++) { gtxt (p); seekf ((long) new_scrend * 8, new_fd); writef (Txt, (int) p->Lineleng, new_fd); p->Seekaddr = new_scrend; new_scrend += (p->Lineleng + 7) / 8; } closef (Scr); unlink (Scrname); Scr = new_fd; memset (Scrname, '\0', MAXLINE); snprintf (Scrname, MAXLINE-1, "%s", new_name); Scrend = new_scrend; Lost_lines = 0; remark (""); }
int maklin (char lin[], int i, LINEDESC **newind) { char text [MAXLINE]; int l, n; LINEDESC *ptr; if (alloc (&ptr) == SE_NOMORE) /* get space for pointer block */ return (SE_ERR); for (n = i; lin [n] != SE_EOS; n++) /* find end of line */ if (lin [n] == '\n') { n++; break; } if (n - i >= MAXLINE ) /* can't handle more than MAXLINE chars/line */ n = i + MAXLINE - 1; l = n - i + 1; /* length of new line (including SE_EOS) */ move_ (&lin [i], text, l); /* move new line into text */ text [l - 1] = SE_EOS; /* add SE_EOS */ ptr->Seekaddr = Scrend; /* will be added to end of scratch file */ ptr->Lineleng = l; /* line length including SE_EOS */ ptr->Globmark = SE_NO; /* not marked for Global command */ ptr->Markname = DEFAULTNAME; /* give it default mark name */ seekf ((long) Scrend * 8, Scr); /* go to end of scratch file */ writef (text, l, Scr); /* write line on scratch file */ Scrend += (l + 7) / 8; /* update end-of-file pointer */ Buffer_changed = SE_YES; *newind = ptr; /* return index of new line */ return (n); /* return next char of interest in lin */ }
int play (dspdev_t * dsp, int fd, big_t * datamark, big_t bsize, double total_time, double constant, readfunc_t * readf, decoders_queue_t * dec, seekfunc_t * seekf) { #define EXITPLAY(code) \ do { \ ossplay_free (buf); \ ossplay_free (verbose_meta); \ clear_update (); \ ioctl (dsp->fd, SNDCTL_DSP_HALT_OUTPUT, NULL); \ errno = 0; \ return (code); \ } while (0) big_t rsize = bsize; big_t filesize = *datamark; ssize_t outl; unsigned char * buf, * obuf, contflag = 0; decoders_queue_t * d; verbose_values_t * verbose_meta = NULL; buf = (unsigned char *)ossplay_malloc (bsize); if (verbose) { verbose_meta = setup_verbose (dsp->format, format2bits(dsp->format) * dsp->channels * dsp->speed / 8.0, total_time); if (seek_time == 0) print_play_verbose_info (NULL, 0, verbose_meta); } *datamark = 0; while (*datamark < filesize) { if (eflag) EXITPLAY (eflag); rsize = bsize; if (rsize > filesize - *datamark) rsize = filesize - *datamark; if ((seek_time != 0) && (seekf != NULL)) { errors_t ret; ret = seekf (fd, datamark, filesize, constant, rsize, dsp->channels, dec->metadata); if (ret == E_OK) { if (verbose) { verbose_meta->secs = (double)seek_time; verbose_meta->next_sec = (double)seek_time; print_play_verbose_info (NULL, 0, verbose_meta); } seek_time = 0; continue; } else if (ret == SEEK_CONT_AFTER_DECODE) contflag = 1; else EXITPLAY (ret); } if ((outl = readf (fd, buf, rsize, dec->metadata)) <= 0) { if (errno) perror_msg ("read"); if ((filesize != BIG_SPECIAL) && (*datamark < filesize) && (!eflag)) { print_msg (NOTIFYM, "Sound data ended prematurely!\n"); } EXITPLAY (eflag); } *datamark += outl; if (contflag) { contflag = 0; continue; } obuf = buf; d = dec; do { outl = d->decoder (&(d->outbuf), obuf, outl, d->metadata); obuf = d->outbuf; d = d->next; } while (d != NULL); if (verbose) print_play_verbose_info (obuf, outl, verbose_meta); if (write (dsp->fd, obuf, outl) == -1) { if ((errno == EINTR) && (eflag)) EXITPLAY (eflag); ossplay_free (buf); perror_msg ("audio write"); exit (E_DECODE); } } ossplay_free (buf); ossplay_free (verbose_meta); clear_update (); return 0; }