Use posix_fadvise(POSIX_FADV_SEQUENTIAL) where available.
-random.c should not know about set_seed.
-
Use AFM files instead of Groff font files, and include AFMs for our default
fonts with the distribution.
+Sat Mar 20 00:53:10 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+ * pspp.texi: Added a brief mention of the SHOW command.
+
Sun Mar 14 21:50:56 2004 Ben Pfaff <blp@gnu.org>
* pspp.texi: Added details on how various features interact.
* INCLUDE:: Include a file within the current one.
* QUIT:: Terminate the PSPP session.
* SET:: Adjust PSPP runtime parameters.
+* SHOW:: Display runtime parameters.
* SUBTITLE:: Provide a document subtitle.
* TITLE:: Provide a document title.
@end menu
This command is not valid within a command file.
-@node SET, SUBTITLE, QUIT, Utilities
+@node SET, SHOW, QUIT, Utilities
@section SET
@vindex SET
overwrite files, for instance) but it is an improvement.
@end table
-@node SUBTITLE, TITLE, SET, Utilities
+@node SHOW, SUBTITLE, SET, Utilities
+@comment node-name, next, previous, up
+@section SHOW
+@vindex SHOW
+
+@display
+SHOW
+ /@var{subcommand}
+
+@end display
+
+@cmd{SHOW} can be used to display the current state of PSPP's
+execution parameters. All of the parameters which can be changed
+using @code{SET} @xref{SET}, can be examined using @cmd{SHOW}, by
+using a subcommand with the same name.
+In addition, @code{SHOW} supports the following subcommands:
+
+@table @code
+@item WARRANTY
+Show details of the lack of warranty for PSPP.
+@item COPYING
+Display the terms of PSPP's copyright licence @ref{License}.
+@end table
+
+
+
+@node SUBTITLE, TITLE, SHOW, Utilities
@section SUBTITLE
@vindex SUBTITLE
msgstr ""
"Project-Id-Version: PSPP 0.3.1\n"
"Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2004-03-13 14:14+0800\n"
+"POT-Creation-Date: 2004-03-20 00:30+0800\n"
"PO-Revision-Date: 2004-01-23 13:04+0800\n"
"Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
"Language-Team: John Darrington <john@darrington.wattle.id.au>\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-#: src/aggregate.c:190 src/aggregate.c:231 src/data-list.c:1363
+#: src/aggregate.c:183 src/aggregate.c:216 src/data-list.c:1363
#: src/data-list.c:1398 src/data-list.c:1411 src/data-list.c:1424
#: src/data-list.c:1457
#, c-format
msgid "%s subcommand given multiple times."
msgstr ""
-#: src/aggregate.c:216
+#: src/aggregate.c:203
msgid "while expecting COLUMNWISE"
msgstr ""
-#: src/aggregate.c:261
+#: src/aggregate.c:244
msgid "BREAK subcommand not specified."
msgstr ""
-#: src/aggregate.c:490
+#: src/aggregate.c:400
msgid "expecting aggregation function"
msgstr ""
-#: src/aggregate.c:506
+#: src/aggregate.c:416
#, c-format
msgid "Unknown aggregation function %s."
msgstr ""
-#: src/aggregate.c:521
+#: src/aggregate.c:431
msgid "expecting `('"
msgstr ""
-#: src/aggregate.c:556
+#: src/aggregate.c:466
#, c-format
msgid "Missing argument %d to %s."
msgstr ""
-#: src/aggregate.c:564
+#: src/aggregate.c:474
#, c-format
msgid "Arguments to %s must be of same type as source variables."
msgstr ""
-#: src/aggregate.c:574 src/expr-prs.c:665
+#: src/aggregate.c:484 src/expr-prs.c:665
msgid "expecting `)'"
msgstr ""
-#: src/aggregate.c:586 src/autorecode.c:110
+#: src/aggregate.c:496
#, c-format
msgid ""
"Number of source variables (%d) does not match number of target variables (%"
"d)."
msgstr ""
-#: src/aggregate.c:653
+#: src/aggregate.c:564
#, c-format
msgid ""
"Variable name %s is not unique within the aggregate file dictionary, which "
msgid "%s - Page %d"
msgstr ""
-#: src/autorecode.c:121 src/command.c:697 src/compute.c:293
+#: src/autorecode.c:121
+#, c-format
+msgid "Source variable count (%d) does not match target variable count (%d)."
+msgstr ""
+
+#: src/autorecode.c:138 src/command.c:690 src/compute.c:293
#: src/data-list.c:380 src/data-list.c:878 src/data-list.c:1690
#: src/do-if.c:263 src/get.c:381 src/lexer.c:387 src/loop.c:241
-#: src/matrix-data.c:510 src/print.c:338 src/print.c:1060 src/recode.c:409
+#: src/matrix-data.c:510 src/print.c:338 src/print.c:1060 src/recode.c:405
#: src/sel-if.c:56 src/sel-if.c:138 src/vector.c:194 src/file-handle.q:88
msgid "expecting end of command"
msgstr ""
-#: src/autorecode.c:131
+#: src/autorecode.c:148
#, c-format
msgid "Target variable %s duplicates existing variable %s."
msgstr ""
-#: src/autorecode.c:138
+#: src/autorecode.c:155
#, c-format
msgid "Duplicate variable name %s among target variables."
msgstr ""
-#: src/cmdline.c:112 src/cmdline.c:131 src/cmdline.c:143 src/command.c:196
-#: src/set.q:315 src/set.q:317 src/set.q:857
+#: src/cmdline.c:114 src/cmdline.c:133 src/cmdline.c:145 src/command.c:196
+#: src/set.q:416 src/set.q:418 src/set.q:958
#, c-format
msgid "%s is not yet implemented."
msgstr ""
-#: src/cmdline.c:157
+#: src/cmdline.c:159
msgid ""
"\n"
"Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.\n"
"Written by Ben Pfaff <blp@gnu.org>."
msgstr ""
-#: src/cmdline.c:217
+#: src/cmdline.c:221
#, c-format
msgid ""
"PSPP, a program for statistical analysis of sample data.\n"
"\n"
msgstr ""
-#: src/cmdline.c:249
+#: src/cmdline.c:253
#, c-format
msgid ""
"\n"
msgid "The sentinel may not be the empty string."
msgstr ""
-#: src/command.c:574
+#: src/command.c:576 src/command.c:708
msgid "This command not allowed when the SAFER option is set."
msgstr ""
-#: src/command.c:597
+#: src/command.c:590
#, c-format
msgid "Error removing `%s': %s."
msgstr ""
-#: src/command.c:647
+#: src/command.c:640
#, c-format
msgid "Couldn't fork: %s."
msgstr ""
-#: src/command.c:688
+#: src/command.c:681
#, c-format
msgid "Error executing command: %s."
msgstr ""
-#: src/command.c:734
+#: src/command.c:731
msgid "No operating system support for this command."
msgstr ""
-#: src/command.c:763
+#: src/command.c:760
msgid "This command is not valid in a syntax file."
msgstr ""
msgid "Extra characters after expression."
msgstr ""
-#: src/count.c:171
+#: src/count.c:156
msgid "Destination cannot be a string variable."
msgstr ""
-#: src/count.c:282
+#: src/count.c:263
#, c-format
msgid ""
"%g THRU %g is not a valid range. The number following THRU must be at least "
msgstr ""
#: src/data-list.c:768 src/data-list.c:899 src/print.c:803
-#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1148
+#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1011
#: src/descript.q:791
msgid "Variable"
msgstr ""
msgid "Error writing file %s: %s."
msgstr ""
-#: src/dfm.c:657
+#: src/dfm.c:656
msgid ""
"This command is not valid here since the current input program does not "
"access the inline file."
msgstr ""
-#: src/dfm.c:664
+#: src/dfm.c:663
msgid "inline file: Opening for reading."
msgstr ""
-#: src/dfm.c:678
+#: src/dfm.c:677
msgid "Skipping remaining inline data."
msgstr ""
-#: src/dfm.c:690
+#: src/dfm.c:689
msgid "reading as a data file"
msgstr ""
-#: src/dfm.c:697
+#: src/dfm.c:696
msgid "writing as a data file"
msgstr ""
msgid "DO IF %d: missing\n"
msgstr ""
-#: src/error.c:113
+#: src/error.c:115
msgid "Terminating NOW due to a fatal error!"
msgstr ""
-#: src/error.c:190
+#: src/error.c:192
msgid "Terminating execution of syntax file due to error."
msgstr ""
-#: src/error.c:192
+#: src/error.c:194
#, c-format
msgid "Errors (%d) exceeds limit (%d)."
msgstr ""
-#: src/error.c:195
+#: src/error.c:197
#, c-format
msgid "Warnings (%d) exceed limit (%d)."
msgstr ""
-#: src/error.c:253
+#: src/error.c:255
msgid "fatal"
msgstr ""
-#: src/error.c:255 src/error.c:262 src/error.c:265 src/expr-prs.c:1464
+#: src/error.c:257 src/error.c:264 src/error.c:267 src/expr-prs.c:1464
msgid "error"
msgstr ""
-#: src/error.c:256 src/error.c:263 src/error.c:266
+#: src/error.c:258 src/error.c:265 src/error.c:268
msgid "warning"
msgstr ""
-#: src/error.c:257 src/error.c:267
+#: src/error.c:259 src/error.c:269
msgid "note"
msgstr ""
-#: src/error.c:259 src/error.c:260
+#: src/error.c:261 src/error.c:262
msgid "installation error"
msgstr ""
msgid "Unknown record type %g."
msgstr ""
-#: src/flip.c:210
+#: src/flip.c:76
+msgid ""
+"FLIP ignores TEMPORARY. Temporary transformations will be made permanent."
+msgstr ""
+
+#: src/flip.c:217
#, c-format
msgid "Could not create acceptable variant for variable %s."
msgstr ""
-#: src/flip.c:226
+#: src/flip.c:233
msgid "Cannot create more than 99999 variable names."
msgstr ""
-#: src/flip.c:270
+#: src/flip.c:277
msgid "Could not create temporary file for FLIP."
msgstr ""
-#: src/flip.c:277 src/flip.c:339
+#: src/flip.c:284 src/flip.c:347
#, c-format
msgid "Error writing FLIP file: %s."
msgstr ""
-#: src/flip.c:381
+#: src/flip.c:389
#, c-format
msgid "Error rewinding FLIP file: %s."
msgstr ""
-#: src/flip.c:385
+#: src/flip.c:393
msgid "Error creating FLIP source file."
msgstr ""
-#: src/flip.c:394
+#: src/flip.c:402
#, c-format
msgid "Error reading FLIP file: %s."
msgstr ""
-#: src/flip.c:406
+#: src/flip.c:414
#, c-format
msgid "Error seeking FLIP source file: %s."
msgstr ""
-#: src/flip.c:411
+#: src/flip.c:419
#, c-format
msgid "Error writing FLIP source file: %s."
msgstr ""
-#: src/flip.c:422
+#: src/flip.c:430
#, c-format
msgid "Error rewind FLIP source file: %s."
msgstr ""
-#: src/flip.c:470
+#: src/flip.c:478
#, c-format
msgid "Error reading FLIP temporary file: %s."
msgstr ""
-#: src/flip.c:473
+#: src/flip.c:481
msgid "Unexpected end of file reading FLIP temporary file."
msgstr ""
msgid "GET translation table from file to memory:\n"
msgstr ""
-#: src/get.c:117 src/get.c:1416
+#: src/get.c:117 src/get.c:1429
#, c-format
msgid " %8s from %3d,%3d to %3d,%3d\n"
msgstr ""
"Variables in dictionary:\n"
msgstr ""
-#: src/get.c:607
+#: src/get.c:610
msgid "The BY subcommand may be given once at most."
msgstr ""
-#: src/get.c:674
+#: src/get.c:677
msgid "The active file may not be specified more than once."
msgstr ""
-#: src/get.c:683
+#: src/get.c:686
msgid "Cannot specify the active file since no active file has been defined."
msgstr ""
-#: src/get.c:715
+#: src/get.c:694
+msgid ""
+"MATCH FILES may not be used after TEMPORARY when the active file is an input "
+"source. Temporary transformations will be made permanent."
+msgstr ""
+
+#: src/get.c:727
msgid ""
"IN, FIRST, and LAST subcommands may not occur before the first FILE or TABLE."
msgstr ""
-#: src/get.c:747
+#: src/get.c:759
#, c-format
msgid "Multiple %s subcommands for a single FILE or TABLE."
msgstr ""
-#: src/get.c:757
+#: src/get.c:769
#, c-format
msgid "Duplicate variable name %s while creating %s variable."
msgstr ""
-#: src/get.c:771
+#: src/get.c:783
msgid ""
"RENAME, KEEP, and DROP subcommands may not occur before the first FILE or "
"TABLE."
msgstr ""
-#: src/get.c:795
+#: src/get.c:807
msgid "The BY subcommand is required when a TABLE subcommand is given."
msgstr ""
-#: src/get.c:816
+#: src/get.c:828
#, c-format
msgid "File %s lacks BY variable %s."
msgstr ""
-#: src/get.c:1328
+#: src/get.c:1341
#, c-format
msgid ""
"Variable %s in file %s (%s) has different type or width from the same "
"variable in earlier file (%s)."
msgstr ""
-#: src/get.c:1378
+#: src/get.c:1391
msgid "expecting COMM or TAPE"
msgstr ""
-#: src/get.c:1411
+#: src/get.c:1424
#, c-format
msgid "IMPORT translation table from file to memory:\n"
msgstr ""
-#: src/getline.c:161
+#: src/getline.c:163
#, c-format
msgid "Can't find `%s' in include file search path."
msgstr ""
-#: src/getline.c:316
+#: src/getline.c:318
#, c-format
msgid "%s: Opening as syntax file."
msgstr ""
-#: src/getline.c:321
+#: src/getline.c:323
#, c-format
msgid "Opening `%s': %s."
msgstr ""
-#: src/getline.c:330 src/html.c:330 src/postscript.c:1461
+#: src/getline.c:332 src/html.c:330 src/postscript.c:1461
#, c-format
msgid "Reading `%s': %s."
msgstr ""
-#: src/getline.c:388
+#: src/getline.c:390
#, c-format
msgid "Closing `%s': %s."
msgstr ""
-#: src/glob.c:212
-msgid "data> "
-msgstr ""
-
-#: src/glob.c:269
-msgid "Specify a terminal type with `setenv TERM <yourtype>'."
-msgstr ""
-
-#: src/glob.c:275
-msgid "Could not access the termcap data base."
-msgstr ""
-
-#: src/glob.c:277
-#, c-format
-msgid "Terminal type `%s' is not defined."
-msgstr ""
-
-#: src/glob.c:278
-msgid "Assuming screen of size 79x25."
-msgstr ""
-
#: src/groff-font.c:107
#, c-format
msgid "%s: Opening Groff font file..."
msgid "expecting %s"
msgstr ""
-#: src/lexer.c:524
+#: src/lexer.c:524 src/val-labs.c:148
msgid "expecting string"
msgstr ""
-#: src/lexer.c:538
+#: src/lexer.c:538 src/val-labs.c:157
msgid "expecting integer"
msgstr ""
msgid "%s without %s."
msgstr ""
-#: src/main.c:71
-msgid "Error initializing output drivers."
-msgstr ""
-
-#: src/main.c:132
-msgid "This command not executed."
-msgstr ""
-
-#: src/main.c:136
-msgid ""
-"Skipping the rest of this command. Part of this command may have been "
-"executed."
-msgstr ""
-
-#: src/main.c:141
-msgid ""
-"Skipping the rest of this command. This command was fully executed up to "
-"this point."
-msgstr ""
-
-#: src/main.c:146
-msgid ""
-"Trailing garbage was encountered following this command. The command was "
-"fully executed to this point."
-msgstr ""
-
#: src/matrix-data.c:191
msgid "VARIABLES subcommand multiply specified."
msgstr ""
msgid "End of line expected %s while reading %s."
msgstr ""
-#: src/matrix-data.c:1179
+#: src/matrix-data.c:1174
#, c-format
msgid "expecting value for %s %s"
msgstr ""
-#: src/matrix-data.c:1339
+#: src/matrix-data.c:1336
#, c-format
msgid "Syntax error expecting SPLIT FILE value %s."
msgstr ""
-#: src/matrix-data.c:1348
+#: src/matrix-data.c:1345
#, c-format
msgid "Expecting value %g for %s."
msgstr ""
-#: src/matrix-data.c:1387 src/matrix-data.c:1842
+#: src/matrix-data.c:1386 src/matrix-data.c:1854
#, c-format
msgid "Syntax error expecting factor value %s."
msgstr ""
-#: src/matrix-data.c:1396
+#: src/matrix-data.c:1395
#, c-format
msgid "Syntax error expecting value %g for %s %s."
msgstr ""
-#: src/matrix-data.c:1623
+#: src/matrix-data.c:1631
#, c-format
msgid "Syntax error %s expecting SPLIT FILE value."
msgstr ""
-#: src/matrix-data.c:1751
+#: src/matrix-data.c:1761
#, c-format
msgid ""
"Expected %d lines of data for %s content; actually saw %d lines. No data "
"will be output for this content."
msgstr ""
-#: src/matrix-data.c:1785
+#: src/matrix-data.c:1796
#, c-format
msgid "Multiply specified ROWTYPE_ %s."
msgstr ""
-#: src/matrix-data.c:1790
+#: src/matrix-data.c:1801
#, c-format
msgid "Syntax error %s expecting ROWTYPE_ string."
msgstr ""
-#: src/matrix-data.c:1810
+#: src/matrix-data.c:1821
#, c-format
msgid "Syntax error %s."
msgstr ""
-#: src/matrix-data.c:1958
+#: src/matrix-data.c:1971
#, c-format
msgid "Duplicate specification for %s."
msgstr ""
-#: src/matrix-data.c:1970
+#: src/matrix-data.c:1983
#, c-format
msgid "Too many rows of matrix data for %s."
msgstr ""
-#: src/matrix-data.c:2016
+#: src/matrix-data.c:2029
#, c-format
msgid "Syntax error expecting value for %s %s."
msgstr ""
msgid "(!!!INTERNAL ERROR--%d!!!)\n"
msgstr ""
-#: src/modify-vars.c:108
+#: src/modify-vars.c:88
+msgid ""
+"MODIFY VARS may not be used after TEMPORARY. Temporary transformations will "
+"be made permanent."
+msgstr ""
+
+#: src/modify-vars.c:115
msgid "REORDER subcommand may be given at most once."
msgstr ""
-#: src/modify-vars.c:131
+#: src/modify-vars.c:138
msgid "Cannot specify ALL after specifying a set of variables."
msgstr ""
-#: src/modify-vars.c:141
+#: src/modify-vars.c:148
msgid "`(' expected on REORDER subcommand."
msgstr ""
-#: src/modify-vars.c:153
+#: src/modify-vars.c:160
msgid "`)' expected following variable names on REORDER subcommand."
msgstr ""
-#: src/modify-vars.c:171
+#: src/modify-vars.c:178
msgid "RENAME subcommand may be given at most once."
msgstr ""
-#: src/modify-vars.c:184
+#: src/modify-vars.c:191
msgid "`(' expected on RENAME subcommand."
msgstr ""
-#: src/modify-vars.c:192
+#: src/modify-vars.c:199
msgid ""
"`=' expected between lists of new and old variable names on RENAME "
"subcommand."
msgstr ""
-#: src/modify-vars.c:200 src/rename-vars.c:70
+#: src/modify-vars.c:207 src/rename-vars.c:77
#, c-format
msgid ""
"Differing number of variables in old name list (%d) and in new name list (%"
"d)."
msgstr ""
-#: src/modify-vars.c:211
+#: src/modify-vars.c:218
msgid "`)' expected after variable lists on RENAME subcommand."
msgstr ""
-#: src/modify-vars.c:225
+#: src/modify-vars.c:232
msgid ""
"KEEP subcommand may be given at most once. It may notbe given in "
"conjunction with the DROP subcommand."
msgstr ""
-#: src/modify-vars.c:267
+#: src/modify-vars.c:274
msgid ""
"DROP subcommand may be given at most once. It may not be given in "
"conjunction with the KEEP subcommand."
msgstr ""
-#: src/modify-vars.c:293
+#: src/modify-vars.c:300
#, c-format
msgid "Unrecognized subcommand name `%s'."
msgstr ""
-#: src/modify-vars.c:295
+#: src/modify-vars.c:302
msgid "Subcommand name expected."
msgstr ""
-#: src/modify-vars.c:303
+#: src/modify-vars.c:310
msgid "`/' or `.' expected."
msgstr ""
"SPACE a negative number of lines."
msgstr ""
-#: src/recode.c:288
+#: src/recode.c:283
#, c-format
msgid ""
"%d variable(s) cannot be recoded into %d variable(s). Specify the same "
"number of variables as input and output variables."
msgstr ""
-#: src/recode.c:302
+#: src/recode.c:297
#, c-format
msgid ""
"There is no string variable named %s. (All string variables specified on "
"variable.)"
msgstr ""
-#: src/recode.c:311
+#: src/recode.c:306
#, c-format
msgid ""
"Type mismatch between input and output variables. Output variable %s is not "
"a string variable, but all the input variables are string variables."
msgstr ""
-#: src/recode.c:330
+#: src/recode.c:325
#, c-format
msgid "Type mismatch after INTO: %s is not a numeric variable."
msgstr ""
-#: src/recode.c:360
+#: src/recode.c:355
msgid ""
"INTO must be used when the input values are numeric and output values are "
"string."
msgstr ""
-#: src/recode.c:368
+#: src/recode.c:363
msgid ""
"INTO must be used when the input values are string and output values are "
"numeric."
msgstr ""
-#: src/recode.c:493
+#: src/recode.c:486
msgid "expecting output value"
msgstr ""
-#: src/recode.c:507
+#: src/recode.c:500
msgid ""
"Inconsistent output types. The output values must be all numeric or all "
"string."
msgstr ""
-#: src/recode.c:558
+#: src/recode.c:551
msgid "following LO THRU"
msgstr ""
-#: src/recode.c:574 src/recode.c:603
+#: src/recode.c:567 src/recode.c:596
msgid "in source value"
msgstr ""
-#: src/recode.c:616
+#: src/recode.c:609
msgid ""
"Keyword CONVERT may only be used with string input values and numeric output "
"values."
msgstr ""
-#: src/recode.c:876
-#, c-format
-msgid "!!END!!"
-msgstr ""
-
-#: src/recode.c:897 src/recode.c:913
-#, c-format
-msgid "!!ERROR!!"
+#: src/rename-vars.c:47
+msgid ""
+"RENAME VARS may not be used after TEMPORARY. Temporary transformations will "
+"be made permanent."
msgstr ""
-#: src/rename-vars.c:55
+#: src/rename-vars.c:62
msgid "`(' expected."
msgstr ""
-#: src/rename-vars.c:63
+#: src/rename-vars.c:70
msgid "`=' expected between lists of new and old variable names."
msgstr ""
-#: src/rename-vars.c:81
+#: src/rename-vars.c:88
msgid "`)' expected after variable names."
msgstr ""
-#: src/rename-vars.c:91
+#: src/rename-vars.c:98
#, c-format
msgid "Renaming would duplicate variable name %s."
msgstr ""
msgid "writing as a system file"
msgstr ""
-#: src/sort.c:122
-msgid "`A' or `D' expected inside parentheses."
+#: src/sort.c:82
+msgid ""
+"SORT CASES may not be used after TEMPORARY. Temporary transformations will "
+"be made permanent."
msgstr ""
#: src/sort.c:127
+msgid "`A' or `D' expected inside parentheses."
+msgstr ""
+
+#: src/sort.c:132
msgid "`)' expected."
msgstr ""
-#: src/sort.c:418
+#: src/sort.c:421
#, c-format
msgid "%s: Creating temporary directory: %s."
msgstr ""
-#: src/sort.c:449
+#: src/sort.c:452
#, c-format
msgid "Generating temporary directory name failed: %s."
msgstr ""
-#: src/sort.c:457
+#: src/sort.c:460
#, c-format
msgid "Creating temporary directory failed: %s."
msgstr ""
-#: src/sort.c:509
+#: src/sort.c:512
#, c-format
msgid "%s: Error removing directory for temporary files: %s."
msgstr ""
-#: src/sort.c:538
+#: src/sort.c:541
#, c-format
msgid "%s: Error opening temporary file for %s: %s."
msgstr ""
-#: src/sort.c:555
+#: src/sort.c:558
#, c-format
msgid "%s: Error closing temporary file: %s."
msgstr ""
-#: src/sort.c:571
+#: src/sort.c:574
#, c-format
msgid "%s: Error removing temporary file: %s."
msgstr ""
-#: src/sort.c:587
+#: src/sort.c:590
#, c-format
msgid "%s: Error writing temporary file: %s."
msgstr ""
-#: src/sort.c:605
+#: src/sort.c:608
#, c-format
msgid "%s: Error reading temporary file: %s."
msgstr ""
-#: src/sort.c:608
+#: src/sort.c:611
#, c-format
msgid "%s: Unexpected end of temporary file."
msgstr ""
-#: src/sort.c:798 src/sort.c:1033
+#: src/sort.c:806 src/sort.c:1037
#, c-format
msgid ""
"Out of memory. Could not allocate room for minimum of %d cases of %d bytes "
msgid "Documents in the active file:"
msgstr ""
-#: src/sysfile-info.c:377 src/sysfile-info.c:535 src/vfm.c:1150
+#: src/sysfile-info.c:377 src/sysfile-info.c:535 src/vfm.c:1013
msgid "Label"
msgstr ""
msgid "Missing Values: "
msgstr ""
-#: src/sysfile-info.c:534 src/vfm.c:1149 src/crosstabs.q:1158
-#: src/crosstabs.q:1185 src/crosstabs.q:1205 src/crosstabs.q:1227
+#: src/sysfile-info.c:534 src/vfm.c:1012 src/crosstabs.q:1159
+#: src/crosstabs.q:1186 src/crosstabs.q:1206 src/crosstabs.q:1228
#: src/frequencies.q:1009 src/frequencies.q:1126
msgid "Value"
msgstr ""
"bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
msgstr ""
-#: src/temporary.c:49
+#: src/temporary.c:47
msgid "This command is not valid inside DO IF or LOOP."
msgstr ""
-#: src/temporary.c:56
+#: src/temporary.c:54
msgid ""
"This command may only appear once between procedures and procedure-like "
"commands."
msgid "Document entered %s %02d:%02d:%02d by %s (%s):"
msgstr ""
-#: src/val-labs.c:138
+#: src/val-labs.c:112
#, c-format
msgid ""
"It is not possible to assign value labels to long string variables such as %"
"s."
msgstr ""
-#: src/val-labs.c:176
-msgid "String expected for value."
-msgstr ""
-
-#: src/val-labs.c:185
-msgid "Number expected for value."
-msgstr ""
-
-#: src/val-labs.c:189
+#: src/val-labs.c:161
#, c-format
msgid "Value label `%g' is not integer."
msgstr ""
-#: src/val-labs.c:199
+#: src/val-labs.c:171
msgid "Truncating value label to 60 characters."
msgstr ""
-#: src/val-labs.c:220
-msgid "Value labels:"
-msgstr ""
-
-#: src/val-labs.c:237
-#, c-format
-msgid " (no value labels)\n"
-msgstr ""
-
#: src/var-labs.c:53
msgid "String expected for variable label."
msgstr ""
"the long form or the short form of VECTOR."
msgstr ""
-#: src/vfm.c:391
-msgid "<NOVAR>"
+#: src/vfm.c:507
+#, c-format
+msgid ""
+"An error occurred creating a temporary file for use as the active file: %s."
msgstr ""
-#: src/vfm.c:554
+#: src/vfm.c:520
#, c-format
msgid ""
-"An error occurred attempting to create a temporary file for use as the "
-"active file: %s."
+"An error occurred writing to a temporary file used as the active file: %s."
msgstr ""
-#: src/vfm.c:579
+#: src/vfm.c:599
#, c-format
msgid ""
-"An error occurred while attempting to write to a temporary file used as the "
-"active file: %s."
+"Workspace limit of %d KB (%d cases at %d bytes each) overflowed. Writing "
+"active file to disk."
msgstr ""
-#: src/vfm.c:606
+#: src/vfm.c:631
#, c-format
msgid ""
"An error occurred while attempting to rewind a temporary file used as the "
"active file: %s."
msgstr ""
-#: src/vfm.c:651
+#: src/vfm.c:680
#, c-format
msgid ""
"An error occurred while attempting to read from a temporary file created for "
"the active file: %s."
msgstr ""
-#: src/vfm.c:755
-msgid "Virtual memory exhausted. Writing active file to disk."
-msgstr ""
-
-#: src/vfm.c:758
-#, c-format
-msgid ""
-"Workspace limit of %d KB (%d cases at %d bytes each) overflowed. Writing "
-"active file to disk."
-msgstr ""
-
-#: src/vfm.c:778 src/vfm.c:817
-#, c-format
-msgid ""
-"An error occurred while attempting to write to a temporary file created as "
-"the active file: %s."
-msgstr ""
-
#: src/weight.c:54
msgid "The weighting variable must be numeric."
msgstr ""
msgid "Write mode ALL not allowed in general mode. Assuming WRITE=CELLS."
msgstr ""
-#: src/crosstabs.q:321
+#: src/crosstabs.q:322
msgid "expecting BY"
msgstr ""
-#: src/crosstabs.q:388
+#: src/crosstabs.q:389
msgid "VARIABLES must be specified before TABLES."
msgstr ""
-#: src/crosstabs.q:425
+#: src/crosstabs.q:426
#, c-format
msgid "Maximum value (%ld) less than minimum value (%ld)."
msgstr ""
-#: src/crosstabs.q:859
+#: src/crosstabs.q:860
msgid "Summary."
msgstr ""
-#: src/crosstabs.q:861
+#: src/crosstabs.q:862
msgid "Cases"
msgstr ""
-#: src/crosstabs.q:862 src/frequencies.q:1007
+#: src/crosstabs.q:863 src/frequencies.q:1007
msgid "Valid"
msgstr ""
-#: src/crosstabs.q:863 src/frequencies.q:1074
+#: src/crosstabs.q:864 src/frequencies.q:1074
msgid "Missing"
msgstr ""
-#: src/crosstabs.q:864 src/crosstabs.q:1067 src/crosstabs.q:1800
+#: src/crosstabs.q:865 src/crosstabs.q:1068 src/crosstabs.q:1801
#: src/frequencies.q:1083
msgid "Total"
msgstr ""
-#: src/crosstabs.q:874 src/t-test.q:655 src/t-test.q:678 src/t-test.q:769
-#: src/t-test.q:1343
+#: src/crosstabs.q:875 src/t-test.q:657 src/t-test.q:680 src/t-test.q:771
+#: src/t-test.q:1345
msgid "N"
msgstr ""
-#: src/crosstabs.q:875 src/frequencies.q:1011 src/frequencies.q:1012
+#: src/crosstabs.q:876 src/frequencies.q:1011 src/frequencies.q:1012
#: src/frequencies.q:1013
msgid "Percent"
msgstr ""
-#: src/crosstabs.q:1117
+#: src/crosstabs.q:1118
msgid "count"
msgstr ""
-#: src/crosstabs.q:1118
+#: src/crosstabs.q:1119
msgid "row %"
msgstr ""
-#: src/crosstabs.q:1119
+#: src/crosstabs.q:1120
msgid "column %"
msgstr ""
-#: src/crosstabs.q:1120
+#: src/crosstabs.q:1121
msgid "total %"
msgstr ""
-#: src/crosstabs.q:1121
+#: src/crosstabs.q:1122
msgid "expected"
msgstr ""
-#: src/crosstabs.q:1122
+#: src/crosstabs.q:1123
msgid "residual"
msgstr ""
-#: src/crosstabs.q:1123
+#: src/crosstabs.q:1124
msgid "std. resid."
msgstr ""
-#: src/crosstabs.q:1124
+#: src/crosstabs.q:1125
msgid "adj. resid."
msgstr ""
-#: src/crosstabs.q:1157 src/crosstabs.q:1184 src/crosstabs.q:1204
-#: src/crosstabs.q:1225
+#: src/crosstabs.q:1158 src/crosstabs.q:1185 src/crosstabs.q:1205
+#: src/crosstabs.q:1226
msgid "Statistic"
msgstr ""
-#: src/crosstabs.q:1159 src/t-test.q:920 src/t-test.q:1121 src/t-test.q:1227
+#: src/crosstabs.q:1160 src/t-test.q:922 src/t-test.q:1123 src/t-test.q:1229
msgid "df"
msgstr ""
-#: src/crosstabs.q:1161
+#: src/crosstabs.q:1162
msgid "Asymp. Sig. (2-sided)"
msgstr ""
-#: src/crosstabs.q:1163
+#: src/crosstabs.q:1164
msgid "Exact. Sig. (2-sided)"
msgstr ""
-#: src/crosstabs.q:1165
+#: src/crosstabs.q:1166
msgid "Exact. Sig. (1-sided)"
msgstr ""
-#: src/crosstabs.q:1183 src/crosstabs.q:1224
+#: src/crosstabs.q:1184 src/crosstabs.q:1225
msgid "Category"
msgstr ""
-#: src/crosstabs.q:1186 src/crosstabs.q:1228
+#: src/crosstabs.q:1187 src/crosstabs.q:1229
msgid "Asymp. Std. Error"
msgstr ""
-#: src/crosstabs.q:1187 src/crosstabs.q:1229
+#: src/crosstabs.q:1188 src/crosstabs.q:1230
msgid "Approx. T"
msgstr ""
-#: src/crosstabs.q:1188 src/crosstabs.q:1230
+#: src/crosstabs.q:1189 src/crosstabs.q:1231
msgid "Approx. Sig."
msgstr ""
-#: src/crosstabs.q:1203
+#: src/crosstabs.q:1204
#, c-format
msgid " 95%% Confidence Interval"
msgstr ""
-#: src/crosstabs.q:1206 src/t-test.q:924 src/t-test.q:1118 src/t-test.q:1230
+#: src/crosstabs.q:1207 src/t-test.q:926 src/t-test.q:1120 src/t-test.q:1232
msgid "Lower"
msgstr ""
-#: src/crosstabs.q:1207 src/t-test.q:925 src/t-test.q:1119 src/t-test.q:1231
+#: src/crosstabs.q:1208 src/t-test.q:927 src/t-test.q:1121 src/t-test.q:1233
msgid "Upper"
msgstr ""
-#: src/crosstabs.q:1226
+#: src/crosstabs.q:1227
msgid "Type"
msgstr ""
-#: src/crosstabs.q:1976
+#: src/crosstabs.q:1977
msgid "Pearson Chi-Square"
msgstr ""
-#: src/crosstabs.q:1977
+#: src/crosstabs.q:1978
msgid "Likelihood Ratio"
msgstr ""
-#: src/crosstabs.q:1978
+#: src/crosstabs.q:1979
msgid "Fisher's Exact Test"
msgstr ""
-#: src/crosstabs.q:1979
+#: src/crosstabs.q:1980
msgid "Continuity Correction"
msgstr ""
-#: src/crosstabs.q:1980
+#: src/crosstabs.q:1981
msgid "Linear-by-Linear Association"
msgstr ""
-#: src/crosstabs.q:2017 src/crosstabs.q:2087 src/crosstabs.q:2146
+#: src/crosstabs.q:2018 src/crosstabs.q:2088 src/crosstabs.q:2147
msgid "N of Valid Cases"
msgstr ""
-#: src/crosstabs.q:2033 src/crosstabs.q:2162
+#: src/crosstabs.q:2034 src/crosstabs.q:2163
msgid "Nominal by Nominal"
msgstr ""
-#: src/crosstabs.q:2034 src/crosstabs.q:2163
+#: src/crosstabs.q:2035 src/crosstabs.q:2164
msgid "Ordinal by Ordinal"
msgstr ""
-#: src/crosstabs.q:2035
+#: src/crosstabs.q:2036
msgid "Interval by Interval"
msgstr ""
-#: src/crosstabs.q:2036
+#: src/crosstabs.q:2037
msgid "Measure of Agreement"
msgstr ""
-#: src/crosstabs.q:2041
+#: src/crosstabs.q:2042
msgid "Phi"
msgstr ""
-#: src/crosstabs.q:2042
+#: src/crosstabs.q:2043
msgid "Cramer's V"
msgstr ""
-#: src/crosstabs.q:2043
+#: src/crosstabs.q:2044
msgid "Contingency Coefficient"
msgstr ""
-#: src/crosstabs.q:2044
+#: src/crosstabs.q:2045
msgid "Kendall's tau-b"
msgstr ""
-#: src/crosstabs.q:2045
+#: src/crosstabs.q:2046
msgid "Kendall's tau-c"
msgstr ""
-#: src/crosstabs.q:2046
+#: src/crosstabs.q:2047
msgid "Gamma"
msgstr ""
-#: src/crosstabs.q:2047
+#: src/crosstabs.q:2048
msgid "Spearman Correlation"
msgstr ""
-#: src/crosstabs.q:2048
+#: src/crosstabs.q:2049
msgid "Pearson's R"
msgstr ""
-#: src/crosstabs.q:2049
+#: src/crosstabs.q:2050
msgid "Kappa"
msgstr ""
-#: src/crosstabs.q:2119
+#: src/crosstabs.q:2120
#, c-format
msgid "Odds Ratio for %s (%g / %g)"
msgstr ""
-#: src/crosstabs.q:2122
+#: src/crosstabs.q:2123
#, c-format
msgid "Odds Ratio for %s (%.*s / %.*s)"
msgstr ""
-#: src/crosstabs.q:2130
+#: src/crosstabs.q:2131
#, c-format
msgid "For cohort %s = %g"
msgstr ""
-#: src/crosstabs.q:2133
+#: src/crosstabs.q:2134
#, c-format
msgid "For cohort %s = %.*s"
msgstr ""
-#: src/crosstabs.q:2164
+#: src/crosstabs.q:2165
msgid "Nominal by Interval"
msgstr ""
-#: src/crosstabs.q:2169
+#: src/crosstabs.q:2170
msgid "Lambda"
msgstr ""
-#: src/crosstabs.q:2170
+#: src/crosstabs.q:2171
msgid "Goodman and Kruskal tau"
msgstr ""
-#: src/crosstabs.q:2171
+#: src/crosstabs.q:2172
msgid "Uncertainty Coefficient"
msgstr ""
-#: src/crosstabs.q:2172
+#: src/crosstabs.q:2173
msgid "Somers' d"
msgstr ""
-#: src/crosstabs.q:2173
+#: src/crosstabs.q:2174
msgid "Eta"
msgstr ""
-#: src/crosstabs.q:2178
+#: src/crosstabs.q:2179
msgid "Symmetric"
msgstr ""
-#: src/crosstabs.q:2179 src/crosstabs.q:2180
+#: src/crosstabs.q:2180 src/crosstabs.q:2181
#, c-format
msgid "%s Dependent"
msgstr ""
-#: src/descript.q:151 src/frequencies.q:94 src/t-test.q:656 src/t-test.q:679
-#: src/t-test.q:768 src/t-test.q:1115
+#: src/descript.q:151 src/frequencies.q:94 src/t-test.q:658 src/t-test.q:681
+#: src/t-test.q:770 src/t-test.q:1117
msgid "Mean"
msgstr ""
msgid "Upper value (%g) is less than lower value (%g) on VARIABLES subcommand."
msgstr ""
-#: src/set.q:217 src/set.q:220 src/set.q:238 src/set.q:307 src/set.q:313
-#: src/set.q:338 src/set.q:340 src/set.q:359 src/set.q:363 src/set.q:367
-#: src/set.q:381 src/set.q:383 src/set.q:387 src/set.q:705 src/set.q:786
-#: src/set.q:867
+#: src/set.q:216 src/set.q:288 src/set.q:332 src/set.q:389 src/set.q:391
+#: src/set.q:393 src/set.q:395 src/set.q:397 src/set.q:399 src/set.q:401
+#: src/set.q:403 src/set.q:405 src/set.q:407 src/set.q:409 src/set.q:411
+#: src/set.q:413 src/set.q:792 src/set.q:873 src/set.q:968
#, c-format
msgid "%s is obsolete."
msgstr ""
#: src/set.q:224
-msgid "Active file compression is not yet implemented (and probably won't be)."
+msgid "LISTING is ON"
msgstr ""
-#: src/set.q:233
-msgid "CPI must be greater than 0."
+#: src/set.q:226
+msgid "LISTING is OFF"
msgstr ""
-#: src/set.q:242
-msgid "LPI must be greater than 0."
+#: src/set.q:252
+msgid "Journalling is off"
msgstr ""
-#: src/set.q:249
+#: src/set.q:422
msgid ""
"CASE is not implemented and probably won't be. If you care, complain about "
"it."
msgstr ""
-#: src/set.q:279
+#: src/set.q:427
+msgid "Active file compression is not yet implemented (and probably won't be)."
+msgstr ""
+
+#: src/set.q:441
#, c-format
-msgid "Value for MITERATE (%ld) must be greater than 0."
+msgid ""
+"CC%c: Length of custom currency string `%s' (%d) exceeds maximum length of "
+"16."
msgstr ""
-#: src/set.q:287
+#: src/set.q:463
#, c-format
-msgid "Value for MNEST (%ld) must be greater than 0."
+msgid ""
+"CC%c: Custom currency string `%s' does not contain exactly three periods or "
+"commas (not both)."
msgstr ""
-#: src/set.q:295
-msgid "MXERRS must be at least 1."
+#: src/set.q:516
+msgid "None"
msgstr ""
-#: src/set.q:302
-msgid "MXLOOPS must be at least 1."
+#: src/set.q:522
+msgid "Disabled"
msgstr ""
-#: src/set.q:323
-msgid "Workspace limit must be at least 1 MB."
+#: src/set.q:527
+msgid "Screen"
msgstr ""
-#: src/set.q:401
-#, c-format
-msgid ""
-"CC%c: Length of custom currency string `%s' (%d) exceeds maximum length of "
-"16."
+#: src/set.q:534
+msgid "Listing"
msgstr ""
-#: src/set.q:423
-#, c-format
-msgid ""
-"CC%c: Custom currency string `%s' does not contain exactly three periods or "
-"commas (not both)."
+#: src/set.q:541
+msgid "Other"
msgstr ""
-#: src/set.q:566
+#: src/set.q:650
msgid "LENGTH must be at least 1."
msgstr ""
-#: src/set.q:603
+#: src/set.q:689
msgid "Missing identifier in RESULTS subcommand."
msgstr ""
-#: src/set.q:614
+#: src/set.q:700
msgid "Unrecognized identifier in RESULTS subcommand."
msgstr ""
-#: src/set.q:651
+#: src/set.q:738
msgid "WIDTH must be at least 1."
msgstr ""
-#: src/set.q:674
+#: src/set.q:761
#, c-format
msgid ""
"FORMAT requires numeric output format as an argument. Specified format %s "
"is of type string."
msgstr ""
-#: src/set.q:718
+#: src/set.q:805
msgid "Text color must be in range 0-15."
msgstr "Text colour must be in range 0-15."
-#: src/set.q:731
+#: src/set.q:818
msgid "Background color must be in range 0-7."
msgstr "Background colour must be in range 0-7."
-#: src/set.q:742
+#: src/set.q:829
msgid "Border color must be in range 0-7."
msgstr "Border colour must be in range 0-7."
-#: src/set.q:798
+#: src/set.q:885
msgid "Lower window color must be between 0 and 6."
msgstr "Lower window colour must be between 0 and 6."
-#: src/set.q:812
+#: src/set.q:899
msgid "Upper window color must be between 0 and 6."
msgstr "Upper window colour must be between 0 and 6."
-#: src/set.q:824
+#: src/set.q:911
msgid "Frame color must be between 0 and 6."
msgstr "Frame colour must be between 0 and 6."
-#: src/set.q:876
+#: src/set.q:977
msgid "Drive letter expected in WORKDEV subcommand."
msgstr ""
+#: src/set.q:1012
+msgid "Specify a terminal type with `setenv TERM <yourtype>'."
+msgstr ""
+
+#: src/set.q:1018
+msgid "Could not access the termcap data base."
+msgstr ""
+
+#: src/set.q:1020
+#, c-format
+msgid "Terminal type `%s' is not defined."
+msgstr ""
+
+#: src/set.q:1048
+msgid "data> "
+msgstr ""
+
#: src/t-test.q:237
msgid "TESTVAL, GROUPS and PAIRS subcommands are mutually exclusive."
msgstr ""
msgid "VARIABLES subcommand is not appropriate with PAIRS"
msgstr ""
-#: src/t-test.q:352 src/t-test.q:429
+#: src/t-test.q:354 src/t-test.q:431
#, c-format
msgid "`%s' is not a variable name"
msgstr ""
-#: src/t-test.q:365
+#: src/t-test.q:367
#, c-format
msgid "Long string variable %s is not valid here."
msgstr ""
-#: src/t-test.q:382
+#: src/t-test.q:384
msgid ""
"When applying GROUPS to a string variable, at least one value must be "
"specified."
msgstr ""
-#: src/t-test.q:464
+#: src/t-test.q:466
#, c-format
msgid ""
"PAIRED was specified but the number of variables preceding WITH (%d) did not "
"match the number following (%d)."
msgstr ""
-#: src/t-test.q:481
+#: src/t-test.q:483
msgid "At least two variables must be specified on PAIRS."
msgstr ""
-#: src/t-test.q:653
+#: src/t-test.q:655
msgid "One-Sample Statistics"
msgstr ""
-#: src/t-test.q:657 src/t-test.q:680 src/t-test.q:770 src/t-test.q:1116
+#: src/t-test.q:659 src/t-test.q:682 src/t-test.q:772 src/t-test.q:1118
msgid "Std. Deviation"
msgstr ""
-#: src/t-test.q:658 src/t-test.q:681 src/t-test.q:771
+#: src/t-test.q:660 src/t-test.q:683 src/t-test.q:773
msgid "SE. Mean"
msgstr ""
-#: src/t-test.q:675
+#: src/t-test.q:677
msgid "Group Statistics"
msgstr ""
-#: src/t-test.q:765
+#: src/t-test.q:767
msgid "Paired Sample Statistics"
msgstr ""
-#: src/t-test.q:787 src/t-test.q:1144 src/t-test.q:1364
+#: src/t-test.q:789 src/t-test.q:1146 src/t-test.q:1366
#, c-format
msgid "Pair %d"
msgstr ""
-#: src/t-test.q:905
+#: src/t-test.q:907
msgid "Independent Samples Test"
msgstr ""
-#: src/t-test.q:913
+#: src/t-test.q:915
msgid "Levene's Test for Equality of Variances"
msgstr ""
-#: src/t-test.q:915
+#: src/t-test.q:917
msgid "t-test for Equality of Means"
msgstr ""
-#: src/t-test.q:917
+#: src/t-test.q:919
msgid "F"
msgstr ""
-#: src/t-test.q:918 src/t-test.q:1345
+#: src/t-test.q:920 src/t-test.q:1347
msgid "Sig."
msgstr ""
-#: src/t-test.q:919 src/t-test.q:1120 src/t-test.q:1226
+#: src/t-test.q:921 src/t-test.q:1122 src/t-test.q:1228
msgid "t"
msgstr ""
-#: src/t-test.q:921 src/t-test.q:1122 src/t-test.q:1228
+#: src/t-test.q:923 src/t-test.q:1124 src/t-test.q:1230
msgid "Sig. (2-tailed)"
msgstr ""
-#: src/t-test.q:922 src/t-test.q:1229
+#: src/t-test.q:924 src/t-test.q:1231
msgid "Mean Difference"
msgstr ""
-#: src/t-test.q:923
+#: src/t-test.q:925
msgid "Std. Error Difference"
msgstr ""
-#: src/t-test.q:928 src/t-test.q:1112 src/t-test.q:1221
+#: src/t-test.q:930 src/t-test.q:1114 src/t-test.q:1223
#, c-format
msgid "%d%% Confidence Interval of the Difference"
msgstr ""
-#: src/t-test.q:962
+#: src/t-test.q:964
msgid "Equal variances assumed"
msgstr ""
-#: src/t-test.q:977
+#: src/t-test.q:979
#, c-format
msgid "Error calculating F statistic (cdff returned %d)."
msgstr ""
-#: src/t-test.q:1000 src/t-test.q:1020 src/t-test.q:1058 src/t-test.q:1070
-#: src/t-test.q:1165 src/t-test.q:1191 src/t-test.q:1271 src/t-test.q:1288
-#: src/t-test.q:1377
+#: src/t-test.q:1002 src/t-test.q:1022 src/t-test.q:1060 src/t-test.q:1072
+#: src/t-test.q:1167 src/t-test.q:1193 src/t-test.q:1273 src/t-test.q:1290
+#: src/t-test.q:1379
#, c-format
msgid "Error calculating T statistic (cdft returned %d)."
msgstr ""
-#: src/t-test.q:1034
+#: src/t-test.q:1036
msgid "Equal variances not assumed"
msgstr ""
-#: src/t-test.q:1102
+#: src/t-test.q:1104
msgid "Paired Samples Test"
msgstr ""
-#: src/t-test.q:1105
+#: src/t-test.q:1107
msgid "Paired Differences"
msgstr ""
-#: src/t-test.q:1117
+#: src/t-test.q:1119
msgid "Std. Error Mean"
msgstr ""
-#: src/t-test.q:1210
+#: src/t-test.q:1212
msgid "One-Sample Test"
msgstr ""
-#: src/t-test.q:1215
+#: src/t-test.q:1217
#, c-format
msgid "Test Value = %f"
msgstr ""
-#: src/t-test.q:1340
+#: src/t-test.q:1342
msgid "Paired Samples Correlations"
msgstr ""
-#: src/t-test.q:1344
+#: src/t-test.q:1346
msgid "Correlation"
msgstr ""
-#: src/t-test.q:1367
+#: src/t-test.q:1369
#, c-format
msgid "%s & %s"
msgstr ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2004-03-13 14:14+0800\n"
+"POT-Creation-Date: 2004-03-20 00:30+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: src/aggregate.c:190 src/aggregate.c:231 src/data-list.c:1363
+#: src/aggregate.c:183 src/aggregate.c:216 src/data-list.c:1363
#: src/data-list.c:1398 src/data-list.c:1411 src/data-list.c:1424
#: src/data-list.c:1457
#, c-format
msgid "%s subcommand given multiple times."
msgstr ""
-#: src/aggregate.c:216
+#: src/aggregate.c:203
msgid "while expecting COLUMNWISE"
msgstr ""
-#: src/aggregate.c:261
+#: src/aggregate.c:244
msgid "BREAK subcommand not specified."
msgstr ""
-#: src/aggregate.c:490
+#: src/aggregate.c:400
msgid "expecting aggregation function"
msgstr ""
-#: src/aggregate.c:506
+#: src/aggregate.c:416
#, c-format
msgid "Unknown aggregation function %s."
msgstr ""
-#: src/aggregate.c:521
+#: src/aggregate.c:431
msgid "expecting `('"
msgstr ""
-#: src/aggregate.c:556
+#: src/aggregate.c:466
#, c-format
msgid "Missing argument %d to %s."
msgstr ""
-#: src/aggregate.c:564
+#: src/aggregate.c:474
#, c-format
msgid "Arguments to %s must be of same type as source variables."
msgstr ""
-#: src/aggregate.c:574 src/expr-prs.c:665
+#: src/aggregate.c:484 src/expr-prs.c:665
msgid "expecting `)'"
msgstr ""
-#: src/aggregate.c:586 src/autorecode.c:110
+#: src/aggregate.c:496
#, c-format
msgid ""
"Number of source variables (%d) does not match number of target variables (%"
"d)."
msgstr ""
-#: src/aggregate.c:653
+#: src/aggregate.c:564
#, c-format
msgid ""
"Variable name %s is not unique within the aggregate file dictionary, which "
msgid "%s - Page %d"
msgstr ""
-#: src/autorecode.c:121 src/command.c:697 src/compute.c:293
+#: src/autorecode.c:121
+#, c-format
+msgid "Source variable count (%d) does not match target variable count (%d)."
+msgstr ""
+
+#: src/autorecode.c:138 src/command.c:690 src/compute.c:293
#: src/data-list.c:380 src/data-list.c:878 src/data-list.c:1690
#: src/do-if.c:263 src/get.c:381 src/lexer.c:387 src/loop.c:241
-#: src/matrix-data.c:510 src/print.c:338 src/print.c:1060 src/recode.c:409
+#: src/matrix-data.c:510 src/print.c:338 src/print.c:1060 src/recode.c:405
#: src/sel-if.c:56 src/sel-if.c:138 src/vector.c:194 src/file-handle.q:88
msgid "expecting end of command"
msgstr ""
-#: src/autorecode.c:131
+#: src/autorecode.c:148
#, c-format
msgid "Target variable %s duplicates existing variable %s."
msgstr ""
-#: src/autorecode.c:138
+#: src/autorecode.c:155
#, c-format
msgid "Duplicate variable name %s among target variables."
msgstr ""
-#: src/cmdline.c:112 src/cmdline.c:131 src/cmdline.c:143 src/command.c:196
-#: src/set.q:315 src/set.q:317 src/set.q:857
+#: src/cmdline.c:114 src/cmdline.c:133 src/cmdline.c:145 src/command.c:196
+#: src/set.q:416 src/set.q:418 src/set.q:958
#, c-format
msgid "%s is not yet implemented."
msgstr ""
-#: src/cmdline.c:157
+#: src/cmdline.c:159
msgid ""
"\n"
"Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.\n"
"Written by Ben Pfaff <blp@gnu.org>."
msgstr ""
-#: src/cmdline.c:217
+#: src/cmdline.c:221
#, c-format
msgid ""
"PSPP, a program for statistical analysis of sample data.\n"
"\n"
msgstr ""
-#: src/cmdline.c:249
+#: src/cmdline.c:253
#, c-format
msgid ""
"\n"
msgid "The sentinel may not be the empty string."
msgstr ""
-#: src/command.c:574
+#: src/command.c:576 src/command.c:708
msgid "This command not allowed when the SAFER option is set."
msgstr ""
-#: src/command.c:597
+#: src/command.c:590
#, c-format
msgid "Error removing `%s': %s."
msgstr ""
-#: src/command.c:647
+#: src/command.c:640
#, c-format
msgid "Couldn't fork: %s."
msgstr ""
-#: src/command.c:688
+#: src/command.c:681
#, c-format
msgid "Error executing command: %s."
msgstr ""
-#: src/command.c:734
+#: src/command.c:731
msgid "No operating system support for this command."
msgstr ""
-#: src/command.c:763
+#: src/command.c:760
msgid "This command is not valid in a syntax file."
msgstr ""
msgid "Extra characters after expression."
msgstr ""
-#: src/count.c:171
+#: src/count.c:156
msgid "Destination cannot be a string variable."
msgstr ""
-#: src/count.c:282
+#: src/count.c:263
#, c-format
msgid ""
"%g THRU %g is not a valid range. The number following THRU must be at least "
msgstr ""
#: src/data-list.c:768 src/data-list.c:899 src/print.c:803
-#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1148
+#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1011
#: src/descript.q:791
msgid "Variable"
msgstr ""
msgid "Error writing file %s: %s."
msgstr ""
-#: src/dfm.c:657
+#: src/dfm.c:656
msgid ""
"This command is not valid here since the current input program does not "
"access the inline file."
msgstr ""
-#: src/dfm.c:664
+#: src/dfm.c:663
msgid "inline file: Opening for reading."
msgstr ""
-#: src/dfm.c:678
+#: src/dfm.c:677
msgid "Skipping remaining inline data."
msgstr ""
-#: src/dfm.c:690
+#: src/dfm.c:689
msgid "reading as a data file"
msgstr ""
-#: src/dfm.c:697
+#: src/dfm.c:696
msgid "writing as a data file"
msgstr ""
msgid "DO IF %d: missing\n"
msgstr ""
-#: src/error.c:113
+#: src/error.c:115
msgid "Terminating NOW due to a fatal error!"
msgstr ""
-#: src/error.c:190
+#: src/error.c:192
msgid "Terminating execution of syntax file due to error."
msgstr ""
-#: src/error.c:192
+#: src/error.c:194
#, c-format
msgid "Errors (%d) exceeds limit (%d)."
msgstr ""
-#: src/error.c:195
+#: src/error.c:197
#, c-format
msgid "Warnings (%d) exceed limit (%d)."
msgstr ""
-#: src/error.c:253
+#: src/error.c:255
msgid "fatal"
msgstr ""
-#: src/error.c:255 src/error.c:262 src/error.c:265 src/expr-prs.c:1464
+#: src/error.c:257 src/error.c:264 src/error.c:267 src/expr-prs.c:1464
msgid "error"
msgstr ""
-#: src/error.c:256 src/error.c:263 src/error.c:266
+#: src/error.c:258 src/error.c:265 src/error.c:268
msgid "warning"
msgstr ""
-#: src/error.c:257 src/error.c:267
+#: src/error.c:259 src/error.c:269
msgid "note"
msgstr ""
-#: src/error.c:259 src/error.c:260
+#: src/error.c:261 src/error.c:262
msgid "installation error"
msgstr ""
msgid "Unknown record type %g."
msgstr ""
-#: src/flip.c:210
+#: src/flip.c:76
+msgid ""
+"FLIP ignores TEMPORARY. Temporary transformations will be made permanent."
+msgstr ""
+
+#: src/flip.c:217
#, c-format
msgid "Could not create acceptable variant for variable %s."
msgstr ""
-#: src/flip.c:226
+#: src/flip.c:233
msgid "Cannot create more than 99999 variable names."
msgstr ""
-#: src/flip.c:270
+#: src/flip.c:277
msgid "Could not create temporary file for FLIP."
msgstr ""
-#: src/flip.c:277 src/flip.c:339
+#: src/flip.c:284 src/flip.c:347
#, c-format
msgid "Error writing FLIP file: %s."
msgstr ""
-#: src/flip.c:381
+#: src/flip.c:389
#, c-format
msgid "Error rewinding FLIP file: %s."
msgstr ""
-#: src/flip.c:385
+#: src/flip.c:393
msgid "Error creating FLIP source file."
msgstr ""
-#: src/flip.c:394
+#: src/flip.c:402
#, c-format
msgid "Error reading FLIP file: %s."
msgstr ""
-#: src/flip.c:406
+#: src/flip.c:414
#, c-format
msgid "Error seeking FLIP source file: %s."
msgstr ""
-#: src/flip.c:411
+#: src/flip.c:419
#, c-format
msgid "Error writing FLIP source file: %s."
msgstr ""
-#: src/flip.c:422
+#: src/flip.c:430
#, c-format
msgid "Error rewind FLIP source file: %s."
msgstr ""
-#: src/flip.c:470
+#: src/flip.c:478
#, c-format
msgid "Error reading FLIP temporary file: %s."
msgstr ""
-#: src/flip.c:473
+#: src/flip.c:481
msgid "Unexpected end of file reading FLIP temporary file."
msgstr ""
msgid "GET translation table from file to memory:\n"
msgstr ""
-#: src/get.c:117 src/get.c:1416
+#: src/get.c:117 src/get.c:1429
#, c-format
msgid " %8s from %3d,%3d to %3d,%3d\n"
msgstr ""
"Variables in dictionary:\n"
msgstr ""
-#: src/get.c:607
+#: src/get.c:610
msgid "The BY subcommand may be given once at most."
msgstr ""
-#: src/get.c:674
+#: src/get.c:677
msgid "The active file may not be specified more than once."
msgstr ""
-#: src/get.c:683
+#: src/get.c:686
msgid "Cannot specify the active file since no active file has been defined."
msgstr ""
-#: src/get.c:715
+#: src/get.c:694
+msgid ""
+"MATCH FILES may not be used after TEMPORARY when the active file is an input "
+"source. Temporary transformations will be made permanent."
+msgstr ""
+
+#: src/get.c:727
msgid ""
"IN, FIRST, and LAST subcommands may not occur before the first FILE or TABLE."
msgstr ""
-#: src/get.c:747
+#: src/get.c:759
#, c-format
msgid "Multiple %s subcommands for a single FILE or TABLE."
msgstr ""
-#: src/get.c:757
+#: src/get.c:769
#, c-format
msgid "Duplicate variable name %s while creating %s variable."
msgstr ""
-#: src/get.c:771
+#: src/get.c:783
msgid ""
"RENAME, KEEP, and DROP subcommands may not occur before the first FILE or "
"TABLE."
msgstr ""
-#: src/get.c:795
+#: src/get.c:807
msgid "The BY subcommand is required when a TABLE subcommand is given."
msgstr ""
-#: src/get.c:816
+#: src/get.c:828
#, c-format
msgid "File %s lacks BY variable %s."
msgstr ""
-#: src/get.c:1328
+#: src/get.c:1341
#, c-format
msgid ""
"Variable %s in file %s (%s) has different type or width from the same "
"variable in earlier file (%s)."
msgstr ""
-#: src/get.c:1378
+#: src/get.c:1391
msgid "expecting COMM or TAPE"
msgstr ""
-#: src/get.c:1411
+#: src/get.c:1424
#, c-format
msgid "IMPORT translation table from file to memory:\n"
msgstr ""
-#: src/getline.c:161
+#: src/getline.c:163
#, c-format
msgid "Can't find `%s' in include file search path."
msgstr ""
-#: src/getline.c:316
+#: src/getline.c:318
#, c-format
msgid "%s: Opening as syntax file."
msgstr ""
-#: src/getline.c:321
+#: src/getline.c:323
#, c-format
msgid "Opening `%s': %s."
msgstr ""
-#: src/getline.c:330 src/html.c:330 src/postscript.c:1461
+#: src/getline.c:332 src/html.c:330 src/postscript.c:1461
#, c-format
msgid "Reading `%s': %s."
msgstr ""
-#: src/getline.c:388
+#: src/getline.c:390
#, c-format
msgid "Closing `%s': %s."
msgstr ""
-#: src/glob.c:212
-msgid "data> "
-msgstr ""
-
-#: src/glob.c:269
-msgid "Specify a terminal type with `setenv TERM <yourtype>'."
-msgstr ""
-
-#: src/glob.c:275
-msgid "Could not access the termcap data base."
-msgstr ""
-
-#: src/glob.c:277
-#, c-format
-msgid "Terminal type `%s' is not defined."
-msgstr ""
-
-#: src/glob.c:278
-msgid "Assuming screen of size 79x25."
-msgstr ""
-
#: src/groff-font.c:107
#, c-format
msgid "%s: Opening Groff font file..."
msgid "expecting %s"
msgstr ""
-#: src/lexer.c:524
+#: src/lexer.c:524 src/val-labs.c:148
msgid "expecting string"
msgstr ""
-#: src/lexer.c:538
+#: src/lexer.c:538 src/val-labs.c:157
msgid "expecting integer"
msgstr ""
msgid "%s without %s."
msgstr ""
-#: src/main.c:71
-msgid "Error initializing output drivers."
-msgstr ""
-
-#: src/main.c:132
-msgid "This command not executed."
-msgstr ""
-
-#: src/main.c:136
-msgid ""
-"Skipping the rest of this command. Part of this command may have been "
-"executed."
-msgstr ""
-
-#: src/main.c:141
-msgid ""
-"Skipping the rest of this command. This command was fully executed up to "
-"this point."
-msgstr ""
-
-#: src/main.c:146
-msgid ""
-"Trailing garbage was encountered following this command. The command was "
-"fully executed to this point."
-msgstr ""
-
#: src/matrix-data.c:191
msgid "VARIABLES subcommand multiply specified."
msgstr ""
msgid "End of line expected %s while reading %s."
msgstr ""
-#: src/matrix-data.c:1179
+#: src/matrix-data.c:1174
#, c-format
msgid "expecting value for %s %s"
msgstr ""
-#: src/matrix-data.c:1339
+#: src/matrix-data.c:1336
#, c-format
msgid "Syntax error expecting SPLIT FILE value %s."
msgstr ""
-#: src/matrix-data.c:1348
+#: src/matrix-data.c:1345
#, c-format
msgid "Expecting value %g for %s."
msgstr ""
-#: src/matrix-data.c:1387 src/matrix-data.c:1842
+#: src/matrix-data.c:1386 src/matrix-data.c:1854
#, c-format
msgid "Syntax error expecting factor value %s."
msgstr ""
-#: src/matrix-data.c:1396
+#: src/matrix-data.c:1395
#, c-format
msgid "Syntax error expecting value %g for %s %s."
msgstr ""
-#: src/matrix-data.c:1623
+#: src/matrix-data.c:1631
#, c-format
msgid "Syntax error %s expecting SPLIT FILE value."
msgstr ""
-#: src/matrix-data.c:1751
+#: src/matrix-data.c:1761
#, c-format
msgid ""
"Expected %d lines of data for %s content; actually saw %d lines. No data "
"will be output for this content."
msgstr ""
-#: src/matrix-data.c:1785
+#: src/matrix-data.c:1796
#, c-format
msgid "Multiply specified ROWTYPE_ %s."
msgstr ""
-#: src/matrix-data.c:1790
+#: src/matrix-data.c:1801
#, c-format
msgid "Syntax error %s expecting ROWTYPE_ string."
msgstr ""
-#: src/matrix-data.c:1810
+#: src/matrix-data.c:1821
#, c-format
msgid "Syntax error %s."
msgstr ""
-#: src/matrix-data.c:1958
+#: src/matrix-data.c:1971
#, c-format
msgid "Duplicate specification for %s."
msgstr ""
-#: src/matrix-data.c:1970
+#: src/matrix-data.c:1983
#, c-format
msgid "Too many rows of matrix data for %s."
msgstr ""
-#: src/matrix-data.c:2016
+#: src/matrix-data.c:2029
#, c-format
msgid "Syntax error expecting value for %s %s."
msgstr ""
msgid "(!!!INTERNAL ERROR--%d!!!)\n"
msgstr ""
-#: src/modify-vars.c:108
+#: src/modify-vars.c:88
+msgid ""
+"MODIFY VARS may not be used after TEMPORARY. Temporary transformations will "
+"be made permanent."
+msgstr ""
+
+#: src/modify-vars.c:115
msgid "REORDER subcommand may be given at most once."
msgstr ""
-#: src/modify-vars.c:131
+#: src/modify-vars.c:138
msgid "Cannot specify ALL after specifying a set of variables."
msgstr ""
-#: src/modify-vars.c:141
+#: src/modify-vars.c:148
msgid "`(' expected on REORDER subcommand."
msgstr ""
-#: src/modify-vars.c:153
+#: src/modify-vars.c:160
msgid "`)' expected following variable names on REORDER subcommand."
msgstr ""
-#: src/modify-vars.c:171
+#: src/modify-vars.c:178
msgid "RENAME subcommand may be given at most once."
msgstr ""
-#: src/modify-vars.c:184
+#: src/modify-vars.c:191
msgid "`(' expected on RENAME subcommand."
msgstr ""
-#: src/modify-vars.c:192
+#: src/modify-vars.c:199
msgid ""
"`=' expected between lists of new and old variable names on RENAME "
"subcommand."
msgstr ""
-#: src/modify-vars.c:200 src/rename-vars.c:70
+#: src/modify-vars.c:207 src/rename-vars.c:77
#, c-format
msgid ""
"Differing number of variables in old name list (%d) and in new name list (%"
"d)."
msgstr ""
-#: src/modify-vars.c:211
+#: src/modify-vars.c:218
msgid "`)' expected after variable lists on RENAME subcommand."
msgstr ""
-#: src/modify-vars.c:225
+#: src/modify-vars.c:232
msgid ""
"KEEP subcommand may be given at most once. It may notbe given in "
"conjunction with the DROP subcommand."
msgstr ""
-#: src/modify-vars.c:267
+#: src/modify-vars.c:274
msgid ""
"DROP subcommand may be given at most once. It may not be given in "
"conjunction with the KEEP subcommand."
msgstr ""
-#: src/modify-vars.c:293
+#: src/modify-vars.c:300
#, c-format
msgid "Unrecognized subcommand name `%s'."
msgstr ""
-#: src/modify-vars.c:295
+#: src/modify-vars.c:302
msgid "Subcommand name expected."
msgstr ""
-#: src/modify-vars.c:303
+#: src/modify-vars.c:310
msgid "`/' or `.' expected."
msgstr ""
"SPACE a negative number of lines."
msgstr ""
-#: src/recode.c:288
+#: src/recode.c:283
#, c-format
msgid ""
"%d variable(s) cannot be recoded into %d variable(s). Specify the same "
"number of variables as input and output variables."
msgstr ""
-#: src/recode.c:302
+#: src/recode.c:297
#, c-format
msgid ""
"There is no string variable named %s. (All string variables specified on "
"variable.)"
msgstr ""
-#: src/recode.c:311
+#: src/recode.c:306
#, c-format
msgid ""
"Type mismatch between input and output variables. Output variable %s is not "
"a string variable, but all the input variables are string variables."
msgstr ""
-#: src/recode.c:330
+#: src/recode.c:325
#, c-format
msgid "Type mismatch after INTO: %s is not a numeric variable."
msgstr ""
-#: src/recode.c:360
+#: src/recode.c:355
msgid ""
"INTO must be used when the input values are numeric and output values are "
"string."
msgstr ""
-#: src/recode.c:368
+#: src/recode.c:363
msgid ""
"INTO must be used when the input values are string and output values are "
"numeric."
msgstr ""
-#: src/recode.c:493
+#: src/recode.c:486
msgid "expecting output value"
msgstr ""
-#: src/recode.c:507
+#: src/recode.c:500
msgid ""
"Inconsistent output types. The output values must be all numeric or all "
"string."
msgstr ""
-#: src/recode.c:558
+#: src/recode.c:551
msgid "following LO THRU"
msgstr ""
-#: src/recode.c:574 src/recode.c:603
+#: src/recode.c:567 src/recode.c:596
msgid "in source value"
msgstr ""
-#: src/recode.c:616
+#: src/recode.c:609
msgid ""
"Keyword CONVERT may only be used with string input values and numeric output "
"values."
msgstr ""
-#: src/recode.c:876
-#, c-format
-msgid "!!END!!"
-msgstr ""
-
-#: src/recode.c:897 src/recode.c:913
-#, c-format
-msgid "!!ERROR!!"
+#: src/rename-vars.c:47
+msgid ""
+"RENAME VARS may not be used after TEMPORARY. Temporary transformations will "
+"be made permanent."
msgstr ""
-#: src/rename-vars.c:55
+#: src/rename-vars.c:62
msgid "`(' expected."
msgstr ""
-#: src/rename-vars.c:63
+#: src/rename-vars.c:70
msgid "`=' expected between lists of new and old variable names."
msgstr ""
-#: src/rename-vars.c:81
+#: src/rename-vars.c:88
msgid "`)' expected after variable names."
msgstr ""
-#: src/rename-vars.c:91
+#: src/rename-vars.c:98
#, c-format
msgid "Renaming would duplicate variable name %s."
msgstr ""
msgid "writing as a system file"
msgstr ""
-#: src/sort.c:122
-msgid "`A' or `D' expected inside parentheses."
+#: src/sort.c:82
+msgid ""
+"SORT CASES may not be used after TEMPORARY. Temporary transformations will "
+"be made permanent."
msgstr ""
#: src/sort.c:127
+msgid "`A' or `D' expected inside parentheses."
+msgstr ""
+
+#: src/sort.c:132
msgid "`)' expected."
msgstr ""
-#: src/sort.c:418
+#: src/sort.c:421
#, c-format
msgid "%s: Creating temporary directory: %s."
msgstr ""
-#: src/sort.c:449
+#: src/sort.c:452
#, c-format
msgid "Generating temporary directory name failed: %s."
msgstr ""
-#: src/sort.c:457
+#: src/sort.c:460
#, c-format
msgid "Creating temporary directory failed: %s."
msgstr ""
-#: src/sort.c:509
+#: src/sort.c:512
#, c-format
msgid "%s: Error removing directory for temporary files: %s."
msgstr ""
-#: src/sort.c:538
+#: src/sort.c:541
#, c-format
msgid "%s: Error opening temporary file for %s: %s."
msgstr ""
-#: src/sort.c:555
+#: src/sort.c:558
#, c-format
msgid "%s: Error closing temporary file: %s."
msgstr ""
-#: src/sort.c:571
+#: src/sort.c:574
#, c-format
msgid "%s: Error removing temporary file: %s."
msgstr ""
-#: src/sort.c:587
+#: src/sort.c:590
#, c-format
msgid "%s: Error writing temporary file: %s."
msgstr ""
-#: src/sort.c:605
+#: src/sort.c:608
#, c-format
msgid "%s: Error reading temporary file: %s."
msgstr ""
-#: src/sort.c:608
+#: src/sort.c:611
#, c-format
msgid "%s: Unexpected end of temporary file."
msgstr ""
-#: src/sort.c:798 src/sort.c:1033
+#: src/sort.c:806 src/sort.c:1037
#, c-format
msgid ""
"Out of memory. Could not allocate room for minimum of %d cases of %d bytes "
msgid "Documents in the active file:"
msgstr ""
-#: src/sysfile-info.c:377 src/sysfile-info.c:535 src/vfm.c:1150
+#: src/sysfile-info.c:377 src/sysfile-info.c:535 src/vfm.c:1013
msgid "Label"
msgstr ""
msgid "Missing Values: "
msgstr ""
-#: src/sysfile-info.c:534 src/vfm.c:1149 src/crosstabs.q:1158
-#: src/crosstabs.q:1185 src/crosstabs.q:1205 src/crosstabs.q:1227
+#: src/sysfile-info.c:534 src/vfm.c:1012 src/crosstabs.q:1159
+#: src/crosstabs.q:1186 src/crosstabs.q:1206 src/crosstabs.q:1228
#: src/frequencies.q:1009 src/frequencies.q:1126
msgid "Value"
msgstr ""
"bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
msgstr ""
-#: src/temporary.c:49
+#: src/temporary.c:47
msgid "This command is not valid inside DO IF or LOOP."
msgstr ""
-#: src/temporary.c:56
+#: src/temporary.c:54
msgid ""
"This command may only appear once between procedures and procedure-like "
"commands."
msgid "Document entered %s %02d:%02d:%02d by %s (%s):"
msgstr ""
-#: src/val-labs.c:138
+#: src/val-labs.c:112
#, c-format
msgid ""
"It is not possible to assign value labels to long string variables such as %"
"s."
msgstr ""
-#: src/val-labs.c:176
-msgid "String expected for value."
-msgstr ""
-
-#: src/val-labs.c:185
-msgid "Number expected for value."
-msgstr ""
-
-#: src/val-labs.c:189
+#: src/val-labs.c:161
#, c-format
msgid "Value label `%g' is not integer."
msgstr ""
-#: src/val-labs.c:199
+#: src/val-labs.c:171
msgid "Truncating value label to 60 characters."
msgstr ""
-#: src/val-labs.c:220
-msgid "Value labels:"
-msgstr ""
-
-#: src/val-labs.c:237
-#, c-format
-msgid " (no value labels)\n"
-msgstr ""
-
#: src/var-labs.c:53
msgid "String expected for variable label."
msgstr ""
"the long form or the short form of VECTOR."
msgstr ""
-#: src/vfm.c:391
-msgid "<NOVAR>"
+#: src/vfm.c:507
+#, c-format
+msgid ""
+"An error occurred creating a temporary file for use as the active file: %s."
msgstr ""
-#: src/vfm.c:554
+#: src/vfm.c:520
#, c-format
msgid ""
-"An error occurred attempting to create a temporary file for use as the "
-"active file: %s."
+"An error occurred writing to a temporary file used as the active file: %s."
msgstr ""
-#: src/vfm.c:579
+#: src/vfm.c:599
#, c-format
msgid ""
-"An error occurred while attempting to write to a temporary file used as the "
-"active file: %s."
+"Workspace limit of %d KB (%d cases at %d bytes each) overflowed. Writing "
+"active file to disk."
msgstr ""
-#: src/vfm.c:606
+#: src/vfm.c:631
#, c-format
msgid ""
"An error occurred while attempting to rewind a temporary file used as the "
"active file: %s."
msgstr ""
-#: src/vfm.c:651
+#: src/vfm.c:680
#, c-format
msgid ""
"An error occurred while attempting to read from a temporary file created for "
"the active file: %s."
msgstr ""
-#: src/vfm.c:755
-msgid "Virtual memory exhausted. Writing active file to disk."
-msgstr ""
-
-#: src/vfm.c:758
-#, c-format
-msgid ""
-"Workspace limit of %d KB (%d cases at %d bytes each) overflowed. Writing "
-"active file to disk."
-msgstr ""
-
-#: src/vfm.c:778 src/vfm.c:817
-#, c-format
-msgid ""
-"An error occurred while attempting to write to a temporary file created as "
-"the active file: %s."
-msgstr ""
-
#: src/weight.c:54
msgid "The weighting variable must be numeric."
msgstr ""
msgid "Write mode ALL not allowed in general mode. Assuming WRITE=CELLS."
msgstr ""
-#: src/crosstabs.q:321
+#: src/crosstabs.q:322
msgid "expecting BY"
msgstr ""
-#: src/crosstabs.q:388
+#: src/crosstabs.q:389
msgid "VARIABLES must be specified before TABLES."
msgstr ""
-#: src/crosstabs.q:425
+#: src/crosstabs.q:426
#, c-format
msgid "Maximum value (%ld) less than minimum value (%ld)."
msgstr ""
-#: src/crosstabs.q:859
+#: src/crosstabs.q:860
msgid "Summary."
msgstr ""
-#: src/crosstabs.q:861
+#: src/crosstabs.q:862
msgid "Cases"
msgstr ""
-#: src/crosstabs.q:862 src/frequencies.q:1007
+#: src/crosstabs.q:863 src/frequencies.q:1007
msgid "Valid"
msgstr ""
-#: src/crosstabs.q:863 src/frequencies.q:1074
+#: src/crosstabs.q:864 src/frequencies.q:1074
msgid "Missing"
msgstr ""
-#: src/crosstabs.q:864 src/crosstabs.q:1067 src/crosstabs.q:1800
+#: src/crosstabs.q:865 src/crosstabs.q:1068 src/crosstabs.q:1801
#: src/frequencies.q:1083
msgid "Total"
msgstr ""
-#: src/crosstabs.q:874 src/t-test.q:655 src/t-test.q:678 src/t-test.q:769
-#: src/t-test.q:1343
+#: src/crosstabs.q:875 src/t-test.q:657 src/t-test.q:680 src/t-test.q:771
+#: src/t-test.q:1345
msgid "N"
msgstr ""
-#: src/crosstabs.q:875 src/frequencies.q:1011 src/frequencies.q:1012
+#: src/crosstabs.q:876 src/frequencies.q:1011 src/frequencies.q:1012
#: src/frequencies.q:1013
msgid "Percent"
msgstr ""
-#: src/crosstabs.q:1117
+#: src/crosstabs.q:1118
msgid "count"
msgstr ""
-#: src/crosstabs.q:1118
+#: src/crosstabs.q:1119
msgid "row %"
msgstr ""
-#: src/crosstabs.q:1119
+#: src/crosstabs.q:1120
msgid "column %"
msgstr ""
-#: src/crosstabs.q:1120
+#: src/crosstabs.q:1121
msgid "total %"
msgstr ""
-#: src/crosstabs.q:1121
+#: src/crosstabs.q:1122
msgid "expected"
msgstr ""
-#: src/crosstabs.q:1122
+#: src/crosstabs.q:1123
msgid "residual"
msgstr ""
-#: src/crosstabs.q:1123
+#: src/crosstabs.q:1124
msgid "std. resid."
msgstr ""
-#: src/crosstabs.q:1124
+#: src/crosstabs.q:1125
msgid "adj. resid."
msgstr ""
-#: src/crosstabs.q:1157 src/crosstabs.q:1184 src/crosstabs.q:1204
-#: src/crosstabs.q:1225
+#: src/crosstabs.q:1158 src/crosstabs.q:1185 src/crosstabs.q:1205
+#: src/crosstabs.q:1226
msgid "Statistic"
msgstr ""
-#: src/crosstabs.q:1159 src/t-test.q:920 src/t-test.q:1121 src/t-test.q:1227
+#: src/crosstabs.q:1160 src/t-test.q:922 src/t-test.q:1123 src/t-test.q:1229
msgid "df"
msgstr ""
-#: src/crosstabs.q:1161
+#: src/crosstabs.q:1162
msgid "Asymp. Sig. (2-sided)"
msgstr ""
-#: src/crosstabs.q:1163
+#: src/crosstabs.q:1164
msgid "Exact. Sig. (2-sided)"
msgstr ""
-#: src/crosstabs.q:1165
+#: src/crosstabs.q:1166
msgid "Exact. Sig. (1-sided)"
msgstr ""
-#: src/crosstabs.q:1183 src/crosstabs.q:1224
+#: src/crosstabs.q:1184 src/crosstabs.q:1225
msgid "Category"
msgstr ""
-#: src/crosstabs.q:1186 src/crosstabs.q:1228
+#: src/crosstabs.q:1187 src/crosstabs.q:1229
msgid "Asymp. Std. Error"
msgstr ""
-#: src/crosstabs.q:1187 src/crosstabs.q:1229
+#: src/crosstabs.q:1188 src/crosstabs.q:1230
msgid "Approx. T"
msgstr ""
-#: src/crosstabs.q:1188 src/crosstabs.q:1230
+#: src/crosstabs.q:1189 src/crosstabs.q:1231
msgid "Approx. Sig."
msgstr ""
-#: src/crosstabs.q:1203
+#: src/crosstabs.q:1204
#, c-format
msgid " 95%% Confidence Interval"
msgstr ""
-#: src/crosstabs.q:1206 src/t-test.q:924 src/t-test.q:1118 src/t-test.q:1230
+#: src/crosstabs.q:1207 src/t-test.q:926 src/t-test.q:1120 src/t-test.q:1232
msgid "Lower"
msgstr ""
-#: src/crosstabs.q:1207 src/t-test.q:925 src/t-test.q:1119 src/t-test.q:1231
+#: src/crosstabs.q:1208 src/t-test.q:927 src/t-test.q:1121 src/t-test.q:1233
msgid "Upper"
msgstr ""
-#: src/crosstabs.q:1226
+#: src/crosstabs.q:1227
msgid "Type"
msgstr ""
-#: src/crosstabs.q:1976
+#: src/crosstabs.q:1977
msgid "Pearson Chi-Square"
msgstr ""
-#: src/crosstabs.q:1977
+#: src/crosstabs.q:1978
msgid "Likelihood Ratio"
msgstr ""
-#: src/crosstabs.q:1978
+#: src/crosstabs.q:1979
msgid "Fisher's Exact Test"
msgstr ""
-#: src/crosstabs.q:1979
+#: src/crosstabs.q:1980
msgid "Continuity Correction"
msgstr ""
-#: src/crosstabs.q:1980
+#: src/crosstabs.q:1981
msgid "Linear-by-Linear Association"
msgstr ""
-#: src/crosstabs.q:2017 src/crosstabs.q:2087 src/crosstabs.q:2146
+#: src/crosstabs.q:2018 src/crosstabs.q:2088 src/crosstabs.q:2147
msgid "N of Valid Cases"
msgstr ""
-#: src/crosstabs.q:2033 src/crosstabs.q:2162
+#: src/crosstabs.q:2034 src/crosstabs.q:2163
msgid "Nominal by Nominal"
msgstr ""
-#: src/crosstabs.q:2034 src/crosstabs.q:2163
+#: src/crosstabs.q:2035 src/crosstabs.q:2164
msgid "Ordinal by Ordinal"
msgstr ""
-#: src/crosstabs.q:2035
+#: src/crosstabs.q:2036
msgid "Interval by Interval"
msgstr ""
-#: src/crosstabs.q:2036
+#: src/crosstabs.q:2037
msgid "Measure of Agreement"
msgstr ""
-#: src/crosstabs.q:2041
+#: src/crosstabs.q:2042
msgid "Phi"
msgstr ""
-#: src/crosstabs.q:2042
+#: src/crosstabs.q:2043
msgid "Cramer's V"
msgstr ""
-#: src/crosstabs.q:2043
+#: src/crosstabs.q:2044
msgid "Contingency Coefficient"
msgstr ""
-#: src/crosstabs.q:2044
+#: src/crosstabs.q:2045
msgid "Kendall's tau-b"
msgstr ""
-#: src/crosstabs.q:2045
+#: src/crosstabs.q:2046
msgid "Kendall's tau-c"
msgstr ""
-#: src/crosstabs.q:2046
+#: src/crosstabs.q:2047
msgid "Gamma"
msgstr ""
-#: src/crosstabs.q:2047
+#: src/crosstabs.q:2048
msgid "Spearman Correlation"
msgstr ""
-#: src/crosstabs.q:2048
+#: src/crosstabs.q:2049
msgid "Pearson's R"
msgstr ""
-#: src/crosstabs.q:2049
+#: src/crosstabs.q:2050
msgid "Kappa"
msgstr ""
-#: src/crosstabs.q:2119
+#: src/crosstabs.q:2120
#, c-format
msgid "Odds Ratio for %s (%g / %g)"
msgstr ""
-#: src/crosstabs.q:2122
+#: src/crosstabs.q:2123
#, c-format
msgid "Odds Ratio for %s (%.*s / %.*s)"
msgstr ""
-#: src/crosstabs.q:2130
+#: src/crosstabs.q:2131
#, c-format
msgid "For cohort %s = %g"
msgstr ""
-#: src/crosstabs.q:2133
+#: src/crosstabs.q:2134
#, c-format
msgid "For cohort %s = %.*s"
msgstr ""
-#: src/crosstabs.q:2164
+#: src/crosstabs.q:2165
msgid "Nominal by Interval"
msgstr ""
-#: src/crosstabs.q:2169
+#: src/crosstabs.q:2170
msgid "Lambda"
msgstr ""
-#: src/crosstabs.q:2170
+#: src/crosstabs.q:2171
msgid "Goodman and Kruskal tau"
msgstr ""
-#: src/crosstabs.q:2171
+#: src/crosstabs.q:2172
msgid "Uncertainty Coefficient"
msgstr ""
-#: src/crosstabs.q:2172
+#: src/crosstabs.q:2173
msgid "Somers' d"
msgstr ""
-#: src/crosstabs.q:2173
+#: src/crosstabs.q:2174
msgid "Eta"
msgstr ""
-#: src/crosstabs.q:2178
+#: src/crosstabs.q:2179
msgid "Symmetric"
msgstr ""
-#: src/crosstabs.q:2179 src/crosstabs.q:2180
+#: src/crosstabs.q:2180 src/crosstabs.q:2181
#, c-format
msgid "%s Dependent"
msgstr ""
-#: src/descript.q:151 src/frequencies.q:94 src/t-test.q:656 src/t-test.q:679
-#: src/t-test.q:768 src/t-test.q:1115
+#: src/descript.q:151 src/frequencies.q:94 src/t-test.q:658 src/t-test.q:681
+#: src/t-test.q:770 src/t-test.q:1117
msgid "Mean"
msgstr ""
msgid "Upper value (%g) is less than lower value (%g) on VARIABLES subcommand."
msgstr ""
-#: src/set.q:217 src/set.q:220 src/set.q:238 src/set.q:307 src/set.q:313
-#: src/set.q:338 src/set.q:340 src/set.q:359 src/set.q:363 src/set.q:367
-#: src/set.q:381 src/set.q:383 src/set.q:387 src/set.q:705 src/set.q:786
-#: src/set.q:867
+#: src/set.q:216 src/set.q:288 src/set.q:332 src/set.q:389 src/set.q:391
+#: src/set.q:393 src/set.q:395 src/set.q:397 src/set.q:399 src/set.q:401
+#: src/set.q:403 src/set.q:405 src/set.q:407 src/set.q:409 src/set.q:411
+#: src/set.q:413 src/set.q:792 src/set.q:873 src/set.q:968
#, c-format
msgid "%s is obsolete."
msgstr ""
#: src/set.q:224
-msgid "Active file compression is not yet implemented (and probably won't be)."
+msgid "LISTING is ON"
msgstr ""
-#: src/set.q:233
-msgid "CPI must be greater than 0."
+#: src/set.q:226
+msgid "LISTING is OFF"
msgstr ""
-#: src/set.q:242
-msgid "LPI must be greater than 0."
+#: src/set.q:252
+msgid "Journalling is off"
msgstr ""
-#: src/set.q:249
+#: src/set.q:422
msgid ""
"CASE is not implemented and probably won't be. If you care, complain about "
"it."
msgstr ""
-#: src/set.q:279
+#: src/set.q:427
+msgid "Active file compression is not yet implemented (and probably won't be)."
+msgstr ""
+
+#: src/set.q:441
#, c-format
-msgid "Value for MITERATE (%ld) must be greater than 0."
+msgid ""
+"CC%c: Length of custom currency string `%s' (%d) exceeds maximum length of "
+"16."
msgstr ""
-#: src/set.q:287
+#: src/set.q:463
#, c-format
-msgid "Value for MNEST (%ld) must be greater than 0."
+msgid ""
+"CC%c: Custom currency string `%s' does not contain exactly three periods or "
+"commas (not both)."
msgstr ""
-#: src/set.q:295
-msgid "MXERRS must be at least 1."
+#: src/set.q:516
+msgid "None"
msgstr ""
-#: src/set.q:302
-msgid "MXLOOPS must be at least 1."
+#: src/set.q:522
+msgid "Disabled"
msgstr ""
-#: src/set.q:323
-msgid "Workspace limit must be at least 1 MB."
+#: src/set.q:527
+msgid "Screen"
msgstr ""
-#: src/set.q:401
-#, c-format
-msgid ""
-"CC%c: Length of custom currency string `%s' (%d) exceeds maximum length of "
-"16."
+#: src/set.q:534
+msgid "Listing"
msgstr ""
-#: src/set.q:423
-#, c-format
-msgid ""
-"CC%c: Custom currency string `%s' does not contain exactly three periods or "
-"commas (not both)."
+#: src/set.q:541
+msgid "Other"
msgstr ""
-#: src/set.q:566
+#: src/set.q:650
msgid "LENGTH must be at least 1."
msgstr ""
-#: src/set.q:603
+#: src/set.q:689
msgid "Missing identifier in RESULTS subcommand."
msgstr ""
-#: src/set.q:614
+#: src/set.q:700
msgid "Unrecognized identifier in RESULTS subcommand."
msgstr ""
-#: src/set.q:651
+#: src/set.q:738
msgid "WIDTH must be at least 1."
msgstr ""
-#: src/set.q:674
+#: src/set.q:761
#, c-format
msgid ""
"FORMAT requires numeric output format as an argument. Specified format %s "
"is of type string."
msgstr ""
-#: src/set.q:718
+#: src/set.q:805
msgid "Text color must be in range 0-15."
msgstr ""
-#: src/set.q:731
+#: src/set.q:818
msgid "Background color must be in range 0-7."
msgstr ""
-#: src/set.q:742
+#: src/set.q:829
msgid "Border color must be in range 0-7."
msgstr ""
-#: src/set.q:798
+#: src/set.q:885
msgid "Lower window color must be between 0 and 6."
msgstr ""
-#: src/set.q:812
+#: src/set.q:899
msgid "Upper window color must be between 0 and 6."
msgstr ""
-#: src/set.q:824
+#: src/set.q:911
msgid "Frame color must be between 0 and 6."
msgstr ""
-#: src/set.q:876
+#: src/set.q:977
msgid "Drive letter expected in WORKDEV subcommand."
msgstr ""
+#: src/set.q:1012
+msgid "Specify a terminal type with `setenv TERM <yourtype>'."
+msgstr ""
+
+#: src/set.q:1018
+msgid "Could not access the termcap data base."
+msgstr ""
+
+#: src/set.q:1020
+#, c-format
+msgid "Terminal type `%s' is not defined."
+msgstr ""
+
+#: src/set.q:1048
+msgid "data> "
+msgstr ""
+
#: src/t-test.q:237
msgid "TESTVAL, GROUPS and PAIRS subcommands are mutually exclusive."
msgstr ""
msgid "VARIABLES subcommand is not appropriate with PAIRS"
msgstr ""
-#: src/t-test.q:352 src/t-test.q:429
+#: src/t-test.q:354 src/t-test.q:431
#, c-format
msgid "`%s' is not a variable name"
msgstr ""
-#: src/t-test.q:365
+#: src/t-test.q:367
#, c-format
msgid "Long string variable %s is not valid here."
msgstr ""
-#: src/t-test.q:382
+#: src/t-test.q:384
msgid ""
"When applying GROUPS to a string variable, at least one value must be "
"specified."
msgstr ""
-#: src/t-test.q:464
+#: src/t-test.q:466
#, c-format
msgid ""
"PAIRED was specified but the number of variables preceding WITH (%d) did not "
"match the number following (%d)."
msgstr ""
-#: src/t-test.q:481
+#: src/t-test.q:483
msgid "At least two variables must be specified on PAIRS."
msgstr ""
-#: src/t-test.q:653
+#: src/t-test.q:655
msgid "One-Sample Statistics"
msgstr ""
-#: src/t-test.q:657 src/t-test.q:680 src/t-test.q:770 src/t-test.q:1116
+#: src/t-test.q:659 src/t-test.q:682 src/t-test.q:772 src/t-test.q:1118
msgid "Std. Deviation"
msgstr ""
-#: src/t-test.q:658 src/t-test.q:681 src/t-test.q:771
+#: src/t-test.q:660 src/t-test.q:683 src/t-test.q:773
msgid "SE. Mean"
msgstr ""
-#: src/t-test.q:675
+#: src/t-test.q:677
msgid "Group Statistics"
msgstr ""
-#: src/t-test.q:765
+#: src/t-test.q:767
msgid "Paired Sample Statistics"
msgstr ""
-#: src/t-test.q:787 src/t-test.q:1144 src/t-test.q:1364
+#: src/t-test.q:789 src/t-test.q:1146 src/t-test.q:1366
#, c-format
msgid "Pair %d"
msgstr ""
-#: src/t-test.q:905
+#: src/t-test.q:907
msgid "Independent Samples Test"
msgstr ""
-#: src/t-test.q:913
+#: src/t-test.q:915
msgid "Levene's Test for Equality of Variances"
msgstr ""
-#: src/t-test.q:915
+#: src/t-test.q:917
msgid "t-test for Equality of Means"
msgstr ""
-#: src/t-test.q:917
+#: src/t-test.q:919
msgid "F"
msgstr ""
-#: src/t-test.q:918 src/t-test.q:1345
+#: src/t-test.q:920 src/t-test.q:1347
msgid "Sig."
msgstr ""
-#: src/t-test.q:919 src/t-test.q:1120 src/t-test.q:1226
+#: src/t-test.q:921 src/t-test.q:1122 src/t-test.q:1228
msgid "t"
msgstr ""
-#: src/t-test.q:921 src/t-test.q:1122 src/t-test.q:1228
+#: src/t-test.q:923 src/t-test.q:1124 src/t-test.q:1230
msgid "Sig. (2-tailed)"
msgstr ""
-#: src/t-test.q:922 src/t-test.q:1229
+#: src/t-test.q:924 src/t-test.q:1231
msgid "Mean Difference"
msgstr ""
-#: src/t-test.q:923
+#: src/t-test.q:925
msgid "Std. Error Difference"
msgstr ""
-#: src/t-test.q:928 src/t-test.q:1112 src/t-test.q:1221
+#: src/t-test.q:930 src/t-test.q:1114 src/t-test.q:1223
#, c-format
msgid "%d%% Confidence Interval of the Difference"
msgstr ""
-#: src/t-test.q:962
+#: src/t-test.q:964
msgid "Equal variances assumed"
msgstr ""
-#: src/t-test.q:977
+#: src/t-test.q:979
#, c-format
msgid "Error calculating F statistic (cdff returned %d)."
msgstr ""
-#: src/t-test.q:1000 src/t-test.q:1020 src/t-test.q:1058 src/t-test.q:1070
-#: src/t-test.q:1165 src/t-test.q:1191 src/t-test.q:1271 src/t-test.q:1288
-#: src/t-test.q:1377
+#: src/t-test.q:1002 src/t-test.q:1022 src/t-test.q:1060 src/t-test.q:1072
+#: src/t-test.q:1167 src/t-test.q:1193 src/t-test.q:1273 src/t-test.q:1290
+#: src/t-test.q:1379
#, c-format
msgid "Error calculating T statistic (cdft returned %d)."
msgstr ""
-#: src/t-test.q:1034
+#: src/t-test.q:1036
msgid "Equal variances not assumed"
msgstr ""
-#: src/t-test.q:1102
+#: src/t-test.q:1104
msgid "Paired Samples Test"
msgstr ""
-#: src/t-test.q:1105
+#: src/t-test.q:1107
msgid "Paired Differences"
msgstr ""
-#: src/t-test.q:1117
+#: src/t-test.q:1119
msgid "Std. Error Mean"
msgstr ""
-#: src/t-test.q:1210
+#: src/t-test.q:1212
msgid "One-Sample Test"
msgstr ""
-#: src/t-test.q:1215
+#: src/t-test.q:1217
#, c-format
msgid "Test Value = %f"
msgstr ""
-#: src/t-test.q:1340
+#: src/t-test.q:1342
msgid "Paired Samples Correlations"
msgstr ""
-#: src/t-test.q:1344
+#: src/t-test.q:1346
msgid "Correlation"
msgstr ""
-#: src/t-test.q:1367
+#: src/t-test.q:1369
#, c-format
msgid "%s & %s"
msgstr ""
+Sat Mar 20 00:05:42 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+ * set.q: Implemented the SHOW command, and synced it to the existing
+ SET cmd.
+
+ Added a handler for SIGWINCH so that viewlength and viewwidth follow
+ changes as the window size is changed.
+
+ Added fallback to set viewlength and viewwidth from LINES and COLUMS
+ environment variables if other methods are not available.
+
+ glob.c: Removed a lot of global variables from glob.c and encapsulated
+ them in set.q
+
+ random.c: Tidied up the way the random seed is set.
+
+ str.c: Added a ds_vprintf function.
+
+ error.c: Extended dump_message so that messages are always broken at
+ '\n' characters.
+
Thu Mar 18 11:07:14 2004 Ben Pfaff <blp@gnu.org>
* pfm-write.c: (bufwrite) Write out the correct element for string
./q2c $< $@
q_sources_c = correlations.c crosstabs.c descript.c file-handle.c \
-frequencies.c list.c means.c set.c t-test.c
+frequencies.c list.c means.c set.c t-test.c
q_sources_q = correlations.q crosstabs.q descript.q file-handle.q \
-frequencies.q list.q means.q set.q t-test.q
+frequencies.q list.q means.q set.q t-test.q
pspp_SOURCES = $(q_sources_c) \
aggregate.c algorithm.c algorithm.h alloc.c alloc.h \
apply-dict.c ascii.c autorecode.c bitvector.h \
cmdline.c cmdline.h command.c command.def command.h compute.c \
+copyleft.c copyleft.h \
count.c data-in.c data-in.h data-list.c data-list.h \
data-out.c debug-print.h devind.c devind.h dfm.c dfm.h \
dictionary.c do-if.c do-ifP.h error.c error.h expr-evl.c expr-opt.c \
struct sfm_write_info w;
w.h = agr->out_file;
w.dict = agr->dict;
- w.compress = set_scompression;
+ w.compress = get_scompression();
if (!sfm_write_dictionary (&w))
return 0;
char *subst_vars (char *);
+static int testing_mode=0;
+
/* Parses the command line specified by ARGC and ARGV as received by
main(). */
void
{"pipe", no_argument, NULL, 'p'},
{"recon", no_argument, NULL, 'n'},
{"safer", no_argument, NULL, 's'},
- {"testing-mode", no_argument, &set_testing_mode, 1},
+ {"testing-mode", no_argument, &testing_mode, 1},
{"verbose", no_argument, NULL, 'v'},
{"version", no_argument, NULL, 'V'},
{0, 0, 0, 0},
no_statrc = 1;
break;
case 's':
- set_safer = 1;
+ make_safe();
break;
case 'v':
err_verbosity++;
}
}
- if (set_testing_mode)
+
+ if (testing_mode)
{
/* FIXME: Later this option should do some other things, too. */
- set_viewwidth = 9999;
+ force_long_view();
}
+
for (i = optind; i < argc; i++)
{
return lex_end_of_command ();
}
-#define assert_not_safer() \
- do { \
- if (set_safer) \
- { \
- msg (SE, _("This command not allowed when the SAFER option is set.")); \
- return CMD_FAILURE; \
- } \
-} while(0)
-
/* Parses, performs the ERASE command. */
int
cmd_erase (void)
{
- assert_not_safer();
+ if ( safer_mode() )
+ {
+ msg (SE, _("This command not allowed when the SAFER option is set."));
+ return CMD_FAILURE;
+ }
+
lex_match_id ("ERASE");
if (!lex_force_match_id ("FILE"))
{
int code;
- assert_not_safer();
-
+ if ( safer_mode() )
+ {
+ msg (SE, _("This command not allowed when the SAFER option is set."));
+ return CMD_FAILURE;
+ }
+
lex_match_id ("HOST");
#ifdef unix
DEFCMD ("SAVE", ERRO, ERRO, PROC, PROC, cmd_save)
DEFCMD ("SELECT IF", ERRO, ERRO, TRAN, TRAN, cmd_select_if)
DEFCMD ("SET", INIT, INPU, TRAN, PROC, cmd_set)
-UNIMPL ("SHOW", INIT, INPU, TRAN, PROC)
+DEFCMD ("SHOW", INIT, INPU, TRAN, PROC, cmd_show)
DEFCMD ("SORT CASES", ERRO, ERRO, PROC, PROC, cmd_sort_cases)
DEFCMD ("SPLIT FILE", ERRO, INPU, TRAN, TRAN, cmd_split_file)
DEFCMD ("STRING", ERRO, INPU, TRAN, TRAN, cmd_string)
--- /dev/null
+char lack_of_warranty[]=""
+" NO WARRANTY\n"
+"\n"
+"BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY "
+"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN "
+"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES "
+"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED "
+"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF "
+"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS "
+"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE "
+"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, "
+"REPAIR OR CORRECTION.\n"
+"\n"
+"IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING "
+"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR "
+"REDISTRIBUTE THE PROGRAM, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY "
+"GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE "
+"OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA "
+"OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD "
+"PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), "
+"EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY "
+"OF SUCH DAMAGES.";
+
+char copyleft[]=""
+" GNU GENERAL PUBLIC LICENSE\n "
+" Version 2, June 1991\n "
+" \n"
+" Copyright (C) 1989, 1991 Free Software Foundation, Inc. \n"
+" 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n "
+" Everyone is permitted to copy and distribute verbatim copies "
+" of this license document, but changing it is not allowed. "
+" \n"
+" Preamble \n"
+"\n"
+" The licenses for most software are designed to take away your "
+"freedom to share and change it. By contrast, the GNU General Public "
+"License is intended to guarantee your freedom to share and change free "
+"software--to make sure the software is free for all its users. This "
+"General Public License applies to most of the Free Software "
+"Foundation\'s software and to any other program whose authors commit to "
+"using it. (Some other Free Software Foundation software is covered by "
+"the GNU Library General Public License instead.) You can apply it to "
+"your programs, too. "
+"\n"
+" When we speak of free software, we are referring to freedom, not "
+"price. Our General Public Licenses are designed to make sure that you "
+"have the freedom to distribute copies of free software (and charge for "
+"this service if you wish), that you receive source code or can get it "
+"if you want it, that you can change the software or use pieces of it "
+"in new free programs; and that you know you can do these things. "
+" \n"
+" To protect your rights, we need to make restrictions that forbid "
+"anyone to deny you these rights or to ask you to surrender the rights. "
+"These restrictions translate to certain responsibilities for you if you "
+"distribute copies of the software, or if you modify it. "
+" \n"
+" For example, if you distribute copies of such a program, whether "
+"gratis or for a fee, you must give the recipients all the rights that "
+"you have. You must make sure that they, too, receive or can get the "
+"source code. And you must show them these terms so they know their "
+"rights. "
+" \n"
+" We protect your rights with two steps: (1) copyright the software, and "
+"(2) offer you this license which gives you legal permission to copy, "
+"distribute and/or modify the software. "
+" \n"
+" Also, for each author's protection and ours, we want to make certain "
+"that everyone understands that there is no warranty for this free "
+"software. If the software is modified by someone else and passed on, we "
+"want its recipients to know that what they have is not the original, so "
+"that any problems introduced by others will not reflect on the original "
+"authors' reputations. "
+" \n"
+" Finally, any free program is threatened constantly by software "
+"patents. We wish to avoid the danger that redistributors of a free "
+"program will individually obtain patent licenses, in effect making the "
+"program proprietary. To prevent this, we have made it clear that any "
+"patent must be licensed for everyone's free use or not licensed at all. "
+" \n"
+" The precise terms and conditions for copying, distribution and "
+"modification follow. "
+"\n "
+" GNU GENERAL PUBLIC LICENSE \n"
+" TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION \n"
+" \n"
+" 0. This License applies to any program or other work which contains "
+"a notice placed by the copyright holder saying it may be distributed "
+"under the terms of this General Public License. The \"Program\", below, "
+"refers to any such program or work, and a \"work based on the Program\" "
+"means either the Program or any derivative work under copyright law: "
+"that is to say, a work containing the Program or a portion of it, "
+"either verbatim or with modifications and/or translated into another "
+"language. (Hereinafter, translation is included without limitation in "
+"the term \"modification\".) Each licensee is addressed as \"you\". "
+" \n"
+"Activities other than copying, distribution and modification are not "
+"covered by this License; they are outside its scope. The act of "
+"running the Program is not restricted, and the output from the Program "
+"is covered only if its contents constitute a work based on the "
+"Program (independent of having been made by running the Program). "
+"Whether that is true depends on what the Program does. "
+"\n"
+" 1. You may copy and distribute verbatim copies of the Program's "
+"source code as you receive it, in any medium, provided that you "
+"conspicuously and appropriately publish on each copy an appropriate "
+"copyright notice and disclaimer of warranty; keep intact all the "
+"notices that refer to this License and to the absence of any warranty; "
+"and give any other recipients of the Program a copy of this License "
+"along with the Program. "
+"\n"
+"You may charge a fee for the physical act of transferring a copy, and "
+"you may at your option offer warranty protection in exchange for a fee. "
+"\n"
+" 2. You may modify your copy or copies of the Program or any portion "
+"of it, thus forming a work based on the Program, and copy and "
+"distribute such modifications or work under the terms of Section 1 "
+"above, provided that you also meet all of these conditions: "
+"\n"
+" a) You must cause the modified files to carry prominent notices "
+" stating that you changed the files and the date of any change. "
+"\n"
+" b) You must cause any work that you distribute or publish, that in "
+" whole or in part contains or is derived from the Program or any "
+" part thereof, to be licensed as a whole at no charge to all third "
+" parties under the terms of this License. "
+"\n"
+" c) If the modified program normally reads commands interactively "
+" when run, you must cause it, when started running for such "
+" interactive use in the most ordinary way, to print or display an "
+" announcement including an appropriate copyright notice and a "
+" notice that there is no warranty (or else, saying that you provide "
+" a warranty) and that users may redistribute the program under "
+" these conditions, and telling the user how to view a copy of this "
+" License. (Exception: if the Program itself is interactive but "
+" does not normally print such an announcement, your work based on "
+" the Program is not required to print an announcement.) "
+"\n "
+"These requirements apply to the modified work as a whole. If "
+"identifiable sections of that work are not derived from the Program, "
+"and can be reasonably considered independent and separate works in "
+"themselves, then this License, and its terms, do not apply to those "
+"sections when you distribute them as separate works. But when you "
+"distribute the same sections as part of a whole which is a work based "
+"on the Program, the distribution of the whole must be on the terms of "
+"this License, whose permissions for other licensees extend to the "
+"entire whole, and thus to each and every part regardless of who wrote it. "
+"\n"
+"Thus, it is not the intent of this section to claim rights or contest "
+"your rights to work written entirely by you; rather, the intent is to "
+"exercise the right to control the distribution of derivative or "
+"collective works based on the Program. "
+"\n"
+"In addition, mere aggregation of another work not based on the Program "
+"with the Program (or with a work based on the Program) on a volume of "
+"a storage or distribution medium does not bring the other work under "
+"the scope of this License. "
+"\n"
+" 3. You may copy and distribute the Program (or a work based on it, "
+"under Section 2) in object code or executable form under the terms of "
+"Sections 1 and 2 above provided that you also do one of the following: "
+"\n"
+" a) Accompany it with the complete corresponding machine-readable "
+" source code, which must be distributed under the terms of Sections "
+" 1 and 2 above on a medium customarily used for software interchange; or, "
+"\n"
+" b) Accompany it with a written offer, valid for at least three "
+" years, to give any third party, for a charge no more than your "
+" cost of physically performing source distribution, a complete "
+" machine-readable copy of the corresponding source code, to be "
+" distributed under the terms of Sections 1 and 2 above on a medium "
+" customarily used for software interchange; or, "
+"\n"
+" c) Accompany it with the information you received as to the offer "
+" to distribute corresponding source code. (This alternative is "
+" allowed only for noncommercial distribution and only if you "
+" received the program in object code or executable form with such "
+" an offer, in accord with Subsection b above.) "
+"\n"
+"The source code for a work means the preferred form of the work for "
+"making modifications to it. For an executable work, complete source "
+"code means all the source code for all modules it contains, plus any "
+"associated interface definition files, plus the scripts used to "
+"control compilation and installation of the executable. However, as a "
+"special exception, the source code distributed need not include "
+"anything that is normally distributed (in either source or binary "
+"form) with the major components (compiler, kernel, and so on) of the "
+"operating system on which the executable runs, unless that component "
+"itself accompanies the executable. "
+"\n"
+"If distribution of executable or object code is made by offering "
+"access to copy from a designated place, then offering equivalent "
+"access to copy the source code from the same place counts as "
+"distribution of the source code, even though third parties are not "
+"compelled to copy the source along with the object code. "
+"\n "
+" 4. You may not copy, modify, sublicense, or distribute the Program "
+"except as expressly provided under this License. Any attempt "
+"otherwise to copy, modify, sublicense or distribute the Program is "
+"void, and will automatically terminate your rights under this License. "
+"However, parties who have received copies, or rights, from you under "
+"this License will not have their licenses terminated so long as such "
+"parties remain in full compliance. "
+"\n"
+" 5. You are not required to accept this License, since you have not "
+"signed it. However, nothing else grants you permission to modify or "
+"distribute the Program or its derivative works. These actions are "
+"prohibited by law if you do not accept this License. Therefore, by "
+"modifying or distributing the Program (or any work based on the "
+"Program), you indicate your acceptance of this License to do so, and "
+"all its terms and conditions for copying, distributing or modifying "
+"the Program or works based on it. "
+"\n"
+" 6. Each time you redistribute the Program (or any work based on the "
+"Program), the recipient automatically receives a license from the "
+"original licensor to copy, distribute or modify the Program subject to "
+"these terms and conditions. You may not impose any further "
+"restrictions on the recipients' exercise of the rights granted herein. "
+"You are not responsible for enforcing compliance by third parties to "
+"this License. "
+"\n"
+" 7. If, as a consequence of a court judgment or allegation of patent "
+"infringement or for any other reason (not limited to patent issues), "
+"conditions are imposed on you (whether by court order, agreement or "
+"otherwise) that contradict the conditions of this License, they do not "
+"excuse you from the conditions of this License. If you cannot "
+"distribute so as to satisfy simultaneously your obligations under this "
+"License and any other pertinent obligations, then as a consequence you "
+"may not distribute the Program at all. For example, if a patent "
+"license would not permit royalty-free redistribution of the Program by "
+"all those who receive copies directly or indirectly through you, then "
+"the only way you could satisfy both it and this License would be to "
+"refrain entirely from distribution of the Program. "
+"\n"
+"If any portion of this section is held invalid or unenforceable under "
+"any particular circumstance, the balance of the section is intended to "
+"apply and the section as a whole is intended to apply in other "
+"circumstances. "
+"\n"
+"It is not the purpose of this section to induce you to infringe any "
+"patents or other property right claims or to contest validity of any "
+"such claims; this section has the sole purpose of protecting the "
+"integrity of the free software distribution system, which is "
+"implemented by public license practices. Many people have made "
+"generous contributions to the wide range of software distributed "
+"through that system in reliance on consistent application of that "
+"system; it is up to the author/donor to decide if he or she is willing "
+"to distribute software through any other system and a licensee cannot "
+"impose that choice. "
+"\n"
+"This section is intended to make thoroughly clear what is believed to "
+"be a consequence of the rest of this License. "
+"\n "
+" 8. If the distribution and/or use of the Program is restricted in "
+"certain countries either by patents or by copyrighted interfaces, the "
+"original copyright holder who places the Program under this License "
+"may add an explicit geographical distribution limitation excluding "
+"those countries, so that distribution is permitted only in or among "
+"countries not thus excluded. In such case, this License incorporates "
+"the limitation as if written in the body of this License. "
+"\n"
+" 9. The Free Software Foundation may publish revised and/or new versions "
+"of the General Public License from time to time. Such new versions will "
+"be similar in spirit to the present version, but may differ in detail to "
+"address new problems or concerns. "
+"\n"
+"Each version is given a distinguishing version number. If the Program "
+"specifies a version number of this License which applies to it and \"any "
+"later version\", you have the option of following the terms and conditions "
+"either of that version or of any later version published by the Free "
+"Software Foundation. If the Program does not specify a version number of "
+"this License, you may choose any version ever published by the Free Software "
+"Foundation. "
+"\n"
+" 10. If you wish to incorporate parts of the Program into other free "
+"programs whose distribution conditions are different, write to the author "
+"to ask for permission. For software which is copyrighted by the Free "
+"Software Foundation, write to the Free Software Foundation; we sometimes "
+"make exceptions for this. Our decision will be guided by the two goals "
+"of preserving the free status of all derivatives of our free software and "
+"of promoting the sharing and reuse of software generally. "
+"\n"
+" NO WARRANTY "
+"\n"
+" 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY "
+"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN "
+"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES "
+"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED "
+"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF "
+"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS "
+"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE "
+"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, "
+"REPAIR OR CORRECTION. "
+"\n"
+" 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING "
+"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR "
+"REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, "
+"INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING "
+"OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED "
+"TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY "
+"YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER "
+"PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE "
+"POSSIBILITY OF SUCH DAMAGES. "
+"\n"
+" END OF TERMS AND CONDITIONS "
+"\n "
+" How to Apply These Terms to Your New Programs "
+"\n"
+" If you develop a new program, and you want it to be of the greatest "
+"possible use to the public, the best way to achieve this is to make it "
+"free software which everyone can redistribute and change under these terms. "
+"\n"
+" To do so, attach the following notices to the program. It is safest "
+"to attach them to the start of each source file to most effectively "
+"convey the exclusion of warranty; and each file should have at least "
+"the \"copyright\" line and a pointer to where the full notice is found. "
+"\n"
+" <one line to give the program's name and a brief idea of what it does.>\n"
+" Copyright (C) <year> <name of author>\n"
+"\n"
+" This program is free software; you can redistribute it and/or modify"
+" it under the terms of the GNU General Public License as published by"
+" the Free Software Foundation; either version 2 of the License, or"
+" (at your option) any later version.\n"
+"\n"
+" This program is distributed in the hope that it will be useful,"
+" but WITHOUT ANY WARRANTY; without even the implied warranty of"
+" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"
+" GNU General Public License for more details.\n"
+"\n"
+" You should have received a copy of the GNU General Public License"
+" along with this program; if not, write to the Free Software"
+" Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
+"\n"
+"\n"
+"Also add information on how to contact you by electronic and paper mail. "
+"\n"
+"If the program is interactive, make it output a short notice like this "
+"when it starts in an interactive mode: "
+"\n"
+" Gnomovision version 69, Copyright (C) year name of author\n"
+" Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n"
+" This is free software, and you are welcome to redistribute it\n"
+" under certain conditions; type `show c' for details.\n"
+"\n"
+"The hypothetical commands `show w' and `show c' should show the appropriate "
+"parts of the General Public License. Of course, the commands you use may "
+"be called something other than `show w' and `show c'; they could even be "
+"mouse-clicks or menu items--whatever suits your program. "
+"\n"
+"You should also get your employer (if you work as a programmer) or your "
+"school, if any, to sign a \"copyright disclaimer\" for the program, if "
+"necessary. Here is a sample; alter the names: "
+"\n"
+" Yoyodyne, Inc., hereby disclaims all copyright interest in the program"
+" `Gnomovision' (which makes passes at compilers) written by James Hacker.\n"
+"\n"
+" <signature of Ty Coon>, 1 April 1989\n"
+" Ty Coon, President of Vice\n"
+"\n"
+"This General Public License does not permit incorporating your program into "
+"proprietary programs. If your program is a subroutine library, you may "
+"consider it more useful to permit linking proprietary applications with the "
+"library. If this is what you want to do, use the GNU Library General "
+"Public License instead of this License. "
+"";
--- /dev/null
+/* PSPP - computes sample statistics.
+ Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@gnu.org>.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA. */
+
+#if !copyleft_h
+#define copyleft_h 1
+
+extern char lack_of_warranty[];
+extern char copyleft[];
+
+#endif
if (type != FMT_DOT)
{
- decimal = set_decimal;
- grouping = set_grouping;
+ decimal = get_decimal();
+ grouping = get_grouping();
}
else
{
- decimal = set_grouping;
- grouping = set_decimal;
+ decimal = get_grouping();
+ grouping = get_decimal();
}
i->v->f = SYSMIS;
if (fmt->cat & FCAT_STRING)
memset (i->v->s, ' ', i->format.w);
else
- i->v->f = set_blanks;
+ i->v->f = get_blanks();
}
int
if (++cp == i->e)
{
- i->v->f = set_blanks;
+ i->v->f = get_blanks();
return 1;
}
}
input.type = FMT_F;
input.w = 8;
input.d = 0;
- output = set_format;
+ output = get_format();
}
if (input.type == FMT_A || input.type == FMT_AHEX)
if (column == 0)
{
- if (set_undefined)
+ if (get_undefined() )
msg (SW, _("Missing value(s) for all variables from %s onward. "
"These will be filled with the system-missing value "
"or blanks, as appropriate."),
/* The C locale always uses a period `.' as a decimal point.
Translate to comma if necessary. */
- if ((set_decimal == ',' && fp->type != FMT_DOT)
- || (set_decimal == '.' && fp->type == FMT_DOT))
+ if ((get_decimal() == ',' && fp->type != FMT_DOT)
+ || (get_decimal() == '.' && fp->type == FMT_DOT))
{
char *cp = strchr (buf, '.');
if (cp)
if (i % 3 == 0 && n_digits > i && n_items > n_reserved)
{
n_items--;
- *dst++ = fp->type == FMT_COMMA ? set_grouping : set_decimal;
+ *dst++ = fp->type == FMT_COMMA ? get_grouping() : get_decimal();
}
*dst++ = *sp++;
}
static int
try_CCx (char *dst, const struct fmt_spec *fp, double number)
{
- struct set_cust_currency *cc = &set_cc[fp->type - FMT_CCA];
+ const struct set_cust_currency *cc = get_cc(fp->type - FMT_CCA);
struct fmt_spec f;
/* Determine length available, decimal character for number
proper. */
- f.type = cc->decimal == set_decimal ? FMT_COMMA : FMT_DOT;
+ f.type = cc->decimal == get_decimal() ? FMT_COMMA : FMT_DOT;
f.w = fp->w - strlen (cc->prefix) - strlen (cc->suffix);
if (number < 0)
f.w -= strlen (cc->neg_prefix) + strlen (cc->neg_suffix) - 1;
if (n == n_int + n_dec)
{
/* Convert periods `.' to commas `,' for our foreign friends. */
- if ((set_decimal == ',' && fp->type != FMT_DOT)
- || (set_decimal == '.' && fp->type == FMT_DOT))
+ if ((get_decimal() == ',' && fp->type != FMT_DOT)
+ || (get_decimal() == '.' && fp->type == FMT_DOT))
{
cp = strchr (cp, '.');
if (cp)
void
msg (int class, const char *format, ...)
{
- char buf[1024];
+ struct string buf;
+ ds_init (NULL, &buf, 1024);
+
/* Format the message into BUF. */
{
va_list args;
va_start (args, format);
- vsnprintf (buf, 1024, format, args);
+ ds_vprintf (&buf, format, args);
va_end (args);
}
e.class = class;
err_location (&e.where);
e.title = NULL;
- e.text = buf;
+ e.text = buf.string;
err_vmsg (&e);
}
}
{
int error_class = getl_interactive ? MM : FE;
- if (set_errorbreak && err_error_count)
+ if (get_errorbreak() && err_error_count)
msg (error_class, _("Terminating execution of syntax file due to error."));
- else if (err_error_count > set_mxerrs)
+ else if (err_error_count > get_mxerrs() )
msg (error_class, _("Errors (%d) exceeds limit (%d)."),
- err_error_count, set_mxerrs);
- else if (err_error_count + err_warning_count > set_mxwarns)
+ err_error_count, get_mxerrs());
+ else if (err_error_count + err_warning_count > get_mxwarns() )
msg (error_class, _("Warnings (%d) exceed limit (%d)."),
- err_error_count + err_warning_count, set_mxwarns);
+ err_error_count + err_warning_count, get_mxwarns() );
else
return;
/* Describes one class of error. */
struct error_class
{
- int flags; /* Zero or more of MSG_*. */
+ int flags; /* Zero or more of ERR_*. */
int *count; /* Counting category. */
const char *banner; /* Banner. */
};
Please note that this is not trivial. We have to avoid an
infinite loop in reporting errors that originate in the output
section. */
- dump_message (ds_value (&msg), 8, puts_stdout, set_viewwidth);
+ dump_message (ds_value (&msg), 8, puts_stdout, get_viewwidth());
ds_destroy (&msg);
puts (s);
}
+/* Returns 1 if the line must be broken here */
+static int
+compulsory_break(int c)
+{
+ return ( c == '\n' );
+}
+
/* Returns 1 if C is a `break character', that is, if it is a good
place to break a message into lines. */
static inline int
char_is_break (int quote, int c)
{
return ((quote && c == DIR_SEPARATOR)
- || (!quote && (isspace (c) || c == '-' || c == '/')));
+ || (!quote && (isspace (c) || c == '-' || c == '/')));
}
/* Returns 1 if C is a break character where the break should be made
if (indent > width / 3)
indent = width / 3;
- buf = local_alloc (width + 1);
+ buf = local_alloc (width + 2);
/* Advance WIDTH characters into MSG.
If that's a valid breakpoint, keep it; otherwise, back up.
Output the line. */
- for (cp = msg; (unsigned) (cp - msg) < width - 1; cp++)
+ for (cp = msg; (unsigned) (cp - msg) < width - 1 &&
+ ! compulsory_break(*cp); cp++)
if (*cp == '"')
quote ^= 1;
*cp = c;
}
+
/* Repeat above procedure for remaining lines. */
for (;;)
{
+ static int hard_break=0;
+
+ int idx=0;
char *cp2;
/* Advance past whitespace. */
- while (isspace ((unsigned char) *cp))
+ if (! hard_break )
+ while ( isspace ((unsigned char) *cp) )
+ cp++;
+ else
cp++;
+
if (*cp == 0)
- break;
+ break;
+
/* Advance WIDTH - INDENT characters. */
- for (cp2 = cp; (unsigned) (cp2 - cp) < width - indent && *cp2; cp2++)
+ for (cp2 = cp; (unsigned) (cp2 - cp) < width - indent &&
+ *cp2 && !compulsory_break(*cp2); cp2++)
if (*cp2 == '"')
quote ^= 1;
+
+ if ( compulsory_break(*cp2) )
+ hard_break = 1;
+ else
+ hard_break = 0;
+
/* Back up if this isn't a breakpoint. */
{
unsigned w = cp2 - cp;
- if (*cp2)
- for (cp2--; !char_is_break (quote, (unsigned char) *cp2) && cp2 > cp;
+ if (*cp2 && ! compulsory_break(*cp2) )
+ for (cp2--; !char_is_break (quote, (unsigned char) *cp2) &&
+ cp2 > cp;
cp2--)
+ {
+
if (*cp2 == '"')
quote ^= 1;
+ }
if (w == width - indent
&& (unsigned) (cp2 - cp) <= (width - indent) * BREAK_LONG_WORD)
- for (; (unsigned) (cp2 - cp) < width - indent && *cp2; cp2++)
+ for (; (unsigned) (cp2 - cp) < width - indent && *cp2 ; cp2++)
if (*cp2 == '"')
quote ^= 1;
}
+
/* Write out the line. */
+
memset (buf, ' ', indent);
memcpy (&buf[indent], cp, cp2 - cp);
- buf[indent + cp2 - cp] = '\0';
- func (buf);
+ if ( hard_break)
+ {
+ buf[indent + idx + cp2 - cp] = '\n';
+ ++idx;
+ }
+ buf[indent + idx + cp2 - cp] = '\0';
+ func (buf);
cp = cp2;
}
#ifdef unix
if (fn[0] == '|')
{
- if (set_safer)
+ if (safer_mode())
return safety_violation (fn);
return popen (&fn[1], mode);
char *s;
FILE *f;
- if (set_safer)
+ if (safer_mode())
return safety_violation (fn);
s = local_alloc (strlen (fn));
/* Allocate memory for many cases. */
case_bytes = flip->var_cnt * sizeof *input_buf;
- case_capacity = set_max_workspace / case_bytes;
+ case_capacity = get_max_workspace() / case_bytes;
if (case_capacity > flip->case_cnt * 2)
case_capacity = flip->case_cnt * 2;
if (case_capacity < 2)
static int
trim_dictionary (struct dictionary *dict, int *options)
{
- if (set_scompression)
+ if (get_scompression())
*options |= GTSV_OPT_COMPRESSED;
if (*options & GTSV_OPT_SAVE)
#endif /* no readline/history.h */
#endif /* -lhistory */
+extern struct cmd_set cmd;
+
static struct string getl_include_path;
/* Number of levels of DO REPEAT structures we're nested inside. If
if (ds_length (&getl_buf) > 0 && ds_end (&getl_buf)[-1] == '\n')
ds_truncate (&getl_buf, ds_length (&getl_buf) - 1);
- if (set_echo)
+ if (get_echo())
tab_output_text (TAB_LEFT | TAT_FIX, ds_value (&getl_buf));
getl_head->ln++;
switch (getl_prompt)
{
case GETL_PRPT_STANDARD:
- prompt = set_prompt;
+ prompt = get_prompt();
break;
case GETL_PRPT_CONTINUATION:
- prompt = set_cprompt;
+ prompt = get_cprompt();
break;
case GETL_PRPT_DATA:
- prompt = set_dprompt;
+ prompt = get_dprompt();
break;
default:
err_error_count = err_warning_count = 0;
err_already_flagged = 0;
- fputs (getl_prompt ? set_cprompt : set_prompt, stdout);
+ fputs (getl_prompt ? get_cprompt() : get_prompt(), stdout);
ds_clear (&getl_buf);
if (ds_getline (&getl_buf, stdin))
return 1;
#endif
#endif
-#if HAVE_LIBTERMCAP
-#if HAVE_TERMCAP_H
-#include <termcap.h>
-#else /* !HAVE_TERMCAP_H */
-int tgetent (char *, char *);
-int tgetnum (char *);
-#endif /* !HAVE_TERMCAP_H */
-#endif /* !HAVE_LIBTERMCAP */
-
#if HAVE_LIBHISTORY
#if HAVE_READLINE_HISTORY_H
#include <readline/history.h>
static void get_date (void);
-#if HAVE_LIBTERMCAP
-static char term_buffer[16384];
-#endif
void
init_glob (int argc UNUSED, char **argv)
textdomain (PACKAGE);
#endif /* ENABLE_NLS */
- /* Workable defaults before we determine the real terminal size. */
- set_viewwidth = 79;
- set_viewlength = 24;
-
fn_init ();
getl_initialize ();
cur_proc = NULL;
}
- /* settings.h */
-#if !USE_INTERNAL_PAGER
- {
- char *pager;
-
- pager = getenv ("STAT_PAGER");
- if (!pager)
- pager = getenv ("PAGER");
- if (pager)
- set_pager = xstrdup (pager);
-#if DEFAULT_PAGER
- else
- set_pager = xstrdup (DEFAULT_PAGER);
-#endif /* DEFAULT_PAGER */
- }
-#endif /* !USE_INTERNAL_PAGER */
-
- set_blanks = SYSMIS;
- set_scompression = 1;
- set_format.type = FMT_F;
- set_format.w = 8;
- set_format.d = 2;
- set_cpi = 6;
- set_lpi = 10;
- set_results_file = xstrdup ("pspp.prc");
- set_dprompt = xstrdup (_("data> "));
-
- {
- int i;
-
- for (i = 0; i < 5; i++)
- {
- struct set_cust_currency *cc = &set_cc[i];
- strcpy (cc->buf, "-");
- cc->neg_prefix = cc->buf;
- cc->prefix = &cc->buf[1];
- cc->suffix = &cc->buf[1];
- cc->neg_suffix = &cc->buf[1];
- cc->decimal = '.';
- cc->grouping = ',';
- }
- }
-
- set_decimal = '.';
- set_grouping = ',';
- set_headers = 1;
- set_journaling = 1;
- set_journal = xstrdup ("pspp.jnl");
- set_messages = 1;
- set_mexpand = 1;
- set_mprint = 1;
- set_mxerrs = 50;
- set_mxwarns = 100;
- set_printback = 1;
- set_undefined = 1;
-
- set_cprompt = xstrdup (" > ");
- set_echo = 0;
- set_endcmd = '.';
- set_errorbreak = 0;
- set_include = 1;
- set_nullline = 1;
- set_more = 1;
- set_prompt = xstrdup ("PSPP> ");
- set_seed = NOT_LONG;
-
-#if __DJGPP__ || __BORLANDC__
- {
- struct text_info ti;
-
- gettextinfo (&ti);
- set_viewlength = max (ti.screenheight, 25);
- set_viewwidth = max (ti.screenwidth, 79);
- }
-#elif HAVE_LIBTERMCAP
- {
- char *termtype;
- int success;
-
- /* This code stolen from termcap.info, though modified. */
- termtype = getenv ("TERM");
- if (!termtype)
- msg (FE, _("Specify a terminal type with `setenv TERM <yourtype>'."));
- success = tgetent (term_buffer, termtype);
- if (success <= 0)
- {
- if (success < 0)
- msg (IE, _("Could not access the termcap data base."));
- else
- msg (IE, _("Terminal type `%s' is not defined."), termtype);
- msg (MM, _("Assuming screen of size 79x25."));
- set_viewlength = 25;
- set_viewwidth = 79;
- }
- else
- {
- set_viewlength = tgetnum ("li");
- set_viewwidth = tgetnum ("co") - 1;
- }
- }
-#else /* !HAVE_LIBTERMCAP */
- set_viewlength = 25;
- set_viewwidth = 79;
-#endif /* !HAVE_LIBTERMCAP */
+ init_settings();
/* log.h */
logging = 1;
len--;
/* Check for and remove terminal dot. */
- if (len > 0 && s[len - 1] == set_endcmd)
+ if (len > 0 && s[len - 1] == get_endcmd() )
{
dot = 1;
len--;
}
- else if (len == 0 && set_nullline)
+ else if (len == 0 && get_nullline() )
dot = 1;
else
dot = 0;
if (two->flags == 0)
{
two->pass++;
- if (two->pass > set_mxloops)
+ if (two->pass > get_mxloops() )
return two->loop_term;
}
for (i = 0; i < vec->n; i++)
{
- if (i % ((set_viewwidth - 4) / 8) == 0)
+ if (i % ((get_viewwidth() - 4) / 8) == 0)
{
if (i)
putchar ('\n');
/* A set of OUTP_DEV_* bits indicating the devices that are
disabled. */
-int disabled_devices;
+static int disabled_devices;
static void destroy_driver (struct outp_driver *);
static void configure_driver (char *);
return d->value;
if (!strcmp (key, "viewwidth"))
{
- sprintf (buf, "%d", set_viewwidth);
+ sprintf (buf, "%d", get_viewwidth());
return buf;
}
else if (!strcmp (key, "viewlength"))
{
- sprintf (buf, "%d", set_viewlength);
+ sprintf (buf, "%d", get_viewlength());
return buf;
}
else
void
outp_list_classes (void)
{
- int width = set_viewwidth;
+ int width = get_viewwidth();
struct outp_driver_class_list *c;
printf (_("Driver classes:\n\t"));
if ((int) strlen (c->class->name) + 1 > width)
{
printf ("\n\t");
- width = set_viewwidth - 8;
+ width = get_viewwidth() - 8;
}
else
putc (' ', stdout);
return iter;
}
-#if DEBUGGING
+#if DEBUGGING
/* Writes a printable representation of the current token to
stdout. */
void
{
switch (token)
{
+ case T_TSTRING:
+ printf ("TR_STRING\t\"%s\"\n", tokstr);
+ break;
case T_STRING:
printf ("STRING\t\"%s\"\n", tokstr);
break;
fail ("%s: Unexpected end of file.", ifn);
}
- if (*cp == '_' || isalnum ((unsigned char) *cp))
- {
- char *dest = tokstr;
- token = T_ID;
- while (*cp == '_' || isalnum ((unsigned char) *cp))
- *dest++ = toupper ((unsigned char) (*cp++));
- *dest++ = '\0';
- }
- else if (*cp == '"')
+ if (*cp == '"')
{
char *dest = tokstr;
token = T_STRING;
error ("Unterminated string literal.");
cp++;
}
+ else if (*cp == '_' || isalnum ((unsigned char) *cp))
+ {
+ char *dest = tokstr;
+ token = T_ID;
+ while (*cp == '_' || isalnum ((unsigned char) *cp))
+ *dest++ = toupper ((unsigned char) (*cp++));
+ *dest++ = '\0';
+ }
else
token = *cp++;
const char *prefix; /* Prefix for variable and constant names. */
specifier *spec; /* Array of specifiers. */
- /* SBC_STRING only. */
+ /* SBC_STRING and SBC_INT only. */
char *restriction; /* Expression restricting string length. */
char *message; /* Error message. */
+ int translatable; /* Error message is translatable */
+ };
+
+typedef struct aux_subcommand aux_subcommand;
+struct aux_subcommand
+ {
+ aux_subcommand *next; /* Next in the chain. */
+ char *name; /* Subcommand name. */
+ char *value; /* Subcommand value */
};
+static aux_subcommand *aux_subcommands ;
+
/* Name of the command; i.e., DESCRIPTIVES. */
char *cmdname;
sbc->narray = 0;
sbc->type = SBC_PLAIN;
sbc->spec = NULL;
+ sbc->translatable = 0;
if (match_token ('['))
{
sbc->type = SBC_VARLIST;
}
else if (match_id ("INTEGER"))
+ {
sbc->type = match_id ("LIST") ? SBC_INT_LIST : SBC_INT;
+ if ( token == T_STRING)
+ {
+ sbc->restriction = xstrdup (tokstr);
+ lex_get ();
+ if ( match_id("N_") )
+ {
+ skip_token('(');
+ force_string ();
+ lex_get();
+ skip_token(')');
+ sbc->translatable = 1;
+ }
+ else {
+ force_string ();
+ lex_get ();
+ }
+ sbc->message = xstrdup (tokstr);
+ }
+ else
+ sbc->restriction = NULL;
+ }
else if (match_id ("PINT"))
sbc->type = SBC_PINT;
else if (match_id ("DOUBLE"))
/* Write code to initialize all variables. */
static void
-dump_vars_init (void)
+dump_vars_init (int persistent)
{
/* Loop through all the subcommands. */
{
subcommand *sbc;
-
+
for (sbc = subcommands; sbc; sbc = sbc->next)
{
int f = 0;
dump (0, "p->sbc_%s = 0;", st_lower (sbc->name));
- switch (sbc->type)
+ if ( ! persistent )
{
- case SBC_DBL:
- case SBC_INT_LIST:
- case SBC_DBL_LIST:
- case SBC_CUSTOM:
- /* nothing */
- break;
+ switch (sbc->type)
+ {
+ case SBC_DBL:
+ case SBC_INT_LIST:
+ case SBC_DBL_LIST:
+ case SBC_CUSTOM:
+ /* nothing */
+ break;
- case SBC_PLAIN:
- case SBC_ARRAY:
- {
- specifier *spec;
+ case SBC_PLAIN:
+ case SBC_ARRAY:
+ {
+ specifier *spec;
- for (spec = sbc->spec; spec; spec = spec->next)
- if (spec->s == NULL)
- {
- if (sbc->type == SBC_PLAIN)
- dump (0, "p->%s%s = 0;", sbc->prefix, spec->varname);
- else if (f == 0)
+ for (spec = sbc->spec; spec; spec = spec->next)
+ if (spec->s == NULL)
{
- dump (0, "memset (p->a_%s, 0, sizeof p->a_%s);",
- st_lower (sbc->name), st_lower (sbc->name));
- f = 1;
+ if (sbc->type == SBC_PLAIN)
+ dump (0, "p->%s%s = 0;", sbc->prefix, spec->varname);
+ else if (f == 0)
+ {
+ dump (0, "memset (p->a_%s, 0, sizeof p->a_%s);",
+ st_lower (sbc->name), st_lower (sbc->name));
+ f = 1;
+ }
}
- }
- else
- dump_specifier_init (spec, sbc);
- }
- break;
-
- case SBC_VARLIST:
- dump (0, "p->%sn_%s = 0;",
- st_lower (sbc->prefix), st_lower (sbc->name));
- dump (0, "p->%sv_%s = NULL;",
- st_lower (sbc->prefix), st_lower (sbc->name));
- break;
+ else
+ dump_specifier_init (spec, sbc);
+ }
+ break;
+
+ case SBC_VARLIST:
+ dump (0, "p->%sn_%s = 0;",
+ st_lower (sbc->prefix), st_lower (sbc->name));
+ dump (0, "p->%sv_%s = NULL;",
+ st_lower (sbc->prefix), st_lower (sbc->name));
+ break;
- case SBC_VAR:
- dump (0, "p->%sv_%s = NULL;",
- st_lower (sbc->prefix), st_lower (sbc->name));
- break;
-
- case SBC_STRING:
- dump (0, "p->s_%s = NULL;", st_lower (sbc->name));
- break;
-
- case SBC_INT:
- case SBC_PINT:
- dump (0, "p->n_%s = NOT_LONG;", st_lower (sbc->name));
- break;
-
- default:
- assert (0);
+ case SBC_VAR:
+ dump (0, "p->%sv_%s = NULL;",
+ st_lower (sbc->prefix), st_lower (sbc->name));
+ break;
+
+ case SBC_STRING:
+ dump (0, "p->s_%s = NULL;", st_lower (sbc->name));
+ break;
+
+ case SBC_INT:
+ case SBC_PINT:
+ dump (0, "p->n_%s = NOT_LONG;", st_lower (sbc->name));
+ break;
+
+ default:
+ assert (0);
+ }
}
}
}
dump (-1, "}");
outdent ();
}
+ dump (0, "free(p->s_%s);", st_lower(sbc->name) );
dump (0, "p->s_%s = xstrdup (ds_value (&tokstr));",
st_lower (sbc->name));
dump (0, "lex_get ();");
}
else if (sbc->type == SBC_INT)
{
+ dump(1, "{");
+ dump(0, "int x;");
dump (1, "if (!lex_force_int ())");
dump (0, "goto lossage;");
- dump (-1, "p->n_%s = lex_integer ();", st_lower (sbc->name));
+ dump (-1, "x = lex_integer ();");
dump (0, "lex_get();");
+ if (sbc->restriction)
+ {
+ char buf[1024];
+ dump (1, "if (!(%s))", sbc->restriction);
+ dump (1, "{");
+ sprintf(buf,sbc->message,sbc->name);
+ if ( sbc->translatable )
+ dump (0, "msg (SE, gettext(\"%s\"));",buf);
+ else
+ dump (0, "msg (SE, \"%s\");",buf);
+ dump (0, "goto lossage;");
+ dump (-1, "}");
+ }
+ dump (-1, "p->n_%s = x;", st_lower (sbc->name));
+ dump (-1,"}");
}
else if (sbc->type == SBC_PINT)
{
/* Write out entire parser. */
static void
-dump_parser (void)
+dump_parser (int persistent)
{
int f;
make_identifier (cmdname));
dump (1, "{");
- dump_vars_init ();
+ dump_vars_init (persistent);
dump (1, "for (;;)");
dump (1, "{");
dump (0, nullstr);
}
+
+/* Write out the code to parse aux subcommand SBC. */
+static void
+dump_aux_subcommand (const subcommand *sbc)
+{
+ if (sbc->type == SBC_PLAIN )
+ {
+ specifier *spec;
+
+ for (spec = sbc->spec; spec; spec = spec->next)
+ {
+ char buf[80];
+ sprintf(buf,"p->%s%s",st_lower(sbc->prefix),spec->varname);
+
+ dump (0, "msg(MM,\"%s is %%s\",",sbc->name);
+ dump (0, "(%s < 1000)?\"not set\":settings[%s - 1000]", buf, buf);
+
+ dump (0, ");");
+ }
+ }
+ else if (sbc->type == SBC_STRING)
+ {
+ dump (0, "msg(MM,\"%s is \\\"%%s\\\"\",p->s_%s);", sbc->name,st_lower(sbc->name) );
+ }
+ else if (sbc->type == SBC_INT)
+ {
+ dump (0, "msg(MM,\"%s is %%ld\",p->n_%s);", sbc->name,st_lower(sbc->name) );
+ }
+ else if (sbc->type == SBC_CUSTOM)
+ {
+ dump (0, "aux_%scustom_%s(p);",st_lower(prefix),make_identifier(sbc->name));
+ }
+ else
+ assert(0);
+}
+
+
+
+/* Write out auxilliary parser. */
+static void
+dump_aux_parser (void)
+{
+ int f=0;
+ subcommand *sbc;
+ aux_subcommand *asbc;
+
+ /* Write out English strings for all the identifiers in the symbol table. */
+ {
+ int f, k;
+ symbol *sym;
+ char *buf = NULL;
+
+ /* Note the squirmings necessary to make sure that the last string
+ is not followed by a comma (is it necessary to do that ?? ) */
+ for (sym = symtab, f = k = 0; sym; sym = sym->next)
+ if (!sym->unique && !is_keyword (sym->name))
+ {
+ if (!f)
+ {
+ dump (0, "/* Strings for subcommand specifiers. */");
+ dump (1, "static const char *settings[]=");
+ dump (1, "{");
+ f = 1;
+ }
+
+ if (buf == NULL)
+ buf = xmalloc (1024);
+ else
+ dump (0, buf);
+
+ sprintf (buf, "\"%s\",",sym->name);
+ }
+ if (buf)
+ {
+ buf[strlen (buf) - 1] = 0;
+ dump (0, buf);
+ free (buf);
+ }
+ if (f)
+ {
+ dump (-1, "};");
+ dump (-1, nullstr);
+ }
+ }
+
+
+ indent = 0;
+
+ dump (0, "static int");
+ dump (0, "aux_parse_%s (struct cmd_%s *p)", make_identifier (cmdname),
+ make_identifier (cmdname));
+ dump (1, "{");
+
+ dump (1, "for (;;)");
+ dump (1, "{");
+
+
+ for (sbc = subcommands; sbc; sbc = sbc->next)
+ {
+ dump (1, "%sif (%s)", f ? "else " : "", make_match (sbc->name));
+ f = 1;
+ dump (1, "{");
+
+ dump_aux_subcommand (sbc);
+
+ dump (-1, "}");
+ outdent ();
+ }
+
+ for (asbc = aux_subcommands ; asbc ; asbc = asbc->next)
+ {
+ dump (1, "%sif (%s)", f ? "else " : "", make_match (asbc->name));
+ f = 1;
+ dump (1, "{");
+ dump(0,"aux_%s();",make_identifier(asbc->value));
+ dump (-1, "}");
+ outdent ();
+ }
+
+ dump (1, "if (!lex_match ('/'))");
+ dump (0, "break;");
+ dump (-2, "}");
+ outdent ();
+ dump (0, nullstr);
+ dump (1, "if (token != '.')");
+ dump (1, "{");
+ dump (0, "lex_error (_(\"expecting end of command\"));");
+ dump (0, "goto lossage;");
+ dump (-1, "}");
+ dump (0, nullstr);
+ dump (-1, "return 1;");
+ dump (0, nullstr);
+ dump (-1, "lossage:");
+ indent ();
+ dump (0, "free_%s (p);", make_identifier (cmdname));
+ dump (0, "return 0;");
+ dump (-1, "} /* aux_parse_%s (struct cmd_%s *p) */",
+ make_identifier (cmdname), make_identifier (cmdname));
+ dump (0, nullstr);
+}
+
+
/* Write the output file header. */
static void
dump_header (void)
/* Write out commands to free variable state. */
static void
-dump_free (void)
+dump_free (int persistent)
{
subcommand *sbc;
int used;
indent = 0;
used = 0;
- for (sbc = subcommands; sbc; sbc = sbc->next)
- if (sbc->type == SBC_STRING)
- used = 1;
+ if ( ! persistent )
+ {
+ for (sbc = subcommands; sbc; sbc = sbc->next)
+ if (sbc->type == SBC_STRING)
+ used = 1;
+ }
dump (0, "static void");
dump (0, "free_%s (struct cmd_%s *p%s)", make_identifier (cmdname),
make_identifier (cmdname), used ? "" : " UNUSED");
dump (1, "{");
- for (sbc = subcommands; sbc; sbc = sbc->next)
- if (sbc->type == SBC_STRING)
- dump (0, "free (p->s_%s);", st_lower (sbc->name));
+ if ( ! persistent )
+ {
+
+ for (sbc = subcommands; sbc; sbc = sbc->next)
+ if (sbc->type == SBC_STRING)
+ dump (0, "free (p->s_%s);", st_lower (sbc->name));
+ }
dump (-1, "}");
+
}
+
+
/* Returns the name of a directive found on the current input line, if
any, or a null pointer if none found. */
static const char *
return directive;
}
+static void aux_parse (void);
+
int
main (int argc, char *argv[])
{
dump_declarations ();
else if (!strcmp (directive, "functions"))
{
- dump_parser ();
- dump_free ();
+ dump_parser (0);
+ dump_free (0);
+ }
+ else if (!strcmp (directive, "_functions"))
+ {
+ dump_parser (1);
+ dump_free (1);
+ }
+ else if (!strcmp (directive, "aux_functions"))
+ {
+ aux_parse();
+ dump_aux_parser ();
}
else
error ("unknown directive `%s'", directive);
return EXIT_SUCCESS;
}
+/* Parse an entire auxilliary specification. */
+static void
+aux_parse (void)
+{
+ aux_subcommand *sbc;
+ aux_subcommand *prevsbc = 0 ;
+ get_line();
+ lex_get();
+
+ for (;;)
+ {
+ sbc = xmalloc(sizeof(aux_subcommand));
+ sbc->next = prevsbc;
+ sbc->name = xstrdup (tokstr);
+ lex_get();
+ skip_token('=');
+ sbc->value = xstrdup (tokstr);
+ lex_get();
+ if (token == '.')
+ break;
+ skip_token(';');
+ prevsbc = sbc;
+
+ }
+ /* Skip trailing star-slash line. */
+ get_line ();
+ aux_subcommands = sbc;
+}
+
+
double next_normal;
};
+
+/* Return a `random' seed by using the real time clock */
+unsigned long
+random_seed(void)
+{
+ time_t t;
+
+ time(&t);
+
+ return (unsigned long) t;
+}
+
/* Creates a new random number generator, seeds it based on
the current time, and returns it. */
struct rng *
rng_create (void)
{
struct rng *rng;
- static time_t t=0;
+ static unsigned long seed=0;
+ unsigned long s;
rng = xmalloc (sizeof *rng);
+
+
+ if ( seed_is_set(&s) )
+ {
+ seed = s;
+ }
+ else if ( seed == 0 )
+ {
+ seed = random_seed();
+ }
+ assert(seed);
+ /*
if (t == 0 || set_seed_used)
{
if (set_seed == NOT_LONG)
}
else
t++;
- rng_seed (rng, &t, sizeof t);
+ */
+ rng_seed (rng, &seed, sizeof seed);
rng->next_normal = NOT_DOUBLE;
return rng;
}
struct rng *pspp_rng (void);
+/* Return a `random' seed by using the real time clock */
+unsigned long random_seed(void);
+
+
#endif /* random.h */
while (ds_length (&getl_buf) > 0
&& isspace ((unsigned char) ds_end (&getl_buf)[-1]))
ds_truncate (&getl_buf, ds_length (&getl_buf) - 1);
- if (ds_length (&getl_buf) > 0 && ds_end (&getl_buf)[-1] == set_endcmd)
+ if (ds_length (&getl_buf) > 0 && ds_end (&getl_buf)[-1] == get_endcmd() )
{
dot = 1;
ds_truncate (&getl_buf, ds_length (&getl_buf) - 1);
}
}
if (dot)
- ds_putchar (&output, (unsigned char) set_endcmd);
+ ds_putchar (&output, get_endcmd() );
ds_destroy (&getl_buf);
getl_buf = output;
#include "output.h"
#include "var.h"
#include "format.h"
+#include "copyleft.h"
+#include "random.h"
+
+#include "signal.h"
+
+#if HAVE_LIBTERMCAP
+#if HAVE_TERMCAP_H
+#include <termcap.h>
+#else /* !HAVE_TERMCAP_H */
+int tgetent (char *, const char *);
+int tgetnum (const char *);
+#endif /* !HAVE_TERMCAP_H */
+#endif /* !HAVE_LIBTERMCAP */
+
+static int set_errors;
+static int set_messages;
+static int set_results;
+
+static double set_blanks=SYSMIS;
+
+static struct fmt_spec set_format={FMT_F,8,2};
+
+static struct set_cust_currency set_cc[5];
+
+static char *set_journal;
+static int set_journaling;
+
+static int set_listing=1;
-double set_blanks;
-int set_compression;
-struct set_cust_currency set_cc[5];
-int set_cpi;
-char *set_cprompt;
-int set_decimal;
-int set_grouping;
-char *set_dprompt;
-int set_echo;
-int set_endcmd;
-int set_errorbreak;
-int set_errors, set_messages, set_results;
-struct fmt_spec set_format;
-int set_headers;
-int set_include;
-char *set_journal;
-int set_journaling;
-int set_lpi;
-int set_messages;
-int set_mexpand;
-int set_miterate;
-int set_mnest;
-int set_more;
-int set_mprint;
-int set_mxerrs;
-int set_mxloops;
-int set_mxwarns;
-int set_nullline;
-int set_printback;
-int set_output = 1;
#if !USE_INTERNAL_PAGER
-char *set_pager;
+static char *set_pager=0;
#endif /* !USE_INTERNAL_PAGER */
-int set_printer;
-char *set_prompt;
-char *set_results_file;
-int set_safer;
-int set_scompression;
-int set_screen;
-long set_seed;
-int set_seed_used;
-int set_testing_mode;
-int set_undefined;
-int set_viewlength;
-int set_viewwidth;
-size_t set_max_workspace = 4L * 1024 * 1024;
+static unsigned long set_seed;
+static int seed_flag=0;
+
+static int long_view=0;
+int set_testing_mode=0;
+static int set_viewlength;
+static int set_viewwidth;
+
+void aux_show_warranty(void);
+void aux_show_copying(void);
+
+static const char *route_to_string(int routing);
static void set_routing (int q, int *setting);
+
static int set_ccx (const char *cc_string, struct set_cust_currency * cc,
int cc_name);
-
/* (specification)
"SET" (stc_):
automenu=automenu:on/off;
cce=string;
color=custom;
compression=compress:on/off;
- cpi=integer;
+ cpi=integer "x>0" "%s must be greater than 0";
cprompt=string;
- decimal=dec:dot/_comma;
+ decimal=dec:dot/comma;
disk=custom;
dprompt=string;
echo=echo:on/off;
listing=custom;
log=custom;
lowres=lores:auto/on/off;
- lpi=integer;
+ lpi=integer "x>0" "% must be greater than 0";
menus=menus:standard/extended;
messages=messages:on/off/terminal/listing/both/none;
mexpand=mexp:on/off;
- miterate=integer;
- mnest=integer;
+ miterate=integer "x>0" "%s must be greater than 0";
+ mnest=integer "x>0" "%s must be greater than 0";
more=more:on/off;
mprint=mprint:on/off;
- mxerrs=integer;
- mxloops=integer;
+ mxerrs=integer "x >= 1" "%s must be at least 1";
+ mxloops=integer "x >=1" "%s must be at least 1";
mxmemory=integer;
mxwarns=integer;
nulline=null:on/off;
tbfonts=string;
undefined=undef:warn/nowarn;
viewlength=custom;
- viewwidth=integer;
+ viewwidth=custom;
width=custom;
workdev=custom;
- workspace=integer;
+ workspace=integer "x>=1024" "%s must be at least 1 MB";
xsort=xsort:yes/no.
*/
/* (declarations) */
-/* (functions) */
-int internal_cmd_set (void);
+/* (_functions) */
+
+static int
+aux_stc_custom_blanks(struct cmd_set *cmd UNUSED)
+{
+ if ( set_blanks == SYSMIS )
+ msg(MM, "SYSMIS");
+ else
+ msg(MM, "%g", set_blanks);
+ return 0;
+}
+
+
+static int
+aux_stc_custom_color(struct cmd_set *cmd UNUSED)
+{
+ msg (MW, _("%s is obsolete."),"COLOR");
+ return 0;
+}
+
+static int
+aux_stc_custom_listing(struct cmd_set *cmd UNUSED)
+{
+ if ( set_listing )
+ msg(MM, _("LISTING is ON"));
+ else
+ msg(MM, _("LISTING is OFF"));
+
+ return 0;
+}
+
+static int
+aux_stc_custom_disk(struct cmd_set *cmd UNUSED)
+{
+ return aux_stc_custom_listing(cmd);
+}
+
+static int
+aux_stc_custom_format(struct cmd_set *cmd UNUSED)
+{
+ msg(MM, fmt_to_string(&set_format));
+ return 0;
+}
+
+
+
+static int
+aux_stc_custom_journal(struct cmd_set *cmd UNUSED)
+{
+ if (set_journaling)
+ msg(MM, set_journal);
+ else
+ msg(MM, _("Journalling is off") );
+
+ return 0;
+}
+
+static int
+aux_stc_custom_length(struct cmd_set *cmd UNUSED)
+{
+ msg(MM, "%d", set_viewlength);
+ return 0;
+}
+
+static int
+aux_stc_custom_log(struct cmd_set *cmd )
+{
+ return aux_stc_custom_journal (cmd);
+}
+
+static int
+aux_stc_custom_pager(struct cmd_set *cmd UNUSED)
+{
+#if !USE_INTERNAL_PAGER
+ if ( set_pager )
+ msg(MM, set_pager);
+ else
+ msg(MM, "No pager");
+#else /* USE_INTERNAL_PAGER */
+ msg (MM, "Internal pager.");
+#endif /* USE_INTERNAL_PAGER */
+
+ return 0;
+}
+
+static int
+aux_stc_custom_rcolor(struct cmd_set *cmd UNUSED)
+{
+ msg (SW, _("%s is obsolete."),"RCOLOR");
+ return 0;
+}
+
+static int
+aux_stc_custom_results(struct cmd_set *cmd UNUSED)
+{
+
+ msg(MM, route_to_string(set_results) );
+
+ return 0;
+}
+
+static int
+aux_stc_custom_seed(struct cmd_set *cmd UNUSED)
+{
+ msg(MM, "%ld",set_seed);
+ return 0;
+}
+
+static int
+aux_stc_custom_viewlength(struct cmd_set *cmd UNUSED)
+{
+ msg(MM, "%d", set_viewlength);
+ return 0;
+}
+
+static int
+aux_stc_custom_viewwidth(struct cmd_set *cmd UNUSED)
+{
+ msg(MM, "%d", set_viewwidth);
+ return 0;
+}
+
+static int
+aux_stc_custom_width(struct cmd_set *cmd UNUSED)
+{
+ msg(MM, "%d", set_viewwidth);
+ return 0;
+}
+
+static int
+aux_stc_custom_workdev(struct cmd_set *cmd UNUSED)
+{
+ msg (SW, _("%s is obsolete."),"WORKDEV");
+ return 0;
+}
+
+
+
+/* (aux_functions)
+ warranty=show_warranty;
+ copying=show_copying.
+*/
+
+
+static struct cmd_set cmd;
+
+int
+cmd_show (void)
+{
+ lex_match_id ("SHOW");
+
+ if (!aux_parse_set (&cmd))
+ return CMD_FAILURE;
+
+ return CMD_SUCCESS;
+}
int
cmd_set (void)
{
- struct cmd_set cmd;
lex_match_id ("SET");
if (!parse_set (&cmd))
return CMD_FAILURE;
- if (cmd.sbc_block)
- msg (SW, _("%s is obsolete."),"BLOCK");
-
- if (cmd.sbc_boxstring)
- msg (SW, _("%s is obsolete."),"BOXSTRING");
-
- if (cmd.compress != -1)
- {
- msg (MW, _("Active file compression is not yet implemented "
- "(and probably won't be)."));
- set_compression = cmd.compress == STC_OFF ? 0 : 1;
- }
- if (cmd.scompress != -1)
- set_scompression = cmd.scompress == STC_OFF ? 0 : 1;
- if (cmd.n_cpi != NOT_LONG)
- {
- if (cmd.n_cpi <= 0)
- msg (SE, _("CPI must be greater than 0."));
- else
- set_cpi = cmd.n_cpi;
- }
- if (cmd.sbc_histogram)
- msg (MW, _("%s is obsolete."),"HISTOGRAM");
- if (cmd.n_lpi != NOT_LONG)
- {
- if (cmd.n_lpi <= 0)
- msg (SE, _("LPI must be greater than 0."));
- else
- set_lpi = cmd.n_lpi;
- }
-
- /* Windows compatible syntax. */
- if (cmd.sbc_case)
- msg (SW, _("CASE is not implemented and probably won't be. If you care, "
- "complain about it."));
if (cmd.sbc_cca)
set_ccx (cmd.s_cca, &set_cc[0], 'A');
if (cmd.sbc_ccb)
set_ccx (cmd.s_ccd, &set_cc[3], 'D');
if (cmd.sbc_cce)
set_ccx (cmd.s_cce, &set_cc[4], 'E');
- if (cmd.dec != -1)
- {
- set_decimal = cmd.dec == STC_DOT ? '.' : ',';
- set_grouping = cmd.dec == STC_DOT ? ',' : '.';
- }
- if (cmd.errors != -1)
+
+ if (cmd.sbc_errors)
set_routing (cmd.errors, &set_errors);
- if (cmd.headers != -1)
- set_headers = cmd.headers == STC_NO ? 0 : (cmd.headers == STC_YES ? 1 : 2);
- if (cmd.messages != -1)
+ if (cmd.sbc_messages)
set_routing (cmd.messages, &set_messages);
- if (cmd.mexp != -1)
- set_mexpand = cmd.mexp == STC_OFF ? 0 : 1;
- if (cmd.n_miterate != NOT_LONG)
- {
- if (cmd.n_miterate > 0)
- set_miterate = cmd.n_miterate;
- else
- msg (SE, _("Value for MITERATE (%ld) must be greater than 0."),
- cmd.n_miterate);
- }
- if (cmd.n_mnest != NOT_LONG)
- {
- if (cmd.n_mnest > 0)
- set_mnest = cmd.n_mnest;
- else
- msg (SE, _("Value for MNEST (%ld) must be greater than 0."),
- cmd.n_mnest);
- }
- if (cmd.mprint != -1)
- set_mprint = cmd.mprint == STC_OFF ? 0 : 1;
- if (cmd.n_mxerrs != NOT_LONG)
- {
- if (set_mxerrs < 1)
- msg (SE, _("MXERRS must be at least 1."));
- else
- set_mxerrs = cmd.n_mxerrs;
- }
- if (cmd.n_mxloops != NOT_LONG)
- {
- if (set_mxloops < 1)
- msg (SE, _("MXLOOPS must be at least 1."));
- else
- set_mxloops = cmd.n_mxloops;
- }
- if (cmd.n_mxmemory != NOT_LONG)
- msg (SE, _("%s is obsolete."),"MXMEMORY");
- if (cmd.n_mxwarns != NOT_LONG)
- set_mxwarns = cmd.n_mxwarns;
- if (cmd.prtbck != -1)
- set_printback = cmd.prtbck == STC_OFF ? 0 : 1;
- if (cmd.s_scripttab)
- msg (SE, _("%s is obsolete."),"SCRIPTTAB");
- if (cmd.s_tbfonts)
- msg (SW, _("%s is not yet implemented."),"TBFONTS");
- if (cmd.s_tb1)
- msg (SW, _("%s is not yet implemented."),"TB1");
- if (cmd.undef != -1)
- set_undefined = cmd.undef == STC_NOWARN ? 0 : 1;
- if (cmd.n_workspace != NOT_LONG)
- {
- if (cmd.n_workspace < 1024)
- msg (SE, _("Workspace limit must be at least 1 MB."));
- else
- {
- if (cmd.n_workspace > (size_t) -1 / 1024)
- set_max_workspace = -1;
- else
- set_max_workspace = 1024 * cmd.n_workspace;
- }
- }
/* PC+ compatible syntax. */
- if (cmd.scrn != -1)
+ if (cmd.sbc_screen)
outp_enable_device (cmd.scrn == STC_OFF ? 0 : 1, OUTP_DEV_SCREEN);
+ if (cmd.sbc_printer)
+ outp_enable_device (cmd.prtr == STC_OFF ? 0 : 1, OUTP_DEV_PRINTER);
- if (cmd.automenu != -1)
+ if (cmd.sbc_automenu )
msg (SW, _("%s is obsolete."),"AUTOMENU");
- if (cmd.beep != -1)
+ if (cmd.sbc_beep )
msg (SW, _("%s is obsolete."),"BEEP");
-
- if (cmd.s_cprompt)
- {
- free (set_cprompt);
- set_cprompt = cmd.s_cprompt;
- cmd.s_cprompt = NULL;
- }
- if (cmd.s_dprompt)
- {
- free (set_dprompt);
- set_dprompt = cmd.s_dprompt;
- cmd.s_dprompt = NULL;
- }
- if (cmd.echo != -1)
- set_echo = cmd.echo == STC_OFF ? 0 : 1;
- if (cmd.s_endcmd)
- set_endcmd = cmd.s_endcmd[0];
- if (cmd.eject != -1)
+ if (cmd.sbc_block)
+ msg (SW, _("%s is obsolete."),"BLOCK");
+ if (cmd.sbc_boxstring)
+ msg (SW, _("%s is obsolete."),"BOXSTRING");
+ if (cmd.sbc_eject )
msg (SW, _("%s is obsolete."),"EJECT");
- if (cmd.errbrk != -1)
- set_errorbreak = cmd.errbrk == STC_OFF ? 0 : 1;
- if (cmd.helpwin != -1)
+ if (cmd.sbc_helpwindows )
msg (SW, _("%s is obsolete."),"HELPWINDOWS");
- if (cmd.inc != -1)
- set_include = cmd.inc == STC_OFF ? 0 : 1;
- if (cmd.menus != -1)
+ if (cmd.sbc_histogram)
+ msg (MW, _("%s is obsolete."),"HISTOGRAM");
+ if (cmd.sbc_menus )
msg (MW, _("%s is obsolete."),"MENUS");
- if (cmd.null != -1)
- set_nullline = cmd.null == STC_OFF ? 0 : 1;
- if (cmd.more != -1)
- set_more = cmd.more == STC_OFF ? 0 : 1;
- if (cmd.prtr != -1)
- outp_enable_device (cmd.prtr == STC_OFF ? 0 : 1, OUTP_DEV_PRINTER);
- if (cmd.s_prompt)
- {
- free (set_prompt);
- set_prompt = cmd.s_prompt;
- cmd.s_prompt = NULL;
- }
- if (cmd.ptrans != -1)
+ if (cmd.sbc_ptranslate )
msg (SW, _("%s is obsolete."),"PTRANSLATE");
- if (cmd.runrev != -1)
+ if (cmd.sbc_runreview )
msg (SW, _("%s is obsolete."),"RUNREVIEW");
- if (cmd.safe == STC_ON)
- set_safer = 1;
- if (cmd.xsort != -1)
+ if (cmd.sbc_xsort )
msg (SW, _("%s is obsolete."),"XSORT");
+ if (cmd.sbc_mxmemory )
+ msg (SE, _("%s is obsolete."),"MXMEMORY");
+ if (cmd.sbc_scripttab)
+ msg (SE, _("%s is obsolete."),"SCRIPTTAB");
- free_set (&cmd);
+ if (cmd.sbc_tbfonts)
+ msg (SW, _("%s is not yet implemented."),"TBFONTS");
+ if (cmd.sbc_tb1 && cmd.s_tb1)
+ msg (SW, _("%s is not yet implemented."),"TB1");
+
+ /* Windows compatible syntax. */
+ if (cmd.sbc_case)
+ msg (SW, _("CASE is not implemented and probably won't be. "
+ "If you care, complain about it."));
+
+ if (cmd.sbc_compression)
+ {
+ msg (MW, _("Active file compression is not yet implemented "
+ "(and probably won't be)."));
+ }
return CMD_SUCCESS;
}
return 1;
}
+
+const char *
+route_to_string(int routing)
+{
+ static char s[255];
+
+ s[0]='\0';
+
+ if ( routing == 0 )
+ {
+ strcpy(s, _("None"));
+ return s;
+ }
+
+ if (routing & SET_ROUTE_DISABLE )
+ {
+ strcpy(s, _("Disabled") );
+ return s;
+ }
+
+ if (routing & SET_ROUTE_SCREEN)
+ strcat(s, _("Screen") );
+
+ if (routing & SET_ROUTE_LISTING)
+ {
+ if(s[0] != '\0')
+ strcat(s,", ");
+
+ strcat(s, _("Listing") );
+ }
+
+ if (routing & SET_ROUTE_OTHER)
+ {
+ if(s[0] != '\0')
+ strcat(s,", ");
+ strcat(s, _("Other") );
+ }
+
+
+ return s;
+
+
+}
+
/* Sets *SETTING, which is a combination of SET_ROUTE_* bits that
indicates what to do with some sort of output, to the value
indicated by Q, which is a value provided by the input parser. */
{
switch (q)
{
- case STC_ON:
+ case STC_OFF:
*setting |= SET_ROUTE_DISABLE;
break;
- case STC_OFF:
+ case STC_ON:
*setting &= ~SET_ROUTE_DISABLE;
break;
case STC_TERMINAL:
lex_get ();
}
- /* FIXME: Set page length. */
+ if ( page_length != -1 )
+ set_viewlength = page_length;
+
return 1;
}
{
lex_match ('=');
if (lex_match_id ("RANDOM"))
- set_seed = NOT_LONG;
+ set_seed = random_seed();
else
{
if (!lex_force_num ())
set_seed = tokval;
lex_get ();
}
- set_seed_used=1;
+ seed_flag = 1;
+
return 1;
}
lex_get ();
}
- /* FIXME: Set page width. */
+ set_viewwidth = page_width;
return 1;
}
{
lex_match ('=');
if (lex_match_id ("ON") || lex_match_id ("YES"))
- outp_enable_device (1, OUTP_DEV_LISTING);
+ set_listing = 1;
else if (lex_match_id ("OFF") || lex_match_id ("NO"))
- outp_enable_device (0, OUTP_DEV_LISTING);
+ set_listing = 0;
else
{
/* FIXME */
+ return 0;
}
+ outp_enable_device (set_listing, OUTP_DEV_LISTING);
- return 0;
+ return 1;
}
static int
stc_custom_disk (struct cmd_set *cmd UNUSED)
{
- stc_custom_listing (cmd);
- return 0;
+ return stc_custom_listing (cmd);
}
static int
stc_custom_log (struct cmd_set *cmd UNUSED)
{
- stc_custom_journal (cmd);
- return 0;
+ return stc_custom_journal (cmd);
}
static int
return 1;
}
+static int
+stc_custom_viewwidth (struct cmd_set *cmd UNUSED)
+{
+ lex_match ('=');
+
+ if ( !lex_force_int() )
+ return 0;
+
+ set_viewwidth = lex_integer();
+ lex_get();
+
+ return 1;
+}
+
static int
stc_custom_viewlength (struct cmd_set *cmd UNUSED)
{
return 0;
}
+
+
+static void
+set_viewport(void)
+{
+#if HAVE_LIBTERMCAP
+ static char term_buffer[16384];
+#endif
+
+ /* Workable defaults before we determine the real terminal size. */
+ set_viewwidth = 79;
+ set_viewlength = 24;
+
+
+
+#if __DJGPP__ || __BORLANDC__
+ {
+ struct text_info ti;
+
+ gettextinfo (&ti);
+ set_viewlength = max (ti.screenheight, 25);
+ set_viewwidth = max (ti.screenwidth, 79);
+ }
+#elif HAVE_LIBTERMCAP
+ {
+ char *termtype;
+ int success;
+
+ /* This code stolen from termcap.info, though modified. */
+ termtype = getenv ("TERM");
+ if (!termtype)
+ msg (FE, _("Specify a terminal type with `setenv TERM <yourtype>'."));
+
+ success = tgetent (term_buffer, termtype);
+ if (success <= 0)
+ {
+ if (success < 0)
+ msg (IE, _("Could not access the termcap data base."));
+ else
+ msg (IE, _("Terminal type `%s' is not defined."), termtype);
+ }
+ else
+ {
+ set_viewlength = tgetnum ("li");
+ set_viewwidth = tgetnum ("co") - 1;
+ }
+ }
+#else
+ {
+ char *s;
+
+ /* Try the environment variables */
+ s = getenv("COLUMNS");
+ if ( s ) set_viewwidth = atoi(s);
+
+ s = getenv("LINES");
+ if ( s ) set_viewlength = atoi(s);
+ }
+#endif /* !HAVE_LIBTERMCAP */
+
+}
+
+/* Public functions */
+
+void
+init_settings(void)
+{
+ cmd.s_dprompt = xstrdup (_("data> "));
+ cmd.s_cprompt = xstrdup (" > ");
+ cmd.s_prompt = xstrdup ("PSPP> ");
+ cmd.s_endcmd = xstrdup (".");
+
+ assert(cmd.safe == 0 );
+ cmd.safe = STC_OFF;
+
+ cmd.dec = STC_DOT;
+ cmd.n_cpi = 6;
+ cmd.n_lpi = 10;
+ cmd.echo = STC_OFF;
+ cmd.more = STC_ON;
+ cmd.headers = STC_YES;
+ cmd.errbrk = STC_OFF;
+
+ cmd.scompress = STC_OFF;
+ cmd.undef = STC_WARN;
+ cmd.mprint = STC_ON ;
+ cmd.prtbck = STC_ON ;
+ cmd.null = STC_ON ;
+ cmd.inc = STC_ON ;
+
+ set_journal = xstrdup ("pspp.jnl");
+ set_journaling = 1;
+
+ cmd.n_mxwarns = 100;
+ cmd.n_mxerrs = 100;
+ cmd.n_mxloops = 1;
+ cmd.n_workspace = 4L * 1024 * 1024;
+
+
+#if !USE_INTERNAL_PAGER
+ {
+ char *pager;
+
+ pager = getenv ("STAT_PAGER");
+ if (!pager) set_pager = getenv ("PAGER");
+
+ if (pager)
+ set_pager = xstrdup (pager);
+#if DEFAULT_PAGER
+ else
+ set_pager = xstrdup (DEFAULT_PAGER);
+#endif /* DEFAULT_PAGER */
+ }
+#endif /* !USE_INTERNAL_PAGER */
+
+
+ {
+ int i;
+
+ for (i = 0; i < 5; i++)
+ {
+ struct set_cust_currency *cc = &set_cc[i];
+ strcpy (cc->buf, "-");
+ cc->neg_prefix = cc->buf;
+ cc->prefix = &cc->buf[1];
+ cc->suffix = &cc->buf[1];
+ cc->neg_suffix = &cc->buf[1];
+ cc->decimal = '.';
+ cc->grouping = ',';
+ }
+ }
+
+ if ( ! long_view )
+ {
+ set_viewport();
+ signal (SIGWINCH,set_viewport);
+ }
+
+}
+
+void
+force_long_view(void)
+{
+ long_view = 1;
+ set_viewwidth=9999;
+}
+
+int
+safer_mode(void)
+{
+ return !(cmd.safe != STC_ON) ;
+}
+
+
+/* Set safer mode */
+void
+make_safe(void)
+{
+ cmd.safe = STC_ON;
+}
+
+
+char
+get_decimal(void)
+{
+ return (cmd.dec == STC_DOT ? '.' : ',');
+}
+
+
+char
+get_grouping(void)
+{
+ return (cmd.dec == STC_DOT ? ',' : '.');
+}
+
+
+char *
+get_prompt(void)
+{
+ return cmd.s_prompt;
+}
+
+char *
+get_dprompt(void)
+{
+ return cmd.s_dprompt;
+}
+
+char *
+get_cprompt(void)
+{
+ return cmd.s_cprompt;
+}
+
+
+int
+get_echo(void)
+{
+ return (cmd.echo != STC_OFF );
+}
+
+
+int
+get_errorbreak(void)
+{
+ return (cmd.errbrk != STC_OFF);
+}
+
+
+int
+get_scompression(void)
+{
+ return (cmd.scompress != STC_OFF );
+}
+
+int
+get_undefined(void)
+{
+ return (cmd.undef != STC_NOWARN);
+}
+
+int
+get_mxwarns(void)
+{
+ return cmd.n_mxwarns;
+}
+
+int
+get_mxerrs(void)
+{
+ return cmd.n_mxerrs;
+}
+
+int
+get_mprint(void)
+{
+ return ( cmd.mprint != STC_OFF );
+}
+
+int
+get_printback(void)
+{
+ return (cmd.prtbck != STC_OFF );
+}
+
+int
+get_mxloops(void)
+{
+ return cmd.n_mxloops;
+}
+
+int
+get_nullline(void)
+{
+ return (cmd.null != STC_OFF );
+}
+
+int
+get_include(void)
+{
+ return (cmd.inc != STC_OFF );
+}
+
+unsigned char
+get_endcmd(void)
+{
+ return cmd.s_endcmd[0];
+}
+
+
+size_t
+get_max_workspace(void)
+{
+ return cmd.n_workspace;
+}
+
+double
+get_blanks(void)
+{
+ return set_blanks;
+}
+
+struct fmt_spec
+get_format(void)
+{
+ return set_format;
+}
+
+/* CCA through CCE. */
+const struct set_cust_currency *
+get_cc(int i)
+{
+ return &set_cc[i];
+}
+
+void
+aux_show_warranty(void)
+{
+ msg(MM,lack_of_warranty);
+}
+
+void
+aux_show_copying(void)
+{
+ msg(MM,copyleft);
+}
+
+
+int
+get_viewlength(void)
+{
+ return set_viewlength;
+}
+
+int
+get_viewwidth(void)
+{
+ return set_viewwidth;
+}
+
+const char *
+get_pager(void)
+{
+ return set_pager;
+}
+
+/* Return 1 if the seed has been set since the last time this function
+ was called.
+ Fill the value pointed to by seed with the seed .
+*/
+int
+seed_is_set(unsigned long *seed)
+{
+ int result = 0;
+
+ *seed = set_seed ;
+
+ if ( seed_flag )
+ result = 1;
+
+ seed_flag = 0;
+
+ return result;
+
+}
+
+
/*
Local Variables:
mode: c
#include <stddef.h>
#include <float.h>
-/* The value that blank numeric fields are set to when read in;
- normally SYSMIS. */
-extern double set_blanks;
/* Describes one custom currency specification. */
struct set_cust_currency
int grouping; /* Grouping character. */
};
-/* CCA through CCE. */
-extern struct set_cust_currency set_cc[5];
-
-/* Whether the active file should be compressed. */
-extern int set_compression;
-
-/* Characters per inch (horizontal). */
-extern int set_cpi;
-/* Continuation prompt. */
-extern char *set_cprompt;
-
-/* The character used for a decimal point: ',' or '.'. Only respected
- for data input and output. */
-extern int set_decimal;
-/* The character used for grouping in numbers: '.' or ','; the
- opposite of set_decimal. Only used in COMMA data input and
- output. */
-extern int set_grouping;
-
-/* Prompt used for lines between BEGIN DATA and END DATA. */
-extern char *set_dprompt;
-
-/* Whether we echo commands to the listing file/printer; 0=no, 1=yes. */
-extern int set_echo;
-
-/* The character used to terminate commands. */
-extern int set_endcmd;
/* Types of routing. */
enum
SET_ROUTE_DISABLE = 010 /* Disable output--overrides all other bits. */
};
-/* Routing for errors, messages, and procedure results. */
-extern int set_errors, set_messages, set_results;
-/* Whether an error stops execution; 0=no, 1=yes. */
-extern int set_errorbreak;
+/* Set view width to a very long value, and prevent it from
+ ever changing */
+void force_long_view(void);
-/* Default format for variables created by transformations and by DATA
- LIST {FREE,LIST}. */
-extern struct fmt_spec set_format;
-/* I don't know what this setting means; 0=no, 1=yes, 2=blank. */
-extern int set_headers;
+/* Requested "view length" in lines. */
+int get_viewlength(void);
-/* If set_echo is on, whether commands from include files are echoed;
- * 0=no, 1=yes. */
-extern int set_include;
+/* Screen width. */
+int get_viewwidth(void);
-/* Journal file's name. */
-extern char *set_journal;
+void init_settings(void) ;
-/* Whether we're journaling. */
-extern int set_journaling;
+/* Whether pspp can erase and overwrite files */
+int safer_mode(void);
-/* Lines per inch (vertical). */
-extern int set_lpi;
+/* Put into safer mode */
+void make_safe(void);
-/* 0=macro expansion is disabled, 1=macro expansion is enabled. */
-extern int set_mexpand;
+/* The character used for a decimal point: ',' or '.'. Only respected
+ for data input and output. */
+char get_decimal(void);
-/* Maximum number of iterations in a macro loop. */
-extern int set_miterate;
+/* The character used for grouping in numbers: '.' or ','; the
+ opposite of set_decimal. Only used in COMMA data input and
+ output. */
-/* Maximum nesting level for macros. */
-extern int set_mnest;
+char get_grouping(void);
-/* Whether we pause after each screen of output; 0=no, 1=yes. */
-extern int set_more;
+char *get_prompt(void);
-/* Independent of set_printback, controls whether the commands
- generated by macro invocations are displayed. */
-extern int set_mprint;
+/* Prompt used for lines between BEGIN DATA and END DATA. */
+char *get_dprompt(void);
-/* Maximum number of errors. */
-extern int set_mxerrs;
+/* Continuation prompt. */
+char *get_cprompt(void);
-/* Implied limit of unbounded loop. */
-extern int set_mxloops;
-/* Maximum number of warnings + errors. */
-extern int set_mxwarns;
+/* Whether we echo commands to the listing file/printer;*/
+int get_echo(void);
-/* Whether a blank line is a command terminator; 0=no, 1=yes. */
-extern int set_nullline;
+/* If echo is on, whether commands from include files are echoed */
+int get_include(void);
-/* Whether commands are written to the display; 0=off, 1=on. */
-extern int set_printback;
+/* Whether an error stops execution; */
+int get_errorbreak(void);
-#if !USE_INTERNAL_PAGER
-/* Name of the pager program. */
-extern char *set_pager;
-#endif /* !USE_INTERNAL_PAGER */
-
-/* The command prompt. */
-extern char *set_prompt;
+/* Whether save files should be compressed by default. */
+int get_scompression(void);
-/* Name of the results file. */
-extern char *set_results_file;
+/* Whether to warn on undefined values in numeric data. */
+int get_undefined(void);
-/* Whether to allow certain unsafe operations. Cannot be unset after
- it is set. */
-extern int set_safer;
+/* Maximum number of warnings + errors. */
+int get_mxwarns(void);
-/* Whether save files should be compressed by default. */
-extern int set_scompression;
+/* Maximum number of errors. */
+int get_mxerrs(void);
-/* The random number seed; NOT_LONG if we want a "random" random
- number seed. */
-extern long set_seed;
+/* 0=macro expansion is disabled, 1=macro expansion is enabled. */
+int get_mexpand(void);
-/* 1=The user has modified or made use of the random number seed. */
-extern int set_seed_used;
+/* Whether commands are written to the display */
+int get_printback(void);
-/* 1=Turn on some heuristics that make testing PSPP for correct
- workings a little easier. */
-extern int set_testing_mode;
+/* Independent of get_printback, controls whether the commands
+ generated by macro invocations are displayed. */
+int get_mprint(void);
-/* Whether to warn on undefined values in numeric data. */
-extern int set_undefined;
+/* Implied limit of unbounded loop. */
+int get_mxloops(void);
-/* Requested "view length" in lines. */
-extern int set_viewlength;
+/* Whether a blank line is a command terminator */
+int get_nullline(void);
-/* Screen width. */
-extern int set_viewwidth;
+/* The character used to terminate commands. */
+unsigned char get_endcmd(void);
/* Approximate maximum amount of memory to use for cases, in
bytes. */
-extern size_t set_max_workspace;
+size_t get_max_workspace(void);
+
+/* The value that blank numeric fields are set to when read in;
+ normally SYSMIS. */
+double get_blanks(void);
+
+
+/* Default format for variables created by transformations and by DATA
+ LIST {FREE,LIST}. */
+struct fmt_spec get_format(void);
+
+/* CCA through CCE. */
+const struct set_cust_currency *get_cc(int i);
+
+#if !USE_INTERNAL_PAGER
+/* Name of the pager program. */
+const char *get_pager(void);
+#endif /* !USE_INTERNAL_PAGER */
+
+
+/* Return 1 if the seed has been set since the last time this function
+ was called.
+ Fill the value pointed to by seed with the seed .
+*/
+int seed_is_set(unsigned long *seed);
+
#endif /* !settings_h */
if (case_cnt <= 0)
return isrt;
- if (case_cnt > set_max_workspace / sizeof *case_array)
+ if (case_cnt > get_max_workspace() / sizeof *case_array)
goto error;
case_list = storage_source_get_cases (vfm_source);
+ sizeof *irs->free_list
+ irs->xsrt->scp->case_size
+ 4 * sizeof (void *));
- max_cases = set_max_workspace / approx_case_cost;
+ max_cases = get_max_workspace() / approx_case_cost;
irs->records = malloc (sizeof *irs->records * max_cases);
for (i = 0; i < max_cases; i++)
{
msg (SE, _("Out of memory. Could not allocate room for minimum of %d "
"cases of %d bytes each. (PSPP workspace is currently "
"restricted to a maximum of %d KB.)"),
- MIN_BUFFER_TOTAL_SIZE_RECS, approx_case_cost, set_max_workspace / 1024);
+ MIN_BUFFER_TOTAL_SIZE_RECS, approx_case_cost, get_max_workspace() / 1024);
return 0;
}
return 1;
/* Allocate as many cases as possible into cases. */
approx_case_cost = (sizeof *mrg.cases
+ xsrt->scp->case_size + 4 * sizeof (void *));
- mrg.case_cnt = set_max_workspace / approx_case_cost;
+ mrg.case_cnt = get_max_workspace() / approx_case_cost;
mrg.cases = malloc (sizeof *mrg.cases * mrg.case_cnt);
if (mrg.cases == NULL)
goto done;
msg (SE, _("Out of memory. Could not allocate room for minimum of %d "
"cases of %d bytes each. (PSPP workspace is currently "
"restricted to a maximum of %d KB.)"),
- MIN_BUFFER_TOTAL_SIZE_RECS, approx_case_cost, set_max_workspace / 1024);
+ MIN_BUFFER_TOTAL_SIZE_RECS, approx_case_cost, get_max_workspace() / 1024);
return 0;
}
st->length += len;
}
+void ds_vprintf (struct string *st, const char *format, va_list args);
+
+
/* Formats FORMAT as a printf string and appends the result to ST. */
void
ds_printf (struct string *st, const char *format, ...)
+{
+ va_list args;
+
+ va_start (args, format);
+ ds_vprintf(st,format,args);
+ va_end (args);
+
+}
+
+/* Formats FORMAT as a printf string and appends the result to ST. */
+void
+ds_vprintf (struct string *st, const char *format, va_list args)
{
/* Fscking glibc silently changed behavior between 2.0 and 2.1.
Fsck fsck fsck. Before, it returned -1 on buffer overflow. Now,
it returns the number of characters (not bytes) that would have
been written. */
- va_list args;
int avail, needed;
- va_start (args, format);
avail = st->size - st->length + 1;
needed = vsnprintf (st->string + st->length, avail, format, args);
- va_end (args);
+
if (needed >= avail)
{
ds_extend (st, st->length + needed);
- va_start (args, format);
vsprintf (st->string + st->length, format, args);
- va_end (args);
}
else
while (needed == -1)
{
ds_extend (st, (st->size + 1) * 2);
avail = st->size - st->length + 1;
-
- va_start (args, format);
+
needed = vsnprintf (st->string + st->length, avail, format, args);
- va_end (args);
+
}
st->length += needed;
void ds_putchar (struct string *, int ch);
void ds_concat (struct string *, const char *);
void ds_concat_buffer (struct string *, const char *buf, size_t len);
+void ds_vprintf (struct string *st, const char *format, va_list args);
void ds_printf (struct string *, const char *, ...)
PRINTF_FORMAT (2, 3);
else
{
info->mode = MEMORY;
- info->max_cases = (set_max_workspace
+ info->max_cases = (get_max_workspace()
/ (sizeof (struct case_list) + info->case_size));
}
}
workspace_overflow = 1;
msg (MW, _("Workspace limit of %d KB (%d cases at %d bytes each) "
"overflowed. Writing active file to disk."),
- set_max_workspace / 1024, info->max_cases,
+ get_max_workspace() / 1024, info->max_cases,
sizeof (struct case_list) + info->case_size);
storage_to_disk (info, sink->value_cnt);
EOF
if [ $? -ne 0 ] ; then no_result ; fi
+activity="run program"
$SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/rnd.sps
if [ $? -ne 0 ] ; then no_result ; fi
+activity="compare output"
diff -b -B -w $TEMPDIR/pspp.list - << EOF
R1
--------
activity="run program"
-$SUPERVISOR $here/../src/pspp -o raw-ascii --testing-mode $TEMPDIR/print.stat > $TEMPDIR/errs
+$SUPERVISOR $here/../src/pspp --testing-mode -o raw-ascii --testing-mode $TEMPDIR/print.stat > $TEMPDIR/errs
# Note vv --- there are errors in input. Therefore, the command must FAIL
if [ $? -eq 0 ] ; then fail ; fi
if [ $? -ne 0 ] ; then fail ; fi
-
activity="compare output"
diff -b -B $TEMPDIR/pspp.list - << EOF
----------------------------------------------------------------------
12.00 . . .
12.00 . . .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
EOF
if [ $? -ne 0 ] ; then fail ; fi