File: scsort.c

package info (click to toggle)
csound 1%3A6.18.1%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 63,220 kB
  • sloc: ansic: 192,643; cpp: 14,149; javascript: 9,654; objc: 9,181; python: 3,376; java: 3,337; sh: 1,840; yacc: 1,255; xml: 985; perl: 635; lisp: 411; tcl: 341; lex: 217; makefile: 128
file content (87 lines) | stat: -rw-r--r-- 2,716 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
    scsort.c:

    Copyright (C) 1991 Barry Vercoe, John ffitch

    This file is part of Csound.

    The Csound Library is free software; you can redistribute it
    and/or modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    Csound is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with Csound; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
    02110-1301 USA
*/

#include "csoundCore.h"                                  /*   SCSORT.C  */
#include "corfile.h"
#include <ctype.h>

extern void sort(CSOUND*);
extern void twarp(CSOUND*);
extern void swritestr(CSOUND*, CORFIL *sco, int first);
extern void sfree(CSOUND *csound);
//extern void sread_init(CSOUND *csound);
extern int  sread(CSOUND *csound);

/* called from smain.c or some other main */
/* reads,sorts,timewarps each score sect in turn */

extern void sread_initstr(CSOUND *, CORFIL *sco);
char *scsortstr(CSOUND *csound, CORFIL *scin)
{
    int     n;
    int     first = 0;
    CORFIL *sco;

    csound->scoreout = NULL;
    if (csound->scstr == NULL && (csound->engineStatus & CS_STATE_COMP) == 0) {
      first = 1;
      sco = csound->scstr = corfile_create_w(csound);
    }
    else sco = corfile_create_w(csound);
    csound->sectcnt = 0;
    sread_initstr(csound, scin);

    while ((n = sread(csound)) > 0) {
      if (csound->frstbp->text[0] == 's') { // ignore empty segment
        // should this free memory?
        //printf("repeated 's'\n");
        continue;
      }
      sort(csound);
      twarp(csound);
      swritestr(csound, sco, first);
      //printf("sorted: >>>%s<<<\n", sco->body);
    }
    //printf("**** first = %d body = >>%s<<\n", first, sco->body);
    if (first) {
      int i = 0;
      while (isspace(sco->body[i])) i++;
      if (sco->body[i] == 'e' && sco->body[i+1] == '\n' && sco->body[i+2] != 'e') {
        corfile_rewind(sco);
        corfile_puts(csound, "f0 800000000000.0\ne\n", sco); /* ~25367 years */
      }
      else corfile_puts(csound, "e\n", sco);
      //printf("body >>%s<<\n", sco->body);
    }
    corfile_flush(csound, sco);
    sfree(csound);
    if (first) {
      return sco->body;
    }
    else {
      char *str = cs_strdup(csound,sco->body);
      corfile_rm(csound, &(sco));
      return str;
    }
}