columns0.c 119 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162
  1. /*
  2. * Copyright (c) 1983-2013 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. /* Manipulate or Generate columns of numbers */
  22. #include <columns.h>
  23. #include <srates.h>
  24. #include <string.h>
  25. #define STACK_WITH_OVERLAP 1111
  26. //#ifdef unix
  27. #define round(x) lround((x))
  28. //#endif
  29. void usage(void), logo(void);
  30. static void read_flags(char *,char *);
  31. static void do_string_params(char *argv[],int pcnt);
  32. static void read_data(char *startarg,char *endarg,int *ro);
  33. static void do_help(char *str);
  34. static int option_takes_NO_data_but_has_extra_params(char *agv);
  35. static int option_takes_data_and_has_extra_params(char *agv);
  36. static void check_exceptional_processes(int ro,int argc);
  37. static void handle_multifile_processes_and_the_output_file(int argc,char flag,int ro,char **argv);
  38. static void cant_read_numeric_value(char flag,int ro);
  39. static void cant_read_numeric_value_with_flag_only(char flag);
  40. static void unknown_flag_only(char flag);
  41. static void unknown_flag(char flag,int ro);
  42. static void cannot_read_flags(char *flagstr);
  43. static void flag_takes_no_params(char flag,int ro);
  44. static void flag_only_takes_no_params(char flag);
  45. static void unknown_flag_or_bad_param(void);
  46. static void no_value_with_flag(char flag,int ro);
  47. static void no_value_with_flag_only(char flag);
  48. static void no_value_required_with_flag(char flag,int i_ro);
  49. static void no_value_required_with_flag_only(char flag);
  50. static void read_flags_data_error(char *str);
  51. static void unknown_flag_string(char *flagstr);
  52. static void check_for_columnextract(char *argv1,int *argc,char *argv[]);
  53. static int valid_call_for_multicol_input(char flag,int ro);
  54. static int noro(int i_ro);
  55. static void output_multicol_data(void);
  56. int cnt = 0, firstcnt, arraysize = BIGARRAY, infilecnt, outfilecnt, colcnt, thecol, allcols = 1;
  57. double *number, *permm, *permmm, factor, scatter, *pos, *outcoldata;
  58. int outcoldatacnt = 0;
  59. FILE **fp;
  60. char temp[20000], flag, *filename, *thisfilename, string[200];
  61. int ro = 0, ifactor = 0, len, condit = 0;
  62. double thresh;
  63. int *file_cnt;
  64. int sloom = 0;
  65. int sloombatch = 0;
  66. char errstr[400];
  67. char srcfile[2000],goalfile[2000];
  68. #define TOO_BIG_ARRAY (100000)
  69. void reorganise_extra_params(char *agv,int argc,char *argv[]);
  70. const char* cdp_version = "7.1.0";
  71. int main(int argc,char *argv[])
  72. {
  73. int extra_params = 0, k = 0, *perm = (int *)0;
  74. char *agv = (char *)0;
  75. char *p;
  76. goalfile[0] = ENDOFSTR;
  77. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  78. fprintf(stdout,"%s\n",cdp_version);
  79. fflush(stdout);
  80. return 0;
  81. }
  82. if(argc < 2)
  83. usage();
  84. if(!strcmp(argv[1],"#")) {
  85. sloom = 1;
  86. argv++;
  87. argc--;
  88. } else if (!strcmp(argv[1],"##")) {
  89. p = argv[0];
  90. argc--;
  91. argv++;
  92. argv[0] = p;
  93. sloombatch = 1;
  94. }
  95. initrand48();
  96. number = (double *)exmalloc(arraysize * sizeof(double));
  97. fp = (FILE **)exmalloc(2 * sizeof(FILE *));
  98. fp[1] = stderr;
  99. if(!sloom && !sloombatch) {
  100. if(argc==2)
  101. do_help(argv[1]);
  102. }
  103. if(argc<3)
  104. usage();
  105. check_for_columnextract(argv[1],&argc,argv);
  106. check_for_conditional(&argc,argv);
  107. agv = argv[argc-1];
  108. if(!sloom) {
  109. if(allcols > 1)
  110. read_data("__temp.txt",argv[argc-1],&ro);
  111. else
  112. read_data(argv[1],argv[argc-1],&ro);
  113. read_flags(agv,argv[2]);
  114. } else {
  115. if(option_takes_NO_data_but_has_extra_params(agv))
  116. extra_params = 1;
  117. else {
  118. if(allcols > 1)
  119. read_data("__temp.txt",argv[argc-1],&ro);
  120. else
  121. read_data(argv[1],argv[argc-1],&ro);
  122. }
  123. if(option_takes_data_and_has_extra_params(agv)) {
  124. extra_params = 1;
  125. read_flags(agv,argv[2]);
  126. }
  127. if(!extra_params)
  128. read_flags(agv,argv[2]);
  129. }
  130. check_exceptional_processes(ro,argc);
  131. if(!sloom) {
  132. if(argc>=4)
  133. handle_multifile_processes_and_the_output_file(argc,flag,ro,argv);
  134. if((number=(double *)exrealloc((char *)number,(cnt+1)*sizeof(double)))==NULL) {
  135. fprintf(stdout, "ERROR: Out of memory\n");
  136. fflush(stdout);
  137. exit(1); /* EXTRA ONE IS TEMPORARY FOR QIKSORT INDEXING PROBLEM !! */
  138. }
  139. } else {
  140. if(argc>=4 && !extra_params)
  141. handle_multifile_processes_and_the_output_file(argc,flag,ro,argv);
  142. else if(flag =='K' && ro == 'b') {
  143. handle_multifile_processes_and_the_output_file(argc,flag,ro,argv);
  144. }
  145. if(extra_params)
  146. reorganise_extra_params(agv,argc,argv);
  147. else if((number=(double *)exrealloc((char *)number,(cnt+1)*sizeof(double)))==NULL) {
  148. fprintf(stdout, "ERROR: Out of memory\n");
  149. fflush(stdout);
  150. exit(1); /* EXTRA ONE IS TEMPORARY FOR QIKSORT INDEXING PROBLEM !! */
  151. }
  152. }
  153. switch(flag) {
  154. case('A'):
  155. switch(ro) {
  156. case('d'): accel_durations(); break; /* Ad */
  157. case('e'): abutt(); break; /* Ae */
  158. case('s'): alphabetic_sort(); break; /* As */
  159. case('t'): accel_time_seq(); break; /* At */
  160. default: approx_vals(); break; /* A */
  161. }
  162. break;
  163. case('a'):
  164. switch(ro) {
  165. case(0): add(); break; /* a */
  166. case('o'): ascending_order(); break; /* ao */
  167. case('T'): append_text(0); break; /* aT */
  168. case('X'): append_text(1); break; /* aX */
  169. }
  170. break;
  171. case('B'): plain_bob(); break; /* B */
  172. case('b'):
  173. switch(ro) {
  174. case('b'): band_cut(); break; /* bb */
  175. case('g'): reduce_to_bound(); print_numbers(); break; /* bg */
  176. case('l'): increase_to_bound(); print_numbers(); break; /* bl */
  177. }
  178. break;
  179. case('C'):
  180. switch(ro) {
  181. case(ENDOFSTR): concatenate_files(argv[1]); break; /* C */
  182. case('c'): concatenate_files_cyclically(argv[1]); break; /* Cc */
  183. case('a'): cyclic_select('a'); break; /* Ca */
  184. case('m'): cyclic_select('m'); break; /* Cm */
  185. }
  186. break;
  187. case('c'):
  188. switch(ro) {
  189. case(ENDOFSTR): count_items(argv[1]); break; /* c */
  190. case('c'): columnate(); break; /* cc */
  191. case('l'): count_items(argv[1]); break; /* cl */
  192. case('s'): cosin_spline(); break; /* cs */
  193. case('t'): cut_table_at_time(); break; /* ct */
  194. }
  195. break;
  196. case('D'):
  197. switch(ro) {
  198. case('B'): db_to_level(0); break; /* DB */
  199. case('s'): db_to_level(1); break; /* Ds */
  200. }
  201. break;
  202. case('d'):
  203. switch(ro) {
  204. case(ENDOFSTR): divide_list(); break; /* d */
  205. case('b'): level_to_db(0); break; /* db */
  206. case('d'): duplicate_values_stepped(); break; /* dd */
  207. case('g'): distance_from_grid(); break; /* dg */
  208. case('h'): delay_to_pitch(0); break; /* dh */
  209. case('i'): delete_small_intervals(); break; /* di */
  210. case('l'): duplicate_list(); break; /* dl */
  211. case('L'): duplicate_list_at_step(); break; /* dL */
  212. case('M'): delay_to_pitch(1); break; /* dM */
  213. case('o'): duplicate_octaves(); break; /* do */
  214. case('O'): duplicate_octfrq(); break; /* dO */
  215. case('v'): duplicate_values(); break; /* dv */
  216. }
  217. break;
  218. case('E'): vals_end_to_end_in_2_cols(); break; /* E */
  219. case('e'):
  220. switch(ro) {
  221. case(ENDOFSTR): eliminate_equivalents(); print_numbers(); break; /* e */
  222. case('a'): env_append(); break; /* ea */
  223. case('b'): eliminate_dupltext(); break; /* eb */
  224. case('d'): eliminate_duplicates(); print_numbers(); break; /* ed */
  225. case('e'): eliminate_even_items(); print_numbers(); break; /* ee */
  226. case('f'): expand_table_dur_by_factor(); break; /* ef */
  227. case('g'): eliminate_greater_than(); print_numbers(); break; /* eg */
  228. case('i'): env_superimpos(INVERT,MULT); break; /* ei */
  229. case('l'): eliminate_less_than(); print_numbers(); break; /* el */
  230. case('L'): list_warp(); break; /* eL */
  231. case('m'): env_superimpos(0,ENVMAX); break; /* em */
  232. case('Q'): seqtime_warp(); break; /* eQ */
  233. case('s'): env_superimpos(0,MULT); break; /* es */
  234. case('t'): expand_table_to_dur(); break; /* et */
  235. case('v'): expand_table_vals_by_factor(); break; /* ev */
  236. case('w'): time_warp(); break; /* ew */
  237. case('W'): brktime_warp(); break; /* eW */
  238. case('x'): extend_table_to_dur(); break; /* ex */
  239. case('X'): brkval_warp(); break; /* eX */
  240. case('Y'): brktime_owarp(); break; /* eY */
  241. case('A'): env_superimpos(0,ADD); break; /* eA */
  242. case('D'): env_del_inv(); break; /* eD */
  243. case('P'): env_plateau(); break; /* eP */
  244. case('S'): env_superimpos(0,SUBTRACT); break; /* eS */
  245. }
  246. break;
  247. case('F'):
  248. switch(ro) {
  249. case(ENDOFSTR): format_vals(); break; /* F */ /* RWD */
  250. case('r'): column_format_vals(); break; /* Fr */
  251. case('f'): format_strs(); break; /* Ff */
  252. case('R'): column_format_strs(); break; /* FR */
  253. }
  254. break;
  255. case('f'):
  256. switch(ro) {
  257. case('r'): remove_frq_pitchclass_duplicates(); break; /* fr */
  258. case('l'): floor_vals(); break; /* fl */
  259. case('t'): pitchtotext(0); break; /* ft */
  260. }
  261. break;
  262. case('G'): group(); break; /* G */
  263. case('g'):
  264. switch(ro) {
  265. case(ENDOFSTR): greatest(); break; /* g */
  266. case('s'): multiply(1); break; /* gs */
  267. case('a'): cumuladd(); break; /* ga */
  268. }
  269. break;
  270. case('H'):
  271. switch(ro) {
  272. case(ENDOFSTR): generate_harmonics(); break; /* H */
  273. case('g'): group_harmonics(); break; /* Hg */
  274. case('r'): get_harmonic_roots(); break; /* Hr */
  275. }
  276. break;
  277. case('h'):
  278. switch(ro) {
  279. case('d'): pitch_to_delay(0); break; /* hd */
  280. case('M'): hz_to_midi(); break; /* hM */
  281. }
  282. break;
  283. case('I'):
  284. switch(ro) {
  285. case(ENDOFSTR): print_numbers(); break; /* I */
  286. case('r'): interval_to_ratio(1,0); break; /* Ir */
  287. case('v'): invert_normd_env(); break; /* Iv */
  288. case('V'): interp_n_vals(); break; /* IV */
  289. }
  290. break;
  291. case('i'):
  292. switch(ro) {
  293. case(ENDOFSTR): get_intervals(); break; /* i */
  294. case('r'): repeat_intervals(); break; /* ir */
  295. case('='): make_equal_intevals_btwn_given_vals(); break; /* i= */
  296. case('e'): create_equal_vals(); break; /* ie */
  297. case('c'): create_intervals(); break; /* ic */
  298. case('C'): create_intervals_from_base(); break; /* iC */
  299. case('R'): create_ratios_from_base(); break; /* iR */
  300. case('p'): insert_intermediate_valp(); break; /* ip */
  301. case('Q'): create_equal_steps(); break; /* iQ */
  302. case('a'): change_value_of_intervals(); break; /* ia */
  303. case('m'): change_value_of_intervals(); break; /* im */
  304. case('v'): get_intermediate_values(); break; /* iv */
  305. case('V'): insert_intermediate_values(); break; /* iV */
  306. case('M'): motivically_invert_midi(); break; /* iM */
  307. case('h'): motivically_invert_hz(); break; /* ih */
  308. case('l'): /* il */
  309. case('L'): interval_limit(); break; /* iL */
  310. }
  311. break;
  312. case('J'):
  313. switch(ro) {
  314. case(0): join_many_files_as_columns(argv[1],0); break; /* J */
  315. case('j'): join_many_files_as_columns(argv[1],1); break; /* Jj */
  316. }
  317. break;
  318. case('j'):
  319. switch(ro) {
  320. case(0): join_files_as_rows(); break; /* j */
  321. case('j'): join_many_files_as_rows(); break; /* jj */
  322. }
  323. break;
  324. case('k'):
  325. switch(ro) {
  326. case('A'): kill_path(); break; /* kA */
  327. case('B'): kill_extension(); break; /* kB */
  328. case('C'): kill_path_and_extension(); break; /* kC */
  329. case('T'): kill_text(0); break; /* kT */
  330. case('X'): kill_text(1); break; /* kX */
  331. case('Y'): kill_text(2); break; /* kY */
  332. }
  333. break;
  334. case('K'):
  335. switch(ro) {
  336. case('a'): ta_reverse_sequence(1); break; /* Ka */
  337. case('A'): a_reverse_sequence(1); break; /* KA */
  338. case('b'): abut_sequences(1); break; /* Kb */
  339. case('c'): compress_sequence(1); break; /* Kc */
  340. case('E'): p_expandset_sequence(1); break; /* KE */
  341. case('I'): p_invertset_sequence(1); break; /* KI */
  342. case('i'): p_invert_sequence(1); break; /* Ki */
  343. case('l'): loop_sequence(1); break; /* Kl */
  344. case('m'): uptempo_sequence(1); break; /* Km */
  345. case('M'): accel_sequence(1); break; /* KM */
  346. case('P'): p_reverse_sequence(1); break; /* KP */
  347. case('r'): t_reverse_sequence(1); break; /* Kr */
  348. case('R'): pa_reverse_sequence(1); break; /* KR */
  349. case('t'): transpose_sequence(1); break; /* Kt */
  350. case('T'): tp_reverse_sequence(1); break; /* KT */
  351. case('Z'): tpa_reverse_sequence(1); break; /* KZ */
  352. }
  353. break;
  354. case('L'): log_equal_divisions(); break; /* L */
  355. case('l'):
  356. switch(ro) {
  357. case(ENDOFSTR): least(); break; /* l */
  358. case('i'): limit_vals(); break; /* li */
  359. case('v'): limit_table_val_range(); break; /* lv */
  360. }
  361. break;
  362. case('M'):
  363. switch(ro) {
  364. case(ENDOFSTR): find_mean(); break; /* M */
  365. case('d'): pitch_to_delay(1); break; /* Md */
  366. case('h'): midi_to_hz(); break; /* Mh */
  367. case('m'): major_to_minor(); break; /* Mm */
  368. case('r'): remove_midi_pitchclass_duplicates(); break; /* Mr */
  369. case('t'): pitchtotext(1); break; /* Mt */
  370. }
  371. break;
  372. case('m'):
  373. switch(ro) {
  374. case(0): multiply(0); break; /* m */
  375. case('g'): mark_greater_than(); break; /* mg */
  376. case('l'): mark_less_than(); break; /* ml */
  377. case('m'): mark_multiples(); break; /* mm */
  378. case('M'): minor_to_major(); break; /* mM */
  379. case('e'): mark_event_groups(); break; /* me */
  380. case('i'): min_interval(0); break; /* mi */
  381. case('I'): min_interval(1); break; /* mI */
  382. }
  383. break;
  384. case('N'):
  385. switch(ro) {
  386. case('r'): rotate_partition_values_to_files(); break; /* Nr */
  387. default: partition_values_to_files(); break; /* N */
  388. }
  389. break;
  390. case('n'):
  391. switch(ro) {
  392. case('F'): note_to_midi(2); break; /* nF */
  393. case('M'): note_to_midi(0); break; /* nM */
  394. case('T'): note_to_midi(1); break; /* nT */
  395. }
  396. break;
  397. case('O'):
  398. switch(ro) {
  399. case('s'): multiply(0); break; /* Os */
  400. case('T'): interval_to_ratio(0,1); break; /* OT */
  401. }
  402. break;
  403. case('o'):
  404. switch(ro) {
  405. case(ENDOFSTR): qiksort(); print_numbers(); break; /* o */
  406. case('r'): interval_to_ratio(0,0); break; /* or */
  407. }
  408. break;
  409. case('p'):
  410. switch(ro) {
  411. case(ENDOFSTR): product(); break; /* p */
  412. case('p'): tw_psuedopan(); break; /* pp */
  413. }
  414. break;
  415. case('P'): take_power(); break; /* P */
  416. case('Q'): quadratic_curve_steps(); break; /* Q */
  417. case('q'):
  418. switch(ro) {
  419. case(ENDOFSTR): quantise(); break; /* q */
  420. case('t'): quantise_time(); break; /* qt */
  421. case('v'): quantise_val(); break; /* qv */
  422. case('z'): rand_zigs(); break; /* qz */
  423. }
  424. break;
  425. case('R'):
  426. switch(ro) {
  427. case(ENDOFSTR): reciprocals(0); break; /* R */
  428. case('o'):
  429. case('x'):
  430. if((perm=(int *)malloc(stringscnt * sizeof(int)))==NULL) {
  431. fprintf(stdout, "ERROR: Out of memory\n");
  432. fflush(stdout);
  433. exit(1);
  434. }
  435. for(k=0;k<stringscnt;k++)
  436. perm[k] = k;
  437. if(ro=='o')
  438. randomise_order(perm); /* Ro */
  439. else
  440. randomise_Ntimes(perm);
  441. break; /* Rx */
  442. case('a'): add_randval_plus_or_minus(); break; /* Ra */
  443. case('A'): add_randval(); break; /* RA */
  444. case('c'): randchunks(); break; /* Rc */
  445. case('e'): random_elimination(); break; /* Re */
  446. case('g'): random_0s_and_1s(); break; /* Rg */
  447. case('G'): random_0s_and_1s_restrained(); break; /* RG */
  448. case('i'): random_integers(); break; /* Ri */
  449. case('I'): random_integers_evenly_spread(); break; /* RI */
  450. case('m'): multiply_by_randval(); break; /* Rm */
  451. case('r'): generate_randomised_vals(); break; /* Rr */
  452. case('s'): random_scatter(); break; /* Rs */
  453. case('v'): generate_random_values(); break; /* Rv */
  454. }
  455. break;
  456. case('r'):
  457. switch(ro) {
  458. case(ENDOFSTR): reverse_order_of_brkvals(); break; /* r */
  459. case('a'): ratios(); break; /* ra */
  460. case('I'): ratio_to_interval(1,0); break; /* rI */
  461. case('o'): ratio_to_interval(0,0); break; /* ro */
  462. case('r'): reverse_list(); break; /* rr */
  463. case('G'): random_pairs(); break; /* rG */
  464. case('J'): random_pairs_restrained(); break; /* rJ */
  465. case('R'): rotate_list(0); break; /* rR */
  466. case('X'): rotate_list(1); break; /* rX */
  467. case('m'): rotate_motif(); break; /* rm */
  468. case('p'): mean_of_reversed_pairs(); break; /* rp */
  469. case('T'): condit = 0; reciprocals(1); break; /* rT */
  470. case('z'): rand_ints_with_fixed_ends(); break; /* rz */
  471. }
  472. break;
  473. case('S'):
  474. switch(ro) {
  475. case(ENDOFSTR): separate_columns_to_files(); break; /* S */
  476. case('M'): splice_pos(); break; /* SM */
  477. }
  478. break;
  479. case('s'):
  480. switch(ro) {
  481. case(ENDOFSTR): stack(1); break; /* s */
  482. case('a'): scale_above(); break; /* sa */
  483. case('b'): scale_below(); break; /* sb */
  484. case('c'): sinjoin('c'); break; /* sc */
  485. case('d'): sum_absolute_differences(); break; /* sd */
  486. case('D'): level_to_db(1); break; /* sD */
  487. case('E'): convert_to_edits(); break; /* sE */
  488. case('f'): scale_from(); break; /* sf */
  489. case('g'): multiply(0); break; /* sg */
  490. case('k'): get_one_skip_n(); break; /* sk */
  491. case('K'): get_n_skip_one(); break; /* sK */
  492. case('l'): do_slope(); break; /* sl */
  493. case('n'): sum_nwise(); break; /* sn */
  494. case('o'): sum_minus_overlaps(); break; /* so */
  495. case('u'): substitute(); break; /* su */
  496. case('U'): substitute_all(); break; /* sU */
  497. case('O'): multiply(0); break; /* sO */
  498. case('p'): spanpair(); break; /* sp */
  499. case('s'): sinusoid(); break; /* ss */
  500. case('t'): samp_to_time(); break; /* st */
  501. case('v'): sinjoin('v'); break; /* sv */
  502. case('x'): sinjoin('x'); break; /* sx */
  503. case('A'): span_all(); break; /* sA */
  504. case('F'): span_fall(); break; /* sF */
  505. case('X'): span_xall(); break; /* sX */
  506. case('P'): span(); break; /* sP */
  507. case('R'): span_rise(); break; /* sR */
  508. case('T'): interval_to_ratio(1,1); break; /* sT */
  509. case('z'): stack(0); break; /* sz */
  510. }
  511. break;
  512. case('T'):
  513. switch(ro) {
  514. case('B'): time_from_bar_beat_metre_tempo(1); break; /* TB */
  515. case('b'): time_from_bar_beat_metre_tempo(0); break; /* Tb */
  516. case('c'): time_from_crotchet_count(); break; /* Tc */
  517. case('h'): temper_hz_data(); break; /* Th */
  518. case('l'): time_from_beat_lengths(); break; /* Tl */
  519. case('M'): temper_midi_data(); break; /* TM */
  520. case('O'): ratio_to_interval(0,1); break; /* TO */
  521. case('p'): time_from_beat_position(0); break; /* Tp */
  522. case('P'): time_from_beat_position(1); break; /* TP */
  523. case('r'): condit = 0; reciprocals(1); break; /* Tr */
  524. case('s'): ratio_to_interval(1,1); break; /* Ts */
  525. }
  526. break;
  527. case('t'):
  528. switch(ro) {
  529. case(ENDOFSTR): total(); break; /* t */
  530. case('B'): time_to_crotchets(1); break; /* tB */
  531. case('c'): thresh_cut(); break; /* tc */
  532. case('C'): time_to_crotchets(0); break; /* tC */
  533. case('d'): time_density(); break; /* td */
  534. case('e'): mean_tempo(); break; /* te */
  535. case('h'): text_to_hz(); break; /* th */
  536. case('M'): print_numbers(); break; /* tM */
  537. case('r'): reverse_time_intervals(); break; /* tr */
  538. case('R'): reverse_time_intervals2(); break; /* tR */
  539. case('s'): time_to_samp(); break; /* ts */
  540. }
  541. break;
  542. case('v'): rank_vals(); break; /* v */
  543. case('V'): rank_frqs(); break; /* V */
  544. case('w'):
  545. switch(ro) {
  546. case('o'): warped_times(1); break; /* wo */
  547. case('t'): warped_times(0); break; /* wt */
  548. }
  549. break;
  550. case('W'):
  551. switch(ro) {
  552. case('a'): ta_reverse_sequence(0); break; /* Wa */
  553. case('A'): a_reverse_sequence(0); break; /* WA */
  554. case('b'): abut_sequences(0); break; /* Wb */
  555. case('c'): compress_sequence(0); break; /* Wc */
  556. case('E'): p_expandset_sequence(0); break; /* WE */
  557. case('I'): p_invertset_sequence(0); break; /* WI */
  558. case('i'): p_invert_sequence(0); break; /* Wi */
  559. case('l'): loop_sequence(0); break; /* Wl */
  560. case('m'): uptempo_sequence(0); break; /* Wm */
  561. case('M'): accel_sequence(0); break; /* WM */
  562. case('P'): p_reverse_sequence(0); break; /* WP */
  563. case('r'): t_reverse_sequence(0); break; /* Wr */
  564. case('R'): pa_reverse_sequence(0); break; /* WR */
  565. case('t'): transpose_sequence(0); break; /* Wt */
  566. case('T'): tp_reverse_sequence(0); break; /* WT */
  567. case('Z'): tpa_reverse_sequence(0); break; /* WZ */
  568. }
  569. break;
  570. case('y'):
  571. switch(ro) {
  572. case('a'): replace_with_rand(0); break; /* ya */
  573. case('A'): insert_after_val(); break; /* yA */
  574. case('b'): replace_with_rand(-1); break; /* yb */
  575. case('B'): insert_at_start(); break; /* yB */
  576. case('c'): replace_with_rand(1); break; /* yc */
  577. case('C'): cyclic_select('s'); break; /* yC */
  578. case('d'): delete_vals(); break; /* yd */
  579. case('e'): replace_equal(); break; /* ye */
  580. case('E'): insert_at_end(); break; /* yE */
  581. case('g'): replace_greater(); break; /* yg */
  582. case('i'): insert_val(); break; /* yi */
  583. case('I'): invert_over_range(); break; /* yI */
  584. case('l'): replace_less(); break; /* yl */
  585. case('o'): insert_in_order(); break; /* yo */
  586. case('p'): invert_around_pivot(); break; /* yp */
  587. case('P'): targeted_pan(); break; /* yP */
  588. case('q'): randquanta_in_gaps(); break; /* yq */
  589. case('Q'): do_squeezed_pan(); break; /* yQ */
  590. case('r'): replace_val(); break; /* yr */
  591. case('R'): randdel_not_adjacent(); break; /* yR */
  592. case('s'): grid(1); break; /* ys */
  593. case('S'): grid(0); break; /* yS */
  594. case('x'): targeted_stretch(); break; /* yx */
  595. }
  596. break;
  597. case('Y'):
  598. switch(ro) {
  599. case('s'): convert_space_pan_to_tex(); break; /* Ys */
  600. case('S'): convert_space_tex_to_pan(); break; /* YS */
  601. }
  602. break;
  603. case('z'):
  604. switch(ro) {
  605. case('q'):
  606. if(number[2] > 1.0) {
  607. if(number[0] < .001) {
  608. fprintf(stdout, "ERROR: Quantisation too small for scatter > 1.0\n");
  609. fflush(stdout);
  610. exit(1);
  611. }
  612. k = (int)floor(number[1]/number[0]) + 1;
  613. k = (int)ceil(k/(cnt-1));
  614. k *= round(number[2]);
  615. if(k > TOO_BIG_ARRAY) {
  616. fprintf(stdout, "ERROR: Combination of scatter > 1 with small quantisation: requires too much memory\n");
  617. fflush(stdout);
  618. exit(1);
  619. }
  620. if((perm=(int *)malloc(k * sizeof(int)))==NULL) {
  621. fprintf(stdout, "ERROR: Out of memory\n");
  622. fflush(stdout);
  623. exit(1);
  624. }
  625. }
  626. quantised_scatter(perm,k); break; /* za */
  627. case('X'): alt0101(); break; /* zX */
  628. case('Y'): alt0011(); break; /* zY */
  629. case('Z'): alt01100(); break; /* zZ */
  630. case('A'): alt0r0r(); break; /* zA */
  631. case('B'): altr0r0(); break; /* zB */
  632. case('C'): alt00rr(); break; /* zC */
  633. case('D'): altrr00(); break; /* zD */
  634. case('e'): tw_pseudo_exp(); break; /* ze */
  635. case('E'): alt0rr00r(); break; /* zE */
  636. case('F'): altr00rr0(); break; /* zF */
  637. case('G'): alt00RR(); break; /* zG */
  638. case('H'): altrr00(); break; /* zH */
  639. case('I'): alt0RR00R(); break; /* zI */
  640. case('J'): altR00RR0(); break; /* zJ */
  641. }
  642. break;
  643. case('Z'):
  644. switch(ro) {
  645. case('h'): just_intonation_Hz(); break; /* Zh */
  646. case('M'): just_intonation_midi(); break; /* ZM */
  647. case('H'): create_just_intonation_Hz(); break; /* ZH */
  648. case('m'): create_just_intonation_midi(); break; /* Zm */
  649. case('s'): random_warp(); break; /* Zs */
  650. }
  651. break;
  652. }
  653. if(allcols > 1)
  654. output_multicol_data();
  655. return 0;
  656. }
  657. /****************************** USAGE ****************************/
  658. void usage(void)
  659. {
  660. if(!sloom) {
  661. logo();
  662. fprintf(stderr,
  663. "USAGE: columns infile [outfile] -flag[@] [{threshold|}threshold] [--cCOLCNT]\n\n");
  664. fprintf(stderr, " { = less than: } = greater than THRESHOLD is numeric value.\n");
  665. fprintf(stderr, " threshold can only be used with R,a,m,d,P,c.\n");
  666. fprintf(stderr, " and specified operation then applies ONLY to vals > OR < threshold value.\n\n");
  667. fprintf(stderr, " If multicolumn data is being processed\n");
  668. fprintf(stderr, " COLCNT is the column of the input data to which process is applied.\n");
  669. fprintf(stderr, " Not all processes work with multicolumn data.\n");
  670. fprintf(stderr, "FOR MORE INFORMATION:\n");
  671. fprintf(stderr, " columns -f to see all available flags.\n");
  672. fprintf(stderr, " columns -g for generative operations.\n");
  673. fprintf(stderr, " columns -l for list manipulation and editing.\n");
  674. fprintf(stderr, " columns -m for mathematical operations.\n");
  675. fprintf(stderr, " columns -M for musical operations.\n");
  676. fprintf(stderr, " columns -R for random operations.\n");
  677. fprintf(stderr, "ALSO\n");
  678. fprintf(stderr, "columns inoutfile1 infile2 [infile3....] -J to juxtapose cols in one file\n");
  679. fprintf(stderr, "columns infile1 outfiles -SX to separate cols to X distinct files.\n");
  680. fprintf(stderr, "columns infile1 outfiles -NX to separate vals to X distinct files, in blocks.\n");
  681. fprintf(stderr, "columns infile1 outfiles -NrX to separate vals to X distinct files, in rotation\n");
  682. }
  683. exit(1);
  684. }
  685. /********************************** READ_FLAGS *************************/
  686. void read_flags(char *argv,char *argv2)
  687. {
  688. char *p, *q;
  689. double qtone = 0.0;
  690. int maxpos;
  691. if(*argv++!='-')
  692. cannot_read_flags(argv-1);
  693. if(sscanf(argv++,"%c",&flag)!=1)
  694. cannot_read_flags(argv-2);
  695. if(allcols > 1) {
  696. ro = *argv;
  697. if(!valid_call_for_multicol_input(flag,ro)) {
  698. fprintf(stdout,"ERROR: Operation invalid with multicolumn input.\n");
  699. fflush(stdout);
  700. exit(1);
  701. }
  702. }
  703. switch(flag) {
  704. case('A'):
  705. ro = *argv++;
  706. switch(ro) {
  707. case('b'): /* Ab */
  708. case('e'): /* Ae */
  709. case('s'): /* As */
  710. if(strlen(argv))
  711. no_value_required_with_flag(flag,ro);
  712. break;
  713. case('d'): /* Ad */
  714. case('t'): /* At */
  715. if(sscanf(argv,"%lf",&factor)!=1)
  716. cant_read_numeric_value(flag,ro);
  717. break;
  718. default:
  719. if(sscanf(--argv,"%lf",&factor)!=1) /* A */
  720. unknown_flag(flag,ro);
  721. }
  722. break;
  723. case('a'): /* a */
  724. ro = *argv++;
  725. switch(ro) {
  726. case('o'): /* ao */
  727. break;
  728. case('T'): /* aT */
  729. case('X'): /* aX */
  730. if(sscanf(argv,"%s",temp)!=1) {
  731. fprintf(stdout,"ERROR: Cannot read string text parameter.\n");
  732. fflush(stdout);
  733. exit(1);
  734. }
  735. break;
  736. default: /* a */
  737. if(sscanf(--argv,"%lf",&factor)!=1) {
  738. cant_read_numeric_value_with_flag_only(flag);
  739. }
  740. ro = 0;
  741. ifactor = round(factor);
  742. break;
  743. }
  744. break;
  745. case('B'): /* B */
  746. if((cnt & 1))
  747. read_flags_data_error("Must have even number of 'bells' for bell-ringing, at present.");
  748. if(cnt > 32)
  749. read_flags_data_error("Too many bells (max 32, at present).");
  750. if(*argv!=ENDOFSTR)
  751. flag_only_takes_no_params(flag);
  752. break;
  753. case('b'):
  754. ro = (int)*argv++;
  755. switch(ro) {
  756. case('b'): /* bb */
  757. break;
  758. case('g'): /* bg */
  759. case('l'): /* bl */
  760. if(sscanf(argv,"%lf",&factor)!=1)
  761. cant_read_numeric_value(flag,ro);
  762. break;
  763. default:
  764. unknown_flag_string(argv-2);
  765. }
  766. break;
  767. case('C'): /* C */
  768. ro =*argv++;
  769. switch(ro) {
  770. case(ENDOFSTR): case('a'): case('m'): case('c'):
  771. break;
  772. }
  773. break;
  774. case('c'):
  775. ro = *argv++;
  776. switch(ro) {
  777. case(ENDOFSTR):
  778. break; /* c */
  779. case('l'): /* cl */
  780. case('c'): /* cc */
  781. if(*argv!=ENDOFSTR)
  782. flag_takes_no_params(flag,ro);
  783. break;
  784. case('s'): /* cs */
  785. case('t'): /* ct */
  786. if(sscanf(argv,"%lf",&factor)!=1)
  787. no_value_with_flag(flag,ro);
  788. break;
  789. default:
  790. if(isdigit(ro) || ro=='.' || ro=='-') {
  791. --argv;
  792. if(sscanf(argv,"%lf",&thresh)!=1)
  793. cant_read_numeric_value(flag,ro);
  794. else {
  795. ro = 0;
  796. condit = '>';
  797. }
  798. break;
  799. }
  800. unknown_flag(flag,ro);
  801. }
  802. break;
  803. case('D'):
  804. ro = (int)*argv++;
  805. switch(ro) {
  806. case('B'): /* DB */
  807. case('s'): /* Ds */
  808. break;
  809. default:
  810. unknown_flag(flag,ro);
  811. }
  812. break;
  813. case('d'):
  814. ro = (int)*argv++;
  815. switch(ro) {
  816. case('v'): /* dv */
  817. case('l'): /* dl */
  818. case('o'): /* do */
  819. case('O'): /* dO */
  820. if(sscanf(argv,"%d",&ifactor)!=1)
  821. cant_read_numeric_value(flag,ro);
  822. break;
  823. case('i'): /* di */
  824. if(sscanf(argv,"%lf",&factor)!=1)
  825. cant_read_numeric_value(flag,ro);
  826. break;
  827. case('b'): /* db */
  828. case('d'): /* dd */
  829. case('g'): /* dg */
  830. case('h'): /* dh */
  831. case('L'): /* dL */
  832. case('M'): /* dM */
  833. break;
  834. default:
  835. if(isalpha(ro))
  836. unknown_flag(flag,ro);
  837. else {
  838. if(sscanf(argv-1,"%lf",&factor)!=1)
  839. cant_read_numeric_value_with_flag_only(flag);
  840. ro = ENDOFSTR; /* d */
  841. }
  842. break;
  843. }
  844. break;
  845. case('E'): /* E */
  846. if(sscanf(argv,"%lf",&factor)!=1)
  847. factor = 0.0;
  848. break;
  849. case('e'):
  850. ro = (int)*argv;
  851. if(ro==ENDOFSTR)
  852. no_value_with_flag_only(flag);
  853. if(isdigit(ro) || ro=='.' || ro=='-') {
  854. if(sscanf(argv,"%lf",&factor)!=1)
  855. cant_read_numeric_value_with_flag_only(flag);
  856. ro = ENDOFSTR; /* e */
  857. break;
  858. }
  859. argv++;
  860. switch(ro) {
  861. case('e'): /* ee */
  862. case('b'): /* eb */
  863. case('Q'): /* eQ */
  864. case('L'): /* eL */
  865. case('w'): /* ew */
  866. case('W'): /* eW */
  867. case('X'): /* eX */
  868. case('Y'): /* eY */
  869. if(*argv!=ENDOFSTR)
  870. read_flags_data_error("No parameter required with this option.");
  871. break;
  872. case('a'): /* ea */
  873. case('d'): /* ed */
  874. case('g'): /* eg */
  875. case('l'): /* el */
  876. case('f'): /* ef */
  877. case('t'): /* et */
  878. case('x'): /* ex */
  879. case('v'): /* ev */
  880. if(sscanf(argv,"%lf",&factor)!=1)
  881. cant_read_numeric_value(flag,ro);
  882. break;
  883. case('i'): /* ei */
  884. case('m'): /* em */
  885. case('s'): /* es */
  886. case('A'): /* eA */
  887. case('S'): /* eS */
  888. if(*argv == ENDOFSTR)
  889. factor = 0.0;
  890. else {
  891. if(sscanf(argv,"%lf",&factor)!=1) {
  892. fprintf(stdout,"ERROR: Cannot read numerical value.\n");
  893. fflush(stdout);
  894. exit(1);
  895. }
  896. if(factor < 0.0) {
  897. fprintf(stdout,"ERROR: Cannot insert at a time before zero.\n");
  898. fflush(stdout);
  899. exit(1);
  900. }
  901. }
  902. break;
  903. case('D'): /* eD */
  904. if(sscanf(argv,"%lf",&factor)!=1) {
  905. fprintf(stdout,"ERROR: Cannot read numerical value.\n");
  906. fflush(stdout);
  907. exit(1);
  908. }
  909. if(factor < 0.0) {
  910. fprintf(stdout,"ERROR: Cannot delay to a time before zero.\n");
  911. fflush(stdout);
  912. exit(1);
  913. }
  914. break;
  915. case('P'): /* eP */
  916. if(sscanf(argv,"%d",&ifactor)!=1) {
  917. fprintf(stdout,"ERROR: Cannot read line number.\n");
  918. fflush(stdout);
  919. exit(1);
  920. }
  921. if(ifactor < 1 || ifactor > cnt) {
  922. fprintf(stdout,"ERROR: Line %d does not exist.\n",ifactor);
  923. fflush(stdout);
  924. exit(1);
  925. }
  926. if(ifactor == 1) {
  927. fprintf(stdout,"ERROR: Cannot plateau at line 1 (No change to file).\n");
  928. fflush(stdout);
  929. exit(1);
  930. }
  931. break;
  932. default:
  933. unknown_flag_string(argv-2);
  934. }
  935. break;
  936. /*RWD new Format option */
  937. case('F'):
  938. ro = (int)*argv;
  939. if(ro=='r' || ro == 'f' || ro == 'R')
  940. argv++;
  941. else
  942. ro = ENDOFSTR;
  943. if(((int)*argv) == ENDOFSTR)
  944. no_value_with_flag_only(flag);
  945. if(sscanf(argv,"%d",&ifactor)!=1)
  946. cant_read_numeric_value_with_flag_only(flag);
  947. if(ifactor <= 0)
  948. read_flags_data_error("Value must be > zero.");
  949. if(!sloom) {
  950. if(ifactor > 8)
  951. read_flags_data_error("Maximum of 8 values possible on a line.");
  952. }
  953. break;
  954. case('f'):
  955. ro = *argv++;
  956. switch(ro) {
  957. case('t'): /* ft */
  958. break;
  959. case('r'): /* fr */
  960. if(sscanf(argv,"%d",&ifactor)!=1)
  961. ifactor = 1;
  962. break;
  963. case('l'): /* fl */
  964. if(sscanf(argv,"%lf",&factor)!=1)
  965. no_value_with_flag(flag,ro);
  966. break;
  967. default:
  968. unknown_flag(flag,ro);
  969. }
  970. break;
  971. case('G'): /* G */
  972. if(sscanf(argv,"%d",&ifactor)!=1)
  973. no_value_with_flag_only(flag);
  974. if(ifactor >= stringscnt) {
  975. sprintf(errstr,"ERROR: regrouping value (%d) is too big for list of numbers (only %d in list).\n",ifactor,cnt);
  976. do_error();
  977. }
  978. break;
  979. case('g'):
  980. ro = *argv++;
  981. switch(ro) {
  982. case(ENDOFSTR): /* g */
  983. case('a'): /* ga */
  984. break;
  985. case('s'): /* gs */
  986. factor = (double)MAXSAMP;
  987. break;
  988. default:
  989. unknown_flag_or_bad_param();
  990. }
  991. break;
  992. case('H'):
  993. if((ro = (int)*argv++)!='g' && ro !='r') {
  994. if(isalpha(ro))
  995. unknown_flag(flag,ro);
  996. if(sscanf(--argv,"%d",&ifactor)!=1)
  997. no_value_with_flag_only(flag);
  998. ro = ENDOFSTR;
  999. } else {
  1000. switch(ro) {
  1001. case('r'):
  1002. if(sscanf(argv,"%d",&ifactor)!=1)
  1003. no_value_with_flag(flag,ro);
  1004. break;
  1005. case('g'):
  1006. if(sscanf(argv,"%lf",&factor)!=1)
  1007. factor = HARMONIC_TUNING_TOLERANCE;
  1008. break;
  1009. default:
  1010. unknown_flag(flag,ro);
  1011. }
  1012. }
  1013. break;
  1014. case('h'):
  1015. ro = *argv++;
  1016. switch(ro) {
  1017. case('d'): /* hd */
  1018. case('M'): /* hM */
  1019. break;
  1020. default:
  1021. unknown_flag_string(argv-1);
  1022. }
  1023. if(*argv!=ENDOFSTR)
  1024. read_flags_data_error("No parameter required with this flag.");
  1025. break;
  1026. case('I'):
  1027. ro =*argv++;
  1028. switch(ro) {
  1029. case(ENDOFSTR): break; /* I */
  1030. case('r'): break; /* Ir */
  1031. case('v'): break; /* Iv */
  1032. case('V'): /* IV */
  1033. if(sscanf(argv,"%d",&ifactor)!=1)
  1034. cant_read_numeric_value(flag,ro);
  1035. break;
  1036. }
  1037. break;
  1038. case('i'):
  1039. ro = (int)*argv++;
  1040. switch(ro) {
  1041. case(ENDOFSTR): /* i */
  1042. break;
  1043. case('M'): /* iM */
  1044. case('p'): /* ip */
  1045. case('v'): /* iv */
  1046. case('V'): /* iV */
  1047. case('h'): /* ih */
  1048. if(*argv!=ENDOFSTR)
  1049. no_value_required_with_flag(flag,ro);
  1050. break;
  1051. case('='): /* i= */
  1052. if(cnt!=2) {
  1053. if(!sloom)
  1054. read_flags_data_error("Must have two values in infile with flag i=.");
  1055. exit(1);
  1056. }
  1057. if(flteq(number[0],number[1])) {
  1058. if(!sloom)
  1059. read_flags_data_error("Two values in infile must be different.");
  1060. exit(1);
  1061. }
  1062. if(sscanf(argv,"%lf",&factor)!=1)
  1063. cant_read_numeric_value(flag,ro);
  1064. if(flteq(factor,0.0))
  1065. read_flags_data_error("Parameter cannot be zero.");
  1066. break;
  1067. case('r'): /* ir */
  1068. case('c'): /* ic */
  1069. if(sscanf(argv,"%d",&ifactor)!=1)
  1070. cant_read_numeric_value(flag,ro);
  1071. if(flag=='c' && cnt!=1)
  1072. read_flags_data_error("Must have only one value in infile.");
  1073. break;
  1074. case('a'): /* ia */
  1075. case('m'): /* im */
  1076. case('l'): /* il */
  1077. case('L'): /* iL */
  1078. if(sscanf(argv,"%lf",&factor)!=1)
  1079. cant_read_numeric_value(flag,ro);
  1080. break;
  1081. default:
  1082. if(isdigit(ro) || ro=='.' || ro=='-')
  1083. flag_only_takes_no_params(flag);
  1084. unknown_flag_string(argv-2);
  1085. }
  1086. break;
  1087. case('J'):
  1088. ro = *argv;
  1089. if(ro=='j') { /*Jj */
  1090. if(sscanf(++argv,"%d",&ifactor)!=1)
  1091. no_value_with_flag_only(flag);
  1092. } else if(*argv!=ENDOFSTR) /* J */
  1093. flag_only_takes_no_params(flag);
  1094. break;
  1095. case('j'):
  1096. ro = *argv;
  1097. if(ro == 'j') /* jj */
  1098. break;
  1099. else { /* j */
  1100. ro = 0;
  1101. maxpos = (cnt/colcnt) + 1;
  1102. if(sscanf(argv,"%d",&ifactor)!=1)
  1103. no_value_with_flag_only(flag);
  1104. else if(ifactor > maxpos) {
  1105. fprintf(stdout,"ERROR: Insertion point is beyond end of file: reverting to end of file.\n");
  1106. fflush(stdout);
  1107. ifactor = maxpos;
  1108. }
  1109. }
  1110. break;
  1111. case('L'): /* L */
  1112. if(cnt!=2)
  1113. read_flags_data_error("Must have two values in infile.");
  1114. if(flteq(number[0],number[1]))
  1115. read_flags_data_error("Two values in infile must be different.");
  1116. if(number[0]<=0 || number[1]<=0)
  1117. read_flags_data_error("This option only works on values >0.\n");
  1118. if(sscanf(argv,"%lf",&factor)!=1)
  1119. cant_read_numeric_value_with_flag_only(flag);
  1120. if(flteq(factor,0.0))
  1121. read_flags_data_error("Parameter cannot be zero.");
  1122. break;
  1123. case('l'):
  1124. ro =*argv++;
  1125. switch(ro) {
  1126. case(ENDOFSTR): break; /* l */
  1127. case('i'): /* li */
  1128. case('v'): /* lv */
  1129. if(sscanf(argv,"%lf",&factor)!=1)
  1130. no_value_with_flag(flag,ro);
  1131. break;
  1132. default:
  1133. unknown_flag(flag,ro);
  1134. }
  1135. break;
  1136. case('k'):
  1137. ro =*argv++;
  1138. switch(ro) {
  1139. case('A'): /* kA */
  1140. case('B'): /* kB */
  1141. case('C'): /* kC */
  1142. case('T'): /* kT */
  1143. case('X'): /* kX */
  1144. case('Y'): /* kY */
  1145. break;
  1146. default:
  1147. unknown_flag(flag,ro);
  1148. }
  1149. break;
  1150. case('K'):
  1151. ro =*argv++;
  1152. switch(ro) {
  1153. case('c'): case('t'): case('E'):
  1154. case('l'): case('b'): case('m'): case('M'):
  1155. if(sscanf(argv,"%lf",&factor)!=1)
  1156. read_flags_data_error("Cannot read parameter value.");
  1157. break;
  1158. case('I'): case('i'): case('P'): case('A'): case('R'): case('r'):
  1159. case('Z'): case('T'): case('a'):
  1160. break;
  1161. default:
  1162. fprintf(stdout,"ERROR: Unknown option\n");
  1163. fflush(stdout);
  1164. exit(1);
  1165. }
  1166. break;
  1167. case('M'):
  1168. ro = *argv++;
  1169. switch(ro) {
  1170. case(ENDOFSTR): /* M */
  1171. case('d'): /* Md */
  1172. break;
  1173. case('h'): /* Mh */
  1174. if(*argv!=ENDOFSTR)
  1175. no_value_required_with_flag(flag,ro);
  1176. break;
  1177. case('m'): /* Mm */
  1178. if((p=get_pitchclass(argv,&ifactor,0))==(char *)0) {
  1179. sprintf(errstr,"key not specified, or unknown (%s)\n",argv);
  1180. do_error();
  1181. }
  1182. break;
  1183. case('t'): /* Mt */
  1184. break;
  1185. case('r'): /* Mr */
  1186. if(sscanf(argv,"%d",&ifactor)!=1)
  1187. ifactor = 1;
  1188. break;
  1189. default:
  1190. if(isdigit(ro) || ro=='.' || ro=='-')
  1191. no_value_required_with_flag_only(flag);
  1192. unknown_flag(flag,ro);
  1193. }
  1194. break;
  1195. case('m'):
  1196. ro = *argv++;
  1197. switch(ro) {
  1198. case('i'): /* mi */
  1199. case('I'): /* mI */
  1200. break;
  1201. case('M'): /* mM */
  1202. if((p=get_pitchclass(argv,&ifactor,0))==(char *)0) {
  1203. sprintf(errstr,"key not specified, or unknown (%s)\n",argv);
  1204. do_error();
  1205. }
  1206. break;
  1207. case('g'): /* mg */
  1208. case('l'): /* ml */
  1209. case('e'): /* me */
  1210. case('m'): /* mm */
  1211. if(sscanf(argv,"%lf",&factor)!=1) {
  1212. cant_read_numeric_value(flag,ro);
  1213. }
  1214. if(ro == 'm' && flteq(factor,0.0)) {
  1215. fprintf(stdout,"ERROR: Mutiples of numbers very close to zero cannot be handled.\n");
  1216. fflush(stdout);
  1217. exit(1);
  1218. }
  1219. ifactor = round(factor);
  1220. break;
  1221. default: /* m */
  1222. if(sscanf(--argv,"%lf",&factor)!=1) {
  1223. cant_read_numeric_value_with_flag_only(flag);
  1224. }
  1225. ro = 0;
  1226. break;
  1227. }
  1228. break;
  1229. case('N'): /* N */
  1230. ro = *argv;
  1231. if(ro == 'r') /* Nr */
  1232. argv++;
  1233. if(*argv==ENDOFSTR) {
  1234. if(ro=='r')
  1235. cant_read_numeric_value(flag,ro);
  1236. else
  1237. cant_read_numeric_value_with_flag_only(flag);
  1238. }
  1239. if(ro!='r' && !isdigit(ro))
  1240. unknown_flag(flag,ro);
  1241. if(sscanf(argv,"%d",&outfilecnt)!=1) {
  1242. if(ro=='r')
  1243. cant_read_numeric_value(flag,ro);
  1244. else
  1245. cant_read_numeric_value_with_flag_only(flag);
  1246. }
  1247. if(outfilecnt<2)
  1248. read_flags_data_error("Number of partitioning sets must be >1.");
  1249. if(outfilecnt > 99)
  1250. read_flags_data_error("You can't have more than 99 outfiles (at present).");
  1251. len = strlen(argv2);
  1252. filename = (char *)exmalloc(len+1);
  1253. *filename = ENDOFSTR;
  1254. strcpy(filename,argv2);
  1255. len+=2;
  1256. if(factor>9)
  1257. len++;
  1258. thisfilename = (char *)exmalloc(len+1);
  1259. break;
  1260. case('n'): /* n */
  1261. ro = *argv++;
  1262. switch(ro) {
  1263. case('F'): /* nF */
  1264. case('M'): /* nM */
  1265. break;
  1266. case('T'): /* nT */
  1267. switch(*argv++) {
  1268. case('c'): case('C'): factor = 60.0; break;
  1269. case('d'): case('D'): factor = 62.0; break;
  1270. case('e'): case('E'): factor = 64.0; break;
  1271. case('f'): case('F'): factor = 65.0; break;
  1272. case('g'): case('G'): factor = 67.0; break;
  1273. case('a'): case('A'): factor = 69.0; break;
  1274. case('b'): case('B'): factor = 71.0; break;
  1275. default:
  1276. fprintf(stdout,"ERROR: Cannot read note parameter.\n");
  1277. fflush(stdout);
  1278. exit(1);
  1279. }
  1280. switch(*argv) {
  1281. case('b'): factor -= 1.0; argv++; break;
  1282. case('#'): factor += 1.0; argv++; break;
  1283. case(ENDOFSTR): break;
  1284. }
  1285. ifactor = 0;
  1286. switch(*argv) {
  1287. case(ENDOFSTR): break;
  1288. default:
  1289. qtone = 0.0;
  1290. q = argv + strlen(argv) - 1;
  1291. if(*q == '-') {
  1292. qtone = -.5;
  1293. *q = ENDOFSTR;
  1294. } else if(*q == '+') {
  1295. qtone = .5;
  1296. *q = ENDOFSTR;
  1297. }
  1298. if(sscanf(argv,"%d",&ifactor)!=1) {
  1299. fprintf(stdout,"ERROR: Invalid octave data in note parameter.\n");
  1300. fflush(stdout);
  1301. exit(1);
  1302. }
  1303. break;
  1304. }
  1305. factor += (double)(12 * ifactor);
  1306. factor += qtone;
  1307. break;
  1308. default:
  1309. unknown_flag_string(argv-1);
  1310. }
  1311. break;
  1312. case('O'):
  1313. ro = *argv++;
  1314. switch(ro) {
  1315. case('s'): /* Os */
  1316. factor = 12;
  1317. break;
  1318. case('T'): /* OT */
  1319. break;
  1320. default:
  1321. unknown_flag(flag,ro);
  1322. }
  1323. break;
  1324. case('o'):
  1325. ro = *argv++;
  1326. switch(ro) {
  1327. case(ENDOFSTR): /* o */
  1328. case('r'): /* or */
  1329. break;
  1330. default:
  1331. unknown_flag_or_bad_param();
  1332. }
  1333. break;
  1334. case('p'): /* p */
  1335. ro = *argv++;
  1336. switch(ro) {
  1337. case(ENDOFSTR): /* p */
  1338. case('p'): /* pp */
  1339. break;
  1340. default:
  1341. unknown_flag_string(argv-1);
  1342. }
  1343. break;
  1344. case('P'): /* P */
  1345. case('q'): /* q */
  1346. ro = (int)*argv;
  1347. if(ro==ENDOFSTR)
  1348. no_value_with_flag_only(flag);
  1349. if(isdigit(ro) || ro=='.' || ro=='-') {
  1350. if(sscanf(argv,"%lf",&factor)!=1)
  1351. cant_read_numeric_value_with_flag_only(flag);
  1352. ro = ENDOFSTR; /* q */
  1353. break;
  1354. }
  1355. switch(ro) {
  1356. case('t'):
  1357. case('v'):
  1358. argv++;
  1359. if(sscanf(argv,"%lf",&factor)!=1) {
  1360. cant_read_numeric_value(flag,ro);
  1361. exit(1);
  1362. }
  1363. break;
  1364. default:
  1365. unknown_flag_string(argv-1);
  1366. break;
  1367. }
  1368. break;
  1369. case('Q'): /* Q */
  1370. if(cnt!=3)
  1371. read_flags_data_error("Must have three values in infile.");
  1372. if(flteq(number[0],number[1]))
  1373. read_flags_data_error("First two values in infile must be different.");
  1374. if(number[2]<=0.0)
  1375. read_flags_data_error("Curvature (third value in infile) must be >0.0.");
  1376. if(sscanf(argv,"%lf",&factor)!=1)
  1377. cant_read_numeric_value_with_flag_only(flag);
  1378. if(flteq(factor,0.0))
  1379. read_flags_data_error("Parameter cannot be zero.");
  1380. break;
  1381. case('R'):
  1382. ro = (int)*argv++;
  1383. switch(ro) {
  1384. case(ENDOFSTR): /* R */
  1385. factor = 1.0;
  1386. break;
  1387. case('g'): /* Rg */
  1388. case('G'): /* RG */
  1389. if(*argv!=ENDOFSTR)
  1390. read_flags_data_error("No parameter required with this option.");
  1391. break;
  1392. case('o'): /* Ro */
  1393. case('i'): /* Ri */
  1394. case('I'): /* RI */
  1395. case('r'): /* Rr */
  1396. if(*argv!=ENDOFSTR) {
  1397. fprintf(stdout,"ERROR: No parameter required with this option\n");
  1398. fflush(stdout);
  1399. exit(1);
  1400. }
  1401. break;
  1402. case('e'): /* Re */
  1403. if(sscanf(argv,"%d",&ifactor)!=1)
  1404. no_value_with_flag(flag,ro);
  1405. break;
  1406. case('a'): /* Ra */
  1407. case('A'): /* RA */
  1408. case('c'): /* Rc */
  1409. case('m'): /* Rm */
  1410. case('s'): /* Rs */
  1411. case('v'): /* Rv */
  1412. case('x'): /* Rx */
  1413. if(sscanf(argv,"%lf",&factor)!=1)
  1414. cant_read_numeric_value(flag,ro);
  1415. if(ro=='s' && (factor > 1.0 || factor < 0.0))
  1416. read_flags_data_error("Numerical value out of range [0-1].");
  1417. else if(ro == 'x') {
  1418. ifactor = round(factor);
  1419. if(ifactor < 1)
  1420. read_flags_data_error("Numerical value out of range [must be >= 1].");
  1421. }
  1422. break;
  1423. default:
  1424. if(sscanf(argv-1,"%lf",&factor)!=1)
  1425. unknown_flag_string(argv-2);
  1426. ro = ENDOFSTR;
  1427. }
  1428. break;
  1429. case('r'):
  1430. ro = *argv++;
  1431. switch(ro) {
  1432. case(ENDOFSTR): /* r */
  1433. break;
  1434. case('m'): /* rm */
  1435. if(sscanf(argv,"%d",&ifactor)!=1)
  1436. no_value_with_flag(flag,ro);
  1437. break;
  1438. case('T'): /* rT */
  1439. factor = 1.0;
  1440. /* fall thro */
  1441. case('a'): /* ra */
  1442. case('G'): /* rG */
  1443. case('I'): /* rI */
  1444. case('J'): /* rJ */
  1445. case('o'): /* ro */
  1446. case('p'): /* rp */
  1447. case('r'): /* rr */
  1448. case('R'): /* rR */
  1449. case('X'): /* rX */
  1450. case('z'): /* rz */
  1451. if(*argv!=ENDOFSTR)
  1452. no_value_required_with_flag(flag,ro);
  1453. break;
  1454. default:
  1455. unknown_flag(flag,ro);
  1456. }
  1457. break;
  1458. case('S'): /* S */
  1459. ro = *argv;
  1460. switch(ro) {
  1461. case('M'): /* SM */
  1462. argv++; /* NB need to do this here if there are more 'S' flags!! */
  1463. if(*argv!=ENDOFSTR)
  1464. no_value_required_with_flag(flag,ro);
  1465. break;
  1466. default:
  1467. if(*argv==ENDOFSTR) {
  1468. cant_read_numeric_value_with_flag_only(flag);
  1469. exit(1);
  1470. }
  1471. if(sscanf(argv,"%d",&outfilecnt)!=1) {
  1472. cant_read_numeric_value_with_flag_only(flag);
  1473. exit(1);
  1474. }
  1475. if(outfilecnt<2)
  1476. read_flags_data_error("Number of partitioning sets must be >1.");
  1477. if(outfilecnt > 99)
  1478. read_flags_data_error("You can't have more than 99 outfiles (at present).");
  1479. len = strlen(argv2);
  1480. filename = (char *)exmalloc(len+1);
  1481. *filename = ENDOFSTR;
  1482. strcpy(filename,argv2);
  1483. len+=2;
  1484. if(factor>9)
  1485. len++;
  1486. thisfilename = (char *)exmalloc(len+1);
  1487. ro = ENDOFSTR;
  1488. break;
  1489. }
  1490. break;
  1491. case('s'):
  1492. ro = *argv++;
  1493. switch(ro) {
  1494. case('R'): /* sR */
  1495. case('T'): /* sT */
  1496. case('F'): /* sF */
  1497. case('X'): /* sX */
  1498. case('a'): /* sa */
  1499. case('b'): /* sb */
  1500. case('f'): /* sf */
  1501. break;
  1502. case('O'): /* sO */
  1503. factor = .083333333333; /* i.e. 1/12 */
  1504. break;
  1505. case('g'): /* sg */
  1506. factor = 1.0/MAXSAMP;
  1507. break;
  1508. case('d'): /* sd */
  1509. if(*argv == ENDOFSTR) {
  1510. factor = 0.0;
  1511. break;
  1512. }
  1513. /* fall thro */
  1514. /* sd with param */
  1515. case('A'): /* sA */
  1516. if(sscanf(argv,"%lf",&factor)!=1)
  1517. cant_read_numeric_value(flag,ro);
  1518. break;
  1519. case('t'): /* st */
  1520. if(*argv == ENDOFSTR)
  1521. no_value_with_flag(flag,ro);
  1522. else if(sscanf(argv,"%d",&ifactor)!=1)
  1523. cant_read_numeric_value(flag,ro);
  1524. else if(BAD_SR(ifactor))
  1525. read_flags_data_error("Invalid sampling rate.");
  1526. break;
  1527. case('P'): /* sP */
  1528. case('p'): /* sp */
  1529. case('o'): /* so */
  1530. case('u'): /* su */
  1531. case('k'): /* sk */
  1532. case('l'): /* sl */
  1533. case('K'): /* sK */
  1534. case('n'): /* sn */
  1535. case('E'): /* sE */
  1536. if(*argv == ENDOFSTR)
  1537. no_value_with_flag(flag,ro);
  1538. else if(sscanf(argv,"%lf",&factor)!=1)
  1539. cant_read_numeric_value(flag,ro);
  1540. break;
  1541. case('U'): /* sn */
  1542. if(*argv == ENDOFSTR)
  1543. no_value_with_flag(flag,ro);
  1544. else if(sscanf(argv,"%s",string)!=1) {
  1545. fprintf(stdout,"ERROR: Cannot read string text parameter.\n");
  1546. fflush(stdout);
  1547. exit(1);
  1548. }
  1549. break;
  1550. case('z'): /* sz */
  1551. ifactor = *argv;
  1552. if(ifactor == ENDOFSTR)
  1553. factor = 0.0;
  1554. else {
  1555. if(sscanf(argv,"%lf",&factor)!=1) {
  1556. cant_read_numeric_value(flag,ro);
  1557. exit(1);
  1558. }
  1559. }
  1560. break;
  1561. case(ENDOFSTR): /* s */
  1562. factor = 0.0;
  1563. break;
  1564. default: /* s with parameter */
  1565. if(isdigit(ro) || ro=='.' || ro=='-') {
  1566. argv--;
  1567. if(sscanf(argv,"%lf",&factor)!=1) {
  1568. cant_read_numeric_value(flag,ro);
  1569. exit(1);
  1570. }
  1571. ro = ENDOFSTR;
  1572. } else
  1573. unknown_flag(flag,ro);
  1574. }
  1575. break;
  1576. case('T'):
  1577. if((ro = *argv++)==ENDOFSTR)
  1578. unknown_flag_only(flag);
  1579. switch(ro) {
  1580. case('M'): /* TM */
  1581. case('h'): /* Th */
  1582. if(sscanf(argv,"%lf",&factor)!=1)
  1583. factor = TWELVE; /* Normal tempering */
  1584. break;
  1585. case('c'): /* Tc */
  1586. case('l'): /* Tl */
  1587. if(sscanf(argv,"%lf",&factor)!=1)
  1588. read_flags_data_error("Cannot read tempo value.");
  1589. break;
  1590. case('p'): /* Tp */
  1591. case('P'): /* TP */
  1592. if(sscanf(argv,"%lf",&factor)!=1)
  1593. read_flags_data_error("Cannot read beat duration.");
  1594. break;
  1595. case('r'): /* Tr */
  1596. factor = 1.0;
  1597. /* fall thro */
  1598. case('b'): /* Tb */
  1599. case('B'): /* TB */
  1600. case('O'): /* TO */
  1601. case('s'): /* Ts */
  1602. break;
  1603. default:
  1604. unknown_flag(flag,ro);
  1605. }
  1606. break;
  1607. case('t'):
  1608. ro = *argv++;
  1609. switch(ro) {
  1610. case(ENDOFSTR): /* t */
  1611. break;
  1612. case('s'): /* ts */
  1613. if(*argv == ENDOFSTR)
  1614. no_value_with_flag(flag,ro);
  1615. else if(sscanf(argv,"%d",&ifactor)!=1) {
  1616. cant_read_numeric_value(flag,ro);
  1617. } else if(BAD_SR(ifactor))
  1618. read_flags_data_error("Invalid sampling rate.");
  1619. break;
  1620. case('e'): /* te */
  1621. case('M'): /* tM */
  1622. case('h'): /* th */
  1623. case('r'): /* tr */
  1624. case('R'): /* tR */
  1625. if(*argv!=ENDOFSTR)
  1626. no_value_required_with_flag(flag,ro);
  1627. break;
  1628. case('d'):
  1629. if(sscanf(argv,"%d",&ifactor)!=1)
  1630. read_flags_data_error("Cannot read density value.");
  1631. break;
  1632. case('B'): /* tB */
  1633. case('c'): /* tc */
  1634. case('C'): /* tC */
  1635. if(sscanf(argv,"%lf",&factor)!=1)
  1636. read_flags_data_error("Cannot read parameter value.");
  1637. break;
  1638. default:
  1639. if(isdigit(ro) || ro=='.' || ro=='-')
  1640. no_value_required_with_flag_only(flag);
  1641. unknown_flag(flag,ro);
  1642. }
  1643. break;
  1644. case('V'):
  1645. if(sscanf(argv,"%lf",&factor)!=1)
  1646. no_value_with_flag_only(flag);
  1647. break;
  1648. case('v'):
  1649. if(sscanf(argv,"%lf",&factor)!=1)
  1650. factor = 0.0;
  1651. break;
  1652. case('w'):
  1653. ro =*argv++;
  1654. switch(ro) {
  1655. case('t'): case('o'):
  1656. break;
  1657. default:
  1658. fprintf(stdout,"ERROR: Unknown option\n");
  1659. fflush(stdout);
  1660. exit(1);
  1661. }
  1662. break;
  1663. case('W'):
  1664. ro =*argv++;
  1665. switch(ro) {
  1666. case('c'): case('t'): case('E'):
  1667. case('l'): case('b'): case('m'): case('M'):
  1668. if(sscanf(argv,"%lf",&factor)!=1)
  1669. read_flags_data_error("Cannot read parameter value.");
  1670. break;
  1671. case('I'): case('i'): case('P'): case('A'): case('R'): case('r'):
  1672. case('Z'): case('T'): case('a'):
  1673. break;
  1674. default:
  1675. fprintf(stdout,"ERROR: Unknown option\n");
  1676. fflush(stdout);
  1677. exit(1);
  1678. }
  1679. break;
  1680. case('y'):
  1681. ro =*argv++;
  1682. switch(ro) {
  1683. case('a'): case('A'): case('b'): case('B'): case('c'): case('C'):
  1684. case('d'): case('e'): case('E'): case('g'): case('i'): case('I'):
  1685. case('l'): case('o'): case('p'): case('q'): case('Q'): case('r'): case('R'):
  1686. case('P'): case('s'): case('S'): case('x'):
  1687. break;
  1688. default:
  1689. fprintf(stdout,"ERROR: Unknown option\n");
  1690. fflush(stdout);
  1691. exit(1);
  1692. }
  1693. break;
  1694. case('Y'):
  1695. ro =*argv++;
  1696. switch(ro) {
  1697. case('s'): case('S'):
  1698. break;
  1699. default:
  1700. fprintf(stdout,"ERROR: Unknown option\n");
  1701. fflush(stdout);
  1702. exit(1);
  1703. }
  1704. break;
  1705. case('z'):
  1706. ro =*argv++;
  1707. switch(ro) {
  1708. case('A'): case('B'): case('C'): case('D'): case('e'): case('E'): case('F'): case('G'):
  1709. case('H'): case('I'): case('J'): case('X'): case('Y'): case('Z'):
  1710. case('q'):
  1711. break;
  1712. default:
  1713. fprintf(stdout,"ERROR: Unknown option\n");
  1714. fflush(stdout);
  1715. exit(1);
  1716. }
  1717. break;
  1718. case('Z'):
  1719. ro =*argv++;
  1720. switch(ro) {
  1721. case('h'): case('M'):
  1722. if(sscanf(argv,"%lf",&factor)!=1)
  1723. read_flags_data_error("Cannot read parameter value.");
  1724. break;
  1725. case('s'):
  1726. if(sscanf(argv,"%s",string)!=1)
  1727. read_flags_data_error("Cannot read parameter value.");
  1728. break;
  1729. default:
  1730. fprintf(stdout,"ERROR: Unknown option\n");
  1731. fflush(stdout);
  1732. exit(1);
  1733. }
  1734. break;
  1735. default:
  1736. unknown_flag_string(argv-1);
  1737. }
  1738. if(condit) {
  1739. if(!(flag=='s' && (ro=='p' || ro=='P' || ro=='F' || ro=='R' || ro=='u' || ro=='X'))
  1740. && !(flag=='W' && (ro=='l' || ro=='M'))
  1741. && !(flag=='K' && (ro=='l' || ro=='M'))
  1742. && !(flag == 'm' && ro == 'm') && !(flag =='T' && ro == 'P')
  1743. && !(flag == 'l' && ro == 'v')
  1744. && !(flag == 'd' && ro == 'L') && !(flag == 'T' && (ro == 'M' || ro == 'h'))
  1745. && !(flag == 'c' && ro == 0)
  1746. && (ro!=0 || !(flag=='R'||flag=='a'||flag=='m'||flag=='P'||flag=='c'||flag=='d')))
  1747. read_flags_data_error("Threshold cannot be used with this option.");
  1748. }
  1749. }
  1750. /***************************** GET_EXTRA_PARAMS *********************************/
  1751. void get_extra_params(int no,int argc,char *argv[]) {
  1752. int n, m;
  1753. cnt = no;
  1754. number=(double *)exrealloc((char *)number,(cnt+1)*sizeof(double));
  1755. for(n=2,m=0;n < argc-1;n++,m++) {
  1756. if(sscanf(argv[n],"%lf",&number[m])!=1) {
  1757. fprintf(stdout,"ERROR: Insufficient parameters for this process.\n");
  1758. fflush(stdout);
  1759. exit(1);
  1760. }
  1761. }
  1762. }
  1763. /***************************** GET_FUNNY_PARAMS *********************************/
  1764. void get_funny_params(int no,int argc,char *argv[]) {
  1765. int n, m;
  1766. number=(double *)exrealloc((char *)number,(cnt+no)*sizeof(double));
  1767. for(n=2,m=cnt;n < argc-1;n++,m++) {
  1768. if(sscanf(argv[n],"%lf",&number[m])!=1) {
  1769. fprintf(stdout,"ERROR: Insufficient parameters for this process.\n");
  1770. fflush(stdout);
  1771. exit(1);
  1772. }
  1773. }
  1774. }
  1775. /***************************** REORGANISE_EXTRA_PARAMS *********************************/
  1776. void reorganise_extra_params(char *agv,int argc,char *argv[])
  1777. {
  1778. double range, step, scat, quantisation, dur;
  1779. int tq, ql;
  1780. agv++;
  1781. flag = *agv;
  1782. agv++;
  1783. ro = *agv;
  1784. switch(flag) {
  1785. case('A'):
  1786. switch(ro) {
  1787. case('d'):
  1788. case('t'): get_extra_params(3,argc,argv);
  1789. factor = number[0];
  1790. number[0] = number[1];
  1791. number[1] = number[2];
  1792. cnt--;
  1793. if(factor <= 0.0) {
  1794. fprintf(stdout,"ERROR: Total duration must be greater than zero.\n");
  1795. fflush(stdout);
  1796. exit(1);
  1797. }
  1798. if((number[0]<=0) || (number[1]<=0)) {
  1799. fprintf(stdout,"ERROR: Time steps must be greater than zero.\n");
  1800. fflush(stdout);
  1801. exit(1);
  1802. }
  1803. if(factor < number[0] + number[1]) {
  1804. fprintf(stdout,"ERROR: Total duration too small to divide thus.\n");
  1805. fflush(stdout);
  1806. exit(1);
  1807. }
  1808. break;
  1809. case('T'): get_extra_params(4,argc,argv);
  1810. factor = number[0];
  1811. number[0] = number[1];
  1812. number[1] = number[2];
  1813. number[2] = number[3];
  1814. cnt--;
  1815. if((number[0]<=0) || (number[1]<=0)) {
  1816. fprintf(stdout,"ERROR: Time steps must be greater than zero.\n");
  1817. fflush(stdout);
  1818. exit(1);
  1819. }
  1820. if(factor <= 0.0) {
  1821. fprintf(stdout,"ERROR: Total duration must be greater than zero.\n");
  1822. fflush(stdout);
  1823. exit(1);
  1824. }
  1825. if(factor < number[0] + number[1]) {
  1826. fprintf(stdout,"ERROR: Total duration too small to divide thus.\n");
  1827. fflush(stdout);
  1828. exit(1);
  1829. }
  1830. ro = 't';
  1831. break;
  1832. default:
  1833. fprintf(stdout,"ERROR: Unknown process mode.\n");
  1834. fflush(stdout);
  1835. exit(1);
  1836. }
  1837. break;
  1838. case('b'):
  1839. switch(ro) {
  1840. case('b'):
  1841. get_funny_params(2,argc,argv);
  1842. break;
  1843. }
  1844. break;
  1845. case('C'):
  1846. switch(ro) {
  1847. case('a'): case('m'):
  1848. get_funny_params(3,argc,argv);
  1849. break;
  1850. }
  1851. break;
  1852. case('c'):
  1853. switch(ro) {
  1854. case('s'):
  1855. get_extra_params(4,argc,argv);
  1856. cnt = round(number[0]);
  1857. if(cnt < 2) {
  1858. fprintf(stdout,"ERROR: Number of output values must be more than 1.\n");
  1859. fflush(stdout);
  1860. exit(1);
  1861. }
  1862. if(number[3] < FLTERR) {
  1863. fprintf(stdout,"ERROR: skew value must be greater than 0 (1.0 == NO skew).\n");
  1864. fflush(stdout);
  1865. exit(1);
  1866. }
  1867. break;
  1868. }
  1869. break;
  1870. case('d'):
  1871. switch(ro) {
  1872. case('d'):
  1873. case('L'):
  1874. get_funny_params(2,argc,argv);
  1875. break;
  1876. }
  1877. break;
  1878. case('g'):
  1879. switch(ro) {
  1880. case('a'):
  1881. get_funny_params(1,argc,argv);
  1882. break;
  1883. }
  1884. break;
  1885. case('i'):
  1886. switch(ro) {
  1887. case('e'):
  1888. case('c'): get_extra_params(2,argc,argv);
  1889. ifactor = round(number[0]);
  1890. number[0] = number[1];
  1891. cnt--;
  1892. if(ifactor <= 1) {
  1893. fprintf(stdout,"ERROR: Number of values must be more than 1.\n");
  1894. fflush(stdout);
  1895. exit(1);
  1896. }
  1897. break;
  1898. case('R'):
  1899. case('Q'):
  1900. case('C'): get_extra_params(3,argc,argv);
  1901. ifactor = round(number[0]);
  1902. number[0] = number[1];
  1903. number[1] = number[2];
  1904. cnt--;
  1905. if(ifactor <= 1) {
  1906. fprintf(stdout,"ERROR: Number of values must be more than 1.\n");
  1907. fflush(stdout);
  1908. exit(1);
  1909. }
  1910. break;
  1911. case('='): get_extra_params(3,argc,argv);
  1912. factor = number[0];
  1913. number[0] = number[1];
  1914. number[1] = number[2];
  1915. cnt--;
  1916. range = fabs(number[1] - number[0]);
  1917. step = fabs(factor);
  1918. if(step > range) {
  1919. fprintf(stdout,"ERROR: Range not large enough to accomodate the steps.\n");
  1920. fflush(stdout);
  1921. exit(1);
  1922. }
  1923. if(flteq(step,0.0)) {
  1924. fprintf(stdout,"ERROR: Steps are too small to work with.\n");
  1925. fflush(stdout);
  1926. exit(1);
  1927. }
  1928. if(range/step >= 10000.0) {
  1929. fprintf(stdout,"ERROR: More than 10000 steps: can't handle this.\n");
  1930. fflush(stdout);
  1931. exit(1);
  1932. }
  1933. break;
  1934. default:
  1935. fprintf(stdout,"ERROR: Unknown process mode.\n");
  1936. fflush(stdout);
  1937. exit(1);
  1938. }
  1939. break;
  1940. case('L'):
  1941. if(ro != ENDOFSTR) {
  1942. fprintf(stdout,"ERROR: Unknown process mode.\n");
  1943. fflush(stdout);
  1944. exit(1);
  1945. }
  1946. get_extra_params(3,argc,argv);
  1947. factor = (double)round(number[0]);
  1948. if(factor <= 0.0) {
  1949. fprintf(stdout,"ERROR: Number of divisions must be greater than zero.\n");
  1950. fflush(stdout);
  1951. exit(1);
  1952. }
  1953. number[0] = number[1];
  1954. number[1] = number[2];
  1955. if(flteq(number[0],number[1])) {
  1956. fprintf(stdout,"ERROR: The range to divide up is too small.\n");
  1957. fflush(stdout);
  1958. exit(1);
  1959. }
  1960. if(number[0] <= 0.0 || number[1] <= 0.0) {
  1961. fprintf(stdout,"ERROR: The range must be between two positive numbers.\n");
  1962. fflush(stdout);
  1963. exit(1);
  1964. }
  1965. cnt--;
  1966. break;
  1967. case('K'):
  1968. tq = 2;
  1969. if(ro == 'b')
  1970. tq = 3;
  1971. if(sscanf(argv[tq],"%d",&ifactor)!=1) {
  1972. fprintf(stdout,"ERROR: Failed to get number of soundfiles in sequence data.\n");
  1973. fflush(stdout);
  1974. exit(1);
  1975. }
  1976. break;
  1977. case('p'):
  1978. if (ro == 'p') {
  1979. get_extra_params(7,argc,argv);
  1980. break;
  1981. }
  1982. break;
  1983. case('q'):
  1984. if (ro == 'z') {
  1985. get_extra_params(4,argc,argv);
  1986. break;
  1987. }
  1988. break;
  1989. case('Q'):
  1990. if(ro != ENDOFSTR) {
  1991. fprintf(stdout,"ERROR: Unknown process mode.\n");
  1992. fflush(stdout);
  1993. exit(1);
  1994. }
  1995. get_extra_params(4,argc,argv);
  1996. factor = (double)round(number[0]);
  1997. number[0] = number[1];
  1998. number[1] = number[2];
  1999. number[2] = number[3];
  2000. cnt--;
  2001. if(flteq(number[0],number[1])) {
  2002. fprintf(stdout,"ERROR: Parameters 2 and 3 must be different.\n");
  2003. fflush(stdout);
  2004. exit(1);
  2005. }
  2006. if(number[2]<=0.0) {
  2007. fprintf(stdout,"ERROR: Curvature (4th parameter) must be > 0.0.\n");
  2008. fflush(stdout);
  2009. exit(1);
  2010. }
  2011. if(factor <= 0.0) {
  2012. fprintf(stdout,"ERROR: Number of steps cannot be zero\n");
  2013. fflush(stdout);
  2014. exit(1);
  2015. }
  2016. break;
  2017. case('R'):
  2018. switch(ro) {
  2019. case('g'): get_extra_params(1,argc,argv);
  2020. if(round(number[0])<=0) {
  2021. fprintf(stdout,"ERROR: Number of items to generate must be 1 or more.\n");
  2022. fflush(stdout);
  2023. exit(1);
  2024. }
  2025. break;
  2026. case('G'): get_extra_params(1,argc,argv);
  2027. if(round(number[0]) <= 0) {
  2028. fprintf(stdout,"ERROR: Number of items to generate must be 1 or more.\n");
  2029. fflush(stdout);
  2030. exit(1);
  2031. }
  2032. if(round(number[1]) <= 1) {
  2033. fprintf(stdout,"ERROR: Number of consecutive repeats must be 2 or more.\n");
  2034. fflush(stdout);
  2035. exit(1);
  2036. }
  2037. break;
  2038. case('i'): get_extra_params(2,argc,argv);
  2039. if(round(number[0])<=0) {
  2040. fprintf(stdout,"ERROR: Number of items to generate must be 1 or more.\n");
  2041. fflush(stdout);
  2042. exit(1);
  2043. }
  2044. if(round(number[1])==1) {
  2045. fprintf(stdout,"ERROR: All numbers will be the same (1).\n");
  2046. fflush(stdout);
  2047. exit(1);
  2048. }
  2049. break;
  2050. case('I'): get_extra_params(3,argc,argv);
  2051. if(round(number[0])<=0) {
  2052. fprintf(stdout,"ERROR: Number of items to generate must be 1 or more.\n");
  2053. fflush(stdout);
  2054. exit(1);
  2055. }
  2056. if(round(number[1])==1) {
  2057. fprintf(stdout,"ERROR: All numbers will be the same (1).\n");
  2058. fflush(stdout);
  2059. exit(1);
  2060. }
  2061. if(round(number[2])<1) {
  2062. fprintf(stdout,"ERROR: Number of allowable repetitions must be 1 or more.\n");
  2063. fflush(stdout);
  2064. exit(1);
  2065. }
  2066. break;
  2067. case('r'): get_extra_params(3,argc,argv);
  2068. if(round(number[0])<=0) {
  2069. fprintf(stdout,"ERROR: TOtal duratihn must be > 0.\n");
  2070. fflush(stdout);
  2071. exit(1);
  2072. }
  2073. if(round(number[1])<1) {
  2074. fprintf(stdout,"ERROR: Must be more than one number to generate.\n");
  2075. fflush(stdout);
  2076. exit(1);
  2077. }
  2078. if(round(number[2])<=0) {
  2079. fprintf(stdout,"ERROR: Randomisation value must be > 0.\n");
  2080. fflush(stdout);
  2081. exit(1);
  2082. }
  2083. if(round(number[2])>round(number[1])) {
  2084. fprintf(stdout,"ERROR: Randomisation Value cannot be greater than number of values to generate.\n");
  2085. fflush(stdout);
  2086. exit(1);
  2087. }
  2088. break;
  2089. case('c'):
  2090. case('v'): get_extra_params(3,argc,argv);
  2091. factor = number[0];
  2092. number[0] = number[1];
  2093. number[1] = number[2];
  2094. cnt--;
  2095. if(ro == 'v') {
  2096. if(round(factor) < 1.0) {
  2097. fprintf(stdout,"ERROR: Number of items to generate must be 1 or more.\n");
  2098. fflush(stdout);
  2099. exit(1);
  2100. }
  2101. } else { /* case 'c' */
  2102. if (number[0] <= 0.0 || number[1] <= 0.0) {
  2103. fprintf(stdout,"ERROR: Chunk sizes must all be larger than zero.\n");
  2104. fflush(stdout);
  2105. exit(1);
  2106. }
  2107. if (number[1] < number[0]) {
  2108. number[2] = number[0];
  2109. number[0] = number[1];
  2110. number[1] = number[2];
  2111. }
  2112. if(factor <= 0.0) {
  2113. fprintf(stdout,"ERROR: Item to cut must be greater than zero.\n");
  2114. fflush(stdout);
  2115. exit(1);
  2116. }
  2117. if(factor < number[0]) {
  2118. fprintf(stdout,"ERROR: Chunk sizes are too large.\n");
  2119. fflush(stdout);
  2120. exit(1);
  2121. }
  2122. if(factor < number[1]) {
  2123. number[1] = factor;
  2124. }
  2125. }
  2126. break;
  2127. default:
  2128. fprintf(stdout,"ERROR: Unknown process mode.\n");
  2129. fflush(stdout);
  2130. exit(1);
  2131. }
  2132. break;
  2133. case('r'):
  2134. switch(ro) {
  2135. case('G'): get_extra_params(3,argc,argv);
  2136. if(round(number[0]) <= 0) {
  2137. fprintf(stdout,"ERROR: Number of items to generate must be 1 or more.\n");
  2138. fflush(stdout);
  2139. exit(1);
  2140. }
  2141. if((int)round(number[1]) == (int)round(number[2])) {
  2142. fprintf(stdout,"ERROR: Two numbers to randomise must be different from each other.\n");
  2143. fflush(stdout);
  2144. exit(1);
  2145. }
  2146. break;
  2147. case('J'): get_extra_params(4,argc,argv);
  2148. if(round(number[0]) <= 0) {
  2149. fprintf(stdout,"ERROR: Number of items to generate must be 1 or more.\n");
  2150. fflush(stdout);
  2151. exit(1);
  2152. }
  2153. if((int)round(number[1]) == (int)round(number[2])) {
  2154. fprintf(stdout,"ERROR: Two numbers to randomise must be different from each other.\n");
  2155. fflush(stdout);
  2156. exit(1);
  2157. }
  2158. break;
  2159. case('z'): get_extra_params(6,argc,argv);
  2160. if(round(number[0])<3) {
  2161. fprintf(stdout,"ERROR: Number of items to generate must be 3 or more.\n");
  2162. fflush(stdout);
  2163. exit(1);
  2164. }
  2165. if(round(number[1]) == round(number[2])) {
  2166. fprintf(stdout,"ERROR: All 'random' numbers will be the same (%d).\n",(int) round(number[1]));
  2167. fflush(stdout);
  2168. exit(1);
  2169. }
  2170. if(round(number[5])<1) {
  2171. fprintf(stdout,"ERROR: Number of allowable repetitions must be 1 or more.\n");
  2172. fflush(stdout);
  2173. exit(1);
  2174. }
  2175. break;
  2176. default:
  2177. fprintf(stdout,"ERROR: Unknown process mode.\n");
  2178. fflush(stdout);
  2179. exit(1);
  2180. }
  2181. break;
  2182. case('s'):
  2183. switch(ro) {
  2184. case('a'): case('b'): case('f'):
  2185. get_funny_params(2,argc,argv);
  2186. break;
  2187. case('s'):
  2188. get_extra_params(5,argc,argv);
  2189. if(flteq(number[0],number[1])) {
  2190. fprintf(stdout,"WARNING: Maximum and minimum vals are equal: no sinusoidal movement.\n");
  2191. fflush(stdout);
  2192. }
  2193. if(number[3] <= 0.0) {
  2194. fprintf(stdout,"ERROR: No of periods is <= 0. Cannot proceed\n");
  2195. fflush(stdout);
  2196. exit(1);
  2197. }
  2198. if(number[4] <= 2.0) {
  2199. fprintf(stdout,"ERROR: No of values per period is <= 2. No sinusoid will be produced\n");
  2200. fflush(stdout);
  2201. exit(1);
  2202. }
  2203. if (number[3] * number[4] < 1.0) {
  2204. fprintf(stdout,"ERROR: No of cycles too short to produce any output with this no. of vals per cycle.\n");
  2205. fflush(stdout);
  2206. exit(1);
  2207. }
  2208. break;
  2209. case('c'): case('v'): case('x'):
  2210. get_extra_params(5,argc,argv);
  2211. if(flteq(number[0],number[1])) {
  2212. fprintf(stdout,"ERROR: Maximum and minimum vals are equal: no sinusoidal movement.\n");
  2213. fflush(stdout);
  2214. exit(1);
  2215. }
  2216. if(flteq(number[2],number[3])) {
  2217. fprintf(stdout,"ERROR: Start and end times equal .. no sinusoidal movement.\n");
  2218. fflush(stdout);
  2219. exit(1);
  2220. }
  2221. if(number[2] > number[3]) {
  2222. dur = number[2];
  2223. number[2] = number[3];
  2224. number[3] = dur;
  2225. }
  2226. if(number[2] < 0.0) {
  2227. fprintf(stdout,"ERROR: Time value less than zero.\n");
  2228. fflush(stdout);
  2229. exit(1);
  2230. }
  2231. if (ro == 'c') {
  2232. if(number[4] <= 3) {
  2233. fprintf(stdout,"ERROR: No of points < 3. Cannot define sinusoidal motion.\n");
  2234. fflush(stdout);
  2235. exit(1);
  2236. }
  2237. } else {
  2238. if(number[4] <= 5) {
  2239. fprintf(stdout,"ERROR: No of points < 5. Cannot define cosinusoidal motion.\n");
  2240. fflush(stdout);
  2241. exit(1);
  2242. }
  2243. }
  2244. break;
  2245. }
  2246. break;
  2247. case('S'):
  2248. switch(ro) {
  2249. case('M'):
  2250. get_funny_params(4,argc,argv);
  2251. break;
  2252. }
  2253. break;
  2254. case('T'):
  2255. switch(ro) {
  2256. case('b'):
  2257. do_string_params(argv,2);
  2258. break;
  2259. case('B'):
  2260. do_string_params(argv,3);
  2261. break;
  2262. }
  2263. break;
  2264. case('y'):
  2265. switch(ro) {
  2266. case('o'): case('p'): case('s'): case('B'): case('E'): case('S'):
  2267. get_funny_params(1,argc,argv);
  2268. break;
  2269. case('e'): case('l'): case('g'): case('I'): case('A'): case('C'): case('x'):
  2270. get_funny_params(2,argc,argv);
  2271. break;
  2272. case('R'): case('a'): case('b'): case('c'):
  2273. get_funny_params(3,argc,argv);
  2274. break;
  2275. case('q'): case('Q'):
  2276. get_funny_params(4,argc,argv);
  2277. break;
  2278. case('P'):
  2279. get_funny_params(5,argc,argv);
  2280. break;
  2281. case('i'):
  2282. get_funny_params(2,argc,argv);
  2283. ifactor = (int)round(number[cnt]);
  2284. factor = number[cnt+1];
  2285. if(ifactor < 1 || ifactor > cnt+1) {
  2286. fprintf(stdout,"ERROR: Position must be within or at end of the column (1 to %d).\n",cnt+1);
  2287. fflush(stdout);
  2288. exit(1);
  2289. }
  2290. break;
  2291. case('d'):
  2292. get_funny_params(2,argc,argv);
  2293. ifactor = (int)round(number[cnt]);
  2294. factor = round(number[cnt+1]);
  2295. if((ifactor < 1) || (factor < 1.0)) {
  2296. fprintf(stdout,"ERROR: Positions must be 1 or greater.\n");
  2297. fflush(stdout);
  2298. exit(1);
  2299. }
  2300. if((ifactor > cnt) && (factor > (double)cnt)) {
  2301. fprintf(stdout,"ERROR: Positions must be inside the list you are editing.\n");
  2302. fflush(stdout);
  2303. exit(1);
  2304. }
  2305. if(((ifactor >= cnt) && (factor <= 1.0)) || ((ifactor == 1) && (factor >= (double)cnt))) {
  2306. fprintf(stdout,"ERROR: Entire column will be deleted.\n");
  2307. fflush(stdout);
  2308. exit(1);
  2309. }
  2310. break;
  2311. case('r'):
  2312. get_funny_params(2,argc,argv);
  2313. ifactor = (int)round(number[cnt]);
  2314. factor = number[cnt+1];
  2315. if(ifactor < 1 || ifactor > cnt) {
  2316. fprintf(stdout,"ERROR: Position must be within the column (1 to %d).\n",cnt);
  2317. fflush(stdout);
  2318. exit(1);
  2319. }
  2320. break;
  2321. }
  2322. break;
  2323. case('z'):
  2324. switch(ro) {
  2325. case('X'): case('Y'): case('Z'):
  2326. get_extra_params(3,argc,argv);
  2327. cnt = round(number[0]);
  2328. number[0] = number[1];
  2329. number[1] = number[2];
  2330. break;
  2331. case('e'):
  2332. get_extra_params(5,argc,argv);
  2333. ifactor = round(number[0]);
  2334. number[0] = number[1];
  2335. number[1] = number[2];
  2336. number[2] = number[3];
  2337. number[3] = number[4];
  2338. break;
  2339. case('A'): case('B'): case('C'): case('D'): case('E'):
  2340. case('F'): case('G'): case('H'): case('I'): case('J'):
  2341. get_extra_params(4,argc,argv);
  2342. cnt = round(number[0]);
  2343. number[0] = number[1];
  2344. number[1] = number[2];
  2345. number[2] = number[3];
  2346. if(cnt <= 0) {
  2347. fprintf(stdout,"ERROR: Number of steps cannot be less than 1.\n");
  2348. fflush(stdout);
  2349. exit(1);
  2350. }
  2351. break;
  2352. case('q'):
  2353. get_extra_params(4,argc,argv);
  2354. cnt = round(number[0]);
  2355. number[0] = number[1];
  2356. number[1] = number[2];
  2357. number[2] = number[3];
  2358. if(cnt<=1) {
  2359. fprintf(stdout,"ERROR: Can't randomise less than 2 elements.\n");
  2360. fflush(stdout);
  2361. exit(1);
  2362. }
  2363. quantisation = number[0];
  2364. dur = number[1];
  2365. scat = number[2];
  2366. tq = (int)floor(dur/quantisation) + 1; /* total quantised positions */
  2367. ql = (int)ceil(tq/(cnt-1)); /* average number of quanta per placed item */
  2368. if(ql <= 1) {
  2369. fprintf(stdout,"ERROR: Quantisation is too coarse to accomodate all these elements.\n");
  2370. fflush(stdout);
  2371. exit(1);
  2372. }
  2373. if(scat <= 1.0) { /* for scatter less than 1 */
  2374. ql = (int)round(ql * scat);
  2375. if(ql <= 1) {
  2376. fprintf(stdout,"ERROR: Scatter is too small to achieve randomisation of position.\n");
  2377. fflush(stdout);
  2378. exit(1);
  2379. }
  2380. }
  2381. if((cnt+1 > 4) && (number = (double *)realloc((char *)number,(cnt+1) * sizeof(double)))==NULL) {
  2382. fprintf(stdout,"ERROR: Out of memory.\n");
  2383. fflush(stdout);
  2384. exit(1);
  2385. }
  2386. break;
  2387. }
  2388. break;
  2389. case('Z'):
  2390. switch(ro) {
  2391. case('H'): case('m'):
  2392. get_extra_params(3,argc,argv);
  2393. break;
  2394. }
  2395. break;
  2396. default:
  2397. fprintf(stdout,"ERROR: Unknown process mode.\n");
  2398. fflush(stdout);
  2399. exit(1);
  2400. }
  2401. }
  2402. /************************* DO_STRING_PARAMS ***************************
  2403. *
  2404. * Reads parameters which are strings
  2405. *
  2406. * NB stringscnt will then include count of these parameters,
  2407. * hence count of any strings values read from file gets remembered as 'cnt'.
  2408. */
  2409. void do_string_params(char *argv[],int pcnt)
  2410. {
  2411. int strspace, n, k, nn;
  2412. int space_step = 200, startstringscnt = stringscnt;
  2413. char temp2[200], *p;
  2414. int total_space = space_step;
  2415. cnt = stringscnt; /* remember count of any existing strings */
  2416. if(stringstoresize == 0) {
  2417. if((stringstore = (char *)exmalloc(total_space))==NULL) {
  2418. sprintf(errstr,"Out of Memory\n");
  2419. do_error();
  2420. }
  2421. }
  2422. for(n=2,k=0;k<pcnt;k++,n++) {
  2423. strcpy(temp2,argv[n]);
  2424. strspace = strlen(temp2)+1;
  2425. //old_stringstoresize = stringstoresize;
  2426. if((stringstoresize += strspace) >= total_space) {
  2427. while(stringstoresize >= total_space)
  2428. total_space += space_step;
  2429. if((stringstore = (char *)exrealloc((char *)stringstore,total_space))==NULL) {
  2430. sprintf(errstr,"Out of Memory\n");
  2431. do_error();
  2432. }
  2433. }
  2434. strcpy(stringstore + stringstart,temp2);
  2435. stringstart += strspace;
  2436. stringscnt++;
  2437. }
  2438. if(stringscnt <= cnt) {
  2439. fprintf(stdout,"ERROR: Invalid or missing data.\n");
  2440. fflush(stdout);
  2441. exit(1);
  2442. }
  2443. if(strings == 0) {
  2444. if((strings = (char **)malloc(stringscnt * sizeof(char *)))==NULL) {
  2445. sprintf(errstr,"Out of Memory\n");
  2446. do_error();
  2447. }
  2448. } else {
  2449. if((strings = (char **)realloc((char *)strings,stringscnt * sizeof(char *)))==NULL) {
  2450. sprintf(errstr,"Out of Memory\n");
  2451. do_error();
  2452. }
  2453. }
  2454. p = stringstore;
  2455. nn = 0;
  2456. while(nn < startstringscnt) {
  2457. while(*p != ENDOFSTR)
  2458. p++;
  2459. p++;
  2460. nn++;
  2461. }
  2462. while(nn < stringscnt) {
  2463. strings[nn] = p;
  2464. while(*p != ENDOFSTR)
  2465. p++;
  2466. p++;
  2467. nn++;
  2468. }
  2469. fclose(fp[0]);
  2470. }
  2471. /********************************* READ_DATA *********************************/
  2472. void read_data(char *startarg,char *endarg,int *i_ro)
  2473. {
  2474. /* READ THE (FIRST) FILE DATA */
  2475. if(!strncmp(endarg,"-th",3) || !strncmp(endarg,"-tM",3))
  2476. do_pitchtext_infile(startarg); /* PITCH-REPRESENTING TEXTS in file */
  2477. else if(!strncmp(endarg,"-As",3) || !strncmp(endarg,"-dl",3) || !strncmp(endarg,"-rr",3)
  2478. || !strncmp(endarg,"-rR",3) || !strncmp(endarg,"-rX",3)
  2479. || !strncmp(endarg,"-dv",3) || !strncmp(endarg,"-G",2) || !strncmp(endarg,"-sK",3)
  2480. || !strncmp(endarg,"-sk",3) || !strncmp(endarg,"-Ro",3) || !strncmp(endarg,"-Ff",3)
  2481. || !strncmp(endarg,"-FR",3) || !strncmp(endarg,"-Tb",3) || !strncmp(endarg,"-TB",3)
  2482. || !strncmp(endarg,"-nM",3) || !strcmp(endarg,"-kT") || !strcmp(endarg,"-kX")
  2483. || !strcmp(endarg,"-kA") || !strcmp(endarg,"-kB") || !strcmp(endarg,"-kC")
  2484. || !strcmp(endarg,"-kY") || !strncmp(endarg,"-aT",3) || !strncmp(endarg,"-aX",3)
  2485. || !strncmp(endarg,"-nT",3) || !strncmp(endarg,"-sU",3) || !strncmp(endarg,"-Rx",3)
  2486. || !strncmp(endarg,"-eb",3) || !strncmp(endarg,"-nF",3)) {
  2487. do_string_infile(startarg); /* STRINGS in file */
  2488. } else if(!strncmp(endarg,"-J",2) || !strncmp(endarg,"-j",2) || !strncmp(endarg,"-jj",3)
  2489. || !strncmp(endarg,"-Jj",3) || !strncmp(endarg,"-Wb",3) ) {
  2490. colcnt = do_stringline_infile(startarg,0); /* LINES OF STRINGS in file */
  2491. if(!strncmp(endarg,"-Wb",3) && (colcnt != 3)) {
  2492. fprintf(stdout,"ERROR: THis process only works with sequence files\n");
  2493. fflush(stdout);
  2494. exit(1);
  2495. }
  2496. cnt = stringscnt;
  2497. } else if(!strncmp(endarg,"-DB",3))
  2498. do_DB_infile(startarg); /* DB info in file */
  2499. else if(!strcmp(endarg,"-c"))
  2500. *i_ro = ENDOFSTR; /* COUNT only, option */
  2501. else if(!strcmp(endarg,"-cl"))
  2502. *i_ro = 'l'; /* COUNT lines, option */
  2503. else
  2504. do_infile(startarg); /* read numeric values */
  2505. }
  2506. /********************************* DO_HELP *********************************/
  2507. void do_help(char *str)
  2508. {
  2509. if(!strcmp(str,"-f")) help();
  2510. if(!strcmp(str,"-m")) helpm();
  2511. if(!strcmp(str,"-M")) helpM();
  2512. if(!strcmp(str,"-R")) helpr();
  2513. if(!strcmp(str,"-l")) helpl();
  2514. if(!strcmp(str,"-g")) helpg();
  2515. }
  2516. /********************************* OPTION_TAKES_NO_DATA_BUT_HAS_EXTRA_PARAMS *********************************/
  2517. int option_takes_NO_data_but_has_extra_params(char *agv)
  2518. {
  2519. if(!strcmp(agv,"-Rg") || !strcmp(agv,"-Rv") || !strcmp(agv,"-Rc") || !strcmp(agv,"-Ri") || !strcmp(agv,"-RI")
  2520. || !strcmp(agv,"-At") || !strcmp(agv,"-AT") || !strcmp(agv,"-Ad") || !strcmp(agv,"-ic") || !strcmp(agv,"-i=")
  2521. || !strcmp(agv,"-L") || !strcmp(agv,"-Q") || !strcmp(agv,"-iC") || !strcmp(agv,"-ie") || !strcmp(agv,"-rz") || !strcmp(agv,"-qz")
  2522. || !strcmp(agv,"-Rr") || !strcmp(agv,"-iR") || !strcmp(agv,"-iQ") || !strcmp(agv,"-cs") || !strcmp(agv,"-ss")
  2523. || !strcmp(agv,"-sc") || !strcmp(agv,"-sv") || !strcmp(agv,"-sx") || !strncmp(agv,"-Zm",3) || !strncmp(agv,"-ZH",3)
  2524. || !strncmp(agv,"-z",2) || !strcmp(agv,"-RG") || !strcmp(agv,"-rG") || !strcmp(agv,"-rJ") || !strcmp(agv,"-pp"))
  2525. return 1; /* all flags starting with 'z', don't read data, but have extra-params */
  2526. return 0;
  2527. }
  2528. /********************************* OPTION_TAKES_DATA_AND_HAS_EXTRA_PARAMS *********************************/
  2529. int option_takes_data_and_has_extra_params(char *agv)
  2530. {
  2531. if(!strncmp(agv,"-y",2) /* all flags starting with 'y', read data, and have extra-params */
  2532. || !strncmp(agv,"-Tb",3) || !strncmp(agv,"-TB",3) || !strncmp(agv,"-Ca",3) || !strncmp(agv,"-Cm",3)
  2533. || !strcmp(agv,"-sa") || !strcmp(agv,"-sb") || !strcmp(agv,"-sf") || !strncmp(agv,"-bb",3)
  2534. || !strcmp(agv,"-dd") || !strcmp(agv,"-dL") || !strcmp(agv,"-SM") || !strcmp(agv,"-ga")
  2535. || !strncmp(agv,"-K",2)) /* all flags starting with 'K', read data, and have extra-params */
  2536. return 1;
  2537. return 0;
  2538. }
  2539. /********************************* CHECK_EXCEPTIONAL_PROCESSES ********************************/
  2540. void check_exceptional_processes(int i_ro,int argc)
  2541. {
  2542. if(!sloom && !sloombatch) {
  2543. if(flag=='H' && (ro==ENDOFSTR || i_ro=='r') && cnt>1) {
  2544. fprintf(stderr,"Too many values in file for H");
  2545. if(i_ro=='r')
  2546. fprintf(stderr,"r");
  2547. fprintf(stderr," flag.\n");
  2548. exit(1);
  2549. }
  2550. if((flag=='J' || (flag=='C' && (i_ro == ENDOFSTR || i_ro == 'c'))) && argc<4) {
  2551. fprintf(stderr,"Flags J & C need at least 2 input files.\n");
  2552. exit(1);
  2553. }
  2554. if(((flag=='S' && i_ro==ENDOFSTR) || flag=='N') && argc!=4) {
  2555. fprintf(stderr,"flags S & N or Nr need 1 infilename & 1 generic outfilename.\n");
  2556. exit(1);
  2557. }
  2558. } else {
  2559. if(flag=='H' && (i_ro==ENDOFSTR || i_ro=='r') && cnt>1) {
  2560. fprintf(stdout,"ERROR: Too many values in file this option.\n");
  2561. fflush(stdout);
  2562. exit(1);
  2563. }
  2564. if((flag=='J' || flag=='j'
  2565. || (flag == 'W' && i_ro == 'b')
  2566. || (flag=='e' && (i_ro == 's' || i_ro == 'i' || i_ro == 'A' || i_ro == 'S' || i_ro == 'w' || i_ro == 'W' || i_ro == 'L' || i_ro == 'Q' || i_ro == 'X' || i_ro == 'Y'))
  2567. || (flag == 'A' && i_ro == 'e')) && argc<4) {
  2568. fprintf(stdout,"ERROR: This option needs at least 2 input files.\n");
  2569. fflush(stdout);
  2570. exit(1);
  2571. }
  2572. if(((flag=='S' && i_ro==ENDOFSTR) || flag=='N') && argc!=4) {
  2573. fprintf(stdout,"ERROR: These options need 1 infilename & 1 generic outfilename.\n");
  2574. fflush(stdout);
  2575. exit(1);
  2576. }
  2577. }
  2578. }
  2579. /********************************* HANDLE_MULTIFILE_PROCESSES_AND_THE_OUTPUT_FILE ********************************/
  2580. void handle_multifile_processes_and_the_output_file(int argc, char cflag,int i_ro,char **argv)
  2581. {
  2582. int joico = 0, colcnt2 = 0;
  2583. if(!sloom) {
  2584. if(flag=='J') {
  2585. joico = 1;
  2586. firstcnt = cnt;
  2587. infilecnt = argc-2;
  2588. do_other_stringline_infiles(argv,'J');
  2589. } else if(cflag=='C' && (i_ro == ENDOFSTR || i_ro == 'c')) {
  2590. joico = 1;
  2591. firstcnt = cnt;
  2592. infilecnt = argc-2;
  2593. do_other_infiles(argv);
  2594. } else if(cflag =='j') {
  2595. if(i_ro == 0) {
  2596. infilecnt = 2;
  2597. colcnt2 = do_other_stringline_infile(argv[2]);
  2598. if(colcnt != colcnt2) {
  2599. fprintf(stdout,"ERROR: Incompatible column counts (%d and %d) in these two files.\n",colcnt,colcnt2);
  2600. fflush(stdout);
  2601. exit(1);
  2602. }
  2603. } else if(i_ro =='j') {
  2604. infilecnt = argc-2;
  2605. do_other_stringline_infiles(argv,'j');
  2606. }
  2607. } else if(cflag =='W' && i_ro == 'b') {
  2608. infilecnt = argc-2;
  2609. do_other_stringline_infiles(argv,'W');
  2610. } else if(cflag =='K' && i_ro == 'b') {
  2611. infilecnt = argc-3;
  2612. do_other_infiles(argv);
  2613. } else {
  2614. if(argc>4 && !joico) {
  2615. fprintf(stdout,"Too many arguments.\n");
  2616. fflush(stdout);
  2617. exit(1);
  2618. }
  2619. if(cflag!='S' && flag!='N') {
  2620. /*RWD*/ if(!strcmp(argv[2],"con") || !strcmp(argv[2],"CON"))
  2621. fp[1]=stdout;
  2622. else if(allcols == 1)
  2623. do_outfile(argv[2]);
  2624. else
  2625. strcpy(goalfile,argv[2]);
  2626. }
  2627. }
  2628. } else {
  2629. if(cflag=='A' && i_ro == 'e') {
  2630. joico = 1;
  2631. infilecnt = argc-2;
  2632. if((file_cnt = (int *)malloc(infilecnt * sizeof(int)))==NULL) {
  2633. fprintf(stdout,"ERROR: Out of memory.\n");
  2634. fflush(stdout);
  2635. exit(1);
  2636. }
  2637. file_cnt[0] = cnt;
  2638. do_other_infiles(argv);
  2639. } else if(cflag=='J') {
  2640. joico = 1;
  2641. firstcnt = cnt;
  2642. infilecnt = argc-2;
  2643. do_other_stringline_infiles(argv,'J');
  2644. } else if(cflag=='C' && (i_ro == ENDOFSTR || i_ro == 'c')) {
  2645. joico = 1;
  2646. firstcnt = cnt;
  2647. infilecnt = argc-2;
  2648. do_other_infiles(argv);
  2649. } else if(cflag =='e'
  2650. && (i_ro == 's' || i_ro == 'i' || i_ro == 'a' || i_ro == 'A' || i_ro == 'S' || i_ro == 'w' || i_ro == 'W' || i_ro == 'L' || i_ro == 'Q'
  2651. || i_ro == 'X' || i_ro == 'm' || i_ro =='Y')) {
  2652. firstcnt = cnt;
  2653. infilecnt = 2;
  2654. do_other_infiles(argv);
  2655. } else if(cflag =='w' && (i_ro == 't' || i_ro == 'o')) {
  2656. firstcnt = cnt;
  2657. infilecnt = 2;
  2658. do_other_infiles(argv);
  2659. } else if(cflag =='j') {
  2660. if(i_ro == 0) {
  2661. infilecnt = 2;
  2662. colcnt2 = do_other_stringline_infile(argv[2]);
  2663. if(colcnt != colcnt2) {
  2664. fprintf(stdout,"ERROR: Incompatible column counts (%d and %d) in these two files.\n",colcnt,colcnt2);
  2665. fflush(stdout);
  2666. exit(1);
  2667. }
  2668. } else if(i_ro =='j') {
  2669. infilecnt = argc-2;
  2670. do_other_stringline_infiles(argv,'j');
  2671. }
  2672. } else if(cflag =='W' && i_ro == 'b') {
  2673. infilecnt = argc-2;
  2674. do_other_stringline_infiles(argv,'W');
  2675. } else if(cflag =='K' && i_ro == 'b') {
  2676. infilecnt = argc-3;
  2677. do_other_infiles(argv);
  2678. } else if(!joico) {
  2679. if(argc>4) {
  2680. fprintf(stdout,"ERROR: Too many arguments.\n");
  2681. fflush(stdout);
  2682. exit(1);
  2683. }
  2684. if(cflag!='S' && cflag!='N') {
  2685. if(allcols == 1)
  2686. do_outfile(argv[2]);
  2687. else
  2688. strcpy(goalfile,argv[2]);
  2689. }
  2690. }
  2691. }
  2692. }
  2693. /********************************* ERROR_REPORTING ********************************/
  2694. void cant_read_numeric_value(char cflag,int i_ro) {
  2695. if(!sloom && !sloombatch)
  2696. fprintf(stderr,"Cannot read numerical value with flag %c%c\n",cflag,i_ro);
  2697. else {
  2698. fprintf(stdout,"ERROR: Cannot read numerical value.\n");
  2699. fflush(stdout);
  2700. }
  2701. exit(1);
  2702. }
  2703. void cant_read_numeric_value_with_flag_only(char cflag) {
  2704. if(!sloom && !sloombatch)
  2705. fprintf(stderr,"Cannot read numerical value with flag %c\n",cflag);
  2706. else {
  2707. fprintf(stdout,"ERROR: Cannot read numerical value.\n");
  2708. fflush(stdout);
  2709. }
  2710. exit(1);
  2711. }
  2712. void unknown_flag_only(char cflag)
  2713. {
  2714. if(!sloom && !sloombatch)
  2715. fprintf(stderr,"Unknown flag -%c\n",cflag);
  2716. else {
  2717. fprintf(stdout,"ERROR: Unknown option.\n");
  2718. fflush(stdout);
  2719. }
  2720. exit(1);
  2721. }
  2722. void unknown_flag(char cflag,int i_ro)
  2723. {
  2724. if(!sloom && !sloombatch)
  2725. fprintf(stderr,"Unknown flag -%c%c\n",cflag,i_ro);
  2726. else {
  2727. fprintf(stdout,"ERROR: Unknown option.\n");
  2728. fflush(stdout);
  2729. }
  2730. exit(1);
  2731. }
  2732. void cannot_read_flags(char *flagstr)
  2733. {
  2734. if(!sloom && !sloombatch)
  2735. fprintf(stderr,"Cannot read flag %s.\n",flagstr);
  2736. else {
  2737. fprintf(stdout,"ERROR: Cannot read the option type\n");
  2738. fflush(stdout);
  2739. }
  2740. exit(1);
  2741. }
  2742. void flag_takes_no_params(char cflag,int i_ro)
  2743. {
  2744. if(!sloom && !sloombatch)
  2745. fprintf(stderr,"flag -%c%c does not take a parameter\n",cflag,i_ro);
  2746. else {
  2747. fprintf(stdout,"ERROR: This option does not take a parameter\n");
  2748. fflush(stdout);
  2749. }
  2750. exit(1);
  2751. }
  2752. void flag_only_takes_no_params(char cflag)
  2753. {
  2754. if(!sloom && !sloombatch)
  2755. fprintf(stderr,"flag -%c does not take a parameter\n",cflag);
  2756. else {
  2757. fprintf(stdout,"ERROR: This option does not take a parameter\n");
  2758. fflush(stdout);
  2759. }
  2760. exit(1);
  2761. }
  2762. void unknown_flag_or_bad_param(void)
  2763. {
  2764. if(!sloom && !sloombatch)
  2765. fprintf(stderr,"Unknown flag or inappropriate use of parameter.\n");
  2766. else {
  2767. fprintf(stdout,"ERROR: Unknown flag or inappropriate use of parameter.\n");
  2768. fflush(stdout);
  2769. }
  2770. exit(1);
  2771. }
  2772. void no_value_with_flag(char cflag,int i_ro)
  2773. {
  2774. if(!sloom && !sloombatch)
  2775. fprintf(stderr,"No value supplied with flag -%c%c\n",cflag,i_ro);
  2776. else {
  2777. fprintf(stdout,"ERROR: No value supplied with this option\n");
  2778. fflush(stdout);
  2779. }
  2780. exit(1);
  2781. }
  2782. void no_value_with_flag_only(char cflag)
  2783. {
  2784. if(!sloom && !sloombatch)
  2785. fprintf(stderr,"No value supplied with flag -%c\n",cflag);
  2786. else {
  2787. fprintf(stdout,"ERROR: No value supplied with this option\n");
  2788. fflush(stdout);
  2789. }
  2790. exit(1);
  2791. }
  2792. void no_value_required_with_flag(char cflag,int i_ro)
  2793. {
  2794. if(!sloom && !sloombatch)
  2795. fprintf(stderr,"No parameter required with flag %c%c.\n",cflag,i_ro);
  2796. else {
  2797. fprintf(stdout,"ERROR: No parameter required with this option.\n");
  2798. fflush(stdout);
  2799. }
  2800. exit(1);
  2801. }
  2802. void no_value_required_with_flag_only(char cflag)
  2803. {
  2804. if(!sloom && !sloombatch)
  2805. fprintf(stderr,"No parameter required with flag %c\n",cflag);
  2806. else {
  2807. fprintf(stdout,"ERROR: No parameter required with this option.\n");
  2808. fflush(stdout);
  2809. }
  2810. exit(1);
  2811. }
  2812. void read_flags_data_error(char *str)
  2813. {
  2814. if(!sloom && !sloombatch)
  2815. fprintf(stderr,"%s\n",str);
  2816. else {
  2817. fprintf(stdout,"ERROR: %s\n",str);
  2818. fflush(stdout);
  2819. }
  2820. exit(1);
  2821. }
  2822. void unknown_flag_string(char *flagstr)
  2823. {
  2824. if(!sloom && !sloombatch)
  2825. fprintf(stderr,"Unknown flag %s.\n",flagstr);
  2826. else {
  2827. fprintf(stdout,"ERROR: Unknown option\n");
  2828. fflush(stdout);
  2829. }
  2830. exit(1);
  2831. }
  2832. void do_error(void) {
  2833. if(!sloom && !sloombatch)
  2834. fprintf(stderr,"%s\n",errstr);
  2835. else {
  2836. fprintf(stdout,"ERROR: %s\n",errstr);
  2837. fflush(stdout);
  2838. }
  2839. exit(1);
  2840. }
  2841. void do_valout(double val) {
  2842. if(!sloom && !sloombatch) {
  2843. if(allcols > 1)
  2844. outcoldata[outcoldatacnt++] = val;
  2845. else
  2846. fprintf(fp[1],"%lf\n",val);
  2847. } else
  2848. fprintf(stdout,"INFO: %lf\n",val);
  2849. }
  2850. void do_valout_as_message(double val) {
  2851. if(!sloom && !sloombatch)
  2852. fprintf(fp[1],"%lf\n",val);
  2853. else
  2854. fprintf(stdout,"WARNING: %lf\n",val);
  2855. }
  2856. void do_valout_flush(double val) {
  2857. if(!sloom && !sloombatch) {
  2858. if(allcols > 1)
  2859. outcoldata[outcoldatacnt++] = val;
  2860. else
  2861. fprintf(fp[1],"%lf\n",val);
  2862. } else {
  2863. fprintf(stdout,"INFO: %lf\n",val);
  2864. fflush(stdout);
  2865. }
  2866. }
  2867. void do_stringout(char *str) {
  2868. if(!sloom && !sloombatch) {
  2869. if(allcols > 1)
  2870. outcoldata[outcoldatacnt++] = atof(str);
  2871. else
  2872. fprintf(fp[1],"%s\n",str);
  2873. }
  2874. else
  2875. fprintf(stdout,"INFO: %s\n",str);
  2876. }
  2877. void do_valpair_out(double val0,double val1) {
  2878. if(!sloom && !sloombatch)
  2879. fprintf(fp[1],"%lf %lf\n",val0,val1);
  2880. else
  2881. fprintf(stdout,"INFO: %lf %lf\n",val0,val1);
  2882. }
  2883. /************************* CHECK_FOR_COLUMNEXTRACT ************************/
  2884. void check_for_columnextract(char *argv1,int *argc,char *argv[])
  2885. {
  2886. int this_column, linecnt;
  2887. double dummy;
  2888. char temp2[200], *p = argv[*argc-1];
  2889. if(*p != '-')
  2890. return;
  2891. p++;
  2892. if(*p != '-')
  2893. return;
  2894. p++;
  2895. if(*p != 'c')
  2896. return;
  2897. p++;
  2898. if(sscanf(p,"%d",&thecol)!=1)
  2899. return;
  2900. thecol--;
  2901. strcpy(srcfile,argv1);
  2902. (*argc)--;
  2903. if((fp[0] = fopen(argv1,"r"))==NULL) {
  2904. sprintf(errstr,"Cannot open infile %s\n",argv1);
  2905. do_error();
  2906. }
  2907. if((fp[2] = fopen("__temp.txt","w"))==NULL) {
  2908. sprintf(errstr,"Cannot open temporary file (__temp.txt) to store extracted column\n");
  2909. do_error();
  2910. }
  2911. this_column = 0;
  2912. linecnt = 0;
  2913. while(fgets(temp,200,fp[0])!=NULL) {
  2914. this_column = 0;
  2915. p = temp;
  2916. while(strgetstr(&p,temp2)) {
  2917. if(this_column == thecol) {
  2918. if(sscanf(temp2,"%lf",&dummy) != 1) {
  2919. sprintf(errstr,"Numeric values only for multicolumn data.\n");
  2920. do_error();
  2921. }
  2922. fprintf(fp[2],"%s\n",temp2);
  2923. }
  2924. this_column++;
  2925. }
  2926. if(linecnt == 0) {
  2927. if(this_column <= thecol) {
  2928. sprintf(errstr,"There is no column %d in the input data.\n",thecol+1);
  2929. do_error();
  2930. }
  2931. allcols = this_column;
  2932. } else if(allcols != this_column) {
  2933. sprintf(errstr,"Inconsistent number of columns in data.\n");
  2934. do_error();
  2935. }
  2936. linecnt++;
  2937. }
  2938. fclose(fp[0]);
  2939. fclose(fp[2]);
  2940. if((outcoldata = (double *)malloc(linecnt * sizeof(double))) == NULL) {
  2941. sprintf(errstr,"Failed to allocate memory to store column data.\n");
  2942. do_error();
  2943. }
  2944. }
  2945. /********************************** VALID_CALL_FOR_MULTICOL_INPUT **********************************/
  2946. int valid_call_for_multicol_input(char cflag,int i_ro)
  2947. {
  2948. switch(cflag) {
  2949. case('A'):
  2950. if(i_ro == 's')
  2951. return 1;
  2952. if(noro(i_ro))
  2953. return 1;
  2954. break;
  2955. case('D'):
  2956. if(i_ro == 'B')
  2957. return 1;
  2958. break;
  2959. case('I'):
  2960. if(i_ro == 'r')
  2961. return 1;
  2962. break;
  2963. case('M'):
  2964. if(i_ro == 'h')
  2965. return 1;
  2966. if(i_ro == 'm')
  2967. return 1;
  2968. if(i_ro == 't')
  2969. return 1;
  2970. break;
  2971. case('P'):
  2972. if(noro(i_ro))
  2973. return 1;
  2974. break;
  2975. case('R'):
  2976. if(noro(i_ro))
  2977. return 1;
  2978. if(i_ro == 'A' || i_ro == 'a' || i_ro == 'm' || i_ro == 'o' || i_ro == 's')
  2979. return 1;
  2980. break;
  2981. case('S'):
  2982. if(i_ro == 'L')
  2983. return 1;
  2984. break;
  2985. case('T'):
  2986. if(i_ro == 'c' || i_ro == 'h' || i_ro == 'M' || i_ro == 'l')
  2987. return 1;
  2988. break;
  2989. case('a'):
  2990. if(noro(i_ro))
  2991. return 1;
  2992. break;
  2993. case('b'):
  2994. if(i_ro == 'g' || i_ro == 'l')
  2995. return 1;
  2996. break;
  2997. case('d'):
  2998. if(noro(i_ro))
  2999. return 1;
  3000. if(i_ro == 'b')
  3001. return 1;
  3002. break;
  3003. case('f'):
  3004. if(i_ro == 'l')
  3005. return 1;
  3006. break;
  3007. case('h'):
  3008. if(i_ro == 'M')
  3009. return 1;
  3010. break;
  3011. case('i'):
  3012. if(i_ro == 'L' || i_ro == 'M' || i_ro == 'a' || i_ro == 'h' || i_ro == 'm' || i_ro == 'l')
  3013. return 1;
  3014. break;
  3015. case('l'):
  3016. if(i_ro == 'i')
  3017. return 1;
  3018. break;
  3019. case('m'):
  3020. if(noro(i_ro))
  3021. return 1;
  3022. if(i_ro == 'M' || ro == 'g' || ro == 'l')
  3023. return 1;
  3024. break;
  3025. case('o'):
  3026. case('q'):
  3027. if(noro(i_ro))
  3028. return 1;
  3029. break;
  3030. case('r'):
  3031. if(i_ro == 'S' || i_ro == 'm' || i_ro == 'r')
  3032. return 1;
  3033. break;
  3034. case('s'):
  3035. if(i_ro == 'l' || i_ro == 't')
  3036. return 1;
  3037. break;
  3038. case('t'):
  3039. if(i_ro == 'M' || i_ro == 'h')
  3040. return 1;
  3041. break;
  3042. }
  3043. return 0;
  3044. }
  3045. int noro(int i_ro)
  3046. {
  3047. if(i_ro == ENDOFSTR || i_ro == '.' || i_ro == '-' || isdigit(i_ro))
  3048. return 1;
  3049. return 0;
  3050. }
  3051. void output_multicol_data(void)
  3052. {
  3053. int xcnt;
  3054. int this_column;
  3055. char *p, temp2[200];
  3056. if(strlen(goalfile) > 0) {
  3057. if((fp[0] = fopen(srcfile,"r"))==NULL) {
  3058. sprintf(errstr,"Cannot reopen source file %s\n",srcfile);
  3059. do_error();
  3060. }
  3061. do_outfile(goalfile);
  3062. xcnt = 0;
  3063. while(fgets(temp,200,fp[0])!=NULL) {
  3064. this_column = 0;
  3065. p = temp;
  3066. while(strgetstr(&p,temp2)) {
  3067. if(this_column == thecol)
  3068. fprintf(fp[1],"%lf",outcoldata[xcnt++]);
  3069. else
  3070. fprintf(fp[1],"%s",temp2);
  3071. fprintf(fp[1],"\t");
  3072. this_column++;
  3073. }
  3074. fprintf(fp[1],"\n");
  3075. }
  3076. fclose(fp[0]);
  3077. fclose(fp[1]);
  3078. } else {
  3079. for(xcnt = 0;xcnt < outcoldatacnt;xcnt++)
  3080. fprintf(stdout,"%lf\n",outcoldata[xcnt]);
  3081. fflush(stdout);
  3082. }
  3083. }